Browse Source

1.下货纸数据导出文件名称修改
2.主单下货纸数据提示问题修改
3.历史费用导入接口增加排序以及箱量问题修改
4.出场增加未发送下货纸邮箱通知
5.OW(拿)无货返空判断是否单一目的港,单一目的港不清空目的港数据
6.放箱号增加是否停用检索条件
7.箱池动态增加检索条件
8.海运出口样本导入配箱列表逻辑修改
9.OW箱提醒查询报错修改

纪新园 13 hours ago
parent
commit
f5f810d493

+ 10 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/dto/BoxPoolDTO.java

@@ -91,5 +91,15 @@ public class BoxPoolDTO {
 
 	private String id;
 
+	/**
+	 * 是否过期
+	 */
+	private String whetherExpired;
+
+	/**
+	 * 1=可用不等于0,2=盘存不等于0
+	 */
+	private String type;
+
 
 }

+ 81 - 79
blade-service/blade-los/src/main/java/org/springblade/los/Util/BillUtils.java

@@ -1215,80 +1215,85 @@ public class BillUtils implements IBillUtils {
 		if (billsList.isEmpty()) {
 			throw new RuntimeException("未查到海运出口单据,发送失败!");
 		}
+		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("系统检测到" + formatter.format(bills.getEtd()) + " " + bills.getCarrierCnName() + " " + bills.getPolEnName() +
+				"->" + bills.getPodEnName() + "没有指导价 请联系成本中心!!!");
+		}
+		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("系统检测到" + formatter.format(bills.getEtd()) + " " + bills.getCarrierCnName() + " " + bills.getPolEnName() +
+				"->" + bills.getPodEnName() + "没有指导价 请联系成本中心!!!");
+		}
+		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));
+
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getDc, "D")
+			.eq(FeeCenter::getFeeCode, "HYF")
+			.in(FeeCenter::getPid, idList));
+		if (feeCenterList.isEmpty()) {
+			throw new RuntimeException("未查到应收海运费,发送失败!");
+		}
+		String boxBusinessConnectionTime = sysClient.getParamService("box.business.connection.time");
 		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("系统检测到" + bills.getEtd() + " " + bills.getCarrierCnName() + " " + bills.getPolEnName() +
-					"->" + bills.getPodEnName() + "没有指导价 请联系成本中心!!!");
-			}
-			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("系统检测到" + bills.getEtd() + " " + bills.getCarrierCnName() + " " + bills.getPolEnName() +
-					"->" + bills.getPodEnName() + "没有指导价 请联系成本中心!!!");
-			}
-			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));
-			if (!containerNumberItemList.isEmpty()) {
-				if (containerNumberItemList.stream().noneMatch(e -> e.getPid().equals(bills.getId()))) {
-					throw new RuntimeException("未选择放箱号,发送失败!");
+		for (Bills item : billsList){
+			if ("SOC".equals(item.getBoxBelongsTo()) && "DD,MH".contains(item.getBillType())) {
+				if (!containerNumberItemList.isEmpty()) {
+					if (containerNumberItemList.stream().noneMatch(e -> e.getPid().equals(item.getId()))) {
+						throw new RuntimeException("未选择放箱号,发送失败!");
+					}
 				}
-			}
-			List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-				.eq(FeeCenter::getIsDeleted, 0)
-				.eq(FeeCenter::getDc, "D")
-				.eq(FeeCenter::getFeeCode, "HYF")
-				.in(FeeCenter::getPid, idList));
-			if (feeCenterList.isEmpty()) {
-				throw new RuntimeException("未查到应收海运费,发送失败!");
-			}
-			String boxBusinessConnectionTime = sysClient.getParamService("box.business.connection.time");
-			Date date = null;
-			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-			if (ObjectUtils.isNotNull(boxBusinessConnectionTime)) {
-				try {
-					date = dateFormat.parse(boxBusinessConnectionTime);
-				} catch (ParseException e) {
-					throw new RuntimeException(e);
+				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) {
-					Bills bills1 = billsList.stream().filter(e -> e.getId().equals(containers.getPid())).findFirst().orElse(null);
-					if (bills1 != null) {
-						BigDecimal price = feeCenterList.stream().filter(e -> containers.getCntrTypeCode().equals(e.getUnitNo())
-							&& containers.getPid().equals(e.getPid())).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(bills1.getHblno()).append("箱型:").append(containers.getCntrTypeCode()).append("应收海运费:" + price + "小于成本中心海运费:" + minCostItem.get(0).getSalesPrice() + "!");
-							messageBody.append("提单号:").append(bills1.getHblno()).append("应收海运费:").append(price).append("小于成本中心海运费:").append(minCostItem.get(0).getSalesPrice()).append("!");
-						}
-						if (containerNumberItemList.stream().filter(e -> e.getBoxType().equals(containers.getCntrTypeCode())
-								&& containers.getPid().equals(e.getPid()))
-							.mapToInt(SeaContainerNumberItem::getOccupyNum).sum() != containers.getQuantity()) {
-							text.append("提单号:").append(bills1.getHblno()).append("箱型:").append(containers.getCntrTypeCode()).append("箱量与所选放箱号数量不等!");
+				boolean status = item.getEtd().compareTo(date) >= 0;
+				if (status) {
+					for (PreContainers containers : preContainersList) {
+						Bills bills1 = billsList.stream().filter(e -> e.getId().equals(containers.getPid())).findFirst().orElse(null);
+						if (bills1 != null) {
+							BigDecimal price = feeCenterList.stream().filter(e -> containers.getCntrTypeCode().equals(e.getUnitNo())
+								&& containers.getPid().equals(e.getPid())).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(bills1.getHblno()).append("箱型:").append(containers.getCntrTypeCode())
+									.append("应收海运费:").append(price).append("小于成本中心海运费:").append(minCostItem.get(0).getSalesPrice()).append("!");
+								messageBody.append("提单号:").append(bills1.getHblno()).append("应收海运费:").append(price)
+									.append("小于成本中心海运费:").append(minCostItem.get(0).getSalesPrice()).append("!");
+							}
+							if (containerNumberItemList.stream().filter(e -> e.getBoxType().equals(containers.getCntrTypeCode())
+									&& containers.getPid().equals(e.getPid()))
+								.mapToInt(SeaContainerNumberItem::getOccupyNum).sum() != containers.getQuantity()) {
+								text.append("提单号:").append(bills1.getHblno()).append("箱型:").append(containers.getCntrTypeCode()).append("箱量与所选放箱号数量不等!");
+							}
 						}
 					}
 				}
@@ -1300,7 +1305,6 @@ public class BillUtils implements IBillUtils {
 			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("操作成功");
@@ -1470,12 +1474,13 @@ public class BillUtils implements IBillUtils {
 		List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
 			.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
 			.eq(PreContainers::getIsDeleted, 0)
-			.eq(PreContainers::getPid, billId));
+			.eq(PreContainers::getPid, id));
 		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 			.eq(FeeCenter::getIsDeleted, 0)
 			.eq(FeeCenter::getPid, billId)
-			.eq(FeeCenter::getDc, dc));
+			.eq(ObjectUtils.isNotNull(dc),FeeCenter::getDc, dc)
+			.orderByDesc(FeeCenter::getDc).orderByAsc(FeeCenter::getSort));
 		if (!feeCenterList.isEmpty()) {
 			List<Long> idList = new ArrayList<>();
 			idList.add(bills.getCorpId());
@@ -1502,12 +1507,9 @@ public class BillUtils implements IBillUtils {
 			}
 			for (FeeCenter feeCenter : feeCenterList) {
 				if (!boxTypeList.isEmpty() && boxTypeList.contains(feeCenter.getUnitNo()) && !preContainersList.isEmpty()) {
-					PreContainers preContainers = preContainersList.stream().filter(e -> e.getCntrTypeCode().equals(feeCenter.getUnitNo()))
-						.findFirst().orElse(null);
-					if (preContainers != null) {
-						feeCenter.setQuantity(new BigDecimal(preContainers.getQuantity() + ""));
-					}
-				} else {
+                    preContainersList.stream().filter(e -> e.getCntrTypeCode().equals(feeCenter.getUnitNo()))
+                            .findFirst().ifPresent(preContainers -> feeCenter.setQuantity(new BigDecimal(preContainers.getQuantity() + "")));
+                } else {
 					if ("CNTRQTY".equals(feeCenter.getUnitNo())) {
 						feeCenter.setQuantity(bills.getQuantity());
 					} else if ("JOB".equals(feeCenter.getUnitNo()) || "票".equals(feeCenter.getUnitNo())) {

+ 16 - 12
blade-service/blade-los/src/main/java/org/springblade/los/Util/EntryExitDataHandleUtils.java

@@ -299,10 +299,12 @@ public class EntryExitDataHandleUtils {
 			putBoxItem.setShipEname("");
 			putBoxItem.setShipCode("");
 			putBoxItem.setVoyage("");
-			putBoxItem.setPodCyAddress("");
-			putBoxItem.setPodCyContact("");
-			putBoxItem.setPodCyEmail("");
-			putBoxItem.setPodCyTel("");
+			if (ObjectUtils.isNull(putBoxData.getPodId()) || putBoxData.getPodId().contains(",")) {
+				putBoxItem.setPodCyAddress("");
+				putBoxItem.setPodCyContact("");
+				putBoxItem.setPodCyEmail("");
+				putBoxItem.setPodCyTel("");
+			}
 			putBoxItem.setEtd(null);
 			putBoxItem.setPolFreeBoxUseDays(0);
 			putBoxItem.setPolOverdueBoxUseDays(0);
@@ -613,10 +615,16 @@ public class EntryExitDataHandleUtils {
 			tradingBoxItem.setPolFreeBoxUseDays(0);
 			tradingBoxItem.setPolOverdueBoxUseDays(0);
 			tradingBoxItem.setEta(null);
-			tradingBoxItem.setPodStationId(0L);
-			tradingBoxItem.setPodStationCode("");
-			tradingBoxItem.setPodStationCname("");
-			tradingBoxItem.setPodStationEname("");
+			if (ObjectUtils.isNull(tradingBox.getPodId()) || tradingBox.getPodId().contains(",")) {
+				tradingBoxItem.setPodStationId(0L);
+				tradingBoxItem.setPodStationCode("");
+				tradingBoxItem.setPodStationCname("");
+				tradingBoxItem.setPodStationEname("");
+				tradingBoxItem.setPodCyAddress("");
+				tradingBoxItem.setPodCyContact("");
+				tradingBoxItem.setPodCyEmail("");
+				tradingBoxItem.setPodCyTel("");
+			}
 			tradingBoxItem.setPodFreeBoxUseDays(0);
 			tradingBoxItem.setPodBoxUseDays(0);
 			tradingBoxItem.setAgentName("");
@@ -629,10 +637,6 @@ public class EntryExitDataHandleUtils {
 			tradingBoxItem.setShipEname("");
 			tradingBoxItem.setShipCode("");
 			tradingBoxItem.setVoyage("");
-			tradingBoxItem.setPodCyAddress("");
-			tradingBoxItem.setPodCyContact("");
-			tradingBoxItem.setPodCyEmail("");
-			tradingBoxItem.setPodCyTel("");
 			tradingBoxItem.setActualEtd(null);
 			tradingBoxItem.setActualEta(null);
 			tradingBoxItem.setTemporaryId(item.getTemporaryId());

+ 117 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/SendAnEmailUtils.java

@@ -0,0 +1,117 @@
+package org.springblade.los.Util;
+
+import com.echepei.dto.mail.MailDto;
+import com.echepei.utils.mail.SendMailUtil;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.system.entity.DictBiz;
+import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/12/29
+ */
+@Component
+@AllArgsConstructor
+public class SendAnEmailUtils {
+
+	private final ISysClient sysClient;
+
+	private final IUserClient userClient;
+
+	private final IDictBizClient dictBizClient;
+
+	/**
+	 * 未发送下货纸箱号出场邮箱通知
+	 *
+	 * @param bills   单据
+	 * @param boxCode 箱号
+	 */
+	public Boolean sendAnEmail(Bills bills, String boxCode) {
+		String sendMailType = sysClient.getParamService("send.mail.type");
+		if (!StringUtils.hasText(sendMailType)) {
+			System.err.println("请配置邮件发送方式");
+			return false;
+		}
+		String baseFilePath = sysClient.getParamService("stimulsoft.send.mail.path");
+		if (!StringUtils.hasText(baseFilePath)) {
+			System.err.println("请配置发送邮件文件路径");
+			return false;
+		}
+		BladeUser bladeUser = AuthUtil.getUser();
+		R<User> userInfoResult = userClient.userInfoById(bladeUser.getUserId());
+		if (!userInfoResult.isSuccess()) {
+			System.err.println(userInfoResult.getMsg());
+			return false;
+		}
+		User userInfo = userInfoResult.getData();
+		if (org.springframework.util.ObjectUtils.isEmpty(userInfo)) {
+			System.err.println("用户不存在,请重新登录");
+			return false;
+		}
+		String userMail = userInfo.getEmail();
+		String userMailAuthorization = userInfo.getEmailAuthorization();
+		if (!StringUtils.hasText(userMail) || !StringUtils.hasText(userMailAuthorization)) {
+			R<List<DictBiz>> bizResult = dictBizClient.getList("mail_send");
+			if (!bizResult.isSuccess()) {
+				System.err.println("请完善邮箱信息");
+				return false;
+			}
+			List<DictBiz> dictBizList = bizResult.getData();
+			if (CollectionUtils.isEmpty(dictBizList)) {
+				System.err.println("请完善邮箱信息");
+				return false;
+			}
+			DictBiz dictBiz = dictBizList.stream().filter(db -> db.getTenantId().equals(bladeUser.getTenantId())).sorted(Comparator.comparingInt(DictBiz::getSort)).findFirst().orElse(null);
+			if (dictBiz == null) {
+				System.err.println("请完善有效的邮箱信息");
+				return false;
+			}
+			userMail = dictBiz.getDictKey();
+			userMailAuthorization = dictBiz.getDictValue();
+			if (!StringUtils.hasText(userMail) || !StringUtils.hasText(userMailAuthorization)) {
+				System.err.println("请维护邮箱信息");
+				return false;
+			}
+		}
+		String sendTo = sysClient.getParamService("delivery.paper.mail");
+		if (!StringUtils.hasText(sendTo)) {
+			System.err.println("请配置接收人邮件");
+			return false;
+		}
+		MailDto mailDto = new MailDto();
+		mailDto.setMailFrom(userMail);
+		mailDto.setMailUserName(userMail);
+		mailDto.setMailPassword(userMailAuthorization);
+		mailDto.setMailType(Integer.parseInt(sendMailType));
+		mailDto.setMailTo(sendTo);
+		mailDto.setMailCc("");
+		mailDto.setMailBcc("");
+		mailDto.setMailTitle("未发送下货纸箱号出场通知");
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
+		mailDto.setMailContent("NO Dock Receipt: " + bills.getHblno() + "/" + bills.getVesselCnName() + "/" + bills.getVoyageNo() +
+			"/" + formatter.format(bills.getEtd()) + "/" + bills.getOperatorName() + "/" + bills.getCustomerServiceName()
+			+ "/" + boxCode + "/" + bills.getPolEnName());
+		mailDto.setMailFilePath(new ArrayList<>());
+
+		System.err.println("ReportsServiceImpl.generateMailFileAndSend" + mailDto);
+
+		SendMailUtil.sendTextMail(mailDto);
+		System.err.println("ReportsServiceImpl.generateMailFileAndSend" + mailDto);
+		return true;
+	}
+}

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

@@ -92,6 +92,7 @@ public class PutBoxController extends BladeController {
 			.like(ObjectUtils.isNotNull(putBox.getBoxEastName()), PutBox::getBoxEastName, putBox.getBoxEastName())
 			.eq(ObjectUtils.isNotNull(putBox.getBoxBelongsTo()), PutBox::getBoxBelongsTo, putBox.getBoxBelongsTo())
 			.eq(ObjectUtils.isNotNull(putBox.getPodId()), PutBox::getPodId, putBox.getPodId())
+			.eq(ObjectUtils.isNotNull(putBox.getWhetherDeactivate()), PutBox::getWhetherDeactivate, putBox.getWhetherDeactivate())
 //			.like(ObjectUtils.isNotNull(putBox.getPodCname()), PutBox::getPodCname, putBox.getPodCname())
 			.and(ObjectUtils.isNotNull(putBox.getPodCname()), i -> i.like(PutBox::getPodCname, putBox.getPodCname()).or()
 				.like(PutBox::getPodEname, putBox.getPodCname()).or().like(PutBox::getPodCode, putBox.getPodCname()))

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

@@ -133,6 +133,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 
 	private final ArchivesTrajectoryUtils archivesTrajectoryUtils;
 
+	private final SendAnEmailUtils sendAnEmailUtils;
+
 	@Override
 	public IPage<BoxDynamicsRecordVO> selectBoxDynamicsRecordPage(IPage<BoxDynamicsRecordVO> page, BoxDynamicsRecordVO boxDynamicsRecord) {
 		return page.setRecords(baseMapper.selectBoxDynamicsRecordPage(page, boxDynamicsRecord));
@@ -3511,6 +3513,8 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 					failureHandling(type, boxDynamicsRecord, "请先维护放箱号固定前缀参数!");
 					return false;
 				}
+				//是否开启未发送下货纸邮箱通知
+				String sendDeliveryPaperMail = sysClient.getParamService("send.delivery.paper.mail");
 				List<BoxDynamicsRecordItems> itemsListCCOWF = new ArrayList<>();
 				List<BoxDynamicsRecordItems> itemsListCC = new ArrayList<>();
 				//区分正常出场还是OW放出场  只有提单号不为空并且符合前缀匹配的才是OW放出场箱号,其余都是正常出场
@@ -3741,6 +3745,10 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 								failureHandling(type, boxDynamicsRecord, "提单号:" + bills.getHblno() + "对应海运出口单据未生成配箱列表");
 								return false;
 							}
+							//未发送下货纸
+							if (!"1".equals(bills.getEdiStatus()) && intercept && "1".equals(sendDeliveryPaperMail)){
+								sendAnEmailUtils.sendAnEmail(bills,item.getBoxCode());
+							}
 						} else {
 							//判断出场港口是否国内或越南港口,是提单号必须存在  否需提示但箱正常出场
 							if (intercept) {

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

@@ -125,9 +125,20 @@
         AND lp.is_deleted = '0'
         AND corp.tenant_id = #{data.tenantId}
         AND corp.is_deleted = '0'
-        AND (lpb.storage_num > 0 or lpb.remaining_num > 0)
-        AND lpb.whether_deactivate = '0'
         AND lpb.box_class != 'OW(放)'
+        AND lpb.whether_deactivate = '0'
+        <if test='data.whetherExpired != null and data.whetherExpired != ""'>
+            and lpb.effective_end_date &gt;= CURDATE()
+        </if>
+        <if test='data.type != null and data.type != "" and data.type != "1"'>
+            and lpb.remaining_num > 0
+        </if>
+        <if test='data.type != null and data.type != "" and data.type != "2"'>
+            and lpb.storage_num > 0
+        </if>
+        <if test='data.type == null or data.type == "" '>
+            AND (lpb.storage_num > 0 or lpb.remaining_num > 0)
+        </if>
         <if test='data.containerNumber != null and data.containerNumber != ""'>
             and lpb.container_number like concat(concat('%', #{data.containerNumber}),'%')
         </if>
@@ -336,9 +347,20 @@
         AND lp.is_deleted = '0'
         AND corp.tenant_id = #{data.tenantId}
         AND corp.is_deleted = '0'
-        AND (lpb.storage_num > 0 or lpb.remaining_num > 0)
         AND lpb.whether_deactivate = '0'
         AND lpb.box_class != 'OW(放)'
+        <if test='data.whetherExpired != null and data.whetherExpired != ""'>
+            and lpb.effective_end_date &gt;= CURDATE()
+        </if>
+        <if test='data.type != null and data.type != "" and data.type != "1"'>
+            and lpb.remaining_num > 0
+        </if>
+        <if test='data.type != null and data.type != "" and data.type != "2"'>
+            and lpb.storage_num > 0
+        </if>
+        <if test='data.type == null or data.type == "" '>
+            AND (lpb.storage_num > 0 or lpb.remaining_num > 0)
+        </if>
         <if test='data.containerNumber != null and data.containerNumber != ""'>
             and lpb.container_number like concat(concat('%', #{data.containerNumber}),'%')
         </if>

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java

@@ -3489,7 +3489,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				.eq(TradingBox::getWhetherEnable, "是")
 				.le(TradingBox::getEffectiveDate, calendar.getTime())
 				.ge(TradingBox::getExpiryDate, new Date())
-				.apply("find_in_set(type,'OW-N,OW-F') and box_number - cancel_number - suitcase_num != 0 != 0")
+				.apply("find_in_set(type,'OW-N,OW-F') and box_number - cancel_number - suitcase_num != 0")
 				.orderByDesc(TradingBox::getExpiryDate));
 			for (TradingBox item : tradingBoxList) {
 				BoxReminderExcel excel = new BoxReminderExcel();

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

@@ -1093,7 +1093,12 @@ public class BillsController extends BladeController {
 	@GetMapping("/sendDeliveryPaperExport")
 	public void sendDeliveryPaperExport(@RequestParam("ids") String ids, HttpServletResponse response) {
 		List<DeliveryPaperExcel> excelList = billUtils.sendDeliveryPaperExport(ids);
-		ExcelUtil.export(response, "下货纸数据", "下货纸数据", excelList, DeliveryPaperExcel.class);
+		Bills bills = billsService.getById(ids);
+		if ("MM,DD".contains(bills.getBillType())) {
+			ExcelUtil.export(response, "下货纸数据-" + bills.getMblno(), "下货纸数据", excelList, DeliveryPaperExcel.class);
+		} else {
+			ExcelUtil.export(response, "下货纸数据-" + bills.getHblno(), "下货纸数据", excelList, DeliveryPaperExcel.class);
+		}
 	}
 
 
@@ -1171,27 +1176,25 @@ public class BillsController extends BladeController {
 	 */
 	@GetMapping("/updateHblno")
 	public R updateHblno(@RequestParam("id") Long id, @RequestParam("hblno") String hblno) {
-		return updateHblnoUtils.updateHblno(id,hblno);
+		return updateHblnoUtils.updateHblno(id, hblno);
 	}
 
 	/**
 	 * 历史费用导入
-	 *
 	 */
 	@GetMapping("/historyCostList")
 	public R historyCostList(@RequestParam("id") Long id,
-							@RequestParam(value = "billId", required = false) Long billId,
-							@RequestParam(value = "dc", required = false) String dc) {
+							 @RequestParam(value = "billId", required = false) Long billId,
+							 @RequestParam(value = "dc", required = false) String dc) {
 		return billUtils.historyCostList(id, billId, dc);
 	}
 
 	/**
 	 * 历史费用导入
-	 *
 	 */
 	@PostMapping("/historyCostImport")
 	@RepeatSubmit
-	public R historyCostImport(@RequestBody  Bills bills) {
+	public R historyCostImport(@RequestBody Bills bills) {
 		return billUtils.historyCostImport(bills);
 	}
 

+ 74 - 33
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/TemplateImportServiceImpl.java

@@ -7,7 +7,6 @@ import org.apache.poi.ss.usermodel.*;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.los.Util.BigDecimalUtils;
-import org.springblade.los.Util.BoxNumUtils;
 import org.springblade.los.basic.packages.entity.BPackages;
 import org.springblade.los.basic.packages.service.IBPackagesService;
 import org.springblade.los.basic.ports.entity.BPorts;
@@ -22,6 +21,7 @@ import org.springblade.los.business.sea.service.IBillsService;
 import org.springblade.los.business.sea.service.IContainersService;
 import org.springblade.los.business.sea.service.IPreContainersService;
 import org.springblade.los.business.sea.service.ITemplateImportService;
+import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -55,6 +55,8 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 
 	private final IPreContainersService preContainersService;
 
+	private final ISysClient sysClient;
+
 	public static double splitNumericPrefixFromString(String str) {
 		str = str.replace(" ", "").trim();
 		String str2 = "", str3 = "";
@@ -1492,13 +1494,11 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 			bills.setMarks(marks);
 		}
 		if (!"KHTS".equals(bills.getBusinessType())) {
+			String isOccupyNum = sysClient.getParamService("is.occupyNum");
 			List<Containers> containersListOld = containersService.list(new LambdaQueryWrapper<Containers>()
 				.eq(Containers::getTenantId, AuthUtil.getTenantId())
 				.eq(Containers::getIsDeleted, 0)
 				.eq(Containers::getPid, billId));
-			if (!containersListOld.isEmpty()) {
-				containersService.removeByIds(containersListOld.stream().map(Containers::getId).collect(Collectors.toList()));
-			}
 			List<Containers> containersList = new ArrayList<>();
 			BigDecimal sumQty = new BigDecimal(0L);
 			BigDecimal sumGw = new BigDecimal(0L);
@@ -1523,6 +1523,7 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				containers.setBillNo(bills.getBillNo());
 				containers.setCreateUser(bills.getCreateUser());
 				containers.setCreateUserName(bills.getCreateUserName());
+				containers.setCreateTime(new Date());
 				containers.setTenantId(bills.getTenantId());
 				containers.setBillNo(bills.getBillNo());
 				containers.setPolId(bills.getPolId());
@@ -1545,7 +1546,7 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				containers.setPackingUnit(bills.getPackingUnit());
 				if (ObjectUtils.isNotNull(getSheetCellValueAsString(sheet, r, cellIndex)) &&
 					ObjectUtils.isNotNull(getSheetCellValueAsString(sheet, r, cellIndex + 2))) {
-					BoxNumUtils.containerNumberVerification(getSheetCellValueAsString(sheet, r, cellIndex));
+//					BoxNumUtils.containerNumberVerification(getSheetCellValueAsString(sheet, r, cellIndex));
 					containers.setCntrNo(getSheetCellValueAsString(sheet, r, cellIndex));
 					containers.setSealNo(getSheetCellValueAsString(sheet, r, cellIndex + 1));
 					containers.setCntrTypeCode(getSheetCellValueAsString(sheet, r, cellIndex + 2));
@@ -1568,40 +1569,80 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 					containersList.add(containers);
 				}
 			}
-			if (!containersList.isEmpty()) {
-				List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
-					.eq(PreContainers::getPid, billId)
-					.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
-					.eq(PreContainers::getIsDeleted, 0));
-				if (preContainersList.isEmpty()) {
-					throw new RuntimeException("请先维护单据箱型");
-				}
-				List<String> cntrTypeList = preContainersList.stream().map(PreContainers::getCntrTypeCode).distinct()
-					.collect(Collectors.toList());
+			if ("1".equals(isOccupyNum) && !containersListOld.isEmpty()) {
+				List<Containers> containersList1 = new ArrayList<>();
+				StringBuilder text = new StringBuilder();
+				List<String> cntrNo = containersListOld.stream().map(Containers::getCntrNo).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 				for (Containers item : containersList) {
-					if (!cntrTypeList.isEmpty()) {
-						if (!cntrTypeList.contains(item.getCntrTypeCode())) {
-							throw new RuntimeException("箱型" + item.getCntrTypeCode() + "与单据箱型不符");
+					if (!cntrNo.isEmpty() && !cntrNo.contains(item.getCntrNo())) {
+						text.append(item.getCntrNo()).append(",");
+					}
+				}
+				if (ObjectUtils.isNotNull(text.toString())) {
+					throw new RuntimeException("箱号:" + text + "未查到,请确认!");
+				}
+				for (Containers item : containersListOld) {
+					if (!containersList.isEmpty()) {
+						Containers containers = containersList.stream().filter(e -> e.getCntrNo().equals(item.getCntrNo()))
+							.findFirst().orElse(null);
+						if (containers != null) {
+							item.setSealNo(containers.getSealNo());
+							item.setCntrTypeCode(containers.getCntrTypeCode());
+							item.setTare(containers.getTare());
+							item.setVgmWeight(containers.getVgmWeight());
+							item.setQuantity(containers.getQuantity());
+							item.setGrossWeight(containers.getGrossWeight());
+							item.setMeasurement(containers.getMeasurement());
+							item.setUpdateUser(AuthUtil.getUserId());
+							item.setUpdateTime(new Date());
+							item.setUpdateUserName(AuthUtil.getUserName());
+							containersList1.add(item);
 						}
-					} else {
-						throw new RuntimeException("请先维护单据箱型");
 					}
 				}
-				bills.setQuantity(containersList.stream().map(Containers::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
-				bills.setQuantityPackingDescr("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
-				bills.setCfsQuantity(bills.getQuantity());
-				bills.setGrossWeight(containersList.stream().map(Containers::getGrossWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
-				bills.setCfsGrossWeight(bills.getGrossWeight());
-				bills.setMeasurement(containersList.stream().map(Containers::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
-				bills.setCfsMeasurement(bills.getMeasurement());
-				containersService.saveBatch(containersList);
-				for (PreContainers item : preContainersList) {
-					long count = containersList.stream().filter(e -> e.getCntrTypeCode().equals(item.getCntrTypeCode())).count();
-					item.setQuantity(Integer.parseInt(String.valueOf(count)));
+				if (!containersList1.isEmpty()) {
+					containersService.updateBatchById(containersList1);
+				}
+				bills.setContainersList(containersListOld);
+			} else {
+				if (!containersListOld.isEmpty()) {
+					containersService.removeByIds(containersListOld.stream().map(Containers::getId).collect(Collectors.toList()));
+				}
+				if (!containersList.isEmpty()) {
+					List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+						.eq(PreContainers::getPid, billId)
+						.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+						.eq(PreContainers::getIsDeleted, 0));
+					if (preContainersList.isEmpty()) {
+						throw new RuntimeException("请先维护单据箱型");
+					}
+					List<String> cntrTypeList = preContainersList.stream().map(PreContainers::getCntrTypeCode).distinct()
+						.collect(Collectors.toList());
+					for (Containers item : containersList) {
+						if (!cntrTypeList.isEmpty()) {
+							if (!cntrTypeList.contains(item.getCntrTypeCode())) {
+								throw new RuntimeException("箱型" + item.getCntrTypeCode() + "与单据箱型不符");
+							}
+						} else {
+							throw new RuntimeException("请先维护单据箱型");
+						}
+					}
+					bills.setQuantity(containersList.stream().map(Containers::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
+					bills.setQuantityPackingDescr("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
+					bills.setCfsQuantity(bills.getQuantity());
+					bills.setGrossWeight(containersList.stream().map(Containers::getGrossWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
+					bills.setCfsGrossWeight(bills.getGrossWeight());
+					bills.setMeasurement(containersList.stream().map(Containers::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
+					bills.setCfsMeasurement(bills.getMeasurement());
+					containersService.saveBatch(containersList);
+					for (PreContainers item : preContainersList) {
+						long count = containersList.stream().filter(e -> e.getCntrTypeCode().equals(item.getCntrTypeCode())).count();
+						item.setQuantity(Integer.parseInt(String.valueOf(count)));
+					}
+					preContainersService.updateBatchById(preContainersList);
 				}
-				preContainersService.updateBatchById(preContainersList);
+				bills.setContainersList(containersList);
 			}
-			bills.setContainersList(containersList);
 		}
 		bills.setPreContainersList(new ArrayList<>());
 		bills.setContainersReportsList(new ArrayList<>());