Ver código fonte

1.商务中心明细表增加来源编号字段
2.商务中心明细生成报价接口增加来源编号字段
3.客户托书箱型明细增加来源成本编号字段及成本销售价
4.费用明细增加来源成本编号字段及成本销售价
5.进出场记录同步接口增加参数判断是否接入业务数据
6.客户托书-生成订单增加校验是否提取运价以及价格大小接口
7.海运出口增加发送下货纸验证提示接口
8.海运出口增加发送下货纸接口

纪新园 1 mês atrás
pai
commit
31af1be48f
19 arquivos alterados com 998 adições e 512 exclusões
  1. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBox.java
  2. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBoxItems.java
  3. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/mktSlot/entity/MktSlotItem.java
  4. 11 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/mktSlot/entity/MktSlotQuotation.java
  5. 2 2
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Bills.java
  6. 11 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/PreContainers.java
  7. 17 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FeeCenter.java
  8. 487 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/BillUtils.java
  9. 31 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/IBillUtils.java
  10. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/RouteCostController.java
  11. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/controller/BoxDynamicsRecordController.java
  12. 2 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/IBoxDynamicsRecordService.java
  13. 112 83
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java
  14. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/impl/MktSlotServiceImpl.java
  15. 26 10
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  16. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BookingCabinController.java
  17. 6 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java
  18. 181 415
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  19. 83 0
      blade-service/blade-los/src/main/java/org/springblade/los/excel/DeliveryPaperExcel.java

+ 6 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBox.java

@@ -442,5 +442,11 @@ public class PutBox implements Serializable {
 	@TableField(exist = false)
 	private Integer thisSuitcaseNum;
 
+	/**
+	 * 临时字段  是否接入业务逻辑
+	 */
+	@TableField(exist = false)
+	private Boolean status;
+
 
 }

+ 6 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBoxItems.java

@@ -320,4 +320,10 @@ public class PutBoxItems implements Serializable {
 	 */
 	@ApiModelProperty(value = "箱状态")
 	private String status;
+
+	/**
+	 * 临时字段  是否接入业务逻辑
+	 */
+	@TableField(exist = false)
+	private Boolean whetherStatus;
 }

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/mktSlot/entity/MktSlotItem.java

@@ -333,6 +333,11 @@ public class MktSlotItem implements Serializable {
 	 */
 	@ApiModelProperty(value = "来源Id")
 	private Long srcId;
+	/**
+	 * 来源系统编号
+	 */
+	@ApiModelProperty(value = "来源系统编号")
+	private String srcNo;
 
 	/**
 	 * 排序

+ 11 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/mktSlot/entity/MktSlotQuotation.java

@@ -296,5 +296,16 @@ public class MktSlotQuotation implements Serializable {
 	@ApiModelProperty(value = "中转港代码")
 	private String transitPortCode;
 
+	/**
+	 * 来源Id
+	 */
+	@ApiModelProperty(value = "来源Id")
+	private Long srcId;
+	/**
+	 * 来源系统编号
+	 */
+	@ApiModelProperty(value = "来源系统编号")
+	private String srcNo;
+
 
 }

+ 2 - 2
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Bills.java

@@ -1135,9 +1135,9 @@ public class Bills implements Serializable {
 	private String iqNo;
 
 	/**
-	 * edi发送状态  0 = 未发送  1= 已发送
+	 * 是否下货纸  0 = 未发送  1= 已发送
 	 */
-	@ApiModelProperty(value = "edi发送状态")
+	@ApiModelProperty(value = "是否下货纸")
 	private String ediStatus;
 	/**
 	 * 默认团队id

+ 11 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/PreContainers.java

@@ -356,5 +356,16 @@ public class PreContainers implements Serializable {
 	@ApiModelProperty(value = "海运费")
 	private BigDecimal oceanFreight;
 
+	/**
+	 * 来源成本中心Id
+	 */
+	@ApiModelProperty(value = "来源成本中心Id")
+	private Long srcCostId;
+	/**
+	 * 来源成本中心Id
+	 */
+	@ApiModelProperty(value = "来源成本中心Id")
+	private String srcCostNo;
+
 
 }

+ 17 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FeeCenter.java

@@ -1054,5 +1054,22 @@ public class FeeCenter implements Serializable {
 	@ApiModelProperty(value = "单据所属公司")
 	private String billBranchName;
 
+	/**
+	 * 来源成本中心Id
+	 */
+	@ApiModelProperty(value = "来源成本中心Id")
+	private Long srcCostId;
+	/**
+	 * 来源成本中心Id
+	 */
+	@ApiModelProperty(value = "来源成本中心Id")
+	private String srcCostNo;
+
+	/**
+	 * 成本价
+	 */
+	@ApiModelProperty(value = "成本价")
+	private BigDecimal costPrice;
+
 }
 

+ 487 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/BillUtils.java

