Przeglądaj źródła

1.配箱列表增加版本号控制
2.发票金额计算问题修改
3.增加放箱号是否作废接口
4.获取放箱号列表条件修改
5.代码优化

纪新园 6 dni temu
rodzic
commit
9fcfda8b72
15 zmienionych plików z 421 dodań i 247 usunięć
  1. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBoxItems.java
  2. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Containers.java
  3. 226 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/BillUtils.java
  4. 7 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/IBillUtils.java
  5. 13 9
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/PutBoxController.java
  6. 51 9
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java
  7. 5 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/mapper/PutBoxMapper.xml
  8. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/IPutBoxService.java
  9. 29 2
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/PutBoxServiceImpl.java
  10. 3 3
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  11. 0 6
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java
  12. 44 211
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  13. 19 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/ContainersServiceImpl.java
  14. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/SeaContainerNumberItemServiceImpl.java
  15. 10 6
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java

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

@@ -373,4 +373,9 @@ public class PutBoxItems implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String temporaryHblno;
+	/**
+	 * 未占用
+	 */
+	@TableField(exist = false)
+	private String unoccupied;
 }

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

@@ -640,6 +640,12 @@ public class Containers implements Serializable {
 	private String whetherSystemGenerate;
 
 	/**
+	 * 是否出场状态
+	 */
+	@ApiModelProperty(value = "是否出场状态")
+	private String whetherAppearStatus;
+
+	/**
 	 * 配箱类型
 	 */
 	@TableField(exist = false)

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

@@ -9,6 +9,7 @@ import org.springblade.client.entity.Message;
 import org.springblade.client.feign.IMessageClient;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
@@ -19,12 +20,17 @@ import org.springblade.los.basic.fees.entity.BFees;
 import org.springblade.los.basic.fees.service.IBFeesService;
 import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
+import org.springblade.los.box.entity.RouteCost;
+import org.springblade.los.box.entity.RouteCostItem;
+import org.springblade.los.box.service.IRouteCostItemService;
+import org.springblade.los.box.service.IRouteCostService;
 import org.springblade.los.business.files.entity.FilesCenter;
 import org.springblade.los.business.files.service.IFilesCenterService;
 import org.springblade.los.business.release.entity.SeaReleaseBillItems;
 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.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;
@@ -37,9 +43,13 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -88,6 +98,12 @@ public class BillUtils implements IBillUtils {
 
 	private final IBusinessBillNoService businessBillNoService;
 
+	private final ISeaContainerNumberItemService seaContainerNumberItemService;
+
+	private final IRouteCostService routeCostService;
+
+	private final IRouteCostItemService routeCostItemService;
+
 	@Override
 	public void itemCopy(Bills bills, List<Bills> billsList, boolean status) {
 		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
@@ -1008,4 +1024,214 @@ public class BillUtils implements IBillUtils {
 		}
 		return R.success("操作成功");
 	}
+
+	@Override
+	public List<DeliveryPaperExcel> sendDeliveryPaperExport(String ids) {
+		if (ObjectUtils.isNull(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		List<Long> idList = Func.toLongList(ids);
+		List<Bills> billsList = billsMapper.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());
+			String containerNumber = "";
+			List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
+				.collect(Collectors.toList());
+			for (PreContainers containers : preContainers) {
+				List<SeaContainerNumberItem> containerNumberItems = containerNumberItemList.stream().filter(e ->
+					containers.getCntrTypeCode().equals(e.getBoxType()) && 0 != e.getOccupyNum()).collect(Collectors.toList());
+				for (SeaContainerNumberItem numberItem : containerNumberItems) {
+					containerNumber = containerNumber + numberItem.getContainerNumber() + " " + numberItem.getOccupyNum() + "*" +
+						containers.getCntrTypeCode() + "\n";
+				}
+			}
+			excel.setContainerNumber(containerNumber);
+			excelList.add(excel);
+		}
+		return excelList;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R sendDeliveryPaper(String ids) {
+		if (ObjectUtils.isNull(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		List<Long> idList = Func.toLongList(ids);
+		List<Bills> billsList = billsMapper.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());
+			String containerNumber = "";
+			List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
+				.collect(Collectors.toList());
+			for (PreContainers containers : preContainers) {
+				List<SeaContainerNumberItem> containerNumberItems = containerNumberItemList.stream().filter(e ->
+					containers.getCntrTypeCode().equals(e.getBoxType()) && 0 != e.getOccupyNum()).collect(Collectors.toList());
+				for (SeaContainerNumberItem numberItem : containerNumberItems) {
+					containerNumber = containerNumber + numberItem.getContainerNumber() + " " + numberItem.getOccupyNum() + "*" +
+						containers.getCntrTypeCode() + "\n";
+				}
+			}
+			excel.setContainerNumber(containerNumber);
+			excelList.add(excel);
+		}
+		return R.data(excelList);
+	}
+
+	@Override
+	public R sendVerificationPrompt(String ids) {
+		if (ObjectUtils.isNull(ids)) {
+			throw new RuntimeException("缺少必要参数,发送失败!");
+		}
+		Bills bills = billsMapper.selectById(ids);
+		if (bills == null) {
+			throw new RuntimeException("未查到海运出口单据,发送失败!");
+		}
+		StringBuilder text = new StringBuilder();
+		StringBuilder messageBody = new StringBuilder();
+		if ("SOC".equals(bills.getBoxBelongsTo()) && "DD,MH".contains(bills.getBillType())) {
+			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+			List<RouteCost> costList = routeCostService.list(new LambdaQueryWrapper<RouteCost>()
+				.eq(RouteCost::getPodId, bills.getPolId())
+				.eq(RouteCost::getDestinationId, bills.getPodId())
+				.eq(RouteCost::getShippingCompanyId, bills.getCarrierId())
+				.eq(RouteCost::getBusinessType, bills.getBoxBelongsTo())
+				.apply("DATE_FORMAT(effective_start_date,'%Y-%m-%d') <= '" + formatter.format(bills.getEtd()) + "'")
+				.apply("DATE_FORMAT(effective_end_date,'%Y-%m-%d') >= '" + formatter.format(bills.getEtd()) + "'")
+			);
+			if (costList.isEmpty()) {
+				throw new RuntimeException("请先维护成本!");
+			}
+			List<RouteCostItem> costItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
+				.eq(RouteCostItem::getIsDeleted, 0)
+				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
+				.in(RouteCostItem::getPid, costList.stream().map(RouteCost::getId).collect(Collectors.toList())));
+			if (costItemList.isEmpty()) {
+				throw new RuntimeException("请先维护成本!");
+			}
+			List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+				.eq(PreContainers::getIsDeleted, 0)
+				.eq(PreContainers::getPid, ids));
+			if (preContainersList.isEmpty()) {
+				throw new RuntimeException("未查到预配箱型信息,发送失败!");
+			}
+			List<SeaContainerNumberItem> containerNumberItemList = seaContainerNumberItemService.list(new LambdaQueryWrapper<SeaContainerNumberItem>()
+				.eq(SeaContainerNumberItem::getIsDeleted, 0)
+				.eq(SeaContainerNumberItem::getPid, ids)
+				.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::getIsDeleted, 0)
+				.eq(FeeCenter::getDc, "D")
+				.eq(FeeCenter::getFeeCode, "HYF")
+				.eq(FeeCenter::getPid, ids));
+			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);
+				}
+			}
+			boolean status = bills.getEtd().compareTo(date) >= 0;
+			if (status) {
+				for (PreContainers containers : preContainersList) {
+					BigDecimal price = feeCenterList.stream().filter(e -> containers.getCntrTypeCode().equals(e.getUnitNo()))
+						.map(FeeCenter::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+					List<RouteCostItem> minCostItem = costItemList.stream().filter(e -> containers.getCntrTypeCode().equals(e.getBoxType()))
+						.sorted(Comparator.comparing(RouteCostItem::getSalesPrice))
+						.collect(Collectors.toList());
+					if (price.compareTo(minCostItem.get(0).getSalesPrice()) < 0) {
+						text.append("提单号:").append(bills.getMblno()).append("箱型:").append(containers.getCntrTypeCode()).append("应收海运费:" + price + "小于成本中心海运费:" + minCostItem.get(0).getSalesPrice() + "!");
+						messageBody.append("提单号:").append(bills.getMblno()).append("应收海运费:" + price + "小于成本中心海运费:" + minCostItem.get(0).getSalesPrice() + "!");
+					}
+					if (containerNumberItemList.stream().filter(e -> e.getBoxType().equals(containers.getCntrTypeCode()))
+						.mapToInt(SeaContainerNumberItem::getOccupyNum).sum() != containers.getQuantity()) {
+						text.append("提单号:").append(bills.getMblno()).append("箱型:").append(containers.getCntrTypeCode()).append("箱量与所选放箱号数量不等!");
+					}
+				}
+			}
+		}
+		if (ObjectUtils.isNotNull(text.toString())) {
+			String url = "/iosBasicData/OceanFreightImport/bills/index";
+			String pageLabel = "海运出口";
+			String pageStatus = "this.$store.getters.domSaleStatus";
+			messageBody.append("发送人:").append(AuthUtil.getUserName());
+			this.sendMessage(bills, url, pageLabel, pageStatus, messageBody.toString(), "2", bills.getOperatorId(), "成本中心");
+//			return R.success(text.toString());
+			throw new RuntimeException(text.toString());
+		} else {
+			return R.success("操作成功");
+		}
+	}
 }

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

