Просмотр исходного кода

1.箱型箱量增加字段
2.进出场同步流程修改
3.箱型箱量增加修改箱量及操作占用数量修改接口
4.增加放箱号明细占用数量明细列表接口
5.进出场同步成功 失败原因需要清空问题修改

纪新园 3 недель назад
Родитель
Сommit
2d17782eaf

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

@@ -121,6 +121,16 @@ public class PreContainers implements Serializable {
 	@ApiModelProperty(value = "集装箱箱量")
 	private Integer quantity;
 	/**
+	 * 操作占用
+	 */
+	@ApiModelProperty(value = "操作占用")
+	private Integer occupyNum;
+	/**
+	 * 实际集装箱箱量
+	 */
+	@ApiModelProperty(value = "实际集装箱箱量")
+	private Integer actualQuantity;
+	/**
 	 * 毛重 (KGM)
 	 */
 	@ApiModelProperty(value = "毛重 (KGM)")
@@ -366,6 +376,11 @@ public class PreContainers implements Serializable {
 	 */
 	@ApiModelProperty(value = "来源成本中心Id")
 	private String srcCostNo;
+	/**
+	 * 是否出场状态
+	 */
+	@ApiModelProperty(value = "是否出场状态")
+	private String whetherAppearStatus;
 
 
 }

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

@@ -188,6 +188,21 @@ public class SeaContainerNumberItem implements Serializable {
 	@ApiModelProperty(value = "操作占用")
 	private Integer occupyNum;
 	/**
+	 * 实际操作占用
+	 */
+	@ApiModelProperty(value = "实际操作占用")
+	private Integer actualOccupyNum;
+	/**
+	 * 操作占用差额
+	 */
+	@ApiModelProperty(value = "操作占用差额")
+	private Integer occupyBalance;
+	/**
+	 * 是否出场状态
+	 */
+	@ApiModelProperty(value = "是否出场状态")
+	private String whetherAppearStatus;
+	/**
 	 * 放箱号优先等级
 	 */
 	@ApiModelProperty(value = "放箱号优先等级")
@@ -206,5 +221,13 @@ public class SeaContainerNumberItem implements Serializable {
 	@TableField(exist = false)
 	private Integer storageNum;
 
+	//提单号
+	@TableField(exist = false)
+	private String mblno;
+
+	//分单号
+	@TableField(exist = false)
+	private String hblno;
+
 
 }

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/vo/PreContainersVO.java

@@ -20,6 +20,9 @@ import io.swagger.annotations.ApiModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.los.business.sea.entity.PreContainers;
+import org.springblade.los.business.sea.entity.SeaContainerNumberItem;
+
+import java.util.List;
 
 /**
  * 业务-海运进出口-预配箱型箱量视图实体类
@@ -33,4 +36,6 @@ import org.springblade.los.business.sea.entity.PreContainers;
 public class PreContainersVO extends PreContainers {
 	private static final long serialVersionUID = 1L;
 
+	private List<SeaContainerNumberItem> containerNumberItemList;
+
 }

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

@@ -64,8 +64,12 @@ import org.springblade.los.box.service.IPutBoxService;
 import org.springblade.los.box.service.ITradingBoxItemService;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.Containers;
+import org.springblade.los.business.sea.entity.PreContainers;
+import org.springblade.los.business.sea.entity.SeaContainerNumberItem;
 import org.springblade.los.business.sea.mapper.BillsMapper;
 import org.springblade.los.business.sea.service.IContainersService;
+import org.springblade.los.business.sea.service.IPreContainersService;
+import org.springblade.los.business.sea.service.ISeaContainerNumberItemService;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.ftp.dto.ApiItem;
@@ -138,6 +142,10 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 
 	private final IContainersService containersService;
 
+	private final IPreContainersService preContainersService;
+
+	private final ISeaContainerNumberItemService seaContainerNumberItemService;
+
 	private final IStorageFeesService storageFeesService;
 
 	private final IStorageFeesItemsService storageFeesItemsService;
@@ -168,7 +176,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		}
 		List<String> boxCodeList = excelList.stream().map(EmptyContainerAppearance::getBoxCode).filter(Objects::nonNull)
 			.distinct().collect(Collectors.toList());
-		if (boxCodeList.size()!=excelList.size()){
+		if (boxCodeList.size() != excelList.size()) {
 			throw new SecurityException("箱号存在重复数据");
 		}
 		List<String> containerNumber = excelList.stream().map(EmptyContainerAppearance::getContainerNumber).filter(Objects::nonNull)
@@ -258,13 +266,13 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 				recordItems.setObjective("XX");
 			} else if ("直接退租进场".equals(item.getObjective()) || "ZI".equals(item.getObjective())) {
 				recordItems.setObjective("ZI");
-			}else if ("直接调运进场".equals(item.getObjective()) || "ZJ".equals(item.getObjective())) {
+			} else if ("直接调运进场".equals(item.getObjective()) || "ZJ".equals(item.getObjective())) {
 				recordItems.setObjective("ZJ");
 			} else if ("起租箱进场".equals(item.getObjective()) || "QX".equals(item.getObjective())) {
 				recordItems.setObjective("QX");
-			}else if ("场内起租进场".equals(item.getObjective()) || "QZ".equals(item.getObjective())) {
+			} else if ("场内起租进场".equals(item.getObjective()) || "QZ".equals(item.getObjective())) {
 				recordItems.setObjective("QZ");
-			}else if ("退租箱进场".equals(item.getObjective()) || "T".equals(item.getObjective())) {
+			} else if ("退租箱进场".equals(item.getObjective()) || "T".equals(item.getObjective())) {
 				recordItems.setObjective("T");
 			} else if ("内点摆箱".equals(item.getObjective()) || "BX".equals(item.getObjective())) {
 				recordItems.setObjective("BX");
@@ -2999,7 +3007,11 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		}
 		if (!itemsList.isEmpty()) {
 			if (!"同步失败".equals(boxDynamicsRecord.getSynchronizationStatus())) {
-				this.synchronizationV1(boxDynamicsRecord, itemsList, "2");
+				Boolean status = this.synchronizationV1(boxDynamicsRecord, itemsList, "2");
+				if (!status) {
+					boxDynamicsRecord.setSynchronizationStatus("同步失败");
+					baseMapper.updateById(boxDynamicsRecord);
+				}
 			}
 		}
 		return R.success("成功");
@@ -3593,7 +3605,10 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 					List<BoxDynamicsRecordItems> itemsListDLX = itemsListFCs.stream().filter(e -> boxNumList.contains(e.getBoxCode())).collect(Collectors.toList());
 					//箱档案不存在的箱
 					if (!itemsListDLX.isEmpty()) {
-						this.synchronization(itemsListDLX, boxDynamicsRecord, type);
+						Boolean status = this.synchronization(itemsListDLX, boxDynamicsRecord, type);
+						if (!status) {
+							return false;
+						}
 					}
 					//重新添加存在箱档案的客户还箱数据
 					for (BoxDynamicsRecordItems item : itemsListFCs) {
@@ -4374,7 +4389,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							TradingBox tradingBox = tradingBoxList.stream().filter(e -> e.getId().equals(putBox.getSrcId()))
 								.findFirst().orElse(null);
 							if (tradingBox != null) {
-								if ((tradingBox.getPolId()+"").equals(tradingBox.getPodId())) {
+								if ((tradingBox.getPolId() + "").equals(tradingBox.getPodId())) {
 									samePort = false;
 								}
 								if (!tradingBoxes.isEmpty()) {
@@ -4722,7 +4737,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 			}
 			//退租箱进场
 			List<BoxDynamicsRecordItems> itemsListTZX = itemsList.stream().filter(e -> ("T".equals(e.getObjective()) ||
-				"CT".equals(e.getObjective()) || "ZI".equals(e.getObjective())) ).collect(Collectors.toList());
+				"CT".equals(e.getObjective()) || "ZI".equals(e.getObjective()))).collect(Collectors.toList());
 			if (!itemsListTZX.isEmpty()) {
 				Boolean status = this.terminateTheLease(itemsListTZX, boxDynamicsRecord, type);
 				if (!status) {
@@ -5234,19 +5249,31 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 				List<String> hblno = itemsListCC.stream().map(BoxDynamicsRecordItems::getHblno).filter(Objects::nonNull)
 					.distinct().collect(Collectors.toList());
 				List<Containers> containersList = new ArrayList<>();
+				List<PreContainers> preContainersList = new ArrayList<>();
+				List<PreContainers> preContainersListNew = new ArrayList<>();
+				List<SeaContainerNumberItem> containerNumberItemList = new ArrayList<>();
+				List<SeaContainerNumberItem> containerNumberItemListNew = new ArrayList<>();
 				List<Containers> containersListNew = new ArrayList<>();
 				List<Bills> billsList = new ArrayList<>();
 				if (!hblno.isEmpty()) {
 					billsList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
-						.eq(Bills::getTenantId, AuthUtil.getTenantId())
+						.eq(Bills::getTenantId, boxDynamicsRecord.getTenantId())
 						.eq(Bills::getIsDeleted, 0)
 						.eq(Bills::getBusinessType, "SE")
 						.in(Bills::getHblno, hblno));
 					if (!billsList.isEmpty()) {
 						containersList = containersService.list(new LambdaQueryWrapper<Containers>()
-							.eq(Containers::getTenantId, AuthUtil.getTenantId())
+							.eq(Containers::getTenantId, boxDynamicsRecord.getTenantId())
 							.eq(Containers::getIsDeleted, 0)
 							.in(Containers::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+						preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+							.eq(PreContainers::getTenantId, boxDynamicsRecord.getTenantId())
+							.eq(PreContainers::getIsDeleted, 0)
+							.in(PreContainers::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+						containerNumberItemList = seaContainerNumberItemService.list(new LambdaQueryWrapper<SeaContainerNumberItem>()
+							.eq(SeaContainerNumberItem::getTenantId, boxDynamicsRecord.getTenantId())
+							.eq(SeaContainerNumberItem::getIsDeleted, 0)
+							.in(SeaContainerNumberItem::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
 					}
 				}
 				List<PutBox> putBoxList = putBoxService.list(new LambdaQueryWrapper<PutBox>()
@@ -5551,7 +5578,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 											} else {
 												tradingBoxItem.setPolStationEmptyContainerExitDate(new Date());
 											}
-											tradingBoxItem.setStatus("使用");
+											tradingBoxItem.setStatus("使用");
 											tradingBoxItem.setCorpId(bills.getCorpId());
 											tradingBoxItem.setCorpName(bills.getCorpCnName());
 											tradingBoxItem.setHblno(bills.getHblno());
@@ -5602,7 +5629,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 											} else {
 												tradingBoxItem.setPolStationEmptyContainerExitDate(new Date());
 											}
-											tradingBoxItem.setStatus("使用");
+											tradingBoxItem.setStatus("使用");
 											tradingBoxItem.setCorpId(bills.getCorpId());
 											tradingBoxItem.setCorpName(bills.getCorpCnName());
 											tradingBoxItem.setHblno(bills.getHblno());
@@ -5652,7 +5679,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										} else {
 											tradingBoxItem.setPolStationEmptyContainerExitDate(new Date());
 										}
-										tradingBoxItem.setStatus("使用");
+										tradingBoxItem.setStatus("使用");
 										tradingBoxItem.setCorpId(bills.getCorpId());
 										tradingBoxItem.setCorpName(bills.getCorpCnName());
 										tradingBoxItem.setHblno(bills.getHblno());
@@ -5711,6 +5738,10 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 								containers.setPolCyCname(item.getStationCname());
 								containers.setPolCyEname(item.getStationEname());
 								containers.setPolStationEmptyContainerExitDate(item.getApproachExitDate());
+								containers.setPodStationId(putBoxData.getPodStationId());
+								containers.setPodStationCode(putBoxData.getPodStationCode());
+								containers.setPodStationCname(putBoxData.getPodStationCname());
+								containers.setPodStationEname(putBoxData.getPodStationEname());
 								containers.setContainerNumber(item.getContainerNumber());
 								containers.setBoxSrcType(putBoxData.getBoxClass());
 								containersListNew.add(containers);
@@ -5777,10 +5808,25 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 									if (!containers.isEmpty()) {
 										long size = containers.stream().filter(e -> ObjectUtils.isNotNull(e.getContainerNumber()) &&
 											e.getContainerNumber().equals(item.getContainerNumber()) && boxList.contains(e.getCntrNo())).count();
+										if (!containerNumberItemList.isEmpty()) {
+											SeaContainerNumberItem containerNumberItems = containerNumberItemList.stream().filter(e -> e.getSrcId().equals(item.getId())).findFirst().orElse(null);
+											if (containerNumberItems != null) {
+												containerNumberItems.setWhetherAppearStatus("1");
+												containerNumberItemListNew.add(containerNumberItems);
+											}
+										}
+										if (!preContainersList.isEmpty()) {
+											PreContainers preContainers = preContainersList.stream().filter(e -> e.getPid().equals(containers.get(0).getPid()) &&
+												item.getBoxType().equals(e.getCntrTypeCode())).findFirst().orElse(null);
+											if (preContainers != null) {
+												preContainers.setWhetherAppearStatus("1");
+												preContainersListNew.add(preContainers);
+											}
+										}
 										item.setOccupyNum(item.getOccupyNum() - Integer.parseInt(size + ""));
 										if (item.getOccupyNum() < 0) {
 //											throw new RuntimeException("放箱号:" + item.getContainerNumber() + "箱号未被操作占用");
-											failureHandling(type, boxDynamicsRecord, "放箱号:" + item.getContainerNumber() + "箱号未被操作占用");
+											failureHandling(type, boxDynamicsRecord, "放箱号:" + item.getContainerNumber() + "操作占用数量不足,操作失败");
 											return false;
 										}
 									}
@@ -5819,6 +5865,12 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							}
 						}
 					}
+					if (!preContainersListNew.isEmpty()) {
+						preContainersService.updateBatchById(preContainersListNew);
+					}
+					if (!containerNumberItemListNew.isEmpty()) {
+						seaContainerNumberItemService.updateBatchById(containerNumberItemListNew);
+					}
 					putBoxService.saveOrUpdateBatch(putBoxList1);
 					if (!putBoxListOld.isEmpty()) {
 						List<PutBox> putBoxListNew = new ArrayList<>();
@@ -5946,6 +5998,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		}
 		boxDynamicsRecordItemsService.updateBatchById(itemsList);
 		boxDynamicsRecord.setSynchronizationStatus("同步成功");
+		boxDynamicsRecord.setReason("");
 		boxDynamicsRecordMapper.updateById(boxDynamicsRecord);
 		return true;
 	}
@@ -5963,7 +6016,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 	private Boolean countOverdueFee(List<PutBox> putBoxList, List<TradingBox> tradingBoxList, List<TradingBoxItem> tradingBoxItemOldList,
 									List<Containers> containersListNew, List<PutBoxItems> putBoxItems
 		, BoxDynamicsRecord boxDynamicsRecord, String type) throws IOException {
-		List<FeeCenter> feeCenterList = new ArrayList<>();
+		List<FeeCenter> feeCenterListD = new ArrayList<>();
+		List<FeeCenter> feeCenterListC = new ArrayList<>();
 		List<PutBoxItems> putBoxItemsList = new ArrayList<>();
 		List<TradingBoxItem> tradingBoxItemList = new ArrayList<>();
 		List<String> mblnoList = putBoxItems.stream().map(PutBoxItems::getHblno).collect(Collectors.toList());
@@ -6081,7 +6135,6 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 					if (overdueDays > 0) {
 						FeeCenter feeCenter = this.addFeeCenter(item, bills, fees, storageFeesItems, curExrateList, overdueDays, exrateType);
 						if (feeCenter != null) {
-							feeCenterList.add(feeCenter);
 							FeeCenter feeCenterC = new FeeCenter();
 							BeanUtil.copyProperties(feeCenter, feeCenterC);
 							feeCenterC.setPid(bills.getId());
@@ -6096,7 +6149,30 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							feeCenterC.setAmount(feeCenterC.getQuantity().multiply(feeCenterC.getPrice()));
 							feeCenterC.setAmountLoc(feeCenterC.getAmount().multiply(feeCenter.getExrate()));
 							feeCenterC.setUnsettledAmount(feeCenterC.getAmount());
-							feeCenterList.add(feeCenterC);
+							if (feeCenterListD.isEmpty()){
+								feeCenterListD.add(feeCenter);
+								feeCenterListC.add(feeCenterC);
+							}else{
+								FeeCenter feeCenterD = feeCenterListD.stream().filter(e-> e.getPid().equals(feeCenter.getPid()) &&
+									e.getUnitNo().equals(feeCenter.getUnitNo())).findFirst().orElse(null);
+								if (feeCenterD != null){
+									feeCenterD.setQuantity(feeCenterD.getQuantity().add(new BigDecimal("1")));
+									feeCenterD.setAmount(feeCenterD.getQuantity().multiply(feeCenterD.getPrice()));
+									feeCenterD.setAmountLoc(feeCenterD.getAmount().multiply(feeCenterD.getExrate()));
+									feeCenterD.setUnsettledAmount(feeCenterD.getAmount());
+									FeeCenter feeCentersC = feeCenterListC.stream().filter(e-> e.getPid().equals(feeCenterC.getPid()) &&
+										e.getUnitNo().equals(feeCenterC.getUnitNo())).findFirst().orElse(null);
+									if (feeCentersC != null) {
+										feeCentersC.setQuantity(feeCentersC.getQuantity().add(new BigDecimal("1")));
+										feeCentersC.setAmount(feeCentersC.getQuantity().multiply(feeCentersC.getPrice()));
+										feeCentersC.setAmountLoc(feeCentersC.getAmount().multiply(feeCentersC.getExrate()));
+										feeCentersC.setUnsettledAmount(feeCentersC.getAmount());
+									}
+								}else{
+									feeCenterListD.add(feeCenter);
+									feeCenterListC.add(feeCenterC);
+								}
+							}
 							item.setPolOverdueBoxUseDays(Integer.parseInt(days + ""));
 						}
 						putBoxItemsList.add(item);
@@ -6131,8 +6207,11 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		} else {
 			tradingBoxItemService.saveOrUpdateBatch(tradingBoxItemOldList);
 		}
-		if (!feeCenterList.isEmpty()) {
-			feeCenterService.saveBatch(feeCenterList);
+		if (!feeCenterListD.isEmpty()) {
+			feeCenterService.saveBatch(feeCenterListD);
+		}
+		if (!feeCenterListC.isEmpty()) {
+			feeCenterService.saveBatch(feeCenterListC);
 		}
 		return true;
 	}
@@ -6249,7 +6328,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		feeCenter.setUnsettledAmount(amount);
 		feeCenter.setPrice(amount);
 		feeCenter.setRemarks(text);
-		feeCenter.setQuantity(new BigDecimal("1"));
+		int quantity = bills.getQuantityV20()+bills.getQuantityV40()+bills.getQuantityV45()+bills.getQuantityV48()+bills.getQuantityV40hc();
+		feeCenter.setQuantity(new BigDecimal(quantity));
 		feeCenter.setBillNo(bills.getBillNo());
 		feeCenter.setBusinessType(bills.getBusinessType());
 		feeCenter.setBillDate(bills.getBillDate());
@@ -6272,7 +6352,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 	private Boolean countOverdueFeeV1(Bills billsHYJK, List<TradingBox> tradingBoxList,
 									  List<TradingBoxItem> tradingBoxItemOldList, List<PutBoxItems> putBoxItemsOldList,
 									  List<PutBox> putBoxList, BoxDynamicsRecord boxDynamicsRecord, String type) throws IOException {
-		List<FeeCenter> feeCenterList = new ArrayList<>();
+		List<FeeCenter> feeCenterListD = new ArrayList<>();
+		List<FeeCenter> feeCenterListC = new ArrayList<>();
 		List<PutBoxItems> putBoxItemsList = new ArrayList<>();
 		List<TradingBoxItem> tradingBoxItemList = new ArrayList<>();
 		//超期标准
@@ -6363,7 +6444,6 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 				if (overdueDays > 0) {
 					FeeCenter feeCenter = this.addFeeCenter(item, billsHYJK, fees, storageFeesItems, curExrateList, overdueDays, exrateType);
 					if (feeCenter != null) {
-						feeCenterList.add(feeCenter);
 						FeeCenter feeCenterC = new FeeCenter();
 						BeanUtil.copyProperties(feeCenter, feeCenterC);
 						feeCenterC.setDc("C");
@@ -6377,7 +6457,31 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 						feeCenterC.setAmount(feeCenterC.getQuantity().multiply(feeCenterC.getPrice()));
 						feeCenterC.setAmountLoc(feeCenterC.getAmount().multiply(feeCenter.getExrate()));
 						feeCenterC.setUnsettledAmount(feeCenterC.getAmount());
-						feeCenterList.add(feeCenterC);
+
+						if (feeCenterListD.isEmpty()){
+							feeCenterListD.add(feeCenter);
+							feeCenterListC.add(feeCenterC);
+						}else{
+							FeeCenter feeCenterD = feeCenterListD.stream().filter(e-> e.getPid().equals(feeCenter.getPid()) &&
+								e.getUnitNo().equals(feeCenter.getUnitNo())).findFirst().orElse(null);
+							if (feeCenterD != null){
+								feeCenterD.setQuantity(feeCenterD.getQuantity().add(new BigDecimal("1")));
+								feeCenterD.setAmount(feeCenterD.getQuantity().multiply(feeCenterD.getPrice()));
+								feeCenterD.setAmountLoc(feeCenterD.getAmount().multiply(feeCenterD.getExrate()));
+								feeCenterD.setUnsettledAmount(feeCenterD.getAmount());
+								FeeCenter feeCentersC = feeCenterListC.stream().filter(e-> e.getPid().equals(feeCenterC.getPid()) &&
+									e.getUnitNo().equals(feeCenterC.getUnitNo())).findFirst().orElse(null);
+								if (feeCentersC != null) {
+									feeCentersC.setQuantity(feeCentersC.getQuantity().add(new BigDecimal("1")));
+									feeCentersC.setAmount(feeCentersC.getQuantity().multiply(feeCentersC.getPrice()));
+									feeCentersC.setAmountLoc(feeCentersC.getAmount().multiply(feeCentersC.getExrate()));
+									feeCentersC.setUnsettledAmount(feeCentersC.getAmount());
+								}
+							}else{
+								feeCenterListD.add(feeCenter);
+								feeCenterListC.add(feeCenterC);
+							}
+						}
 						item.setPodBoxUseDays(Integer.parseInt(days + ""));
 					}
 					putBoxItemsList.add(item);
@@ -6411,8 +6515,11 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 		} else {
 			tradingBoxItemService.saveOrUpdateBatch(tradingBoxItemOldList);
 		}
-		if (!feeCenterList.isEmpty()) {
-			feeCenterService.saveBatch(feeCenterList);
+		if (!feeCenterListD.isEmpty()) {
+			feeCenterService.saveBatch(feeCenterListD);
+		}
+		if (!feeCenterListC.isEmpty()) {
+			feeCenterService.saveBatch(feeCenterListC);
 		}
 		return true;
 	}

+ 53 - 9
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/SeaContainerNumberItemController.java

@@ -16,25 +16,30 @@
  */
 package org.springblade.los.business.sea.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
+import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.SeaContainerNumberItem;
-import org.springblade.los.business.sea.vo.SeaContainerNumberItemVO;
+import org.springblade.los.business.sea.service.IBillsService;
 import org.springblade.los.business.sea.service.ISeaContainerNumberItemService;
-import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.los.business.sea.vo.PreContainersVO;
+import org.springblade.los.business.sea.vo.SeaContainerNumberItemVO;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 业务放箱号明细 控制器
@@ -50,6 +55,8 @@ public class SeaContainerNumberItemController extends BladeController {
 
 	private final ISeaContainerNumberItemService seaContainerNumberItemService;
 
+	private final IBillsService billsService;
+
 	/**
 	 * 详情
 	 */
@@ -125,8 +132,8 @@ public class SeaContainerNumberItemController extends BladeController {
 	 * 撤销选中放箱号
 	 */
 	@GetMapping("/revokeSelectedContainerNumber")
-	public R revokeSelectedContainerNumber(@RequestParam("boxType") String boxType,@RequestParam("billId") String billId) {
-		return seaContainerNumberItemService.revokeSelectedContainerNumber(boxType,billId);
+	public R revokeSelectedContainerNumber(@RequestParam("boxType") String boxType, @RequestParam("billId") String billId) {
+		return seaContainerNumberItemService.revokeSelectedContainerNumber(boxType, billId);
 	}
 
 
@@ -140,5 +147,42 @@ public class SeaContainerNumberItemController extends BladeController {
 		return R.status(seaContainerNumberItemService.removeByIds(Func.toLongList(ids)));
 	}
 
+	/**
+	 * 实际占用箱量修改
+	 */
+	@PostMapping("/actualOccupyNumUpdate")
+	public R actualOccupyNumUpdate(@Valid @RequestBody PreContainersVO preContainers) {
+		return seaContainerNumberItemService.actualOccupyNumUpdate(preContainers);
+	}
+
+	/**
+	 * 获取放箱号占用记录
+	 */
+	@GetMapping("/getContainerNumberOccupationRecord")
+	public R<List<SeaContainerNumberItem>> list(@RequestParam("id") Long id) {
+		List<SeaContainerNumberItem> list = seaContainerNumberItemService.list(new LambdaQueryWrapper<SeaContainerNumberItem>()
+			.eq(SeaContainerNumberItem::getTenantId, AuthUtil.getTenantId())
+			.eq(SeaContainerNumberItem::getIsDeleted, 0)
+			.eq(SeaContainerNumberItem::getSrcId, id)
+			.eq(SeaContainerNumberItem::getWhetherAppearStatus, "0"));
+		if (!list.isEmpty()){
+			List<Long> idList = list.stream().map(SeaContainerNumberItem::getPid).distinct().collect(Collectors.toList());
+			List<Bills> billsList = billsService.list(new LambdaQueryWrapper<Bills>()
+				.eq(Bills::getTenantId,AuthUtil.getTenantId())
+				.eq(Bills::getIsDeleted,0)
+				.in(Bills::getId,idList));
+			for (SeaContainerNumberItem item : list){
+				if (!billsList.isEmpty()){
+					Bills bills = billsList.stream().filter(e-> e.getId().equals(item.getPid())).findFirst().orElse(null);
+					if (bills != null){
+						item.setMblno(bills.getMblno());
+						item.setHblno(bills.getHblno());
+					}
+				}
+			}
+		}
+		return R.data(list);
+	}
+
 
 }

+ 3 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/ISeaContainerNumberItemService.java

@@ -18,6 +18,7 @@ package org.springblade.los.business.sea.service;
 
 import org.springblade.core.tool.api.R;
 import org.springblade.los.business.sea.entity.SeaContainerNumberItem;
+import org.springblade.los.business.sea.vo.PreContainersVO;
 import org.springblade.los.business.sea.vo.SeaContainerNumberItemVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -45,4 +46,6 @@ public interface ISeaContainerNumberItemService extends IService<SeaContainerNum
     R selectedContainerNumber(List<SeaContainerNumberItem> containerNumberItemList);
 
 	R revokeSelectedContainerNumber(String boxType, String billId);
+
+	R actualOccupyNumUpdate(PreContainersVO preContainers);
 }

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

@@ -379,6 +379,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				if (ObjectUtils.isNull(item.getCntrTypeCode())) {
 					throw new RuntimeException("箱型不能为空");
 				}
+				if ("0".equals(item.getWhetherAppearStatus())){
+					item.setActualQuantity(item.getQuantity());
+				}
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -4744,6 +4747,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				if (ObjectUtils.isNull(item.getCntrTypeCode())) {
 					throw new RuntimeException("箱型不能为空");
 				}
+				if ("0".equals(item.getWhetherAppearStatus())){
+					item.setActualQuantity(item.getQuantity());
+				}
 				item.setWhetherModifyJson(item.getCntrTypeCode() + "+" + item.getQuantity());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());

+ 3 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/PreContainersServiceImpl.java

@@ -333,6 +333,9 @@ public class PreContainersServiceImpl extends ServiceImpl<PreContainersMapper, P
 		}
 		for (PreContainers preContainers : preContainersList) {
 			preContainers.setWhetherModifyJson(preContainers.getCntrTypeCode() + "+" + preContainers.getQuantity());
+			if ("0".equals(preContainers.getWhetherAppearStatus())){
+				preContainers.setActualQuantity(preContainers.getQuantity());
+			}
 			if (preContainers.getId() == null) {
 				preContainers.setCreateTime(new Date());
 				preContainers.setCreateUser(AuthUtil.getUserId());

+ 64 - 5
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/SeaContainerNumberItemServiceImpl.java

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.los.Util.CurrencyUtils;
 import org.springblade.los.Util.RegularUtils;
 import org.springblade.los.basic.cntr.entity.BCntrTypes;
@@ -43,6 +44,7 @@ import org.springblade.los.business.sea.mapper.SeaContainerNumberItemMapper;
 import org.springblade.los.business.sea.service.IContainersService;
 import org.springblade.los.business.sea.service.IPreContainersService;
 import org.springblade.los.business.sea.service.ISeaContainerNumberItemService;
+import org.springblade.los.business.sea.vo.PreContainersVO;
 import org.springblade.los.business.sea.vo.SeaContainerNumberItemVO;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
@@ -92,6 +94,7 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 	@Transactional(rollbackFor = Exception.class)
 	public R selectedContainerNumber(List<SeaContainerNumberItem> containerNumberItemList) {
 		for (SeaContainerNumberItem item : containerNumberItemList) {
+			item.setActualOccupyNum(item.getOccupyNum());
 			item.setCreateTime(new Date());
 			item.setCreateUser(AuthUtil.getUserId());
 			item.setCreateUserName(AuthUtil.getUserName());
@@ -116,7 +119,7 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 				throw new RuntimeException("数据错误,请联系管理员");
 			}
 			item.setOccupyNum(item.getOccupyNum() + containerNumberItem.getOccupyNum());
-			item.setRemainingNum(item.getRemainingNum() - item.getOccupyNum());
+			item.setRemainingNum(item.getRemainingNum() - containerNumberItem.getOccupyNum());
 		}
 		putBoxService.updateBatchByIdAndVersion(putBoxList);
 		PreContainers preContainers = preContainersService.getOne(new LambdaQueryWrapper<PreContainers>()
@@ -128,6 +131,8 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 		if (preContainers.getQuantity() < containerNumberItemList.stream().map(SeaContainerNumberItem::getOccupyNum).reduce(0, Integer::sum)) {
 			throw new RuntimeException("操作占用箱量合计大于订舱箱量");
 		}
+		preContainers.setOccupyNum(containerNumberItemList.stream().map(SeaContainerNumberItem::getOccupyNum).reduce(0, Integer::sum));
+		preContainers.setActualQuantity(containerNumberItemList.stream().map(SeaContainerNumberItem::getActualOccupyNum).reduce(0, Integer::sum));
 		preContainers.setUpdateTime(new Date());
 		preContainers.setUpdateUser(AuthUtil.getUserId());
 		preContainers.setUpdateUserName(AuthUtil.getUserName());
@@ -376,7 +381,7 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 				throw new RuntimeException("放箱号已出场,撤销失败");
 			}
 			item.setOccupyNum(item.getOccupyNum() - containerNumberItem.getOccupyNum());
-			item.setRemainingNum(item.getRemainingNum() + item.getOccupyNum());
+			item.setRemainingNum(item.getRemainingNum() + containerNumberItem.getOccupyNum());
 		}
 		putBoxService.updateBatchByIdAndVersion(putBoxList);
 		PreContainers preContainers = preContainersService.getOne(new LambdaQueryWrapper<PreContainers>()
@@ -385,6 +390,8 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 		if (preContainers == null) {
 			throw new RuntimeException("数据错误,请联系管理员");
 		}
+		preContainers.setOccupyNum(0);
+		preContainers.setActualQuantity(0);
 		preContainers.setUpdateTime(new Date());
 		preContainers.setUpdateUser(AuthUtil.getUserId());
 		preContainers.setUpdateUserName(AuthUtil.getUserName());
@@ -418,11 +425,11 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 			List<Containers> containers = containersList.stream().filter(e -> e.getCntrTypeCode().equals(preContainers.getCntrTypeCode()))
 				.collect(Collectors.toList());
 			List<Long> containersIdList = new ArrayList<>();
-			for (Containers item : containers){
-				if (new BigDecimal("0.00").compareTo(item.getQuantity()) != 0){
+			for (Containers item : containers) {
+				if (new BigDecimal("0.00").compareTo(item.getQuantity()) != 0) {
 					throw new RuntimeException("已配箱,请先撤销后再操作!");
 				}
-				if (ObjectUtils.isNotNull(item.getCntrNo())){
+				if (ObjectUtils.isNotNull(item.getCntrNo())) {
 					throw new RuntimeException("存在箱号,请先清空后再操作!");
 				}
 				containersIdList.add(item.getId());
@@ -434,4 +441,56 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 		return R.data("操作成功");
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R actualOccupyNumUpdate(PreContainersVO preContainers) {
+		PreContainers preContainers1 = new PreContainers();
+		BeanUtil.copyProperties(preContainers, preContainers1);
+		preContainers1.setUpdateTime(new Date());
+		preContainers1.setUpdateUserName(AuthUtil.getUserName());
+		preContainers1.setUpdateUser(AuthUtil.getUserId());
+		preContainersService.updateById(preContainers1);
+		if (ObjectUtils.isNull(preContainers.getContainerNumberItemList()) || preContainers.getContainerNumberItemList().isEmpty()) {
+			throw new RuntimeException("放箱号数据不能为空");
+		}
+		List<PutBox> putBoxList = putBoxService.list(new LambdaQueryWrapper<PutBox>()
+			.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+			.eq(PutBox::getIsDeleted, 0)
+			.in(PutBox::getId, preContainers.getContainerNumberItemList().stream().map(SeaContainerNumberItem::getSrcId).collect(Collectors.toList())));
+		if (putBoxList.isEmpty()) {
+			throw new RuntimeException("未查到对应放箱号单据");
+		}
+		List<PutBox> putBoxes = new ArrayList<>();
+		for (SeaContainerNumberItem item : preContainers.getContainerNumberItemList()) {
+			item.setUpdateTime(new Date());
+			item.setUpdateUser(AuthUtil.getUserId());
+			item.setUpdateUserName(AuthUtil.getUserName());
+			int poor = item.getActualOccupyNum() - item.getOccupyNum();
+			item.setOccupyBalance(poor);
+			if (poor != 0) {
+				PutBox putBox = putBoxList.stream().filter(e -> e.getId().equals(item.getSrcId())).findFirst().orElse(null);
+				if (putBox != null) {
+					putBox.setUpdateTime(new Date());
+					putBox.setUpdateUser(AuthUtil.getUserId());
+					putBox.setUpdateUserName(AuthUtil.getUserName());
+					if (poor < 0) {
+						if (putBox.getRemainingNum() < poor) {
+							throw new RuntimeException("可用箱量不足");
+						}
+					}
+					putBox.setOccupyNum(putBox.getOccupyNum() - poor);
+					putBox.setRemainingNum(putBox.getRemainingNum() + poor);
+					putBox.setVersion(putBox.getVersion() + 1);
+					putBoxes.add(putBox);
+				}
+				item.setActualOccupyNum(item.getOccupyNum());
+			}
+		}
+		if (!putBoxes.isEmpty()) {
+			putBoxService.updateBatchById(putBoxes);
+		}
+		this.updateBatchById(preContainers.getContainerNumberItemList());
+		return R.data("操作成功");
+	}
+
 }