@@ -0,0 +1,487 @@
+package org.springblade.los.Util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import lombok.AllArgsConstructor;
+import org.springblade.client.feign.IMessageClient;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.business.service.IBusinessTypeService;
+import org.springblade.los.basic.corps.entity.BCorps;
+import org.springblade.los.basic.corps.mapper.CorpsMapper;
+import org.springblade.los.basic.corps.service.IBCorpsService;
+import org.springblade.los.basic.cur.entity.BCurExrate;
+import org.springblade.los.basic.fees.entity.BFees;
+import org.springblade.los.basic.fees.service.IBFeesService;
+import org.springblade.los.basic.ports.service.IBPortsService;
+import org.springblade.los.billno.service.IBusinessBillNoService;
+import org.springblade.los.business.amends.mapper.AmendsMapper;
+import org.springblade.los.business.files.entity.FilesCenter;
+import org.springblade.los.business.files.service.IFilesCenterService;
+import org.springblade.los.business.receipt.service.IReceiptService;
+import org.springblade.los.business.sea.entity.*;
+import org.springblade.los.business.sea.mapper.BillsMapper;
+import org.springblade.los.business.sea.service.*;
+import org.springblade.los.check.service.IAuditPathsActsService;
+import org.springblade.los.check.service.IAuditPathsLevelsService;
+import org.springblade.los.check.service.IAuditProecessService;
+import org.springblade.los.finance.fee.entity.FeeCenter;
+import org.springblade.los.finance.fee.entity.FinAccBills;
+import org.springblade.los.finance.fee.service.IFeeCenterService;
+import org.springblade.los.finance.fee.service.IFinAccBillsService;
+import org.springblade.los.finance.genleg.mapper.FinPeriodMapper;
+import org.springblade.system.entity.Dept;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/12/29
+ */
+@Service
+@AllArgsConstructor
+public class BillUtils implements IBillUtils {
+
+	private final IPreContainersService preContainersService;
+
+	private final IFilesCenterService filesCenterService;
+
+	private final IContainersService containersService;
+
+	private final IContainersBillsService containersBillsService;
+
+	private final IContainersCommodityService containersCommodityService;
+
+	private final IFeeCenterService feeCenterService;
+
+	private final BillsMapper billsMapper;
+
+	private final IFinAccBillsService finAccBillsService;
+
+	private final ISeaBillsDetailService seaBillsDetailService;
+
+	private final CurrencyUtils currencyUtils;
+
+	private final IBCorpsService bCorpsService;
+
+	@Override
+	public void itemCopy(Bills bills, List<Bills> billsList, boolean status) {
+		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
+			.eq(Containers::getTenantId, AuthUtil.getTenantId())
+			.eq(Containers::getIsDeleted, 0)
+			.in(Containers::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+		if (!containersList.isEmpty()) {
+			StringBuilder hblno = new StringBuilder();
+			for (Bills item : billsList) {
+				List<Containers> containers = containersList.stream().filter(e -> e.getPid().equals(item.getId()))
+					.collect(Collectors.toList());
+				if (containers.isEmpty()) {
+					hblno.append(item.getHblno()).append(",");
+				} else {
+					BigDecimal quantity = containers.stream().map(Containers::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+					BigDecimal grossWeight = containers.stream().map(Containers::getGrossWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
+					BigDecimal measurement = containers.stream().map(Containers::getMeasurement).reduce(BigDecimal.ZERO, BigDecimal::add);
+					if (quantity.compareTo(new BigDecimal("0.00")) == 0 && grossWeight.compareTo(new BigDecimal("0.00")) == 0 &&
+						measurement.compareTo(new BigDecimal("0.00")) == 0) {
+						hblno.append(item.getHblno()).append(",");
+					}
+				}
+			}
+			/*if (status && ObjectUtils.isNotNull(hblno.toString())) {
+				throw new RuntimeException("分单号:" + hblno + "未分配件重尺,同步失败");
+			}*/
+			for (Containers item : containersList) {
+				item.setMblno(bills.getMblno());
+			}
+			containersService.updateBatchById(containersList);
+			List<Containers> containersListNew = new ArrayList<>();
+			for (Containers item : containersList) {
+				item.setSrcSplitOrderId(item.getPid());
+				item.setSrcId(item.getId());
+				item.setId(null);
+				item.setPid(bills.getId());
+				item.setCreateTime(new Date());
+				item.setCreateUser(AuthUtil.getUserId());
+				item.setCreateUserName(AuthUtil.getUserName());
+				item.setBranchId(bills.getBranchId());
+				item.setUpdateUser(null);
+				item.setUpdateTime(null);
+				item.setUpdateUserName(null);
+				containersListNew.add(item);
+			}
+			containersService.saveBatch(containersListNew);
+			List<ContainersCommodity> containersCommodityList = containersCommodityService.list(new LambdaQueryWrapper<ContainersCommodity>()
+				.eq(ContainersCommodity::getTenantId, AuthUtil.getTenantId())
+				.eq(ContainersCommodity::getIsDeleted, 0)
+				.in(ContainersCommodity::getPpId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+			if (!containersCommodityList.isEmpty()) {
+				List<ContainersCommodity> containersCommodityListNew = new ArrayList<>();
+				for (ContainersCommodity item : containersCommodityList) {
+					Containers containers = containersListNew.stream().filter(e -> e.getSrcId().equals(item.getPid())).findFirst().orElse(null);
+					if (containers != null) {
+						item.setSrcSplitOrderId(item.getPid());
+						item.setId(null);
+						item.setCreateTime(new Date());
+						item.setCreateUser(AuthUtil.getUserId());
+						item.setCreateUserName(AuthUtil.getUserName());
+						item.setBranchId(bills.getBranchId());
+						item.setUpdateUser(null);
+						item.setUpdateTime(null);
+						item.setUpdateUserName(null);
+						item.setPid(containers.getId());
+						item.setPpId(bills.getId());
+					}
+					containersCommodityListNew.add(item);
+				}
+				containersCommodityService.saveBatch(containersCommodityListNew);
+			}
+/*
+			List<ContainersBills> containersBillsList = containersBillsService.list(new LambdaQueryWrapper<ContainersBills>()
+				.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
+				.eq(ContainersBills::getIsDeleted, 0)
+				.in(ContainersBills::getPpId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+			if (!containersBillsList.isEmpty()) {
+				List<ContainersBills> containersBillsListNew = new ArrayList<>();
+				for (ContainersBills item : containersBillsList) {
+					Containers containers = containersListNew.stream().filter(e -> e.getSrcId().equals(item.getPid())).findFirst().orElse(null);
+					if (containers != null) {
+						item.setSrcSplitOrderId(item.getPid());
+						item.setId(null);
+						item.setCreateTime(new Date());
+						item.setCreateUser(AuthUtil.getUserId());
+						item.setCreateUserName(AuthUtil.getUserName());
+						item.setBranchId(bills.getBranchId());
+						item.setUpdateUser(null);
+						item.setUpdateTime(null);
+						item.setUpdateUserName(null);
+						item.setPid(containers.getId());
+						item.setPpId(bills.getId());
+					}
+					containersBillsListNew.add(item);
+				}
+				containersBillsService.saveBatch(containersBillsListNew);
+			}
+*/
+		}
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.in(FeeCenter::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+		if (!feeCenterList.isEmpty()) {
+			List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
+				.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
+				.eq(FinAccBills::getIsDeleted, 0)
+				.in(FinAccBills::getBusinessBillId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+			List<FeeCenter> FeeCenterListNew = new ArrayList<>();
+			List<FinAccBills> finAccBillsListNew = new ArrayList<>();
+			for (FeeCenter item : feeCenterList) {
+				Bills bill = billsList.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
+				if (bill != null) {
+					item.setBillNo(bill.getBillNo());
+					item.setBusinessType(bill.getBusinessType());
+					item.setBillType(bill.getBillType());
+					item.setBillDate(bill.getBillDate());
+					item.setSrcType(bill.getSrcType());
+					item.setSrcId(bill.getSrcId());
+					item.setBookingAgentId(bill.getBookingAgentId());
+					item.setBookingAgentCnName(bill.getBookingAgentCnName());
+					item.setBookingAgentEnName(bill.getBookingAgentEnName());
+					item.setSrcCnName(bill.getSrcCnName());
+					item.setSrcEnName(bill.getSrcEnName());
+					item.setBillCorpId(bill.getCorpId());
+					item.setBillCorpCnName(bill.getCorpCnName());
+					item.setBillCorpEnName(bill.getCorpEnName());
+					item.setBillShortName(bill.getShortName());
+					item.setLineId(bill.getLineId());
+					item.setLineCnName(bill.getLineCnName());
+					item.setLineEnName(bill.getLineEnName());
+					item.setVesselId(bill.getVesselId());
+					item.setVesselEnName(bill.getVesselEnName());
+					item.setVesselCnName(bill.getVesselCnName());
+					item.setVoyageNo(bill.getVoyageNo());
+					item.setMblno(bill.getMblno());
+					item.setHblno(bill.getHblno());
+					item.setEtd(bill.getEtd());
+					item.setEta(bill.getEta());
+					item.setPolId(bill.getPolId());
+					item.setPolCode(bill.getPolCode());
+					item.setPolCnName(bill.getPolCnName());
+					item.setPolEnName(bill.getPolEnName());
+					item.setPodId(bill.getPodId());
+					item.setPodCode(bill.getPodCode());
+					item.setPodCnName(bill.getPodCnName());
+					item.setPodEnName(bill.getPodEnName());
+					item.setPaymode(bill.getMpaymode());
+					item.setPayplace(bill.getMpayplace());
+					item.setRefno(bill.getRefno());
+					item.setBookingNo(bill.getBookingNo());
+					item.setCntrNo(bill.getQuantityCntrTypesDescr());
+					item.setQuantityCntrDescr(bill.getQuantityCntrDescr());
+					item.setTeu(bill.getTeu());
+				}
+				FeeCenterListNew.add(item);
+				if (!finAccBillsList.isEmpty()) {
+					List<FinAccBills> finAccBills = finAccBillsList.stream().filter(e -> e.getId().equals(item.getAccBillId())).collect(Collectors.toList());
+					for (FinAccBills data : finAccBills) {
+						data.setBillDate(item.getBillDate());
+						data.setBusinessDate(item.getBillDate());
+						data.setBookingAgentId(item.getBookingAgentId());
+						data.setBookingAgentCnName(item.getBookingAgentCnName());
+						data.setBookingAgentEnName(item.getBookingAgentEnName());
+						data.setQuantityCntrDescr(item.getQuantityCntrDescr());
+						data.setTeu(item.getTeu());
+						data.setWarehousingDate(item.getStorageDate());
+						data.setOutboundDate(item.getOutboundDate());
+						data.setSrcId(item.getSrcId());
+						data.setSrcCnName(item.getSrcCnName());
+						data.setSrcEnName(item.getSrcEnName());
+						data.setSrcType(item.getSrcType());
+						data.setPaymode(item.getPaymode());
+						data.setCorpId(item.getCorpId());
+						data.setCorpCnName(item.getCorpCnName());
+						data.setCorpEnName(item.getCorpEnName());
+						data.setBillCorpId(item.getBillCorpId());
+						data.setBillCorpCnName(item.getBillCorpCnName());
+						data.setBillCorpEnName(item.getBillCorpEnName());
+						data.setVesselId(item.getVesselId());
+						data.setVesselCnName(item.getVesselCnName());
+						data.setVesselEnName(item.getVesselEnName());
+						data.setVoyageNo(item.getVoyageNo());
+						data.setMblno(item.getMblno());
+						data.setHblno(item.getHblno());
+						data.setRefno(item.getRefno());
+						data.setBookingNo(item.getBookingNo());
+						data.setEtd(item.getEtd());
+						data.setEta(item.getEta());
+						data.setPolId(item.getPolId());
+						data.setPolCnName(item.getPolCnName());
+						data.setPolEnName(item.getPolEnName());
+						data.setPodId(item.getPodId());
+						data.setPodCnName(item.getPodCnName());
+						data.setPodCode(item.getPodCode());
+						data.setPodEnName(item.getPodEnName());
+						finAccBillsListNew.add(data);
+					}
+				}
+			}
+			feeCenterService.updateBatchById(FeeCenterListNew);
+			if (!finAccBillsListNew.isEmpty()) {
+				finAccBillsService.updateBatchById(finAccBillsListNew);
+			}
+		}
+		for (Bills item : billsList) {
+			item.setEta(bills.getEta());
+			item.setActualEta(bills.getActualEta());
+			billsMapper.updateById(item);
+		}
+	}
+
+	@Override
+	public void itemRevoke(Bills bills, List<Bills> billsList) {
+		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
+			.eq(Containers::getTenantId, AuthUtil.getTenantId())
+			.eq(Containers::getIsDeleted, 0)
+			.eq(Containers::getPid, bills.getId())
+			.in(Containers::getSrcSplitOrderId, billsList.stream().map(Bills::getId).collect(Collectors.toList()))
+		);
+		if (!containersList.isEmpty()) {
+			containersService.removeByIds(containersList.stream().map(Containers::getId).collect(Collectors.toList()));
+			List<ContainersCommodity> containersCommodityList = containersCommodityService.list(new LambdaQueryWrapper<ContainersCommodity>()
+				.eq(ContainersCommodity::getTenantId, AuthUtil.getTenantId())
+				.eq(ContainersCommodity::getPpId, bills.getId())
+				.in(ContainersCommodity::getSrcSplitOrderId, billsList.stream().map(Bills::getId).collect(Collectors.toList()))
+			);
+			if (!containersCommodityList.isEmpty()) {
+				containersCommodityService.removeByIds(containersCommodityList.stream().map(ContainersCommodity::getId).collect(Collectors.toList()));
+			}
+			List<ContainersBills> containersBillsList = containersBillsService.list(new LambdaQueryWrapper<ContainersBills>()
+				.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
+				.eq(ContainersBills::getIsDeleted, 0)
+				.eq(ContainersBills::getPpId, bills.getId())
+				.in(ContainersBills::getSrcSplitOrderId, billsList.stream().map(Bills::getId).collect(Collectors.toList()))
+			);
+			if (!containersBillsList.isEmpty()) {
+				containersBillsService.removeByIds(containersBillsList.stream().map(ContainersBills::getId).collect(Collectors.toList()));
+			}
+		}
+	}
+
+	/**
+	 * 删除海运进出口明细表
+	 *
+	 * @param id 主表id
+	 */
+	@Override
+	public void removeItemList(Long id) {
+		SeaBillsDetail seaBillsDetail = seaBillsDetailService.getOne(new LambdaQueryWrapper<SeaBillsDetail>()
+			.eq(SeaBillsDetail::getTenantId, AuthUtil.getTenantId())
+			.eq(SeaBillsDetail::getPid, id));
+		if (seaBillsDetail != null) {
+			seaBillsDetailService.removeById(seaBillsDetail.getId());
+		}
+		List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+			.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+			.eq(PreContainers::getIsDeleted, 0)
+			.eq(PreContainers::getPid, id));
+		if (!preContainersList.isEmpty()) {
+			preContainersService.removeByIds(preContainersList.stream().map(PreContainers::getId).collect(Collectors.toList()));
+		}
+		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
+			.eq(Containers::getTenantId, AuthUtil.getTenantId())
+			.eq(Containers::getIsDeleted, 0)
+			.eq(Containers::getPid, id));
+		if (!containersList.isEmpty()) {
+			containersService.removeByIds(containersList.stream().map(Containers::getId).collect(Collectors.toList()));
+		}
+		List<ContainersCommodity> containersCommodityList = containersCommodityService.list(new LambdaQueryWrapper<ContainersCommodity>()
+			.eq(ContainersCommodity::getTenantId, AuthUtil.getTenantId())
+			.eq(ContainersCommodity::getIsDeleted, 0)
+			.eq(ContainersCommodity::getPpId, id));
+		if (!containersCommodityList.isEmpty()) {
+			containersCommodityService.removeByIds(containersCommodityList.stream().map(ContainersCommodity::getId).collect(Collectors.toList()));
+		}
+		List<ContainersBills> containersBillsList = containersBillsService.list(new LambdaQueryWrapper<ContainersBills>()
+			.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
+			.eq(ContainersBills::getIsDeleted, 0)
+			.eq(ContainersBills::getPpId, id));
+		if (!containersBillsList.isEmpty()) {
+			containersBillsService.removeByIds(containersBillsList.stream().map(ContainersBills::getId).collect(Collectors.toList()));
+		}
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getPid, id));
+		if (!feeCenterList.isEmpty()) {
+			for (FeeCenter item : feeCenterList) {
+				if (1 == item.getAccStatus()) {
+					throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单");
+				}
+				if (item.getStlPid() != null) {
+					throw new RuntimeException("费用:" + item.getFeeCnName() + "已申请");
+				}
+			}
+			feeCenterService.removeByIds(feeCenterList.stream().map(FeeCenter::getId).collect(Collectors.toList()));
+		}
+
+		List<FilesCenter> filesList = filesCenterService.list(new LambdaQueryWrapper<FilesCenter>()
+			.eq(FilesCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FilesCenter::getIsDeleted, 0)
+			.eq(FilesCenter::getPid, id));
+		if (!filesList.isEmpty()) {
+			filesCenterService.removeByIds(filesList.stream().map(FilesCenter::getId).collect(Collectors.toList()));
+		}
+	}
+
+	@Override
+	public FeeCenter addFeeCenterQuotation(Bills bills, String dc, int count, BFees fees, PreContainers items, List<BCurExrate> curExrateList, String exrateType, String type) {
+		FeeCenter feeCenter = new FeeCenter();
+		feeCenter.setSrcCostId(items.getSrcCostId());
+		feeCenter.setSrcCostNo(items.getSrcCostNo());
+		feeCenter.setBranchId(bills.getBranchId());
+		feeCenter.setBranchName(bills.getBranchName());
+		feeCenter.setPid(bills.getId());
+		feeCenter.setCntrNo(bills.getQuantityCntrTypesDescr());
+		feeCenter.setBillNo(bills.getBillNo());
+		feeCenter.setBusinessType(bills.getBusinessType());
+		feeCenter.setBillType(bills.getBillType());
+		feeCenter.setBillDate(bills.getBillDate());
+		feeCenter.setBillCorpId(bills.getCorpId());
+		feeCenter.setBillCorpCnName(bills.getCorpCnName());
+		feeCenter.setBillCorpEnName(bills.getCorpEnName());
+		feeCenter.setBillShortName(bills.getShortName());
+		feeCenter.setBillBranchId(bills.getBranchId());
+		feeCenter.setBillBranchName(bills.getBranchName());
+		feeCenter.setLineId(bills.getLineId());
+		feeCenter.setLineCnName(bills.getLineCnName());
+		feeCenter.setLineEnName(bills.getLineEnName());
+		feeCenter.setVesselId(bills.getVesselId());
+		feeCenter.setVesselCnName(bills.getVesselCnName());
+		feeCenter.setVesselEnName(bills.getVesselEnName());
+		feeCenter.setVoyageNo(bills.getVoyageNo());
+		feeCenter.setMblno(bills.getMblno());
+		feeCenter.setHblno(bills.getHblno());
+		feeCenter.setEtd(bills.getEtd());
+		feeCenter.setEta(bills.getEta());
+		feeCenter.setPolId(bills.getPolId());
+		feeCenter.setPolCode(bills.getPolCode());
+		feeCenter.setPolCnName(bills.getPolCnName());
+		feeCenter.setPolEnName(bills.getPolEnName());
+		feeCenter.setPodId(bills.getPodId());
+		feeCenter.setPodCode(bills.getPodCode());
+		feeCenter.setPodCnName(bills.getPodCnName());
+		feeCenter.setPodEnName(bills.getPodEnName());
+		feeCenter.setDc(dc);
+		feeCenter.setPaymode(bills.getMpaymode());
+		feeCenter.setSort(count);
+		feeCenter.setFeeId(fees.getId());
+		feeCenter.setCorpType("国内直接客户");
+		feeCenter.setFeeCode(fees.getCode());
+		feeCenter.setFeeCnName(fees.getCnName());
+		feeCenter.setFeeEnName(fees.getEnName());
+		feeCenter.setUnitNo(fees.getUnitNo());
+		feeCenter.setCurCode("USD");
+		feeCenter.setExrate(currencyUtils.obtainExrate(feeCenter.getDc(), curExrateList, feeCenter.getCurCode(), "1"));
+		feeCenter.setQuantity(new BigDecimal(items.getQuantity() + ""));
+		if ("1".equals(type)) {
+			feeCenter.setCorpId(bills.getCorpId());
+			feeCenter.setCorpCnName(bills.getCorpCnName());
+			feeCenter.setCorpEnName(bills.getCorpEnName());
+			feeCenter.setShortName(bills.getShortName());
+			feeCenter.setPrice(items.getOceanFreight());
+			feeCenter.setCostPrice(items.getCostPrice());
+			BCorps bCorps = bCorpsService.getById(bills.getCorpId());
+			if (bCorps != null) {
+				feeCenter.setGenerationCorpId(bCorps.getBookingAgentId());
+				feeCenter.setGenerationCorpCnName(bCorps.getBookingAgentCnName());
+				feeCenter.setGenerationCorpEnName(bCorps.getBookingAgentEnName());
+			}
+		} else if ("2".equals(type)) {
+		/*	BCorps bCorps = bCorpsService.getOne(new LambdaQueryWrapper<BCorps>()
+				.eq(BCorps::getTenantId, AuthUtil.getTenantId())
+				.eq(BCorps::getIsDeleted, 0)
+				.eq(BCorps::getCode, "ZBYF"));
+			if (bCorps == null) {
+				throw new RuntimeException("基础资料未查到编码为‘ZBYF’往来单位");
+			}*/
+			feeCenter.setCorpId(bills.getCarrierId());
+			feeCenter.setCorpCnName(bills.getCarrierCnName());
+			feeCenter.setCorpEnName(bills.getCarrierEnName());
+			feeCenter.setShortName(bills.getCarrierShortName());
+			feeCenter.setPrice(items.getCostPrice());
+			feeCenter.setCostPrice(items.getCostPrice());
+			BCorps bCorps = bCorpsService.getById(bills.getCarrierId());
+			if (bCorps != null) {
+				feeCenter.setGenerationCorpId(bCorps.getBookingAgentId());
+				feeCenter.setGenerationCorpCnName(bCorps.getBookingAgentCnName());
+				feeCenter.setGenerationCorpEnName(bCorps.getBookingAgentEnName());
+			}
+		}
+		feeCenter.setAmount(feeCenter.getPrice().multiply(feeCenter.getQuantity()));
+		if (ObjectUtils.isNull(feeCenter.getAmount())) {
+			feeCenter.setAmount(new BigDecimal("0"));
+		}
+		if (exrateType.equals(feeCenter.getCurCode())) {
+			feeCenter.setAmountLoc(feeCenter.getAmount());
+		} else {
+			if (new BigDecimal("0").compareTo(feeCenter.getAmount()) != 0) {
+				feeCenter.setAmountLoc(feeCenter.getAmount().multiply(feeCenter.getExrate()));
+			} else {
+				feeCenter.setAmountLoc(new BigDecimal("0"));
+			}
+		}
+		feeCenter.setUnsettledAmount(feeCenter.getAmount());
+		if (new BigDecimal("0").compareTo(feeCenter.getAmount()) == 0) {
+			return null;
+		} else {
+			return feeCenter;
+		}
+	}
+}

+ 31 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/IBillUtils.java

@@ -0,0 +1,31 @@
+package org.springblade.los.Util;
+
+import org.springblade.los.basic.cur.entity.BCurExrate;
+import org.springblade.los.basic.fees.entity.BFees;
+import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.los.business.sea.entity.PreContainers;
+import org.springblade.los.finance.fee.entity.FeeCenter;
+
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/12/29
+ */
+public interface IBillUtils {
+
+	void itemCopy(Bills bills, List<Bills> billsList, boolean status);
+
+	void itemRevoke(Bills bills, List<Bills> billsList);
+
+	/**
+	 * 删除海运进出口明细表
+	 *
+	 * @param id 主表id
+	 */
+	 void removeItemList(Long id);
+
+	 FeeCenter addFeeCenterQuotation(Bills bills, String dc, int count, BFees fees,
+											PreContainers items, List<BCurExrate> curExrateList, String exrateType, String type);
+
+}

+ 1 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/RouteCostController.java

@@ -445,6 +445,7 @@ public class RouteCostController extends BladeController {
 				for (RouteCost item : list) {
 					MktSlotItem mktSlotItem = new MktSlotItem();
 					mktSlotItem.setSrcId(item.getId());
+					mktSlotItem.setSrcNo(item.getBusinessNo());
 					mktSlotItem.setShippingCompanyId(item.getActualShippingCompanyId());
 					mktSlotItem.setShippingCompanyCname(item.getActualShippingCompanyCname());
 					mktSlotItem.setShippingCompanyEname(item.getActualShippingCompanyEname());

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/controller/BoxDynamicsRecordController.java

@@ -169,7 +169,7 @@ public class BoxDynamicsRecordController extends BladeController {
 	 * 同步
 	 */
 	@GetMapping("/synchronous")
-	public R synchronous(@RequestParam ("id") String id ,@RequestParam ("ids") String ids) {
+	public R synchronous(@RequestParam ("id") String id ,@RequestParam ("ids") String ids)throws IOException {
 		return boxDynamicsRecordService.synchronous(id,ids);
 	}
 }

+ 2 - 1
blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/IBoxDynamicsRecordService.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.text.ParseException;
 
 /**
  * 箱动态记录表 服务类
@@ -44,5 +45,5 @@ public interface IBoxDynamicsRecordService extends IService<BoxDynamicsRecord> {
 
     R importExcel(MultipartFile file,String type) throws IOException;
 
-	R synchronous(String id, String ids);
+	R synchronous(String id, String ids) throws IOException;
 }

+ 112 - 83
blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java

@@ -75,6 +75,9 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.rmi.RemoteException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
@@ -272,7 +275,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public R synchronous(String id, String ids) {
+	public R synchronous(String id, String ids) throws IOException {
 		BoxDynamicsRecord boxDynamicsRecord = baseMapper.selectById(id);
 		List<BoxDynamicsRecordItems> itemsList = boxDynamicsRecordItemsService.list(new LambdaQueryWrapper<BoxDynamicsRecordItems>()
 			.eq(BoxDynamicsRecordItems::getTenantId, AuthUtil.getTenantId())
@@ -281,8 +284,17 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		if (CollectionUtils.isEmpty(itemsList)) {
 			throw new SecurityException("数据不能为空");
 		}
+		String boxBusinessConnectionTime = sysClient.getParamService("box.business.connection.time");
+		Date date = null;
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		if (ObjectUtils.isNotNull(boxBusinessConnectionTime)) {
+			try {
+				date = dateFormat.parse(boxBusinessConnectionTime);
+			} catch (ParseException e) {
+				throw new RuntimeException(e);
+			}
+		}
 		if ("JC".equals(boxDynamicsRecord.getApproachExit())) {
-			String whetherOpenEntryFee = sysClient.getParamService("whether.open.entry.fee");
 			List<BoxDynamicsRecordItems> itemsListJC = itemsList.stream().filter(e -> !e.getObjective().equals("C")).collect(Collectors.toList());
 			if (!itemsListJC.isEmpty()) {
 				List<String> boxCodeList = itemsListJC.stream().map(BoxDynamicsRecordItems::getBoxCode).filter(Objects::nonNull)
@@ -365,6 +377,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							if ("使用中".equals(archives.getStatus())) {
 								throw new RuntimeException("箱号:" + item.getBoxCode() + "状态为使用中");
 							}
+							archives.setBoxStatus(item.getBoxStatus());
 							archives.setUpdateTime(new Date());
 							archives.setUpdateUser(AuthUtil.getUserId());
 							archives.setUpdateUserName(AuthUtil.getUserName());
@@ -389,6 +402,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							archives.setCreateUser(AuthUtil.getUserId());
 							archives.setCreateUserName(AuthUtil.getUserName());
 							archives.setStatus("待使用");
+							archives.setBoxStatus(item.getBoxStatus());
 							archives.setNewDate(item.getApproachExitDate());
 							archives.setBoxDynamics("空箱提箱进场");
 							archives.setBoxBelongsTo("SOC");
@@ -800,27 +814,25 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 				if (businessType == null) {
 					throw new RuntimeException("未找到可用业务类型");
 				}
-				List<Bills> billsHYJKListFD = new ArrayList<>();
-				List<Containers> containersHYJKList = new ArrayList<>();
-				if ("1".equals(whetherOpenEntryFee)){
-					billsHYJKListFD = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
-						.eq(Bills::getTenantId, AuthUtil.getTenantId())
-						.eq(Bills::getIsDeleted, 0)
-						.eq(Bills::getBusinessType, "SI")
-						.apply("find_in_set(bill_type,'MH,DD')")
-						.in(Bills::getHblno, putBoxItemsList.stream().map(PutBoxItems::getHblno).distinct().collect(Collectors.toList())));
-					if (billsHYJKListFD.isEmpty()) {
-						throw new RuntimeException("未查到海运进口单据");
-					}
-					containersHYJKList = containersService.list(new LambdaQueryWrapper<Containers>()
-						.eq(Containers::getTenantId, AuthUtil.getTenantId())
-						.eq(Containers::getIsDeleted, 0)
-						.in(Containers::getPid, billsHYJKListFD.stream().map(Bills::getId).collect(Collectors.toList()))
-						.in(Containers::getCntrNo, itemsListFC.stream().map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.toList()))
-					);
-					if (containersHYJKList.isEmpty()) {
-						throw new RuntimeException("未查到配箱信息");
-					}
+				List<Bills> billsHYJKListFD;
+				List<Containers> containersHYJKList;
+				billsHYJKListFD = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
+					.eq(Bills::getTenantId, AuthUtil.getTenantId())
+					.eq(Bills::getIsDeleted, 0)
+					.eq(Bills::getBusinessType, "SI")
+					.apply("find_in_set(bill_type,'MH,DD')")
+					.in(Bills::getHblno, putBoxItemsList.stream().map(PutBoxItems::getHblno).distinct().collect(Collectors.toList())));
+				if (billsHYJKListFD.isEmpty()) {
+					throw new RuntimeException("未查到海运进口单据");
+				}
+				containersHYJKList = containersService.list(new LambdaQueryWrapper<Containers>()
+					.eq(Containers::getTenantId, AuthUtil.getTenantId())
+					.eq(Containers::getIsDeleted, 0)
+					.in(Containers::getPid, billsHYJKListFD.stream().map(Bills::getId).collect(Collectors.toList()))
+					.in(Containers::getCntrNo, itemsListFC.stream().map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.toList()))
+				);
+				if (containersHYJKList.isEmpty()) {
+					throw new RuntimeException("未查到配箱信息");
 				}
 				List<Containers> containersListNew = new ArrayList<>();
 				for (Bills billsHYJK : billsHYJKListFD) {
@@ -867,6 +879,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 						archives.setUpdateUser(AuthUtil.getUserId());
 						archives.setUpdateUserName(AuthUtil.getUserName());
 						archives.setStatus("待使用");
+						archives.setBoxStatus(recordItems.getBoxStatus());
 						archives.setNewDate(recordItems.getApproachExitDate());
 						archives.setBoxDynamics("空箱进场");
 						archives.setAddressId(billsHYJK.getPodId());
@@ -1289,7 +1302,11 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							}
 						}
 					}
-					if ("1".equals(whetherOpenEntryFee)){
+					boolean status = true;
+					if (billsHYJK.getEtd().compareTo(date) < 0) {
+						status = false;
+					}
+					if (status) {
 						//计算超期箱使费
 						this.countOverdueFeeV1(billsHYJK, tradingBoxList, tradingBoxItemOldList, putBoxItemsOldList, putBoxList);
 					}
@@ -1375,6 +1392,11 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 			List<PutBox> putBoxes = new ArrayList<>();
 			List<TradingBox> tradingBoxes = new ArrayList<>();
 			for (BoxDynamicsRecordItems item : itemsList) {
+				Bills billsDetails = billsList.stream().filter(e -> e.getHblno().equals(item.getHblno())).findFirst().orElse(null);
+				boolean status = true;
+				if (billsDetails != null && billsDetails.getEtd().compareTo(date) < 0) {
+					status = false;
+				}
 				PutBox putBoxData;
 				PutBox putBox = putBoxList.stream().filter(e -> e.getContainerNumber().equals(item.getHblno())
 					&& ObjectUtils.isNotNull(e.getPolId()) && e.getPolId().equals(item.getPortId())
@@ -1392,6 +1414,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 					}
 				}
 				if (putBoxData != null) {
+					putBoxData.setStatus(status);
 					if (!putBoxes.isEmpty()) {
 						if (!putBoxes.stream().map(PutBox::getId).collect(Collectors.toList()).contains(putBoxData.getId())) {
 							putBoxes.add(putBoxData);
@@ -1555,6 +1578,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 						putBoxItem.setBoxEastId(Long.parseLong(putBoxData.getBoxEastId()));
 						putBoxItem.setBoxEastName(putBoxData.getBoxEastName());
 					}
+					putBoxItem.setWhetherStatus(status);
 					putBoxItems.add(putBoxItem);
 					if ("OW(拿),OW(放)".contains(putBoxData.getBusType())) {
 						if (!tradingBoxList.isEmpty()) {
@@ -1745,71 +1769,73 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 						item.setCode(itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber()))
 							.map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.joining(",")));
 					}
-					long count = itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber())).count();
-					if ("OW(拿)".equals(item.getBusType())) {
-						item.setStorageNum(item.getStorageNum() - Integer.parseInt(count + ""));
-						if (item.getStorageNum() < 0) {
-							throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余场地盘存小于本次导入箱数");
-						}
-					} else if ("OW(放)".equals(item.getBusType())) {
-						item.setThisSuitcaseNum(Integer.parseInt(count + ""));
-						item.setSuitcaseNum(item.getSuitcaseNum() + Integer.parseInt(count + ""));
-						item.setNotSuitcaseNum(item.getTotalNum() - item.getSuitcaseNum());
-						if (item.getNotSuitcaseNum() < 0) {
-							throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余未提箱小于本次导入箱数");
-						}
-						item.setRemainingNum(item.getRemainingNum() - Integer.parseInt(count + ""));
-						putBoxListOld.add(item);
-					} else {
-						item.setStorageNum(item.getStorageNum() - Integer.parseInt(count + ""));
-						if (item.getStorageNum() < 0) {
-							throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余场地盘存小于本次导入箱数");
+					if (item.getStatus()) {
+						long count = itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber())).count();
+						if ("OW(拿)".equals(item.getBusType())) {
+							item.setStorageNum(item.getStorageNum() - Integer.parseInt(count + ""));
+							if (item.getStorageNum() < 0) {
+								throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余场地盘存小于本次导入箱数");
+							}
+						} else if ("OW(放)".equals(item.getBusType())) {
+							item.setThisSuitcaseNum(Integer.parseInt(count + ""));
+							item.setSuitcaseNum(item.getSuitcaseNum() + Integer.parseInt(count + ""));
+							item.setNotSuitcaseNum(item.getTotalNum() - item.getSuitcaseNum());
+							if (item.getNotSuitcaseNum() < 0) {
+								throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余未提箱小于本次导入箱数");
+							}
+							item.setRemainingNum(item.getRemainingNum() - Integer.parseInt(count + ""));
+							putBoxListOld.add(item);
+						} else {
+							item.setStorageNum(item.getStorageNum() - Integer.parseInt(count + ""));
+							if (item.getStorageNum() < 0) {
+								throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余场地盘存小于本次导入箱数");
+							}
 						}
-					}
-					if (!containersList.isEmpty()) {
-						if (!"OW(放)".equals(item.getBusType())) {
-							List<String> boxList = itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber()))
-								.map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.toList());
-							List<Containers> containers = containersList.stream()
-								.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(
-									Comparator.comparing(f -> f.getContainerNumber() + f.getCntrNo()))), ArrayList::new));
-							if (!containers.isEmpty()) {
-								long size = containers.stream().filter(e -> ObjectUtils.isNotNull(e.getContainerNumber()) &&
-									e.getContainerNumber().equals(item.getContainerNumber()) && boxList.contains(e.getCntrNo())).count();
-								item.setOccupyNum(item.getOccupyNum() - Integer.parseInt(size + ""));
-								if (item.getOccupyNum() < 0) {
-									throw new RuntimeException("放箱号:" + item.getContainerNumber() + "箱号未被操作占用");
+						if (!containersList.isEmpty()) {
+							if (!"OW(放)".equals(item.getBusType())) {
+								List<String> boxList = itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber()))
+									.map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.toList());
+								List<Containers> containers = containersList.stream()
+									.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(
+										Comparator.comparing(f -> f.getContainerNumber() + f.getCntrNo()))), ArrayList::new));
+								if (!containers.isEmpty()) {
+									long size = containers.stream().filter(e -> ObjectUtils.isNotNull(e.getContainerNumber()) &&
+										e.getContainerNumber().equals(item.getContainerNumber()) && boxList.contains(e.getCntrNo())).count();
+									item.setOccupyNum(item.getOccupyNum() - Integer.parseInt(size + ""));
+									if (item.getOccupyNum() < 0) {
+										throw new RuntimeException("放箱号:" + item.getContainerNumber() + "箱号未被操作占用");
+									}
 								}
 							}
 						}
-					}
-					putBoxList1.add(item);
-					if (!tradingBoxes.isEmpty()) {
-						TradingBox tradingBox = tradingBoxes.stream().filter(e -> e.getId().equals(item.getSrcId())).findFirst().orElse(null);
-						if (tradingBox != null) {
-							if (ObjectUtils.isNotNull(item.getCode())) {
-								for (BoxDynamicsRecordItems e : itemsList) {
-									if (e.getContainerNumber().equals(item.getContainerNumber()) && ObjectUtils.isNotNull(tradingBox.getCode())
-										&& !tradingBox.getCode().contains(e.getBoxCode())) {
-										tradingBox.setCode(tradingBox.getCode() + "," + e.getBoxCode());
-									} else {
-										tradingBox.setCode(e.getBoxCode());
+						putBoxList1.add(item);
+						if (!tradingBoxes.isEmpty()) {
+							TradingBox tradingBox = tradingBoxes.stream().filter(e -> e.getId().equals(item.getSrcId())).findFirst().orElse(null);
+							if (tradingBox != null) {
+								if (ObjectUtils.isNotNull(item.getCode())) {
+									for (BoxDynamicsRecordItems e : itemsList) {
+										if (e.getContainerNumber().equals(item.getContainerNumber()) && ObjectUtils.isNotNull(tradingBox.getCode())
+											&& !tradingBox.getCode().contains(e.getBoxCode())) {
+											tradingBox.setCode(tradingBox.getCode() + "," + e.getBoxCode());
+										} else {
+											tradingBox.setCode(e.getBoxCode());
+										}
 									}
+								} else {
+									tradingBox.setCode(itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber()))
+										.map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.joining(",")));
 								}
-							} else {
-								tradingBox.setCode(itemsList.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber()))
-									.map(BoxDynamicsRecordItems::getBoxCode).collect(Collectors.joining(",")));
-							}
-							if ("OW(放)".equals(item.getBusType())) {
-								item.setSuitcaseNum(item.getSuitcaseNum() + Integer.parseInt(count + ""));
-								item.setNotSuitcaseNum(item.getTotalNum() - item.getSuitcaseNum());
-								if (item.getNotSuitcaseNum() < 0) {
-									throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余未提箱小于本次导入箱数");
+								if ("OW(放)".equals(item.getBusType())) {
+									item.setSuitcaseNum(item.getSuitcaseNum() + Integer.parseInt(count + ""));
+									item.setNotSuitcaseNum(item.getTotalNum() - item.getSuitcaseNum());
+									if (item.getNotSuitcaseNum() < 0) {
+										throw new RuntimeException("放箱号:" + item.getContainerNumber() + "剩余未提箱小于本次导入箱数");
+									}
 								}
+								tradingBox.setActualBoxNumber(tradingBox.getActualBoxNumber() - Integer.parseInt(count + ""));
+								tradingBox.setRemainingBoxNumber(tradingBox.getBoxNumber() - tradingBox.getActualBoxNumber());
+								tradingBoxMapper.updateById(tradingBox);
 							}
-							tradingBox.setActualBoxNumber(tradingBox.getActualBoxNumber() - Integer.parseInt(count + ""));
-							tradingBox.setRemainingBoxNumber(tradingBox.getBoxNumber() - tradingBox.getActualBoxNumber());
-							tradingBoxMapper.updateById(tradingBox);
 						}
 					}
 				}
@@ -1905,7 +1931,10 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 			if (!tradingBoxItems.isEmpty()) {
 				tradingBoxItemService.saveOrUpdateBatch(tradingBoxItems);
 			}
-			this.countOverdueFee(putBoxList, tradingBoxList, tradingBoxItems, containersListNew, putBoxItems);
+			List<PutBoxItems> putBoxItemsArrayList = putBoxItems.stream().filter(e -> e.getWhetherStatus().equals(true)).collect(Collectors.toList());
+			if (!putBoxItemsArrayList.isEmpty()) {
+				this.countOverdueFee(putBoxList, tradingBoxList, tradingBoxItems, containersListNew, putBoxItemsArrayList);
+			}
 		}
 		for (BoxDynamicsRecordItems item : itemsList) {
 			item.setWhetherSynchronous("1");
@@ -2002,7 +2031,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 					}
 					LocalDateTime ldt1 = bills.getEtd().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 					LocalDateTime ldt2 = polPickUpDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
-					long days = ChronoUnit.DAYS.between(ldt1,ldt2);
+					long days = ChronoUnit.DAYS.between(ldt1, ldt2);
 					//超期天数
 					int overdueDays = 0;
 					if (ObjectUtils.isNotNull(bills.getPolFreeBoxUseDays()) || 0 == bills.getPolFreeBoxUseDays() ||

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/impl/MktSlotServiceImpl.java

@@ -328,6 +328,8 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 				mktSlotQuotation.setTransitPortCname(item.getTransitPortCname());
 				mktSlotQuotation.setTransitPortCode(item.getTransitPortCode());
 				mktSlotQuotation.setTransitPortEname(item.getTransitPortEname());
+				mktSlotQuotation.setSrcId(item.getSrcId());
+				mktSlotQuotation.setSrcNo(item.getSrcNo());
 				mktSlotQuotationList.add(mktSlotQuotation);
 			}
 			item.setUpdateUser(AuthUtil.getUserId());

+ 26 - 10
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java

@@ -38,7 +38,6 @@ import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.SeaBillsDetail;
 import org.springblade.los.business.sea.service.IBillsService;
 import org.springblade.los.business.sea.service.ISeaBillsDetailService;
-import org.springblade.los.business.sea.vo.BillsVO;
 import org.springblade.los.excel.BillsExcel;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
@@ -90,6 +89,7 @@ public class BillsController extends BladeController {
 		lambdaQueryWrapper.eq(Bills::getIsDeleted, 0)
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
 			.like(ObjectUtils.isNotNull(bills.getBillOfLadingStatus()), Bills::getBillOfLadingStatus, bills.getBillOfLadingStatus())
+			.eq(ObjectUtils.isNotNull(bills.getEdiStatus()), Bills::getEdiStatus, bills.getEdiStatus())
 			.eq(ObjectUtils.isNotNull(bills.getTransferOrderStatus()), Bills::getTransferOrderStatus, bills.getTransferOrderStatus())
 			.eq(ObjectUtils.isNotNull(bills.getLogisticsStatus()), Bills::getLogisticsStatus, bills.getLogisticsStatus())
 			.eq(ObjectUtils.isNotNull(bills.getBoxBelongsTo()), Bills::getBoxBelongsTo, bills.getBoxBelongsTo())
@@ -140,14 +140,14 @@ public class BillsController extends BladeController {
 			lambdaQueryWrapper.ge(Bills::getActualEta, bills.getActualEtaList().get(0));
 			lambdaQueryWrapper.le(Bills::getActualEta, bills.getActualEtaList().get(1));
 		}
-		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")  ) {
+		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
 			lambdaQueryWrapper.eq(Bills::getBranchId, AuthUtil.getDeptId());
 			if (!AuthUtil.getUserRole().contains("secondaryAdmin") && !AuthUtil.getUserRole().contains("财务") && !AuthUtil.getUserRole().contains("操作经理")) {
 				lambdaQueryWrapper.and(i -> i.eq(AuthUtil.getUserRole().contains("业务员"), Bills::getSrcId, AuthUtil.getUserId()).or()
 					.eq(AuthUtil.getUserRole().contains("操作员"), Bills::getOperatorId, AuthUtil.getUserId()).or()
 					.eq(AuthUtil.getUserRole().contains("客服"), Bills::getCustomerServiceId, AuthUtil.getUserId()).or()
 					.eq(Bills::getCreateUser, AuthUtil.getUserId()));
-			}else{
+			} else {
 				lambdaQueryWrapper.eq(ObjectUtils.isNotNull(bills.getSrcType()), Bills::getSrcType, bills.getSrcType())
 					.and(ObjectUtils.isNotNull(bills.getSrcCnName()), i -> i.like(Bills::getSrcCnName, bills.getSrcCnName()).or()
 						.like(Bills::getSrcEnName, bills.getSrcCnName()));
@@ -193,7 +193,7 @@ public class BillsController extends BladeController {
 				} else if (12 == bills.getBillStatus()) {
 					lambdaQueryWrapper.eq(Bills::getStatus, 0);
 					lambdaQueryWrapper.eq(Bills::getTransferOrderStatus, "已转单");
-				}else{
+				} else {
 					lambdaQueryWrapper.ne(Bills::getBillStatus, "1");
 				}
 			} else if ("SI".equals(bills.getBusinessType())) {
@@ -216,7 +216,7 @@ public class BillsController extends BladeController {
 				} else if (10 == bills.getBillStatus()) {
 					lambdaQueryWrapper.isNotNull(Bills::getClearanceDate);
 					lambdaQueryWrapper.eq(Bills::getBillStatus, 0);
-				}else{
+				} else {
 					lambdaQueryWrapper.ne(Bills::getBillStatus, "1");
 				}
 			}
@@ -250,7 +250,7 @@ public class BillsController extends BladeController {
 				lambdaQueryWrapper.orderByAsc(Bills::getMasterBillNo);
 				lambdaQueryWrapper.orderByDesc(Bills::getBillType);
 				lambdaQueryWrapper.orderByAsc(Bills::getHblno);
-			}else if ("3".equals(bills.getBillSort())) {
+			} else if ("3".equals(bills.getBillSort())) {
 				lambdaQueryWrapper.orderByAsc(Bills::getMasterBillNo);
 				lambdaQueryWrapper.orderByDesc(Bills::getBillType);
 				lambdaQueryWrapper.orderByAsc(Bills::getHblno);
@@ -305,7 +305,7 @@ public class BillsController extends BladeController {
 					.eq(AuthUtil.getUserRole().contains("操作员"), Bills::getOperatorId, AuthUtil.getUserId()).or()
 					.eq(AuthUtil.getUserRole().contains("客服"), Bills::getCustomerServiceId, AuthUtil.getUserId()).or()
 					.eq(Bills::getCreateUser, AuthUtil.getUserId()));
-			}else{
+			} else {
 				lambdaQueryWrapper.eq(ObjectUtils.isNotNull(bills.getSrcType()), Bills::getSrcType, bills.getSrcType())
 					.and(ObjectUtils.isNotNull(bills.getSrcCnName()), i -> i.like(Bills::getSrcCnName, bills.getSrcCnName()).or()
 						.like(Bills::getSrcEnName, bills.getSrcCnName()));
@@ -577,7 +577,7 @@ public class BillsController extends BladeController {
 							@RequestParam(value = "copyCntr", required = false) String copyCntr,
 							@RequestParam(value = "containers", required = false) String containers,
 							@RequestParam(value = "copyFee", required = false) String copyFee) {
-		return billsService.batchCopyBills(ids, billType, copyCntr, copyFee,containers);
+		return billsService.batchCopyBills(ids, billType, copyCntr, copyFee, containers);
 	}
 
 	/**
@@ -683,7 +683,7 @@ public class BillsController extends BladeController {
 				} else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}*/
-			}else{
+			} else {
 				lambdaQueryWrapper.eq(ObjectUtils.isNotNull(bills.getSrcType()), Bills::getSrcType, bills.getSrcType())
 					.and(ObjectUtils.isNotNull(bills.getSrcCnName()), i -> i.like(Bills::getSrcCnName, bills.getSrcCnName()).or()
 						.like(Bills::getSrcEnName, bills.getSrcCnName()));
@@ -975,9 +975,25 @@ public class BillsController extends BladeController {
 	 * 海运出口同步订舱箱型箱量
 	 */
 	@GetMapping("/synchronousBoxType")
-	public R synchronousBoxType( Bills bills){
+	public R synchronousBoxType(Bills bills) {
 		return billsService.synchronousBoxType(bills);
 	}
 
+	/**
+	 * 发送下货纸验证提示
+	 */
+	@GetMapping("/sendVerificationPrompt")
+	public R sendVerificationPrompt(@RequestParam("ids") String ids) {
+		return billsService.sendVerificationPrompt(ids);
+	}
+
+	/**
+	 * 发送下货纸
+	 */
+	@GetMapping("/sendDeliveryPaper")
+	public R sendDeliveryPaper(@RequestParam("ids") String ids) {
+		return billsService.sendDeliveryPaper(ids);
+	}
+
 }
 

+ 8 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BookingCabinController.java

@@ -199,6 +199,14 @@ public class BookingCabinController extends BladeController {
 	}
 
 	/**
+	 * 校验提示
+	 */
+	@PostMapping("/verificationPrompt")
+	public R verificationPrompt(@Valid @RequestBody Bills bills) {
+		return billsService.verificationPrompt(bills);
+	}
+
+	/**
 	 * 提交预定舱
 	 */
 	@PostMapping("/submitBookingCabin")

+ 6 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java

@@ -239,4 +239,10 @@ public interface IBillsService extends IService<Bills> {
 	R revokeElectronBillOfLading(Long id);
 
 	IPage<Bills> selectChangeOrder(IPage<Object> page, Bills bills);
+
+	R verificationPrompt(Bills bills);
+
+	R sendVerificationPrompt(String ids);
+
+	R sendDeliveryPaper(String ids);
 }

+ 181 - 415
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java

@@ -33,13 +33,9 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.los.Util.BoxNumUtils;
-import org.springblade.los.Util.CurrencyUtils;
-import org.springblade.los.Util.StringTools;
-import org.springblade.los.Util.ZrUtil;
+import org.springblade.los.Util.*;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
-import org.springblade.los.basic.commodity.mapper.CommodityMapper;
 import org.springblade.los.basic.corps.entity.BCorps;
 import org.springblade.los.basic.corps.mapper.CorpsMapper;
 import org.springblade.los.basic.corps.service.IBCorpsService;
@@ -67,6 +63,7 @@ import org.springblade.los.check.entity.LosAuditPathsLevels;
 import org.springblade.los.check.service.IAuditPathsActsService;
 import org.springblade.los.check.service.IAuditPathsLevelsService;
 import org.springblade.los.check.service.IAuditProecessService;
+import org.springblade.los.excel.DeliveryPaperExcel;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
@@ -139,8 +136,6 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 
 	private final CorpsMapper corpsMapper;
 
-	private final CommodityMapper commodityMapper;
-
 	private final IHmmEdiService hmmEdiService;
 
 	private final ZrUtil zrUtil;
@@ -163,6 +158,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 
 	private final IReceiptService receiptService;
 
+	private final IBillUtils billUtils;
+
 	@Override
 	public IPage<Bills> selectBillsPage(IPage<Bills> page, Bills bills) {
 		return page.setRecords(baseMapper.selectBillsPage(page, bills));
@@ -1490,7 +1487,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				measurement = measurement.add(billsList.stream().map(Bills::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 				marks = billsList.stream().map(Bills::getMarks).filter(Objects::nonNull).collect(Collectors.joining("&|&"));
 				commodityDescr = billsList.stream().map(Bills::getCommodityDescr).filter(Objects::nonNull).collect(Collectors.joining("&|&"));
-				this.itemCopy(bills, billsList, false);
+				billUtils.itemCopy(bills, billsList, false);
 			}
 			bills.setTeuTotal(teuTotal);
 			bills.setGrossWeight(grossWeight);
@@ -1509,225 +1506,6 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		return R.data("操作成功");
 	}
 
-	private void itemCopy(Bills bills, List<Bills> billsList, boolean status) {
-		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
-			.eq(Containers::getTenantId, AuthUtil.getTenantId())
-			.eq(Containers::getIsDeleted, 0)
-			.in(Containers::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
-		if (!containersList.isEmpty()) {
-			StringBuilder hblno = new StringBuilder();
-			for (Bills item : billsList) {
-				List<Containers> containers = containersList.stream().filter(e -> e.getPid().equals(item.getId()))
-					.collect(Collectors.toList());
-				if (containers.isEmpty()) {
-					hblno.append(item.getHblno()).append(",");
-				} else {
-					BigDecimal quantity = containers.stream().map(Containers::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
-					BigDecimal grossWeight = containers.stream().map(Containers::getGrossWeight).reduce(BigDecimal.ZERO, BigDecimal::add);
-					BigDecimal measurement = containers.stream().map(Containers::getMeasurement).reduce(BigDecimal.ZERO, BigDecimal::add);
-					if (quantity.compareTo(new BigDecimal("0.00")) == 0 && grossWeight.compareTo(new BigDecimal("0.00")) == 0 &&
-						measurement.compareTo(new BigDecimal("0.00")) == 0) {
-						hblno.append(item.getHblno()).append(",");
-					}
-				}
-			}
-			/*if (status && ObjectUtils.isNotNull(hblno.toString())) {
-				throw new RuntimeException("分单号:" + hblno + "未分配件重尺,同步失败");
-			}*/
-			for (Containers item : containersList) {
-				item.setMblno(bills.getMblno());
-			}
-			containersService.updateBatchById(containersList);
-			List<Containers> containersListNew = new ArrayList<>();
-			for (Containers item : containersList) {
-				item.setSrcSplitOrderId(item.getPid());
-				item.setSrcId(item.getId());
-				item.setId(null);
-				item.setPid(bills.getId());
-				item.setCreateTime(new Date());
-				item.setCreateUser(AuthUtil.getUserId());
-				item.setCreateUserName(AuthUtil.getUserName());
-				item.setBranchId(bills.getBranchId());
-				item.setUpdateUser(null);
-				item.setUpdateTime(null);
-				item.setUpdateUserName(null);
-				containersListNew.add(item);
-			}
-			containersService.saveBatch(containersListNew);
-			List<ContainersCommodity> containersCommodityList = containersCommodityService.list(new LambdaQueryWrapper<ContainersCommodity>()
-				.eq(ContainersCommodity::getTenantId, AuthUtil.getTenantId())
-				.eq(ContainersCommodity::getIsDeleted, 0)
-				.in(ContainersCommodity::getPpId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
-			if (!containersCommodityList.isEmpty()) {
-				List<ContainersCommodity> containersCommodityListNew = new ArrayList<>();
-				for (ContainersCommodity item : containersCommodityList) {
-					Containers containers = containersListNew.stream().filter(e -> e.getSrcId().equals(item.getPid())).findFirst().orElse(null);
-					if (containers != null) {
-						item.setSrcSplitOrderId(item.getPid());
-						item.setId(null);
-						item.setCreateTime(new Date());
-						item.setCreateUser(AuthUtil.getUserId());
-						item.setCreateUserName(AuthUtil.getUserName());
-						item.setBranchId(bills.getBranchId());
-						item.setUpdateUser(null);
-						item.setUpdateTime(null);
-						item.setUpdateUserName(null);
-						item.setPid(containers.getId());
-						item.setPpId(bills.getId());
-					}
-					containersCommodityListNew.add(item);
-				}
-				containersCommodityService.saveBatch(containersCommodityListNew);
-			}
-/*
-			List<ContainersBills> containersBillsList = containersBillsService.list(new LambdaQueryWrapper<ContainersBills>()
-				.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
-				.eq(ContainersBills::getIsDeleted, 0)
-				.in(ContainersBills::getPpId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
-			if (!containersBillsList.isEmpty()) {
-				List<ContainersBills> containersBillsListNew = new ArrayList<>();
-				for (ContainersBills item : containersBillsList) {
-					Containers containers = containersListNew.stream().filter(e -> e.getSrcId().equals(item.getPid())).findFirst().orElse(null);
-					if (containers != null) {
-						item.setSrcSplitOrderId(item.getPid());
-						item.setId(null);
-						item.setCreateTime(new Date());
-						item.setCreateUser(AuthUtil.getUserId());
-						item.setCreateUserName(AuthUtil.getUserName());
-						item.setBranchId(bills.getBranchId());
-						item.setUpdateUser(null);
-						item.setUpdateTime(null);
-						item.setUpdateUserName(null);
-						item.setPid(containers.getId());
-						item.setPpId(bills.getId());
-					}
-					containersBillsListNew.add(item);
-				}
-				containersBillsService.saveBatch(containersBillsListNew);
-			}
-*/
-		} /*else {
-			if (status) {
-				throw new RuntimeException("分单号:" + billsList.stream().map(Bills::getHblno).collect(Collectors.joining(","))
-					+ "未分配件重尺,同步失败");
-			}
-		}*/
-		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
-			.eq(FeeCenter::getIsDeleted, 0)
-			.in(FeeCenter::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
-		if (!feeCenterList.isEmpty()) {
-			List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
-				.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
-				.eq(FinAccBills::getIsDeleted, 0)
-				.in(FinAccBills::getBusinessBillId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
-			List<FeeCenter> FeeCenterListNew = new ArrayList<>();
-			List<FinAccBills> finAccBillsListNew = new ArrayList<>();
-			for (FeeCenter item : feeCenterList) {
-				Bills bill = billsList.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
-				if (bill != null) {
-					item.setBillNo(bill.getBillNo());
-					item.setBusinessType(bill.getBusinessType());
-					item.setBillType(bill.getBillType());
-					item.setBillDate(bill.getBillDate());
-					item.setSrcType(bill.getSrcType());
-					item.setSrcId(bill.getSrcId());
-					item.setBookingAgentId(bill.getBookingAgentId());
-					item.setBookingAgentCnName(bill.getBookingAgentCnName());
-					item.setBookingAgentEnName(bill.getBookingAgentEnName());
-					item.setSrcCnName(bill.getSrcCnName());
-					item.setSrcEnName(bill.getSrcEnName());
-					item.setBillCorpId(bill.getCorpId());
-					item.setBillCorpCnName(bill.getCorpCnName());
-					item.setBillCorpEnName(bill.getCorpEnName());
-					item.setBillShortName(bill.getShortName());
-					item.setLineId(bill.getLineId());
-					item.setLineCnName(bill.getLineCnName());
-					item.setLineEnName(bill.getLineEnName());
-					item.setVesselId(bill.getVesselId());
-					item.setVesselEnName(bill.getVesselEnName());
-					item.setVesselCnName(bill.getVesselCnName());
-					item.setVoyageNo(bill.getVoyageNo());
-					item.setMblno(bill.getMblno());
-					item.setHblno(bill.getHblno());
-					item.setEtd(bill.getEtd());
-					item.setEta(bill.getEta());
-					item.setPolId(bill.getPolId());
-					item.setPolCode(bill.getPolCode());
-					item.setPolCnName(bill.getPolCnName());
-					item.setPolEnName(bill.getPolEnName());
-					item.setPodId(bill.getPodId());
-					item.setPodCode(bill.getPodCode());
-					item.setPodCnName(bill.getPodCnName());
-					item.setPodEnName(bill.getPodEnName());
-					item.setPaymode(bill.getMpaymode());
-					item.setPayplace(bill.getMpayplace());
-					item.setRefno(bill.getRefno());
-					item.setBookingNo(bill.getBookingNo());
-					item.setCntrNo(bill.getQuantityCntrTypesDescr());
-					item.setQuantityCntrDescr(bill.getQuantityCntrDescr());
-					item.setTeu(bill.getTeu());
-				}
-				FeeCenterListNew.add(item);
-				if (!finAccBillsList.isEmpty()) {
-					List<FinAccBills> finAccBills = finAccBillsList.stream().filter(e -> e.getId().equals(item.getAccBillId())).collect(Collectors.toList());
-					for (FinAccBills data : finAccBills) {
-						data.setBillDate(item.getBillDate());
-						data.setBusinessDate(item.getBillDate());
-						data.setBookingAgentId(item.getBookingAgentId());
-						data.setBookingAgentCnName(item.getBookingAgentCnName());
-						data.setBookingAgentEnName(item.getBookingAgentEnName());
-						data.setQuantityCntrDescr(item.getQuantityCntrDescr());
-						data.setTeu(item.getTeu());
-						data.setWarehousingDate(item.getStorageDate());
-						data.setOutboundDate(item.getOutboundDate());
-						data.setSrcId(item.getSrcId());
-						data.setSrcCnName(item.getSrcCnName());
-						data.setSrcEnName(item.getSrcEnName());
-						data.setSrcType(item.getSrcType());
-						data.setPaymode(item.getPaymode());
-						data.setCorpId(item.getCorpId());
-						data.setCorpCnName(item.getCorpCnName());
-						data.setCorpEnName(item.getCorpEnName());
-						data.setBillCorpId(item.getBillCorpId());
-						data.setBillCorpCnName(item.getBillCorpCnName());
-						data.setBillCorpEnName(item.getBillCorpEnName());
-						data.setVesselId(item.getVesselId());
-						data.setVesselCnName(item.getVesselCnName());
-						data.setVesselEnName(item.getVesselEnName());
-						data.setVoyageNo(item.getVoyageNo());
-						data.setMblno(item.getMblno());
-						data.setHblno(item.getHblno());
-						data.setRefno(item.getRefno());
-						data.setBookingNo(item.getBookingNo());
-						data.setEtd(item.getEtd());
-						data.setEta(item.getEta());
-						data.setPolId(item.getPolId());
-						data.setPolCnName(item.getPolCnName());
-						data.setPolEnName(item.getPolEnName());
-						data.setPodId(item.getPodId());
-						data.setPodCnName(item.getPodCnName());
-						data.setPodCode(item.getPodCode());
-						data.setPodEnName(item.getPodEnName());
-						finAccBillsListNew.add(data);
-					}
-				}
-			}
-			feeCenterService.updateBatchById(FeeCenterListNew);
-			if (!finAccBillsListNew.isEmpty()) {
-				finAccBillsService.updateBatchById(finAccBillsListNew);
-			}
-		}
-		for (Bills item : billsList) {
-			item.setEta(bills.getEta());
-			item.setActualEta(bills.getActualEta());
-
-		}
-		if (!billsList.isEmpty()) {
-			this.updateBatchById(billsList);
-		}
-	}
-
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public R revokeReinsurancePolicy(String ids, String id) {
@@ -1777,7 +1555,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				grossWeight = grossWeight.subtract(billsList.stream().map(Bills::getGrossWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 				quantity = quantity.subtract(billsList.stream().map(Bills::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 				measurement = measurement.subtract(billsList.stream().map(Bills::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
-				this.itemRevoke(bills, billsList);
+				billUtils.itemRevoke(bills, billsList);
 			}
 			List<Bills> billsList1 = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
 				.eq(Bills::getTenantId, AuthUtil.getTenantId())
@@ -1826,35 +1604,6 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		return R.data("操作成功");
 	}
 
-	private void itemRevoke(Bills bills, List<Bills> billsList) {
-		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
-			.eq(Containers::getTenantId, AuthUtil.getTenantId())
-			.eq(Containers::getIsDeleted, 0)
-			.eq(Containers::getPid, bills.getId())
-			.in(Containers::getSrcSplitOrderId, billsList.stream().map(Bills::getId).collect(Collectors.toList()))
-		);
-		if (!containersList.isEmpty()) {
-			containersService.removeByIds(containersList.stream().map(Containers::getId).collect(Collectors.toList()));
-			List<ContainersCommodity> containersCommodityList = containersCommodityService.list(new LambdaQueryWrapper<ContainersCommodity>()
-				.eq(ContainersCommodity::getTenantId, AuthUtil.getTenantId())
-				.eq(ContainersCommodity::getPpId, bills.getId())
-				.in(ContainersCommodity::getSrcSplitOrderId, billsList.stream().map(Bills::getId).collect(Collectors.toList()))
-			);
-			if (!containersCommodityList.isEmpty()) {
-				containersCommodityService.removeByIds(containersCommodityList.stream().map(ContainersCommodity::getId).collect(Collectors.toList()));
-			}
-			List<ContainersBills> containersBillsList = containersBillsService.list(new LambdaQueryWrapper<ContainersBills>()
-				.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
-				.eq(ContainersBills::getIsDeleted, 0)
-				.eq(ContainersBills::getPpId, bills.getId())
-				.in(ContainersBills::getSrcSplitOrderId, billsList.stream().map(Bills::getId).collect(Collectors.toList()))
-			);
-			if (!containersBillsList.isEmpty()) {
-				containersBillsService.removeByIds(containersBillsList.stream().map(ContainersBills::getId).collect(Collectors.toList()));
-			}
-		}
-	}
-
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void removeIds(List<Long> ids) {
@@ -1984,12 +1733,6 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		return R.data("操作成功");
 	}
 
-	private void revokeSelectedContainerNumber(Bills bills, List<PreContainers> preContainers) {
-		for (PreContainers item : preContainers) {
-			seaContainerNumberItemService.revokeSelectedContainerNumber(item.getCntrTypeCode(), bills.getId() + "");
-		}
-	}
-
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public Bills checkBills(Bills bills) {
@@ -3822,7 +3565,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		if (billsJk == null) {
 			throw new RuntimeException("未找到进口单据");
 		}
-		this.removeItemList(billsJk.getId());
+		billUtils.removeItemList(billsJk.getId());
 		baseMapper.deleteById(billsJk.getId());
 		//主单应加上分单费用
 		if ("MM".equals(detail.getBillType())) {
@@ -3847,7 +3590,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, billsJk.getId()));
 			if (!details.isEmpty()) {
 				for (Bills item : details) {
-					this.removeItemList(item.getId());
+					billUtils.removeItemList(item.getId());
 				}
 				this.removeByIds(details.stream().map(Bills::getId).collect(Collectors.toList()));
 			}
@@ -4920,7 +4663,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				List<BCurExrate> curExrateList = currencyUtils.obtainRate(date, "1", branchId);
 				int count = 1;
 				for (PreContainers item : preContainersList) {
-					FeeCenter feeCenter = this.addFeeCenterQuotation(copyBills, "D", count, fees, item,
+					FeeCenter feeCenter = billUtils.addFeeCenterQuotation(copyBills, "D", count, fees, item,
 						curExrateList, exrateType, "1");
 					if (feeCenter != null) {
 						feeCenter.setUnitNo(item.getCntrTypeCode());
@@ -4930,7 +4673,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 						feeCenterListSum.add(feeCenter);
 					}
 					if (!"SOC".equals(copyBills.getBoxBelongsTo())) {
-						FeeCenter feeCenterD = this.addFeeCenterQuotation(copyBills, "C", count, fees, item,
+						FeeCenter feeCenterD = billUtils.addFeeCenterQuotation(copyBills, "C", count, fees, item,
 							curExrateList, exrateType, "2");
 						if (feeCenterD != null) {
 							feeCenterD.setUnitNo(item.getCntrTypeCode());
@@ -5289,7 +5032,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				measurement = measurement.add(billsList.stream().map(Bills::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 				marks = billsList.stream().map(Bills::getMarks).filter(Objects::nonNull).collect(Collectors.joining("&|&"));
 				commodityDescr = billsList.stream().map(Bills::getCommodityDescr).filter(Objects::nonNull).collect(Collectors.joining("&|&"));
-				this.itemCopy(bills, billsList, true);
+				billUtils.itemCopy(bills, billsList, true);
 			}
 			bills.setTeuTotal(teuTotal);
 			bills.setGrossWeight(grossWeight);
@@ -6829,170 +6572,193 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		return null;
 	}
 
-	/**
-	 * 删除海运进出口明细表
-	 *
-	 * @param id 主表id
-	 */
-	private void removeItemList(Long id) {
-		SeaBillsDetail seaBillsDetail = seaBillsDetailService.getOne(new LambdaQueryWrapper<SeaBillsDetail>()
-			.eq(SeaBillsDetail::getTenantId, AuthUtil.getTenantId())
-			.eq(SeaBillsDetail::getPid, id));
-		if (seaBillsDetail != null) {
-			seaBillsDetailService.removeById(seaBillsDetail.getId());
+	@Override
+	public R verificationPrompt(Bills bills) {
+		if (bills.getId() == null) {
+			throw new SecurityException("缺少必要参数");
+		}
+		Bills detail = baseMapper.selectById(bills.getId());
+		if (detail == null) {
+			throw new SecurityException("未查到单据信息");
 		}
 		List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
 			.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
 			.eq(PreContainers::getIsDeleted, 0)
-			.eq(PreContainers::getPid, id));
-		if (!preContainersList.isEmpty()) {
-			preContainersService.removeByIds(preContainersList.stream().map(PreContainers::getId).collect(Collectors.toList()));
+			.eq(PreContainers::getPid, detail.getId()));
+		StringBuilder texts = new StringBuilder();
+		for (PreContainers containers : preContainersList) {
+			if (ObjectUtils.isNull(containers.getSrcCostNo())) {
+				texts.append(containers.getCntrTypeCode()).append("未提取到成本价,请先提取成本!");
+			}
 		}
-		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
-			.eq(Containers::getTenantId, AuthUtil.getTenantId())
-			.eq(Containers::getIsDeleted, 0)
-			.eq(Containers::getPid, id));
-		if (!containersList.isEmpty()) {
-			containersService.removeByIds(containersList.stream().map(Containers::getId).collect(Collectors.toList()));
+		if (ObjectUtils.isNotNull(texts.toString())) {
+			return R.success(texts.toString());
 		}
-		List<ContainersCommodity> containersCommodityList = containersCommodityService.list(new LambdaQueryWrapper<ContainersCommodity>()
-			.eq(ContainersCommodity::getTenantId, AuthUtil.getTenantId())
-			.eq(ContainersCommodity::getIsDeleted, 0)
-			.eq(ContainersCommodity::getPpId, id));
-		if (!containersCommodityList.isEmpty()) {
-			containersCommodityService.removeByIds(containersCommodityList.stream().map(ContainersCommodity::getId).collect(Collectors.toList()));
+		StringBuilder text = new StringBuilder();
+		for (PreContainers containers : preContainersList) {
+			if (containers.getSalesPrice().compareTo(containers.getCostPrice()) > 0) {
+				text.append(containers.getCntrTypeCode()).append("销售价大于成本中心销售价,是否继续!");
+			}
 		}
-		List<ContainersBills> containersBillsList = containersBillsService.list(new LambdaQueryWrapper<ContainersBills>()
-			.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
-			.eq(ContainersBills::getIsDeleted, 0)
-			.eq(ContainersBills::getPpId, id));
-		if (!containersBillsList.isEmpty()) {
-			containersBillsService.removeByIds(containersBillsList.stream().map(ContainersBills::getId).collect(Collectors.toList()));
+		if (ObjectUtils.isNotNull(text.toString())) {
+			return R.success(text.toString());
+		} else {
+			return R.success("操作成功");
+		}
+	}
+
+	@Override
+	public R sendVerificationPrompt(String ids) {
+		if (ObjectUtils.isNull(ids)) {
+			throw new RuntimeException("缺少必要参数,发送失败!");
+		}
+		List<Long> idList = Func.toLongList(ids);
+		List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
+			.eq(Bills::getIsDeleted, 0)
+			.in(Bills::getId, idList));
+		if (billsList.isEmpty()) {
+			throw new RuntimeException("未查到海运出口单据,发送失败!");
+		}
+		List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+			.eq(PreContainers::getIsDeleted, 0)
+			.in(PreContainers::getPid, idList));
+		if (preContainersList.isEmpty()) {
+			throw new RuntimeException("未查到预配箱型信息,发送失败!");
+		}
+		List<SeaContainerNumberItem> containerNumberItemList = seaContainerNumberItemService.list(new LambdaQueryWrapper<SeaContainerNumberItem>()
+			.eq(SeaContainerNumberItem::getIsDeleted, 0)
+			.in(SeaContainerNumberItem::getPid, idList)
+			.in(SeaContainerNumberItem::getBoxType, preContainersList.stream().map(PreContainers::getCntrTypeCode)
+				.distinct().collect(Collectors.toList())));
+		if (containerNumberItemList.isEmpty()) {
+			throw new RuntimeException("未选择放箱号,发送失败!");
 		}
 		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 			.eq(FeeCenter::getIsDeleted, 0)
-			.eq(FeeCenter::getPid, id));
-		if (!feeCenterList.isEmpty()) {
-			for (FeeCenter item : feeCenterList) {
-				if (1 == item.getAccStatus()) {
-					throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单");
-				}
-				if (item.getStlPid() != null) {
-					throw new RuntimeException("费用:" + item.getFeeCnName() + "已申请");
+			.eq(FeeCenter::getDc, "D")
+			.eq(FeeCenter::getFeeCode, "HYF")
+			.in(FeeCenter::getPid, idList));
+		if (feeCenterList.isEmpty()) {
+			throw new RuntimeException("未查到应收海运费,发送失败!");
+		}
+		String boxBusinessConnectionTime = sysClient.getParamService("box.business.connection.time");
+		Date date = null;
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		if (ObjectUtils.isNotNull(boxBusinessConnectionTime)) {
+			try {
+				date = dateFormat.parse(boxBusinessConnectionTime);
+			} catch (ParseException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		StringBuilder text = new StringBuilder();
+		for (Bills item : billsList) {
+			boolean status = true;
+			if (item.getEtd().compareTo(date) < 0) {
+				status = false;
+			}
+			if (status) {
+				List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
+					.collect(Collectors.toList());
+				for (PreContainers containers : preContainers) {
+					if (feeCenterList.stream().anyMatch(e -> e.getPid().equals(item.getId()) &&
+						containers.getCntrTypeCode().equals(e.getUnitNo()) && e.getPrice().compareTo(containers.getCostPrice()) > 0)) {
+						text.append("提单号:").append(item.getMblno()).append("箱型:").append(containers.getCntrTypeCode()).append("应收海运费用大于成本中心销售价,发送失败!");
+					}
+					if (containerNumberItemList.stream().filter(e -> e.getPid().equals(containers.getPid()))
+						.mapToInt(SeaContainerNumberItem::getOccupyNum).sum() != containers.getQuantity()) {
+						text.append("提单号:").append(item.getMblno()).append("箱型:").append(containers.getCntrTypeCode()).append("箱量与所选放箱号数量不等,发送失败!");
+					}
 				}
 			}
-			feeCenterService.removeByIds(feeCenterList.stream().map(FeeCenter::getId).collect(Collectors.toList()));
 		}
-
-		List<FilesCenter> filesList = filesCenterService.list(new LambdaQueryWrapper<FilesCenter>()
-			.eq(FilesCenter::getTenantId, AuthUtil.getTenantId())
-			.eq(FilesCenter::getIsDeleted, 0)
-			.eq(FilesCenter::getPid, id));
-		if (!filesList.isEmpty()) {
-			filesCenterService.removeByIds(filesList.stream().map(FilesCenter::getId).collect(Collectors.toList()));
+		if (ObjectUtils.isNotNull(text.toString())) {
+			LocalDateTime now = LocalDateTime.now();
+			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+			String formatted = now.format(formatter);
+			R<String> res = sysClient.getRoleIds(AuthUtil.getTenantId(), "成本中心");
+			if (res.isSuccess() && ObjectUtils.isNotNull()) {
+				R<List<User>> userListR = userClient.listUserByRoleIds(res.getData());
+				if (userListR.isSuccess() && ObjectUtils.isNotNull(userListR.getData())) {
+					for (User item : userListR.getData()) {
+						Message sendMessage = new Message();
+						sendMessage.setUserName(AuthUtil.getUserName());
+						sendMessage.setUserId(null);
+						sendMessage.setToUserId(item.getId());
+						sendMessage.setToUserName(item.getName());
+						sendMessage.setMessageType(1);
+						sendMessage.setTenantId(AuthUtil.getTenantId());
+						sendMessage.setCreateUser(null);
+						sendMessage.setCreateTime(new Date());
+						sendMessage.setPageLabel("海运出口");
+						sendMessage.setMessageBody("发送下货纸:" + text + ";时间:" + formatted + ";");
+						R save = messageClient.save(sendMessage);
+						if (!save.isSuccess()) {
+							throw new SecurityException("发送消息失败");
+						}
+					}
+				}
+			}
+			return R.success(text.toString());
+		} else {
+			return R.success("操作成功");
 		}
 	}
 
-	private FeeCenter addFeeCenterQuotation(Bills bills, String dc, int count, BFees fees,
-											PreContainers items, List<BCurExrate> curExrateList, String exrateType, String type) {
-		FeeCenter feeCenter = new FeeCenter();
-		feeCenter.setBranchId(bills.getBranchId());
-		feeCenter.setBranchName(bills.getBranchName());
-		feeCenter.setPid(bills.getId());
-		feeCenter.setCntrNo(bills.getQuantityCntrTypesDescr());
-		feeCenter.setBillNo(bills.getBillNo());
-		feeCenter.setBusinessType(bills.getBusinessType());
-		feeCenter.setBillType(bills.getBillType());
-		feeCenter.setBillDate(bills.getBillDate());
-		feeCenter.setBillCorpId(bills.getCorpId());
-		feeCenter.setBillCorpCnName(bills.getCorpCnName());
-		feeCenter.setBillCorpEnName(bills.getCorpEnName());
-		feeCenter.setBillShortName(bills.getShortName());
-		feeCenter.setBillBranchId(bills.getBranchId());
-		feeCenter.setBillBranchName(bills.getBranchName());
-		feeCenter.setLineId(bills.getLineId());
-		feeCenter.setLineCnName(bills.getLineCnName());
-		feeCenter.setLineEnName(bills.getLineEnName());
-		feeCenter.setVesselId(bills.getVesselId());
-		feeCenter.setVesselCnName(bills.getVesselCnName());
-		feeCenter.setVesselEnName(bills.getVesselEnName());
-		feeCenter.setVoyageNo(bills.getVoyageNo());
-		feeCenter.setMblno(bills.getMblno());
-		feeCenter.setHblno(bills.getHblno());
-		feeCenter.setEtd(bills.getEtd());
-		feeCenter.setEta(bills.getEta());
-		feeCenter.setPolId(bills.getPolId());
-		feeCenter.setPolCode(bills.getPolCode());
-		feeCenter.setPolCnName(bills.getPolCnName());
-		feeCenter.setPolEnName(bills.getPolEnName());
-		feeCenter.setPodId(bills.getPodId());
-		feeCenter.setPodCode(bills.getPodCode());
-		feeCenter.setPodCnName(bills.getPodCnName());
-		feeCenter.setPodEnName(bills.getPodEnName());
-		feeCenter.setDc(dc);
-		feeCenter.setPaymode(bills.getMpaymode());
-		feeCenter.setSort(count);
-		feeCenter.setFeeId(fees.getId());
-		feeCenter.setCorpType("国内直接客户");
-		feeCenter.setFeeCode(fees.getCode());
-		feeCenter.setFeeCnName(fees.getCnName());
-		feeCenter.setFeeEnName(fees.getEnName());
-		feeCenter.setUnitNo(fees.getUnitNo());
-		feeCenter.setCurCode("USD");
-		feeCenter.setExrate(currencyUtils.obtainExrate(feeCenter.getDc(), curExrateList, feeCenter.getCurCode(), "1"));
-		feeCenter.setQuantity(new BigDecimal(items.getQuantity() + ""));
-		if ("1".equals(type)) {
-			feeCenter.setCorpId(bills.getCorpId());
-			feeCenter.setCorpCnName(bills.getCorpCnName());
-			feeCenter.setCorpEnName(bills.getCorpEnName());
-			feeCenter.setShortName(bills.getShortName());
-			feeCenter.setPrice(items.getOceanFreight());
-			BCorps bCorps = bCorpsService.getById(bills.getCorpId());
-			if (bCorps != null) {
-				feeCenter.setGenerationCorpId(bCorps.getBookingAgentId());
-				feeCenter.setGenerationCorpCnName(bCorps.getBookingAgentCnName());
-				feeCenter.setGenerationCorpEnName(bCorps.getBookingAgentEnName());
-			}
-		} else if ("2".equals(type)) {
-		/*	BCorps bCorps = bCorpsService.getOne(new LambdaQueryWrapper<BCorps>()
-				.eq(BCorps::getTenantId, AuthUtil.getTenantId())
-				.eq(BCorps::getIsDeleted, 0)
-				.eq(BCorps::getCode, "ZBYF"));
-			if (bCorps == null) {
-				throw new RuntimeException("基础资料未查到编码为‘ZBYF’往来单位");
-			}*/
-			feeCenter.setCorpId(bills.getCarrierId());
-			feeCenter.setCorpCnName(bills.getCarrierCnName());
-			feeCenter.setCorpEnName(bills.getCarrierEnName());
-			feeCenter.setShortName(bills.getCarrierShortName());
-			feeCenter.setPrice(items.getCostPrice());
-			BCorps bCorps = bCorpsService.getById(bills.getCarrierId());
-			if (bCorps != null) {
-				feeCenter.setGenerationCorpId(bCorps.getBookingAgentId());
-				feeCenter.setGenerationCorpCnName(bCorps.getBookingAgentCnName());
-				feeCenter.setGenerationCorpEnName(bCorps.getBookingAgentEnName());
-			}
-		}
-		feeCenter.setAmount(feeCenter.getPrice().multiply(feeCenter.getQuantity()));
-		if (ObjectUtils.isNull(feeCenter.getAmount())) {
-			feeCenter.setAmount(new BigDecimal("0"));
-		}
-		if (exrateType.equals(feeCenter.getCurCode())) {
-			feeCenter.setAmountLoc(feeCenter.getAmount());
-		} else {
-			if (new BigDecimal("0").compareTo(feeCenter.getAmount()) != 0) {
-				feeCenter.setAmountLoc(feeCenter.getAmount().multiply(feeCenter.getExrate()));
-			} else {
-				feeCenter.setAmountLoc(new BigDecimal("0"));
-			}
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R sendDeliveryPaper(String ids) {
+		if (ObjectUtils.isNull(ids)) {
+			throw new RuntimeException("缺少必要参数");
 		}
-		feeCenter.setUnsettledAmount(feeCenter.getAmount());
-		if (new BigDecimal("0").compareTo(feeCenter.getAmount()) == 0) {
-			return null;
-		} else {
-			return feeCenter;
+		List<Long> idList = Func.toLongList(ids);
+		List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
+			.eq(Bills::getIsDeleted, 0)
+			.in(Bills::getId, idList));
+		if (billsList.isEmpty()) {
+			throw new RuntimeException("未查到海运出口单据,发送失败!");
+		}
+		List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+			.eq(PreContainers::getIsDeleted, 0)
+			.in(PreContainers::getPid, idList));
+		if (preContainersList.isEmpty()) {
+			throw new RuntimeException("未查到预配箱型信息,发送失败!");
+		}
+		List<SeaContainerNumberItem> containerNumberItemList = seaContainerNumberItemService.list(new LambdaQueryWrapper<SeaContainerNumberItem>()
+			.eq(SeaContainerNumberItem::getIsDeleted, 0)
+			.in(SeaContainerNumberItem::getPid, idList)
+			.in(SeaContainerNumberItem::getBoxType, preContainersList.stream().map(PreContainers::getCntrTypeCode)
+				.distinct().collect(Collectors.toList())));
+		if (containerNumberItemList.isEmpty()) {
+			throw new RuntimeException("未选择放箱号,发送失败!");
 		}
+		List<DeliveryPaperExcel> excelList = new ArrayList<>();
+		for (Bills item : billsList) {
+			DeliveryPaperExcel excel = new DeliveryPaperExcel();
+			excel.setEtd(item.getEtd());
+			excel.setPodEnName(item.getPodEnName());
+			excel.setVesselCnName(item.getVesselEnName());
+			excel.setVoyageNo(item.getVoyageNo());
+			excel.setBoxOwner("WFL");
+			excel.setInboundContainerOwner(item.getCarrierEnName());
+			excel.setPotEnName(item.getPotEnName());
+			excel.setMblno(item.getMblno());
+			excel.setHblno(item.getHblno());
+			excel.setQuantityCntrDescr(item.getQuantityCntrDescr());
+			excel.setGrossWeight(item.getGrossWeight());
+			List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
+				.collect(Collectors.toList());
+			if (!preContainers.isEmpty()) {
+				List<Long> preContainersId = preContainers.stream().map(PreContainers::getId).collect(Collectors.toList());
+				List<SeaContainerNumberItem> containerNumberItems = containerNumberItemList.stream().filter(e ->
+					preContainersId.contains(e.getPid())).collect(Collectors.toList());
+				if (!containerNumberItems.isEmpty()) {
+					excel.setContainerNumber(containerNumberItems.stream().map(SeaContainerNumberItem::getContainerNumber)
+						.collect(Collectors.joining(",")));
+				}
+			}
+			excelList.add(excel);
+		}
+		return R.data(excelList);
 	}
-
 }

+ 83 - 0
blade-service/blade-los/src/main/java/org/springblade/los/excel/DeliveryPaperExcel.java

@@ -0,0 +1,83 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 业务-海运进出口实体类
+ *
+ * @author BladeX
+ * @since 2024年6月11日15:29:26
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class DeliveryPaperExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@ExcelProperty(value = "开船日期")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date etd;
+
+	@ExcelProperty(value = "目的港")
+	private String podEnName;
+
+	@ExcelProperty(value = "船名")
+	private String vesselCnName;
+
+	@ExcelProperty(value = "航次")
+	private String voyageNo;
+
+	@ExcelProperty(value = "船主")
+	private String boxOwner;
+
+	@ExcelProperty(value = "入港箱主")
+	private String inboundContainerOwner;
+
+	@ExcelProperty(value = "中转港")
+	private String potEnName;
+
+	@ExcelProperty(value = "主提单号")
+	private String mblno;
+
+	@ExcelProperty(value = "分单号")
+	private String hblno;
+
+	@ExcelProperty(value = "箱型箱量")
+	private String quantityCntrDescr;
+
+	@ExcelProperty(value = "货物毛重")
+	private BigDecimal grossWeight;
+
+	@ExcelProperty(value = "放箱号")
+	private String containerNumber;
+
+}