@@ -6,6 +6,7 @@ import org.springblade.los.basic.fees.entity.BFees;
 import org.springblade.los.business.release.entity.SeaReleaseBillItems;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.PreContainers;
+import org.springblade.los.excel.DeliveryPaperExcel;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 
 import java.util.Date;
@@ -43,4 +44,10 @@ public interface IBillUtils {
 	R generateAmendmentFee(Long id);
 
 	R synchronizationEtdData(Long id);
+
+	List<DeliveryPaperExcel> sendDeliveryPaperExport(String ids);
+
+	R sendDeliveryPaper(String ids);
+
+	R sendVerificationPrompt(String ids);
 }

+ 13 - 9
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/PutBoxController.java

@@ -40,7 +40,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -107,12 +106,12 @@ public class PutBoxController extends BladeController {
 		lambdaQueryWrapper.orderByAsc(PutBox::getPriorityLevel);
 		if ("1".equals(putBox.getWhetherDisplay())) {
 			lambdaQueryWrapper.ne(PutBox::getRemainingNum, 0);
-			lambdaQueryWrapper.ge(PutBox::getEffectiveEndDate, new Date());
+			lambdaQueryWrapper.eq(PutBox::getWhetherDeactivate, "0");
 		} else if ("2".equals(putBox.getWhetherDisplay())) {
 			lambdaQueryWrapper.eq(PutBox::getRemainingNum, 0);
-			lambdaQueryWrapper.ge(PutBox::getEffectiveEndDate, new Date());
+			lambdaQueryWrapper.eq(PutBox::getWhetherDeactivate, "0");
 		} else if ("3".equals(putBox.getWhetherDisplay())) {
-			lambdaQueryWrapper.lt(PutBox::getEffectiveEndDate, new Date());
+			lambdaQueryWrapper.eq(PutBox::getWhetherDeactivate, "1");
 		}
 		if (ObjectUtils.isNotNull(putBox.getEffectiveStartDate()) && ObjectUtils.isNotNull(putBox.getEffectiveEndDate())) {
 			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
@@ -182,6 +181,7 @@ public class PutBoxController extends BladeController {
 			.eq(PutBox::getIsDeleted, 0)
 			.eq(PutBox::getContainerNumber, putBox.getContainerNumber())
 			.eq(PutBox::getBusType, putBox.getBusType())
+			.eq(PutBox::getWhetherDeactivate, "0")
 			.like(ObjectUtils.isNotNull(putBox.getPodId()), PutBox::getPodId, putBox.getPodId())
 			.like(ObjectUtils.isNotNull(putBox.getPolId()), PutBox::getPolId, putBox.getPolId())
 		);
@@ -206,6 +206,7 @@ public class PutBoxController extends BladeController {
 		lambdaQueryWrapper.eq(PutBox::getTenantId, AuthUtil.getTenantId())
 			.eq(PutBox::getIsDeleted, 0)
 			.eq(PutBox::getBoxType, putBox.getBoxType())
+			.eq(PutBox::getWhetherDeactivate, "0")
 			.ne(PutBox::getBusType, "OW(放)")
 			.apply("remaining_num > 0")
 			.like(ObjectUtils.isNotNull(putBox.getPodId()), PutBox::getPodId, putBox.getPodId())
@@ -216,11 +217,6 @@ public class PutBoxController extends BladeController {
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(putBox.getCabinType()), PutBox::getCabinType, putBox.getCabinType());
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(putBox.getAirlineId()), PutBox::getAirlineId, putBox.getAirlineId());
 		}
-		if (ObjectUtils.isNotNull(putBox.getEtd())) {
-			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
-			lambdaQueryWrapper.apply("DATE_FORMAT(effective_start_date,'%Y-%m-%d') <= '" + formatter.format(putBox.getEtd()) + "'")
-				.apply("DATE_FORMAT(effective_end_date,'%Y-%m-%d') >= '" + formatter.format(putBox.getEtd()) + "'");
-		}
 		List<PutBox> putBoxList = putBoxService.list(lambdaQueryWrapper);
 		List<SeaContainerNumberItem> containerNumberItemList = new ArrayList<>();
 		for (PutBox item : putBoxList) {
@@ -263,6 +259,7 @@ public class PutBoxController extends BladeController {
 			.eq(PutBox::getIsDeleted, 0)
 			.eq(ObjectUtils.isNotNull(putBox.getBoxType()), PutBox::getBoxType, putBox.getBoxType())
 			.eq(PutBox::getBoxClass, "自有箱")
+			.eq(PutBox::getWhetherDeactivate, "0")
 			.like(ObjectUtils.isNotNull(putBox.getContainerNumber()), PutBox::getContainerNumber, putBox.getContainerNumber())
 			.eq(ObjectUtils.isNotNull(putBox.getBoxBelongsTo()), PutBox::getBoxBelongsTo, putBox.getBoxBelongsTo())
 			.like(ObjectUtils.isNotNull(putBox.getPodId()), PutBox::getPodId, putBox.getPodId())
@@ -287,5 +284,12 @@ public class PutBoxController extends BladeController {
 		return putBoxService.batchUpdatePod(ids, podId, podCname, podEname, podCode);
 	}
 
+	/**
+	 * 放箱号是否作废
+	 */
+	@GetMapping("/whetherDeactivate")
+	public R whetherDeactivate(@RequestParam("id") String id, @RequestParam("type") String type) {
+		return putBoxService.whetherDeactivate(id, type);
+	}
 
 }

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

@@ -1537,6 +1537,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 												item.setUpdateTime(new Date());
 												item.setUpdateUser(AuthUtil.getUserId());
 												item.setUpdateUserName(AuthUtil.getUserName());
+												int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+												item.setVersion(String.valueOf(version + 1));
 												containersListNew.add(item);
 											}
 										} else {
@@ -2201,8 +2203,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
 							archivesTrajectory.setPortId(tradingBox.getPolId());
 							archivesTrajectory.setPortCode(tradingBox.getPolCode());
-							archivesTrajectory.setPortCname(tradingBox.getPodCname());
-							archivesTrajectory.setPortEname(tradingBox.getPodEname());
+							archivesTrajectory.setPortCname(tradingBox.getPolCname());
+							archivesTrajectory.setPortEname(tradingBox.getPolEname());
 							archivesTrajectory.setStationId(tradingBox.getPolStationId());
 							archivesTrajectory.setStationCode(tradingBox.getPolStationCode());
 							archivesTrajectory.setStationCname(tradingBox.getPolStationCname());
@@ -2623,6 +2625,9 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										containersItem.setPodStationCode("");
 										containersItem.setPodStationCname("");
 										containersItem.setPodStationEname("");
+										containersItem.setWhetherAppearStatus("0");
+										int version = StringUtil.isBlank(containersItem.getVersion()) ? 1 : Integer.parseInt(containersItem.getVersion());
+										containersItem.setVersion(String.valueOf(version + 1));
 										containersListNew.add(containersItem);
 									}
 								}
@@ -3088,8 +3093,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
 							archivesTrajectory.setPortId(tradingBox.getPolId());
 							archivesTrajectory.setPortCode(tradingBox.getPolCode());
-							archivesTrajectory.setPortCname(tradingBox.getPodCname());
-							archivesTrajectory.setPortEname(tradingBox.getPodEname());
+							archivesTrajectory.setPortCname(tradingBox.getPolCname());
+							archivesTrajectory.setPortEname(tradingBox.getPolEname());
 							archivesTrajectory.setStationId(tradingBox.getPolStationId());
 							archivesTrajectory.setStationCode(tradingBox.getPolStationCode());
 							archivesTrajectory.setStationCname(tradingBox.getPolStationCname());
@@ -3194,6 +3199,9 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							.eq(SeaContainerNumberItem::getIsDeleted, 0)
 							.in(SeaContainerNumberItem::getPid, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
 					}
+				} else {
+					failureHandling(type, boxDynamicsRecord, "提单号不能为空");
+					return false;
 				}
 				List<PutBox> putBoxList = putBoxService.list(new LambdaQueryWrapper<PutBox>()
 					.eq(PutBox::getTenantId, boxDynamicsRecord.getTenantId())
@@ -3248,6 +3256,10 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 				List<PutBox> putBoxes = new ArrayList<>();
 				List<TradingBox> tradingBoxes = new ArrayList<>();
 				for (BoxDynamicsRecordItems item : itemsListCC) {
+					if (ObjectUtils.isNull(item)) {
+						failureHandling(type, boxDynamicsRecord, "箱号为:" + item.getBoxCode() + "的提单号不能为空");
+						return false;
+					}
 					if (ObjectUtils.isNull(item.getApproachExitDate())) {
 						item.setApproachExitDate(new Date());
 					}
@@ -3334,6 +3346,14 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										failureHandling(type, boxDynamicsRecord, "提单号:" + bills.getHblno() + "对应海运出口单据未生成配箱列表");
 										return false;
 									}
+									if (!preContainersList.isEmpty()) {
+										PreContainers preContainers = preContainersList.stream().filter(e -> e.getPid().equals(containerItemList.get(0).getPid()) &&
+											item.getBoxType().equals(e.getCntrTypeCode())).findFirst().orElse(null);
+										if (preContainers == null || !"已选择".equals(preContainers.getContainerNumberStatus())) {
+											failureHandling(type, boxDynamicsRecord, "提单号:" + bills.getHblno() + "对应海运出口单据,箱型:" + item.getBoxType() + "未生占用放箱号");
+											return false;
+										}
+									}
 								} else {
 									failureHandling(type, boxDynamicsRecord, "提单号:" + bills.getHblno() + "对应海运出口单据未生成配箱列表");
 									return false;
@@ -3420,6 +3440,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							putBoxItem.setPolFreeBoxUseDays(bills.getPolFreeBoxUseDays());
 							putBoxItem.setEtd(bills.getEtd());
 							putBoxItem.setActualEtd(bills.getActualEtd());
+						} else {
+							putBoxItem.setUnoccupied("1");
 						}
 						putBoxItems.add(putBoxItem);
 						if ("OW(拿),OW(放)".contains(putBoxData.getBoxClass())) {
@@ -3457,7 +3479,6 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										tradingBoxItem = tradingBoxItemList.stream().filter(e -> e.getCode().equals(item.getBoxCode()))
 											.findFirst().orElse(null);
 										if (tradingBoxItem != null) {
-											tradingBoxItem.setPid(tradingBox.getId());
 											tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
 											tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
 											tradingBoxItem.setUpdateTime(new Date());
@@ -3475,7 +3496,6 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 											}
 											tradingBoxItem.setBoxCondition("新");
 											tradingBoxItem.setBoxStatus(item.getBoxStatus());
-											tradingBoxItem.setPid(tradingBox.getId());
 											tradingBoxItem.setContainerNumber(item.getContainerNumber());
 											tradingBoxItem.setCode(item.getBoxCode());
 											tradingBoxItem.setBoxType(item.getBoxType());
@@ -3498,7 +3518,6 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										}
 										tradingBoxItem.setBoxCondition("新");
 										tradingBoxItem.setBoxStatus(item.getBoxStatus());
-										tradingBoxItem.setPid(tradingBox.getId());
 										tradingBoxItem.setContainerNumber(item.getContainerNumber());
 										tradingBoxItem.setCode(item.getBoxCode());
 										tradingBoxItem.setBoxType(item.getBoxType());
@@ -3517,6 +3536,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										tradingBoxItem.setPodCyEmail(tradingBox.getPodCyEmail());
 										tradingBoxItem.setPodCyTel(tradingBox.getPodCyTel());
 									}
+									tradingBoxItem.setPid(tradingBox.getId());
 									tradingBoxItem.setBoxEastId(tradingBox.getPurchaseCompanyId());
 									tradingBoxItem.setBoxEastName(tradingBox.getPurchaseCompanyName());
 									tradingBoxItem.setBoxDynamics("空箱出场");
@@ -3618,6 +3638,9 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 									containers.setPodCyEmail(putBoxData.getPodCyEmail());
 									containers.setPodCyTel(putBoxData.getPodCyTel());
 									containers.setBoxSrcType(putBoxData.getBoxClass());
+									containers.setWhetherAppearStatus("1");
+									int version = StringUtil.isBlank(containers.getVersion()) ? 1 : Integer.parseInt(containers.getVersion());
+									containers.setVersion(String.valueOf(version + 1));
 									containersListNew.add(containers);
 								}
 							} else {
@@ -3645,6 +3668,12 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 						long count = itemsListCC.stream().filter(e -> e.getContainerNumber().equals(item.getContainerNumber())).count();
 						if ("OW(放)".equals(item.getBoxClass())) {
 							item.setRemainingNum(item.getRemainingNum() - Integer.parseInt(count + ""));
+						} else {
+							List<PutBoxItems> items = putBoxItems.stream().filter(e -> e.getPid().equals(item.getId())
+								&& "1".equals(e.getUnoccupied())).collect(Collectors.toList());
+							if (!items.isEmpty()){
+								item.setRemainingNum(item.getRemainingNum() - items.size());
+							}
 						}
 						item.setStorageNum(item.getStorageNum() - Integer.parseInt(count + ""));
 						if (item.getStorageNum() < 0) {
@@ -3715,6 +3744,19 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										failureHandling(type, boxDynamicsRecord, "放箱号:" + item.getContainerNumber() + "剩余未提箱小于本次导入箱数");
 										return false;
 									}
+								} else {
+									if (!tradingBoxItems.isEmpty()) {
+										List<TradingBoxItem> itemList = tradingBoxItems.stream().filter(e -> e.getPid().equals(tradingBox.getId())
+											&& e.getId() == null).collect(Collectors.toList());
+										if (!itemList.isEmpty()) {
+											item.setSuitcaseNum(item.getSuitcaseNum() + itemList.size());
+											item.setNotSuitcaseNum(item.getTotalNum() - item.getSuitcaseNum());
+											if (item.getNotSuitcaseNum() < 0) {
+												failureHandling(type, boxDynamicsRecord, "放箱号:" + item.getContainerNumber() + "剩余未提箱小于本次导入箱数");
+												return false;
+											}
+										}
+									}
 								}
 								tradingBox.setActualBoxNumber(tradingBox.getActualBoxNumber() - Integer.parseInt(count + ""));
 								tradingBox.setRemainingBoxNumber(tradingBox.getBoxNumber() - tradingBox.getActualBoxNumber());
@@ -3740,8 +3782,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
 							archivesTrajectory.setPortId(tradingBox.getPolId());
 							archivesTrajectory.setPortCode(tradingBox.getPolCode());
-							archivesTrajectory.setPortCname(tradingBox.getPodCname());
-							archivesTrajectory.setPortEname(tradingBox.getPodEname());
+							archivesTrajectory.setPortCname(tradingBox.getPolCname());
+							archivesTrajectory.setPortEname(tradingBox.getPolEname());
 							archivesTrajectory.setStationId(tradingBox.getPolStationId());
 							archivesTrajectory.setStationCode(tradingBox.getPolStationCode());
 							archivesTrajectory.setStationCname(tradingBox.getPolStationCname());

+ 5 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/mapper/PutBoxMapper.xml

@@ -67,6 +67,7 @@
         tenant_id = #{data.tenantId}
         AND is_deleted = '0'
         AND remaining_num > 0
+        AND whether_deactivate = '0'
         <if test='data.containerNumber != null and data.containerNumber != ""'>
             and container_number like concat(concat('%', #{data.containerNumber}),'%')
         </if>
@@ -121,6 +122,7 @@
         AND lp.tenant_id = #{data.tenantId}
         AND lp.is_deleted = '0'
         AND lpb.remaining_num > 0
+        AND lpb.whether_deactivate = '0'
         <if test='data.containerNumber != null and data.containerNumber != ""'>
             and lpb.container_number like concat(concat('%', #{data.containerNumber}),'%')
         </if>
@@ -269,6 +271,7 @@
         WHERE
             lpb.tenant_id = #{tenantId}
           AND lpb.is_deleted = '0'
+        AND lpb.whether_deactivate = '0'
         <if test="portId !=null and portId != ''">
             and lpb.pol_id like concat(concat('%', #{portId}),'%')
         </if>
@@ -325,6 +328,7 @@
         AND lp.tenant_id = #{data.tenantId}
         AND lp.is_deleted = '0'
         AND lpb.remaining_num > 0
+        AND lpb.whether_deactivate = '0'
         <if test='data.containerNumber != null and data.containerNumber != ""'>
             and lpb.container_number like concat(concat('%', #{data.containerNumber}),'%')
         </if>
@@ -386,6 +390,7 @@
         tenant_id = #{data.tenantId}
         AND is_deleted = '0'
         AND remaining_num > 0
+        AND whether_deactivate = '0'
         <if test='data.containerNumber != null and data.containerNumber != ""'>
             and container_number like concat(concat('%', #{data.containerNumber}),'%')
         </if>

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/IPutBoxService.java

@@ -103,4 +103,6 @@ public interface IPutBoxService extends IService<PutBox> {
 	List<BoxPoolPortDTO> listPortExport(BoxPoolDTO boxPoolDTO);
 
 	List<BoxPoolContainerNumberDTO> listContainerNumberExport(BoxPoolDTO boxPoolDTO);
+
+	R whetherDeactivate(String id, String type);
 }

+ 29 - 2
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/PutBoxServiceImpl.java

@@ -27,6 +27,7 @@ import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 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.CurrencyUtils;
 import org.springblade.los.basic.business.entity.BusinessType;
@@ -54,7 +55,6 @@ import org.springblade.los.box.entity.*;
 import org.springblade.los.box.excel.EmptyContainerAppearance;
 import org.springblade.los.box.excel.EmptyContainerAppearanceAnalysis;
 import org.springblade.los.box.excel.GiveAnEncore;
-import org.springblade.los.box.excel.PortExcel;
 import org.springblade.los.box.mapper.ArchivesTrajectoryMapper;
 import org.springblade.los.box.mapper.PutBoxMapper;
 import org.springblade.los.box.mapper.TradingBoxMapper;
@@ -5375,7 +5375,7 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 	@Override
 	public List<BoxPoolContainerNumberDTO> listContainerNumberExport(BoxPoolDTO boxPoolDTO) {
 		boxPoolDTO.setTenantId(AuthUtil.getTenantId());
-		List<BoxPoolContainerNumberDTO> putBoxList = baseMapper.listContainerNumberExport( boxPoolDTO);
+		List<BoxPoolContainerNumberDTO> putBoxList = baseMapper.listContainerNumberExport(boxPoolDTO);
 		if (!putBoxList.isEmpty()) {
 			List<Long> ids = putBoxList.stream().map(BoxPoolContainerNumberDTO::getId).collect(Collectors.toList());
 			List<PutBoxItems> boxItemsList = putBoxItemsService.list(new LambdaQueryWrapper<PutBoxItems>()
@@ -5400,6 +5400,33 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 		return putBoxList;
 	}
 
+	@Override
+	public R whetherDeactivate(String id, String type) {
+		if (ObjectUtils.isNull(id)) {
+			throw new RuntimeException("缺少必要请求参数");
+		}
+		List<PutBox> putBoxList = baseMapper.selectList(new LambdaQueryWrapper<PutBox>()
+			.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+			.eq(PutBox::getIsDeleted, 0)
+			.in(PutBox::getId, Func.toLongList(id)));
+		if (putBoxList.isEmpty()) {
+			throw new RuntimeException("未查到对应放箱号单据");
+		}
+		for (PutBox item : putBoxList) {
+			if ("1".equals(type)) {
+				item.setWhetherDeactivate("1");
+			} else {
+				item.setWhetherDeactivate("0");
+			}
+			item.setUpdateUser(AuthUtil.getUserId());
+			item.setUpdateUserName(AuthUtil.getUserName());
+			item.setUpdateTime(new Date());
+			item.setVersion(item.getVersion() + 1);
+		}
+		this.updateBatchById(putBoxList);
+		return R.success("操作成功");
+	}
+
 	private void countOverdueFeeV1(Bills billsHYJK, List<TradingBox> tradingBoxList,
 								   List<TradingBoxItem> tradingBoxItemOldList, List<PutBoxItems> putBoxItemsOldList,
 								   List<PutBox> putBoxList) {

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

@@ -1056,7 +1056,7 @@ public class BillsController extends BladeController {
 	 */
 	@GetMapping("/sendVerificationPrompt")
 	public R sendVerificationPrompt(@RequestParam("ids") String ids) {
-		return billsService.sendVerificationPrompt(ids);
+		return billUtils.sendVerificationPrompt(ids);
 	}
 
 	/**
@@ -1064,7 +1064,7 @@ public class BillsController extends BladeController {
 	 */
 	@GetMapping("/sendDeliveryPaper")
 	public R sendDeliveryPaper(@RequestParam("ids") String ids) {
-		return billsService.sendDeliveryPaper(ids);
+		return billUtils.sendDeliveryPaper(ids);
 	}
 
 	/**
@@ -1072,7 +1072,7 @@ public class BillsController extends BladeController {
 	 */
 	@GetMapping("/sendDeliveryPaperExport")
 	public void sendDeliveryPaperExport(@RequestParam("ids") String ids, HttpServletResponse response) {
-		List<DeliveryPaperExcel> excelList = billsService.sendDeliveryPaperExport(ids);
+		List<DeliveryPaperExcel> excelList = billUtils.sendDeliveryPaperExport(ids);
 		ExcelUtil.export(response, "下货纸数据", "下货纸数据", excelList, DeliveryPaperExcel.class);
 	}
 

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

@@ -244,11 +244,5 @@ public interface IBillsService extends IService<Bills> {
 
 	R verificationPrompt(Bills bills);
 
-	R sendVerificationPrompt(String ids);
-
-	R sendDeliveryPaper(String ids);
-
-	List<DeliveryPaperExcel> sendDeliveryPaperExport(String ids);
-
 	R synchronizeCustoms(Bills bills);
 }

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

@@ -631,6 +631,12 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		BigDecimal grossWeight = new BigDecimal("0.00");
 		BigDecimal measurement = new BigDecimal("0.00");
 		if (ObjectUtils.isNotNull(bills.getContainersList())) {
+			List<Long> idList = bills.getContainersList().stream().map(Containers::getId).filter(Objects::nonNull).collect(Collectors.toList());
+			List<Containers> containersList = new ArrayList<>();
+			if (!idList.isEmpty()) {
+				containersList = containersService.list(new LambdaQueryWrapper<Containers>()
+					.in(Containers::getId, idList));
+			}
 			for (Containers item : bills.getContainersList()) {
 				if (ObjectUtils.isNotNull(item.getQuantity())) {
 					quantity = quantity.add(item.getQuantity());
@@ -665,7 +671,19 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
 						item.setCreateDeptName(deptName);
 					}
+					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version + 1));
 				} else {
+					if (!containersList.isEmpty()) {
+						Containers containers = containersList.stream().filter(e -> e.getId().equals(item.getId())).findFirst().orElse(null);
+						if (containers != null) {
+							if (!Objects.equals(containers.getVersion(), item.getVersion())) {
+								throw new RuntimeException("数据已被其他用户更新,请刷新后重试");
+							}
+						}
+					}
+					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version + 1));
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateTime(new Date());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -1757,6 +1775,24 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			if (!preContainersList.isEmpty()){
 				throw new RuntimeException("已占用放箱号,请先撤销后再退舱");
 			}
+			List<Long> idList = billsList.stream().map(Bills::getTemporaryId).filter(Objects::nonNull).collect(Collectors.toList());
+			if (!idList.isEmpty()){
+				List<Bills> bills = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
+					.eq(Bills::getTenantId, AuthUtil.getTenantId())
+					.eq(Bills::getIsDeleted, 0)
+					.in(Bills::getId, idList));
+				if (!bills.isEmpty()){
+					for (Bills item : bills){
+						item.setUpdateUserName(AuthUtil.getUserName());
+						item.setUpdateUser(AuthUtil.getUserId());
+						item.setUpdateTime(new Date());
+						item.setBillStatus(1);
+						int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+						item.setVersion(String.valueOf(version + 1));
+					}
+					this.updateBatchById(bills);
+				}
+			}
 		}
 		for (Bills item : billsList) {
 			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
@@ -6084,6 +6120,14 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			.eq(Bills::getIsDeleted, 0)
 			.eq(Bills::getTemporaryId, bills.getId()));
 		if (detail != null) {
+			List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+				.eq(PreContainers::getIsDeleted,0)
+				.eq(PreContainers::getContainerNumberStatus,"已选择")
+				.eq(PreContainers::getTenantId,AuthUtil.getTenantId())
+				.eq(PreContainers::getPid,detail.getId()));
+			if (!preContainersList.isEmpty()){
+				throw new RuntimeException("海运出口已占用放箱号,请先联系客服撤销放箱号");
+			}
 			detail.setUpdateUserName(AuthUtil.getUserName());
 			detail.setUpdateUser(AuthUtil.getUserId());
 			detail.setUpdateTime(new Date());
@@ -6529,217 +6573,6 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 	}
 
 	@Override
-	public R sendVerificationPrompt(String ids) {
-		if (ObjectUtils.isNull(ids)) {
-			throw new RuntimeException("缺少必要参数,发送失败!");
-		}
-		Bills bills = baseMapper.selectById(ids);
-		if (bills == null) {
-			throw new RuntimeException("未查到海运出口单据,发送失败!");
-		}
-		StringBuilder text = new StringBuilder();
-		StringBuilder messageBody = new StringBuilder();
-		if ("SOC".equals(bills.getBoxBelongsTo()) && "DD,MH".contains(bills.getBillType())) {
-			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
-			List<RouteCost> costList = routeCostService.list(new LambdaQueryWrapper<RouteCost>()
-				.eq(RouteCost::getPodId, bills.getPolId())
-				.eq(RouteCost::getDestinationId, bills.getPodId())
-				.eq(RouteCost::getShippingCompanyId, bills.getCarrierId())
-				.eq(RouteCost::getBusinessType, bills.getBoxBelongsTo())
-				.apply("DATE_FORMAT(effective_start_date,'%Y-%m-%d') <= '" + formatter.format(bills.getEtd()) + "'")
-				.apply("DATE_FORMAT(effective_end_date,'%Y-%m-%d') >= '" + formatter.format(bills.getEtd()) + "'")
-			);
-			if (costList.isEmpty()) {
-				throw new RuntimeException("请先维护成本!");
-			}
-			List<RouteCostItem> costItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
-				.eq(RouteCostItem::getIsDeleted, 0)
-				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
-				.in(RouteCostItem::getPid, costList.stream().map(RouteCost::getId).collect(Collectors.toList())));
-			if (costItemList.isEmpty()) {
-				throw new RuntimeException("请先维护成本!");
-			}
-			List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
-				.eq(PreContainers::getIsDeleted, 0)
-				.eq(PreContainers::getPid, ids));
-			if (preContainersList.isEmpty()) {
-				throw new RuntimeException("未查到预配箱型信息,发送失败!");
-			}
-			List<SeaContainerNumberItem> containerNumberItemList = seaContainerNumberItemService.list(new LambdaQueryWrapper<SeaContainerNumberItem>()
-				.eq(SeaContainerNumberItem::getIsDeleted, 0)
-				.eq(SeaContainerNumberItem::getPid, ids)
-				.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::getIsDeleted, 0)
-				.eq(FeeCenter::getDc, "D")
-				.eq(FeeCenter::getFeeCode, "HYF")
-				.eq(FeeCenter::getPid, ids));
-			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);
-				}
-			}
-			boolean status = bills.getEtd().compareTo(date) >= 0;
-			if (status) {
-				for (PreContainers containers : preContainersList) {
-					BigDecimal price = feeCenterList.stream().filter(e -> containers.getCntrTypeCode().equals(e.getUnitNo()))
-						.map(FeeCenter::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-					List<RouteCostItem> minCostItem = costItemList.stream().filter(e -> containers.getCntrTypeCode().equals(e.getBoxType()))
-						.sorted(Comparator.comparing(RouteCostItem::getSalesPrice))
-						.collect(Collectors.toList());
-					if (price.compareTo(minCostItem.get(0).getSalesPrice()) < 0) {
-						text.append("提单号:").append(bills.getMblno()).append("箱型:").append(containers.getCntrTypeCode()).append("应收海运费:" + price + "小于成本中心海运费:" + minCostItem.get(0).getSalesPrice() + "!");
-						messageBody.append("提单号:").append(bills.getMblno()).append("应收海运费:" + price + "小于成本中心海运费:" + minCostItem.get(0).getSalesPrice() + "!");
-					}
-					if (containerNumberItemList.stream().filter(e -> e.getBoxType().equals(containers.getCntrTypeCode()))
-						.mapToInt(SeaContainerNumberItem::getOccupyNum).sum() != containers.getQuantity()) {
-						text.append("提单号:").append(bills.getMblno()).append("箱型:").append(containers.getCntrTypeCode()).append("箱量与所选放箱号数量不等!");
-					}
-				}
-			}
-		}
-		if (ObjectUtils.isNotNull(text.toString())) {
-			String url = "/iosBasicData/OceanFreightImport/bills/index";
-			String pageLabel = "海运出口";
-			String pageStatus = "this.$store.getters.domSaleStatus";
-			messageBody.append("发送人:").append(AuthUtil.getUserName());
-			billUtils.sendMessage(bills, url, pageLabel, pageStatus, messageBody.toString(), "2", bills.getOperatorId(), "成本中心");
-//			return R.success(text.toString());
-			throw new RuntimeException(text.toString());
-		} else {
-			return R.success("操作成功");
-		}
-
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public R sendDeliveryPaper(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<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());
-			String containerNumber = "";
-			List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
-				.collect(Collectors.toList());
-			for (PreContainers containers : preContainers) {
-				List<SeaContainerNumberItem> containerNumberItems = containerNumberItemList.stream().filter(e ->
-					containers.getCntrTypeCode().equals(e.getBoxType()) && 0 != e.getOccupyNum()).collect(Collectors.toList());
-				for (SeaContainerNumberItem numberItem : containerNumberItems) {
-					containerNumber = containerNumber + numberItem.getContainerNumber() + " " + numberItem.getOccupyNum() + "*" +
-						containers.getCntrTypeCode() + "\n";
-				}
-			}
-			excel.setContainerNumber(containerNumber);
-			excelList.add(excel);
-		}
-		return R.data(excelList);
-	}
-
-	@Override
-	public List<DeliveryPaperExcel> sendDeliveryPaperExport(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<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());
-			String containerNumber = "";
-			List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
-				.collect(Collectors.toList());
-			for (PreContainers containers : preContainers) {
-				List<SeaContainerNumberItem> containerNumberItems = containerNumberItemList.stream().filter(e ->
-					containers.getCntrTypeCode().equals(e.getBoxType()) && 0 != e.getOccupyNum()).collect(Collectors.toList());
-				for (SeaContainerNumberItem numberItem : containerNumberItems) {
-					containerNumber = containerNumber + numberItem.getContainerNumber() + " " + numberItem.getOccupyNum() + "*" +
-						containers.getCntrTypeCode() + "\n";
-				}
-			}
-			excel.setContainerNumber(containerNumber);
-			excelList.add(excel);
-		}
-		return excelList;
-	}
-
-	@Override
 	public R synchronizeCustoms(Bills bills) {
 
 		if (bills.getId() == null) {

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

@@ -24,6 +24,7 @@ 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.core.tool.utils.StringUtil;
 import org.springblade.los.Util.BoxNumUtils;
 import org.springblade.los.business.sea.dto.WaitingBox;
 import org.springblade.los.business.sea.entity.Bills;
@@ -525,6 +526,12 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 				.collect(Collectors.joining(",")));
 			billsMapper.updateById(bills);
 		}
+		List<Long> idList = list.stream().map(Containers::getId).filter(Objects::nonNull).collect(Collectors.toList());
+		List<Containers> containersList = new ArrayList<>();
+		if (!idList.isEmpty()) {
+			containersList = baseMapper.selectList(new LambdaQueryWrapper<Containers>()
+				.in(Containers::getId, idList));
+		}
 		for (Containers containers : list) {
 			BoxNumUtils.containerNumberVerification(containers.getCntrNo());
 			String sealNo = ObjectUtils.isNotNull(containers.getSealNo()) ? containers.getSealNo().toUpperCase() : "";
@@ -551,6 +558,8 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 				if (!isNilSealNo && !sealNoCount.isEmpty()) {
 					throw new RuntimeException("铅封号不允许重复");
 				}
+				int version = StringUtil.isBlank(containers.getVersion()) ? 1 : Integer.parseInt(containers.getVersion());
+				containers.setVersion(String.valueOf(version + 1));
 				containers.setCreateTime(new Date());
 				containers.setCreateUser(AuthUtil.getUserId());
 				containers.setCreateUserName(AuthUtil.getUserName());
@@ -566,6 +575,16 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 				if (!isNilSealNo && sealNoCount.stream().anyMatch(e -> !e.getId().equals(containers.getId()))) {
 					throw new RuntimeException("铅封号不允许重复");
 				}
+				if (!containersList.isEmpty()) {
+					Containers containers1 = containersList.stream().filter(e -> e.getId().equals(containers.getId())).findFirst().orElse(null);
+					if (containers1 != null) {
+						if (!Objects.equals(containers1.getVersion(), containers.getVersion())) {
+							throw new RuntimeException("数据已被其他用户更新,请刷新后重试");
+						}
+					}
+				}
+				int version = StringUtil.isBlank(containers.getVersion()) ? 1 : Integer.parseInt(containers.getVersion());
+				containers.setVersion(String.valueOf(version + 1));
 				containers.setUpdateUser(AuthUtil.getUserId());
 				containers.setUpdateTime(new Date());
 				containers.setUpdateUserName(AuthUtil.getUserName());

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

@@ -365,7 +365,7 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 		}
 		for (SeaContainerNumberItem item : containerNumberItemList) {
 			if (Objects.equals(item.getActualOccupyNum(), item.getOutNum()) && "1".equals(item.getWhetherAppearStatus())) {
-				throw new RuntimeException("放箱号" + item.getContainerNumber() + "已全部出场。撤销识别");
+				throw new RuntimeException("放箱号" + item.getContainerNumber() + "已全部出场。撤销失败");
 			}
 			item.setUpdateUserName(AuthUtil.getUserName());
 			item.setUpdateTime(new Date());

+ 10 - 6
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java

@@ -212,21 +212,21 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 						amountLocD = amountLocD.add(item.getCurrentAmount());
 					} else {
 						amountCnyC = amountCnyC.add(item.getCurrentAmount());
-						amountLocD = amountLocD.add(item.getCurrentAmount());
+						amountLocC = amountLocC.add(item.getCurrentAmount());
 					}
 				} else {
-					item.setCurrentAmountLoc(item.getCurrentAmount().multiply(finInvoices.getExrate()));
+					item.setCurrentAmountLoc(item.getCurrentAmount().multiply(item.getExrate()));
 					if ("1".equals(finInvoices.getIsExchangeToCny())) {
-						item.setCurrentAmountEx(item.getCurrentAmount().multiply(finInvoices.getExrate()));
+						item.setCurrentAmountEx(item.getCurrentAmount().multiply(item.getExrate()));
 					} else {
 						item.setCurrentAmountEx(item.getCurrentAmount().multiply(item.getExrate()));
 					}
 					if ("D".equals(item.getDc())) {
 						amountUsdD = amountUsdD.add(item.getCurrentAmount());
-						amountLocC = amountLocC.add(item.getCurrentAmount().multiply(finInvoices.getExrate()));
+						amountLocD = amountLocD.add(item.getCurrentAmount().multiply(item.getExrate()));
 					} else {
 						amountUsdC = amountUsdC.add(item.getCurrentAmount());
-						amountLocC = amountLocC.add(item.getCurrentAmount().multiply(finInvoices.getExrate()));
+						amountLocC = amountLocC.add(item.getCurrentAmount().multiply(item.getExrate()));
 					}
 				}
 				item.setPid(finInvoices.getId());
@@ -251,8 +251,12 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 			finInvoices.setAmountCny(amountCnyD.subtract(amountCnyC));
 			finInvoices.setAmountUsd(amountUsdD.subtract(amountUsdC));
 			finInvoices.setAmountSub(amountCnyD.subtract(amountCnyC));
-			finInvoices.setAmountLoc(finInvoices.getAmountCny().add(finInvoices.getAmountUsd().multiply(finInvoices.getExrate())));
 			finInvoices.setAmountSubUsd(amountUsdD.subtract(amountUsdC));
+
+			BigDecimal subAmount = amountLocD.subtract(amountLocC);
+			finInvoices.setAmountSubLoc(subAmount);
+			finInvoices.setAmountLoc(subAmount);
+
 			finInvoices.setBookingAgentCnName(finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getBookingAgentCnName)
 				.distinct().collect(Collectors.joining(",")));
 			finInvoices.setBookingAgentEnName(finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getBookingAgentEnName)