Browse Source

1.久置箱列表,导出接口查询条件修改
2.进出场记录同步增加箱轨迹提取公共方法
3.海运进出口列表查询接口增加app检索字段
4.海运进出保存增加判断提单号,分单号是否修改并同步费用明细和账单中心
5.OW(拿)还箱模板导出接口修改
6.配箱列表,清除箱号,删除等相关接口增加判断是否是主单,主单不限制
7.结算中心导出模板字段修改
8.计算超期箱使费规则修改
9.增加空箱出场-目的港箱数统计接口
10.批量修改放箱号增加箱号状态判断
11.报表列表接口查询数据修改
12.增加app-票数统计接口(未完成)
13.增加app-航线统计
14.增加app-未走货分析(未完成)
15.代理箱,租箱明细增加同步放箱号-箱明细信息接口

纪新园 1 week ago
parent
commit
9559eba46e
30 changed files with 1287 additions and 921 deletions
  1. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/reports/entity/Reports.java
  2. 24 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBoxItems.java
  3. 29 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/EmptyContainerExcel.java
  4. 28 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Bills.java
  5. 27 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/statisticAnalysis/AppStatistics.java
  6. 13 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/statisticAnalysis/BoxNumberProfitQ.java
  7. 34 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/statisticAnalysis/UnshippedGoodsAnalysis.java
  8. 158 4
      blade-service/blade-los/src/main/java/org/springblade/los/Util/ArchivesTrajectoryUtils.java
  9. 21 22
      blade-service/blade-los/src/main/java/org/springblade/los/Util/EntryExitDataHandleUtils.java
  10. 84 140
      blade-service/blade-los/src/main/java/org/springblade/los/Util/OwBoxUsageFeeUtils.java
  11. 3 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/mapper/CorpsMapper.java
  12. 39 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/mapper/CorpsMapper.xml
  13. 17 9
      blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/controller/ReportsController.java
  14. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/PutBoxController.java
  15. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/TradingBoxController.java
  16. 4 3
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/controller/BoxDynamicsRecordController.java
  17. 299 619
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java
  18. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/IPutBoxService.java
  19. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/ITradingBoxService.java
  20. 30 4
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ArchivesServiceImpl.java
  21. 38 14
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/PutBoxServiceImpl.java
  22. 191 11
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java
  23. 10 2
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  24. 61 2
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  25. 27 5
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/ContainersServiceImpl.java
  26. 3 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/SeaContainerNumberItemServiceImpl.java
  27. 0 75
      blade-service/blade-los/src/main/java/org/springblade/los/excel/FinStlBillsExcel.java
  28. 28 4
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/controller/StatisticAnalysisController.java
  29. 7 0
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/IStatisticAnalysisService.java
  30. 86 7
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/impl/StatisticAnalysisServiceImpl.java

+ 6 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/reports/entity/Reports.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.los.basic.reports.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -200,6 +201,11 @@ public class Reports implements Serializable {
 	 */
 	@ApiModelProperty(value = "排除用户")
 	private String excludeUsersId;
+	/**
+	 * 列表是否需要url
+	 */
+	@TableField(exist = false)
+	private String whetherUrl;
 
 
 }

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

@@ -356,6 +356,30 @@ public class PutBoxItems implements Serializable {
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date actualEta;
 
+	/**
+	 * 目的港
+	 */
+	@ApiModelProperty(value = "目的港")
+	private Long podId;
+
+	/**
+	 * 目的港代码
+	 */
+	@ApiModelProperty(value = "目的港代码")
+	private String podCode;
+
+	/**
+	 * 目的港中文名称
+	 */
+	@ApiModelProperty(value = "目的港中文名称")
+	private String podCname;
+
+	/**
+	 * 目的港英文名称
+	 */
+	@ApiModelProperty(value = "目的港英文名称")
+	private String podEname;
+
 
 	/**
 	 * 临时字段  是否接入业务逻辑

+ 29 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/EmptyContainerExcel.java

@@ -0,0 +1,29 @@
+package org.springblade.los.box.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author :jixinyuan
+ * @date : 2025/4/17
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class EmptyContainerExcel {
+
+
+
+	private String id;
+
+	private String ids;
+
+
+
+}

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

@@ -1764,6 +1764,34 @@ public class Bills implements Serializable {
 	 */
 	@TableField(exist = false)
 	private List<String> actualEtaList;
+	/**
+	 * 到港日期
+	 */
+	@TableField(exist = false)
+	private String etaStart;
+	@TableField(exist = false)
+	private String etaEnd;
+	/**
+	 * 开船日期
+	 */
+	@TableField(exist = false)
+	private String etdStart;
+	@TableField(exist = false)
+	private String etdEnd;
+	/**
+	 * 实际开船日期
+	 */
+	@TableField(exist = false)
+	private String actualEtdStart;
+	@TableField(exist = false)
+	private String actualEtdEnd;
+	/**
+	 * 实际到港日期
+	 */
+	@TableField(exist = false)
+	private String actualEtaStart;
+	@TableField(exist = false)
+	private String actualEtaEnd;
 	@TableField(exist = false)
 	private List<String> bookingDateList;
 	/**

+ 27 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/statisticAnalysis/AppStatistics.java

@@ -0,0 +1,27 @@
+package org.springblade.los.statisticAnalysis;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/11/29
+ */
+@Data
+public class AppStatistics {
+
+	/**
+	 * 名称
+	 */
+	private String name;
+	/**
+	 * 数量
+	 */
+	private Long number;
+
+
+
+
+}

+ 13 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/statisticAnalysis/BoxNumberProfitQ.java

@@ -1,7 +1,11 @@
 package org.springblade.los.statisticAnalysis;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author :jixinyuan
  * @date : 2023/11/29
@@ -86,6 +90,15 @@ public class BoxNumberProfitQ {
 	 * 航次
 	 */
 	private String voyageNo;
+	/**
+	 * 操作
+	 */
+	private String operatorName;
+	/**
+	 * 单据日期
+	 */
+	@TableField(exist = false)
+	private List<String> billDateList;
 
 
 }

+ 34 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/statisticAnalysis/UnshippedGoodsAnalysis.java

@@ -0,0 +1,34 @@
+package org.springblade.los.statisticAnalysis;
+
+import lombok.Data;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/11/29
+ */
+@Data
+public class UnshippedGoodsAnalysis {
+
+	/**
+	 * 客户名称
+	 */
+	private String corpName;
+	/**
+	 * 业务类型
+	 */
+	private String businessType;
+	/**
+	 * 业务状态
+	 */
+	private String businessStatus;
+	/**
+	 * 业务日期
+	 */
+	private String businessDate;
+	/**
+	 * 未走货天数
+	 */
+	private String unshippedGoodsDays;
+
+
+}

+ 158 - 4
blade-service/blade-los/src/main/java/org/springblade/los/Util/ArchivesTrajectoryUtils.java

@@ -1,14 +1,18 @@
 package org.springblade.los.Util;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.los.box.dynamics.entity.BoxDynamicsRecordItems;
 import org.springblade.los.box.entity.ArchivesTrajectory;
+import org.springblade.los.box.entity.PutBox;
+import org.springblade.los.box.entity.PutBoxItems;
 import org.springblade.los.box.service.IArchivesTrajectoryService;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.Containers;
 import org.springblade.los.business.sea.service.IContainersService;
-import org.springblade.los.log.entity.GlobalOperationLog;
+import org.springblade.los.enums.BoxDynamicsEnums;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
@@ -27,12 +31,162 @@ public class ArchivesTrajectoryUtils {
 
 	private final IContainersService containersService;
 
-	public void saveTrajectory() {
-
+	/**
+	 * 进出场同步-箱轨迹记录
+	 * @param putBox  放箱号数据
+	 * @param item  箱明细信息
+	 * @param itemsList  进出场记录集合
+	 * @param tenantId  租户号
+	 * @param type 业务类型  1=进场,2=调拨进场,3=出场,4=调箱出场,5=客户还箱(旧),6=无货返空,7=退租出场,8=修箱进场 9=客户还箱新
+	 */
+	public void saveTrajectory(PutBox putBox, PutBoxItems item,List<BoxDynamicsRecordItems> itemsList,String tenantId,
+							   String type,BoxDynamicsRecordItems recordItems) {
+		ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
+		//当前港口,场站
+		if ("1,2,3,4,6,8,9".contains(type)){
+			archivesTrajectory.setPortId(putBox.getPolId());
+			archivesTrajectory.setPortCode(putBox.getPolCode());
+			archivesTrajectory.setPortCname(putBox.getPolCname());
+			archivesTrajectory.setPortEname(putBox.getPolEname());
+			archivesTrajectory.setStationId(putBox.getPolStationId());
+			archivesTrajectory.setStationCode(putBox.getPolStationCode());
+			archivesTrajectory.setStationCname(putBox.getPolStationCname());
+			archivesTrajectory.setStationEname(putBox.getPolStationEname());
+		}else if ("5".equals(type)){
+			BoxDynamicsRecordItems dynamicsRecordItems = itemsList.stream().filter(e -> e.getBoxCode().equals(item.getBoxCode())).findFirst().orElse(null);
+			if (dynamicsRecordItems != null) {
+				archivesTrajectory.setBoxDynamics(BoxDynamicsEnums.getName(dynamicsRecordItems.getObjective()));
+				archivesTrajectory.setNewDate(dynamicsRecordItems.getApproachExitDate());
+				archivesTrajectory.setPortId(dynamicsRecordItems.getPortId());
+				archivesTrajectory.setPortCode(dynamicsRecordItems.getPortCode());
+				archivesTrajectory.setPortCname(dynamicsRecordItems.getPortCname());
+				archivesTrajectory.setPortEname(dynamicsRecordItems.getPortEname());
+				archivesTrajectory.setPodId(dynamicsRecordItems.getPortId());
+				archivesTrajectory.setPodCode(dynamicsRecordItems.getPortCode());
+				archivesTrajectory.setPodCname(dynamicsRecordItems.getPortCname());
+				archivesTrajectory.setPodEname(dynamicsRecordItems.getPortEname());
+			}
+			archivesTrajectory.setStationId(item.getPodStationId());
+			archivesTrajectory.setStationCode(item.getPodStationCode());
+			archivesTrajectory.setStationCname(item.getPodStationCname());
+			archivesTrajectory.setStationEname(item.getPodStationEname());
+		} else if ("7".equals(type)){
+			archivesTrajectory.setPortId(recordItems.getPortId());
+			archivesTrajectory.setPortCode(recordItems.getPortCode());
+			archivesTrajectory.setPortCname(recordItems.getPortCname());
+			archivesTrajectory.setPortEname(recordItems.getPortEname());
+			archivesTrajectory.setStationId(recordItems.getStationId());
+			archivesTrajectory.setStationCname(recordItems.getStationCname());
+			archivesTrajectory.setStationEname(recordItems.getStationEname());
+			archivesTrajectory.setStationCode(recordItems.getStationCode());
+		}
+		//放箱号,箱号,箱型,箱好坏,箱东,海运单据信息
+		if ("1,2,3,4,5,6,8,9".contains(type)){
+			archivesTrajectory.setContainerNumber(item.getContainerNumber());
+			archivesTrajectory.setBoxStatus(item.getBoxStatus());
+			archivesTrajectory.setBoxType(item.getBoxType());
+			archivesTrajectory.setBoxCategory(item.getBoxClass());
+			archivesTrajectory.setBoxEastId(item.getBoxEastId());
+			archivesTrajectory.setBoxEastName(item.getBoxEastName());
+			archivesTrajectory.setMblno(item.getMblno());
+			archivesTrajectory.setHblno(item.getHblno());
+			archivesTrajectory.setPolCyId(item.getPolCyId());
+			archivesTrajectory.setPolCyCode(item.getPolCyCode());
+			archivesTrajectory.setPolCyCname(item.getPolCyCname());
+			archivesTrajectory.setPolCyEname(item.getPolCyEname());
+			archivesTrajectory.setPodStationId(item.getPodStationId());
+			archivesTrajectory.setPodStationCode(item.getPodStationCode());
+			archivesTrajectory.setPodStationCname(item.getPodStationCname());
+			archivesTrajectory.setPodStationEname(item.getPodStationEname());
+			archivesTrajectory.setEtd(item.getEtd());
+			archivesTrajectory.setPolFreeBoxUseDays(item.getPolFreeBoxUseDays());
+			archivesTrajectory.setPolPreAppearanceDate(item.getPolPreAppearanceDate());
+			archivesTrajectory.setPolStationEmptyContainerExitDate(item.getPolStationEmptyContainerExitDate());
+			archivesTrajectory.setPolReturnDate(item.getPolReturnDate());
+			archivesTrajectory.setPolOverdueBoxUseDays(item.getPolOverdueBoxUseDays());
+			archivesTrajectory.setEta(item.getEta());
+			archivesTrajectory.setPodEmptyContainerReturnDate(item.getPodEmptyContainerReturnDate());
+			archivesTrajectory.setPodFreeBoxUseDays(item.getPodFreeBoxUseDays());
+			archivesTrajectory.setPodBoxUseDays(item.getPodBoxUseDays());
+			archivesTrajectory.setShipNameId(item.getShipNameId());
+			archivesTrajectory.setShipCname(item.getShipCname());
+			archivesTrajectory.setShipEname(item.getShipEname());
+			archivesTrajectory.setShipCode(item.getShipCode());
+			archivesTrajectory.setVoyage(item.getVoyage());
+			archivesTrajectory.setCode(item.getBoxCode());
+		}else if ("7".equals(type)){
+			archivesTrajectory.setContainerNumber(recordItems.getContainerNumber());
+			archivesTrajectory.setBoxStatus(recordItems.getBoxStatus());
+			archivesTrajectory.setBoxType(recordItems.getBoxType());
+			archivesTrajectory.setBoxCategory(putBox.getBoxClass());
+			if (ObjectUtils.isNotNull(putBox.getBoxEastId())) {
+				archivesTrajectory.setBoxEastId(Long.parseLong(putBox.getBoxEastId()));
+			}
+			archivesTrajectory.setBoxEastName(putBox.getBoxEastName());
+			archivesTrajectory.setMblno(recordItems.getHblno());
+			archivesTrajectory.setHblno(recordItems.getHblno());
+			archivesTrajectory.setPolCyId(recordItems.getStationId());
+			archivesTrajectory.setPolCyCode(recordItems.getStationCode());
+			archivesTrajectory.setPolCyCname(recordItems.getStationCname());
+			archivesTrajectory.setPolCyEname(recordItems.getStationEname());
+			archivesTrajectory.setPodStationId(recordItems.getStationId());
+			archivesTrajectory.setPodStationCode(recordItems.getStationCode());
+			archivesTrajectory.setPodStationCname(recordItems.getStationCname());
+			archivesTrajectory.setPodStationEname(recordItems.getStationEname());
+			archivesTrajectory.setCode(recordItems.getBoxCode());
+		}
+		//客户名称
+		if ("1,2,3,4".contains(type)){
+			archivesTrajectory.setCorpId(item.getBoxEastId());
+			archivesTrajectory.setCorpName(item.getBoxEastName());
+		}
+		//箱动态,动态日期
+		if ("1,2,4,5,6,8,9".contains(type)){
+			BoxDynamicsRecordItems dynamicsRecordItems = itemsList.stream().filter(e -> e.getBoxCode().equals(item.getBoxCode())).findFirst().orElse(null);
+			if (dynamicsRecordItems != null) {
+				archivesTrajectory.setBoxDynamics(BoxDynamicsEnums.getName(dynamicsRecordItems.getObjective()));
+				archivesTrajectory.setNewDate(dynamicsRecordItems.getApproachExitDate());
+			}
+		} else if ("3".equals(type)){
+			BoxDynamicsRecordItems dynamicsRecordItems = itemsList.stream().filter(e -> e.getBoxCode().equals(item.getBoxCode())).findFirst().orElse(null);
+			if (dynamicsRecordItems != null) {
+				if ("QZ".equals(dynamicsRecordItems.getObjective())) {
+					archivesTrajectory.setBoxDynamics(BoxDynamicsEnums.getName(dynamicsRecordItems.getObjective() + "C"));
+				} else {
+					archivesTrajectory.setBoxDynamics(BoxDynamicsEnums.getName(dynamicsRecordItems.getObjective()));
+				}
+				archivesTrajectory.setNewDate(dynamicsRecordItems.getApproachExitDate());
+			}
+		} else if ("7".equals(type)){
+			archivesTrajectory.setBoxDynamics(BoxDynamicsEnums.getName(recordItems.getObjective()));
+			archivesTrajectory.setNewDate(recordItems.getApproachExitDate());
+		}
+		//pod港口
+		if ("1,2,4,6,8,9".contains(type)){
+			if (ObjectUtils.isNotNull(putBox.getPodId()) && !putBox.getPodId().contains(",")) {
+				archivesTrajectory.setPodId(Long.parseLong(putBox.getPodId()));
+				archivesTrajectory.setPodCode(putBox.getPodCode());
+				archivesTrajectory.setPodCname(putBox.getPodCname());
+				archivesTrajectory.setPodEname(putBox.getPodEname());
+			}
+		}else if ("3".equals(type)){
+			archivesTrajectory.setPodId(item.getPodId());
+			archivesTrajectory.setPodCode(item.getPodCode());
+			archivesTrajectory.setPodCname(item.getPodCname());
+			archivesTrajectory.setPodEname(item.getPodEname());
+		}
+		archivesTrajectory.setBillType(putBox.getBoxClass());
+		archivesTrajectory.setStatus(archivesTrajectory.getBoxDynamics());
+		archivesTrajectory.setSrcId(putBox.getId());
+		archivesTrajectory.setTenantId(tenantId);
+		archivesTrajectory.setCreateTime(new Date());
+		archivesTrajectory.setCreateUser(AuthUtil.getUserId());
+		archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
+		archivesTrajectoryService.save(archivesTrajectory);
 	}
 
 	public void saveTrajectoryAndContainers(Bills bills) {
-		if ("SOC".equals(bills.getBoxBelongsTo())){
+		if ("SOC".equals(bills.getBoxBelongsTo())) {
 			List<ArchivesTrajectory> archivesTrajectoryList = new ArrayList<>();
 			List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
 				.eq(Containers::getTenantId, AuthUtil.getTenantId())

+ 21 - 22
blade-service/blade-los/src/main/java/org/springblade/los/Util/EntryExitDataHandleUtils.java

@@ -36,7 +36,7 @@ public class EntryExitDataHandleUtils {
 	 */
 	public static PutBoxItems putBoxItemDataHandle(PutBoxItems putBoxItem, BoxDynamicsRecordItems item, PutBox putBoxData,
 												   boolean whetherExistence, Bills bills, String boxDynamics, String status, String type
-	,boolean whetherFX) {
+		, boolean whetherFX) {
 		if ("8".equals(type)) {
 			putBoxItem = new PutBoxItems();
 			putBoxItem.setBoxClass(putBoxData.getBoxClass());
@@ -111,11 +111,21 @@ public class EntryExitDataHandleUtils {
 				putBoxItem.setEtd(bills.getEtd());
 				putBoxItem.setActualEtd(bills.getActualEtd());
 				putBoxItem.setPolFreeBoxUseDays(bills.getPolFreeBoxUseDays());
+				putBoxItem.setPodId(bills.getPodId());
+				putBoxItem.setPodCname(bills.getPodCnName());
+				putBoxItem.setPodEname(bills.getPodEnName());
+				putBoxItem.setPodCode(bills.getPodCode());
 			} else {
-				if (!whetherFX){
+				if (!whetherFX) {
 					//未查到海运单据则未占用
 					putBoxItem.setUnoccupied("1");
 				}
+				if (ObjectUtils.isNotNull(putBoxData.getPodId()) && !putBoxData.getPodId().contains(",")) {
+					putBoxItem.setPodId(Long.parseLong(putBoxData.getPodId()));
+					putBoxItem.setPodCname(putBoxData.getPodCname());
+					putBoxItem.setPodEname(putBoxData.getPodEname());
+					putBoxItem.setPodCode(putBoxData.getPodCode());
+				}
 			}
 			putBoxItem.setHblno(item.getHblno());
 			putBoxItem.setTemporaryStatus(false);
@@ -159,7 +169,7 @@ public class EntryExitDataHandleUtils {
 			if (putBoxItem != null) {
 				if ("使用中".equals(putBoxItem.getStatus())) {
 					putBoxItem.setTemporaryStatus(true);
-				}else{
+				} else {
 					putBoxItem.setTemporaryStatus(false);
 				}
 				putBoxItem.setUpdateUser(AuthUtil.getUserId());
@@ -225,7 +235,7 @@ public class EntryExitDataHandleUtils {
 			putBoxItem.setBoxStatus(item.getBoxStatus());
 			if ("待使用".equals(putBoxItem.getStatus())) {
 				putBoxItem.setTemporaryStatus(true);
-			}else{
+			} else {
 				putBoxItem.setTemporaryStatus(false);
 			}
 			putBoxItem.setUpdateUser(AuthUtil.getUserId());
@@ -238,11 +248,11 @@ public class EntryExitDataHandleUtils {
 				int overdueDays = (int) ChronoUnit.DAYS.between(ldt2, ldt1);
 				putBoxItem.setPodBoxUseDays(Integer.parseInt(overdueDays + ""));
 			}
-		}else if ("2".equals(type)){
+		} else if ("2".equals(type)) {
 			if (putBoxItem != null) {
 				if ("使用中".equals(putBoxItem.getStatus())) {
 					putBoxItem.setTemporaryStatus(true);
-				}else{
+				} else {
 					putBoxItem.setTemporaryStatus(false);
 				}
 				putBoxItem.setUpdateUser(AuthUtil.getUserId());
@@ -269,7 +279,7 @@ public class EntryExitDataHandleUtils {
 			putBoxItem.setPolCyEname(item.getPortEname());
 			putBoxItem.setPolPickUpDate(item.getApproachExitDate());
 			putBoxItem.setPolPreAppearanceDate(item.getApproachExitDate());
-		}else if ("6".equals(type)){
+		} else if ("6".equals(type)) {
 			putBoxItem.setPolCyId(item.getStationId());
 			putBoxItem.setPolCyCode(item.getStationCode());
 			putBoxItem.setPolCyCname(item.getStationCname());
@@ -278,13 +288,7 @@ public class EntryExitDataHandleUtils {
 			putBoxItem.setUpdateUser(AuthUtil.getUserId());
 			putBoxItem.setUpdateUserName(AuthUtil.getUserName());
 			putBoxItem.setUpdateTime(new Date());
-			putBoxItem.setTemporaryMblno(putBoxItem.getHblno());
 
-			putBoxItem.setPodEmptyContainerReturnDate(null);
-			putBoxItem.setPodStationId(null);
-			putBoxItem.setPodStationCode(null);
-			putBoxItem.setPodStationCname(null);
-			putBoxItem.setPodStationEname(null);
 			putBoxItem.setEta(null);
 			putBoxItem.setCorpId(0L);
 			putBoxItem.setCorpName("");
@@ -301,8 +305,6 @@ public class EntryExitDataHandleUtils {
 			putBoxItem.setPodCyTel("");
 			putBoxItem.setEtd(null);
 			putBoxItem.setPolFreeBoxUseDays(0);
-			putBoxItem.setPolStationEmptyContainerExitDate(null);
-			putBoxItem.setPolReturnDate(null);
 			putBoxItem.setPolOverdueBoxUseDays(0);
 			putBoxItem.setPodFreeBoxUseDays(0);
 			putBoxItem.setPodBoxUseDays(0);
@@ -310,7 +312,7 @@ public class EntryExitDataHandleUtils {
 			putBoxItem.setActualEtd(null);
 			putBoxItem.setActualEta(null);
 			putBoxItem.setTemporaryStatus(false);
-		}else if ("9".equals(type)){
+		} else if ("9".equals(type)) {
 			if (putBoxItem != null) {
 				putBoxItem.setUpdateUser(AuthUtil.getUserId());
 				putBoxItem.setUpdateUserName(AuthUtil.getUserName());
@@ -565,7 +567,7 @@ public class EntryExitDataHandleUtils {
 				int overdueDays = (int) ChronoUnit.DAYS.between(ldt2, ldt1);
 				tradingBoxItem.setPodBoxUseDays(Integer.parseInt(overdueDays + ""));
 			}
-		}else if ("2".equals(type)){
+		} else if ("2".equals(type)) {
 			if (tradingBoxItem != null) {
 				tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
 				tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
@@ -601,18 +603,16 @@ public class EntryExitDataHandleUtils {
 				tradingBoxItem.setPolPickUpDate(new Date());
 				tradingBoxItem.setPolPreAppearanceDate(new Date());
 			}
-		}else if ("6".equals(type)){
+		} else if ("6".equals(type)) {
 			tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
 			tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
 			tradingBoxItem.setUpdateTime(new Date());
 			tradingBoxItem.setPolReturnDate(item.getApproachExitDate());
 
-			tradingBoxItem.setPodReturnDate(null);
 			tradingBoxItem.setEtd(null);
 			tradingBoxItem.setPolFreeBoxUseDays(0);
 			tradingBoxItem.setPolOverdueBoxUseDays(0);
 			tradingBoxItem.setEta(null);
-			tradingBoxItem.setPodEmptyContainerReturnDate(null);
 			tradingBoxItem.setPodStationId(0L);
 			tradingBoxItem.setPodStationCode("");
 			tradingBoxItem.setPodStationCname("");
@@ -636,7 +636,7 @@ public class EntryExitDataHandleUtils {
 			tradingBoxItem.setActualEtd(null);
 			tradingBoxItem.setActualEta(null);
 			tradingBoxItem.setTemporaryId(item.getTemporaryId());
-		}else if ("8".equals(type)){
+		} else if ("8".equals(type)) {
 			tradingBoxItem = new TradingBoxItem();
 			tradingBoxItem.setBoxBelongsTo("SOC");
 			tradingBoxItem.setBoxCategory("OW(放)");
@@ -683,5 +683,4 @@ public class EntryExitDataHandleUtils {
 		return tradingBoxItem;
 	}
 
-
 }

+ 84 - 140
blade-service/blade-los/src/main/java/org/springblade/los/Util/OwBoxUsageFeeUtils.java

@@ -411,7 +411,7 @@ public class OwBoxUsageFeeUtils {
 					int overdueDays = (int) ChronoUnit.DAYS.between(ldt1, ldt2);
 					//超期天数
 					if (overdueDays > 0) {
-						FeeCenter feeCenter = this.addFeeCenter(item, bills, fees, storageFeesItems, curExrateList, overdueDays, exrateType,"1");
+						FeeCenter feeCenter = this.addFeeCenter(item, bills, fees, storageFeesItems, curExrateList, overdueDays, exrateType, "1");
 						if (feeCenter != null) {
 							FeeCenter feeCenterC = new FeeCenter();
 							BeanUtil.copyProperties(feeCenter, feeCenterC);
@@ -427,30 +427,8 @@ public class OwBoxUsageFeeUtils {
 							feeCenterC.setAmount(feeCenterC.getQuantity().multiply(feeCenterC.getPrice()));
 							feeCenterC.setAmountLoc(feeCenterC.getAmount().multiply(feeCenter.getExrate()));
 							feeCenterC.setUnsettledAmount(feeCenterC.getAmount());
-							if (feeCenterListD.isEmpty()) {
-								feeCenterListD.add(feeCenter);
-								feeCenterListC.add(feeCenterC);
-							} else {
-								FeeCenter feeCenterD = feeCenterListD.stream().filter(e -> e.getPid().equals(feeCenter.getPid()) &&
-									e.getUnitNo().equals(feeCenter.getUnitNo())).findFirst().orElse(null);
-								if (feeCenterD != null) {
-									feeCenterD.setQuantity(feeCenterD.getQuantity().add(new BigDecimal("1")));
-									feeCenterD.setAmount(feeCenterD.getQuantity().multiply(feeCenterD.getPrice()));
-									feeCenterD.setAmountLoc(feeCenterD.getAmount().multiply(feeCenterD.getExrate()));
-									feeCenterD.setUnsettledAmount(feeCenterD.getAmount());
-									FeeCenter feeCentersC = feeCenterListC.stream().filter(e -> e.getPid().equals(feeCenterC.getPid()) &&
-										e.getUnitNo().equals(feeCenterC.getUnitNo())).findFirst().orElse(null);
-									if (feeCentersC != null) {
-										feeCentersC.setQuantity(feeCentersC.getQuantity().add(new BigDecimal("1")));
-										feeCentersC.setAmount(feeCentersC.getQuantity().multiply(feeCentersC.getPrice()));
-										feeCentersC.setAmountLoc(feeCentersC.getAmount().multiply(feeCentersC.getExrate()));
-										feeCentersC.setUnsettledAmount(feeCentersC.getAmount());
-									}
-								} else {
-									feeCenterListD.add(feeCenter);
-									feeCenterListC.add(feeCenterC);
-								}
-							}
+							feeCenterListD.add(feeCenter);
+							feeCenterListC.add(feeCenterC);
 							item.setPolOverdueBoxUseDays(Integer.parseInt(overdueDays + ""));
 							item.setPolFreeBoxUseDays(feeCenter.getOverdueBoxUseDays());
 							putBoxItemsList.add(item);
@@ -737,7 +715,7 @@ public class OwBoxUsageFeeUtils {
 			//起运港超期天数
 			if (ObjectUtils.isNotNull(item.getPolReturnDate()) && ObjectUtils.isNotNull(item.getPolStationEmptyContainerExitDate())) {
 				//所属公司具体超期标准
-				StorageFees storageFees = this.getStorageFees(storageFeesList, bills, "1");
+				StorageFees storageFees = this.getStorageFees(storageFeesList, bills, "3");
 				if (storageFees == null) {
 					failureHandling("3", boxDynamicsRecord, "请先维护基础资料-超期标准");
 					return false;
@@ -749,11 +727,11 @@ public class OwBoxUsageFeeUtils {
 					failureHandling("3", boxDynamicsRecord, "请先维护基础资料-超期标准");
 					return false;
 				}
-				LocalDateTime ldt1 = item.getPolReturnDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
-				LocalDateTime ldt2 = item.getPolStationEmptyContainerExitDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+				LocalDateTime ldt1 = item.getPolStationEmptyContainerExitDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+				LocalDateTime ldt2 = item.getPolReturnDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 				int overdueDays = (int) ChronoUnit.DAYS.between(ldt1, ldt2);
 				if (overdueDays > 0) {
-					FeeCenter feeCenter = this.addFeeCenter(item, bills, fees, storageFeesItems, curExrateList, overdueDays, exrateType,"3");
+					FeeCenter feeCenter = this.addFeeCenter(item, bills, fees, storageFeesItems, curExrateList, overdueDays, exrateType, "3");
 					if (feeCenter != null) {
 						FeeCenter feeCenterC = new FeeCenter();
 						BeanUtil.copyProperties(feeCenter, feeCenterC);
@@ -769,30 +747,8 @@ public class OwBoxUsageFeeUtils {
 						feeCenterC.setAmount(feeCenterC.getQuantity().multiply(feeCenterC.getPrice()));
 						feeCenterC.setAmountLoc(feeCenterC.getAmount().multiply(feeCenter.getExrate()));
 						feeCenterC.setUnsettledAmount(feeCenterC.getAmount());
-						if (feeCenterListD.isEmpty()) {
-							feeCenterListD.add(feeCenter);
-							feeCenterListC.add(feeCenterC);
-						} else {
-							FeeCenter feeCenterD = feeCenterListD.stream().filter(e -> e.getPid().equals(feeCenter.getPid()) &&
-								e.getUnitNo().equals(feeCenter.getUnitNo())).findFirst().orElse(null);
-							if (feeCenterD != null) {
-								feeCenterD.setQuantity(feeCenterD.getQuantity().add(new BigDecimal("1")));
-								feeCenterD.setAmount(feeCenterD.getQuantity().multiply(feeCenterD.getPrice()));
-								feeCenterD.setAmountLoc(feeCenterD.getAmount().multiply(feeCenterD.getExrate()));
-								feeCenterD.setUnsettledAmount(feeCenterD.getAmount());
-								FeeCenter feeCentersC = feeCenterListC.stream().filter(e -> e.getPid().equals(feeCenterC.getPid()) &&
-									e.getUnitNo().equals(feeCenterC.getUnitNo())).findFirst().orElse(null);
-								if (feeCentersC != null) {
-									feeCentersC.setQuantity(feeCentersC.getQuantity().add(new BigDecimal("1")));
-									feeCentersC.setAmount(feeCentersC.getQuantity().multiply(feeCentersC.getPrice()));
-									feeCentersC.setAmountLoc(feeCentersC.getAmount().multiply(feeCentersC.getExrate()));
-									feeCentersC.setUnsettledAmount(feeCentersC.getAmount());
-								}
-							} else {
-								feeCenterListD.add(feeCenter);
-								feeCenterListC.add(feeCenterC);
-							}
-						}
+						feeCenterListD.add(feeCenter);
+						feeCenterListC.add(feeCenterC);
 						item.setPolOverdueBoxUseDays(Integer.parseInt(overdueDays + ""));
 					}
 					putBoxItemsList.add(item);
@@ -845,7 +801,7 @@ public class OwBoxUsageFeeUtils {
 					String exrateType = currencyUtils.standardCurrency(item.getBranchId());
 					Boolean status = this.generateAccBills(feeCenters, item, exrateType, boxDynamicsRecord, type);
 					if (!status) {
-						failureHandling("3", boxDynamicsRecord, "提单号" + item.getHblno() + "超期箱使费生成账单失败");
+						failureHandling("1", boxDynamicsRecord, "提单号" + item.getHblno() + "超期箱使费生成账单失败");
 						return false;
 					}
 				}
@@ -945,7 +901,7 @@ public class OwBoxUsageFeeUtils {
 				int overdueDays = (int) ChronoUnit.DAYS.between(ldt2, ldt1);
 				//超期天数
 				if (overdueDays > 0) {
-					FeeCenter feeCenter = this.addFeeCenter(item, billsHYJK, fees, storageFeesItems, curExrateList, overdueDays, exrateType,"2");
+					FeeCenter feeCenter = this.addFeeCenter(item, billsHYJK, fees, storageFeesItems, curExrateList, overdueDays, exrateType, "2");
 					if (feeCenter != null) {
 						FeeCenter feeCenterC = new FeeCenter();
 						BeanUtil.copyProperties(feeCenter, feeCenterC);
@@ -960,31 +916,8 @@ public class OwBoxUsageFeeUtils {
 						feeCenterC.setAmount(feeCenterC.getQuantity().multiply(feeCenterC.getPrice()));
 						feeCenterC.setAmountLoc(feeCenterC.getAmount().multiply(feeCenter.getExrate()));
 						feeCenterC.setUnsettledAmount(feeCenterC.getAmount());
-
-						if (feeCenterListD.isEmpty()) {
-							feeCenterListD.add(feeCenter);
-							feeCenterListC.add(feeCenterC);
-						} else {
-							FeeCenter feeCenterD = feeCenterListD.stream().filter(e -> e.getPid().equals(feeCenter.getPid()) &&
-								e.getUnitNo().equals(feeCenter.getUnitNo())).findFirst().orElse(null);
-							if (feeCenterD != null) {
-								feeCenterD.setQuantity(feeCenterD.getQuantity().add(new BigDecimal("1")));
-								feeCenterD.setAmount(feeCenterD.getQuantity().multiply(feeCenterD.getPrice()));
-								feeCenterD.setAmountLoc(feeCenterD.getAmount().multiply(feeCenterD.getExrate()));
-								feeCenterD.setUnsettledAmount(feeCenterD.getAmount());
-								FeeCenter feeCentersC = feeCenterListC.stream().filter(e -> e.getPid().equals(feeCenterC.getPid()) &&
-									e.getUnitNo().equals(feeCenterC.getUnitNo())).findFirst().orElse(null);
-								if (feeCentersC != null) {
-									feeCentersC.setQuantity(feeCentersC.getQuantity().add(new BigDecimal("1")));
-									feeCentersC.setAmount(feeCentersC.getQuantity().multiply(feeCentersC.getPrice()));
-									feeCentersC.setAmountLoc(feeCentersC.getAmount().multiply(feeCentersC.getExrate()));
-									feeCentersC.setUnsettledAmount(feeCentersC.getAmount());
-								}
-							} else {
-								feeCenterListD.add(feeCenter);
-								feeCenterListC.add(feeCenterC);
-							}
-						}
+						feeCenterListD.add(feeCenter);
+						feeCenterListC.add(feeCenterC);
 						item.setPodFreeBoxUseDays(feeCenter.getOverdueBoxUseDays());
 					}
 					putBoxItemsList.add(item);
@@ -1178,11 +1111,11 @@ public class OwBoxUsageFeeUtils {
 	 * @param curExrateList    汇率明细
 	 * @param overdueDays      超期天数
 	 * @param exrateType       本币币别
-	 * @param type       业务类型 1=pol,2=pod,3=无货返空
+	 * @param type             业务类型 1=pol,2=pod,3=无货返空
 	 */
 	public FeeCenter addFeeCenter(PutBoxItems item, Bills bills, BFees fees,
 								  List<StorageFeesItems> storageFeesItems, List<BCurExrate> curExrateList,
-								  int overdueDays, String exrateType,String type) {
+								  int overdueDays, String exrateType, String type) {
 		FeeCenter feeCenter = new FeeCenter();
 		feeCenter.setBillType(bills.getBillType());
 		feeCenter.setCorpType("国内同行及代理");
@@ -1205,14 +1138,16 @@ public class OwBoxUsageFeeUtils {
 		feeCenter.setUnitNo(item.getBoxType());
 		//免箱使天数
 		int overdueBoxUseDays = 0;
-		if("1".equals(type)){
+		if ("1".equals(type)) {
 			if (ObjectUtils.isNotNull(bills.getPolFreeBoxUseDays())) {
 				overdueBoxUseDays = bills.getPolFreeBoxUseDays();
 			}
-		}else if ("2".equals(type)){
+		} else if ("2".equals(type)) {
 			if (ObjectUtils.isNotNull(bills.getPodFreeBoxUseDays())) {
 				overdueBoxUseDays = bills.getPodFreeBoxUseDays();
 			}
+		} else {
+			overdueBoxUseDays = overdueDays;
 		}
 		//判断是否超期
 		if (overdueDays < overdueBoxUseDays) {
@@ -1226,7 +1161,12 @@ public class OwBoxUsageFeeUtils {
 			return null;
 		}
 		//开始计费-第一档应计费天数
-		int firstTierChargeableFeeDays = feesItems.getEndDay() - overdueBoxUseDays;
+		int firstTierChargeableFeeDays;
+		if (overdueBoxUseDays < feesItems.getEndDay()) {
+			firstTierChargeableFeeDays = overdueBoxUseDays + 1;
+		} else {
+			firstTierChargeableFeeDays = feesItems.getEndDay() - overdueBoxUseDays;
+		}
 		//计算过程
 		String text;
 		//超期金额
@@ -1246,55 +1186,61 @@ public class OwBoxUsageFeeUtils {
 		}
 		//剩余计费天数
 		int days = overdueDays - feesItems.getEndDay();
-		for (StorageFeesItems term : storageFeesItems) {
-			BigDecimal rate;
-			//根据箱型获取具体超期单价
-			if ("20GP".equals(item.getBoxType())) {
-				rate = term.getPrice20gp();
-			} else if ("40HC".equals(item.getBoxType())) {
-				rate = term.getPrice40hc();
-			} else if ("40GP".equals(item.getBoxType())) {
-				rate = term.getPrice40gp();
-			} else {
-				continue;
+		if (days > 0) {
+			for (StorageFeesItems term : storageFeesItems) {
+				BigDecimal rate;
+				//根据箱型获取具体超期单价
+				if ("20GP".equals(item.getBoxType())) {
+					rate = term.getPrice20gp();
+				} else if ("40HC".equals(item.getBoxType())) {
+					rate = term.getPrice40hc();
+				} else if ("40GP".equals(item.getBoxType())) {
+					rate = term.getPrice40gp();
+				} else {
+					continue;
+				}
+				//剩余计费天数需从免箱使天数所在下一档次开始计算
+				if (term.getStartDay() > finalOverdueBoxUseDays) {
+					//本档次需计费天数
+					int dayLength = term.getEndDay() - term.getStartDay() + 1;
+					//剩余计费天数是否大于本档次计费天数
+					if (days > dayLength) {
+						days -= dayLength;
+						BigDecimal calculate = rate.multiply(new BigDecimal(dayLength + ""));
+						amount = amount.add(calculate);
+						text = text + dayLength + "天*" + rate + "元=" + calculate + "元,";
+					} else {
+						BigDecimal calculate = rate.multiply(new BigDecimal(days + ""));
+						amount = amount.add(calculate);
+						text = text + days + "天*" + rate + "元=" + calculate + "元";
+						days = 0;
+						break;
+					}
+				}
 			}
-			//剩余计费天数需从免箱使天数所在下一档次开始计算
-			if (term.getStartDay() > finalOverdueBoxUseDays) {
-				//本档次需计费天数
-				int dayLength = term.getEndDay() - term.getStartDay() + 1;
-				//剩余计费天数是否大于本档次计费天数
-				if (days > dayLength) {
-					days -= dayLength;
-					BigDecimal calculate = rate.multiply(new BigDecimal(dayLength + ""));
+			//如果计费规则循环计算完成后还有剩余计费天数,需按照最后一档次计算超期金额
+			if (days != 0) {
+				if ("20GP".equals(item.getBoxType())) {
+					BigDecimal calculate = storageFeesItems.get(storageFeesItems.size() - 1).getPrice20gp().multiply(new BigDecimal(days + ""));
 					amount = amount.add(calculate);
-					text = text + dayLength + "天*" + rate + "元=" + calculate + "元,";
-				} else {
-					BigDecimal calculate = rate.multiply(new BigDecimal(days + ""));
+					text = text + "超出费用:" + days + "天*" + storageFeesItems.get(storageFeesItems.size() - 1).getPrice20gp() + "元=" + calculate + "元,";
+				} else if ("40HC".equals(item.getBoxType())) {
+					BigDecimal calculate = storageFeesItems.get(storageFeesItems.size() - 1).getPrice40hc().multiply(new BigDecimal(days + ""));
 					amount = amount.add(calculate);
-					text = text + days + "天*" + rate + "元=" + calculate + "元";
-					days = 0;
-					break;
+					text = text + "超出费用:" + days + "天*" + storageFeesItems.get(storageFeesItems.size() - 1).getPrice40hc() + "元=" + calculate + "元,";
+				} else if ("40GP".equals(item.getBoxType())) {
+					BigDecimal calculate = storageFeesItems.get(storageFeesItems.size() - 1).getPrice40gp().multiply(new BigDecimal(days + ""));
+					amount = amount.add(calculate);
+					text = text + "超出费用:" + days + "天*" + storageFeesItems.get(storageFeesItems.size() - 1).getPrice40gp() + "元=" + calculate + "元,";
+				} else {
+					return null;
 				}
 			}
 		}
-		feeCenter.setOverdueBoxUseDays(overdueDays - overdueBoxUseDays);
-		//如果计费规则循环计算完成后还有剩余计费天数,需按照最后一档次计算超期金额
-		if (days != 0) {
-			if ("20GP".equals(item.getBoxType())) {
-				BigDecimal calculate = storageFeesItems.get(storageFeesItems.size() - 1).getPrice20gp().multiply(new BigDecimal(days + ""));
-				amount = amount.add(calculate);
-				text = text + "超出费用:" + days + "天*" + storageFeesItems.get(storageFeesItems.size() - 1).getPrice20gp() + "元=" + calculate + "元,";
-			} else if ("40HC".equals(item.getBoxType())) {
-				BigDecimal calculate = storageFeesItems.get(storageFeesItems.size() - 1).getPrice40hc().multiply(new BigDecimal(days + ""));
-				amount = amount.add(calculate);
-				text = text + "超出费用:" + days + "天*" + storageFeesItems.get(storageFeesItems.size() - 1).getPrice40hc() + "元=" + calculate + "元,";
-			} else if ("40GP".equals(item.getBoxType())) {
-				BigDecimal calculate = storageFeesItems.get(storageFeesItems.size() - 1).getPrice40gp().multiply(new BigDecimal(days + ""));
-				amount = amount.add(calculate);
-				text = text + "超出费用:" + days + "天*" + storageFeesItems.get(storageFeesItems.size() - 1).getPrice40gp() + "元=" + calculate + "元,";
-			} else {
-				return null;
-			}
+		if ("1".equals(type) || "2".equals(type)) {
+			feeCenter.setOverdueBoxUseDays(overdueDays - overdueBoxUseDays);
+		} else {
+			feeCenter.setOverdueBoxUseDays(overdueDays);
 		}
 		if (exrateType.equals(feeCenter.getCurCode())) {
 			feeCenter.setExrate(new BigDecimal("1.00"));
@@ -1326,6 +1272,8 @@ public class OwBoxUsageFeeUtils {
 		feeCenter.setAutomaticGenerated("1");
 		feeCenter.setBranchId(bills.getBranchId());
 		feeCenter.setBranchName(bills.getBranchName());
+		feeCenter.setBillBranchId(bills.getBranchId());
+		feeCenter.setBillBranchName(bills.getBranchName());
 		feeCenter.setVersion("1");
 		return feeCenter;
 	}
@@ -1338,24 +1286,20 @@ public class OwBoxUsageFeeUtils {
 	 * @param type            操作类型  1=起运港  2=目的港
 	 */
 	public StorageFees getStorageFees(List<StorageFees> storageFeesList, Bills bills, String type) {
-		StorageFees storageFees;
 		String portId;
+		String businessType;
 		if ("1".equals(type)) {
 			portId = bills.getPolId() + "";
-		} else {
+			businessType = "出口超期箱";
+		} else if ("2".equals(type)) {
 			portId = bills.getPodId() + "";
-		}
-		if ("SE".equals(bills.getBusinessType())) {
-			storageFees = storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
-				"出口超期箱".equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
-		} else if ("SI".equals(bills.getBusinessType())) {
-			storageFees = storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
-				"进口超期箱".equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
+			businessType = "进口超期箱";
 		} else {
-			storageFees = storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
-				"退关、无货返空箱".equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
+			portId = bills.getPolId() + "";
+			businessType = "退关、无货返空箱";
 		}
-		return storageFees;
+		return storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
+			businessType.equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
 	}
 
 	/**

+ 3 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/mapper/CorpsMapper.java

@@ -20,6 +20,8 @@ import org.springblade.los.basic.corps.entity.BCorps;
 import org.springblade.los.basic.corps.vo.BCorpsVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.statisticAnalysis.UnshippedGoodsAnalysis;
+
 import java.util.List;
 
 /**
@@ -39,4 +41,5 @@ public interface CorpsMapper extends BaseMapper<BCorps> {
 	 */
 	List<BCorpsVO> selectBCorpsPage(IPage page, BCorpsVO bCorps);
 
+    List<UnshippedGoodsAnalysis> unshippedGoodsAnalysis(UnshippedGoodsAnalysis unshippedGoodsAnalysis, IPage<UnshippedGoodsAnalysis> page);
 }

+ 39 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/mapper/CorpsMapper.xml

@@ -101,5 +101,44 @@
     <select id="selectBCorpsPage" resultMap="bCorpsResultMap">
         select * from los_b_corps where is_deleted = 0
     </select>
+    <select id="unshippedGoodsAnalysis"
+            resultType="org.springblade.los.statisticAnalysis.UnshippedGoodsAnalysis">
+        SELECT
+        corp.cn_name,
+        last_sea.bill_id
+        FROM
+        los_b_corps corp
+        LEFT JOIN (
+        SELECT
+        sb.corp_id,
+        sb.etd,
+        sb.id as bill_id
+        FROM
+        los_sea_bills sb
+        INNER JOIN (
+        SELECT
+        corp_id,
+        MAX(etd) as max_etd
+        FROM
+        los_sea_bills
+        WHERE
+        is_deleted = '0'
+        AND tenant_id = '128478'
+        GROUP BY
+        corp_id
+        ) latest ON sb.corp_id = latest.corp_id AND sb.etd = latest.max_etd
+        WHERE
+        sb.is_deleted = '0'
+        AND sb.tenant_id = '128478'
+        ) last_sea ON corp.id = last_sea.corp_id
+        WHERE
+        corp.is_deleted = '0'
+        AND corp.tenant_id = '128478'
+        AND (
+        last_sea.etd IS NULL
+        OR last_sea.etd < DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
+        );
+
+    </select>
 
 </mapper>

+ 17 - 9
blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/controller/ReportsController.java

@@ -31,7 +31,6 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.basic.reports.entity.Reports;
 import org.springblade.los.basic.reports.service.IReportsBoxService;
 import org.springblade.los.basic.reports.service.IReportsService;
@@ -78,6 +77,15 @@ public class ReportsController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入reports")
 	public R<IPage<Reports>> list(Reports reports, Query query) {
 		LambdaQueryWrapper<Reports> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		if ("1".equals(reports.getWhetherUrl())) {
+			lambdaQueryWrapper.select(Reports::getId, Reports::getBranchId, Reports::getCreateUser, Reports::getCreateUserName,
+				Reports::getCreateDept, Reports::getCreateDeptName, Reports::getCreateTime, Reports::getUpdateUser,
+				Reports::getUpdateUserName, Reports::getUpdateTime, Reports::getBusinessType, Reports::getClassifyCode,
+				Reports::getGroupCode, Reports::getCode, Reports::getCnName, Reports::getEnName, Reports::getContent,
+				Reports::getAuthorizedUsers, Reports::getAuthorizedUsersId, Reports::getVersion, Reports::getStatus,
+				Reports::getRemarks, Reports::getIsDeleted, Reports::getTenantId,  Reports::getAuthorizedRole, Reports::getAuthorizedRoleId,
+				Reports::getAuthorizedTeam, Reports::getAuthorizedTeamId, Reports::getExcludeUsers, Reports::getExcludeUsersId);
+		}
 		lambdaQueryWrapper.eq(Reports::getTenantId, AuthUtil.getTenantId())
 			.eq(Reports::getIsDeleted, 0)
 			.like(ObjectUtils.isNotNull(reports.getCnName()), Reports::getCnName, reports.getCnName())
@@ -195,15 +203,15 @@ public class ReportsController extends BladeController {
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入reports")
 	public R getReportDataBox(@RequestParam(value = "billId", required = false) String billId,
-						   @RequestParam(value = "reportCode", required = false) String reportCode,
-						   @RequestParam(value = "groupCode", required = false) String groupCode,
-						   @RequestParam(value = "corpIds", required = false) String corpIds,
-						   @RequestParam(value = "itemIds", required = false) String itemIds,
-						   @RequestParam(value = "curCode", required = false) String curCode,
-						   @RequestParam(value = "date", required = false) String date,
-						   @RequestParam(value = "type", required = false) String type
+							  @RequestParam(value = "reportCode", required = false) String reportCode,
+							  @RequestParam(value = "groupCode", required = false) String groupCode,
+							  @RequestParam(value = "corpIds", required = false) String corpIds,
+							  @RequestParam(value = "itemIds", required = false) String itemIds,
+							  @RequestParam(value = "curCode", required = false) String curCode,
+							  @RequestParam(value = "date", required = false) String date,
+							  @RequestParam(value = "type", required = false) String type
 	) throws ParseException {
-		return reportsBoxService.getReportData(billId, reportCode, groupCode, corpIds, itemIds, type, curCode,date);
+		return reportsBoxService.getReportData(billId, reportCode, groupCode, corpIds, itemIds, type, curCode, date);
 	}
 
 	@PostMapping("/generateMailFileAndSend")

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

@@ -302,4 +302,12 @@ public class PutBoxController extends BladeController {
 		return putBoxService.synchronization(ids,status,boxDynamics);
 	}
 
+	/**
+	 * 空箱出场-目的港箱数统计
+	 */
+	@GetMapping("/podBoxCountStatistics")
+	public R podBoxCountStatistics(@RequestParam("id") Long id) {
+		return putBoxService.podBoxCountStatistics(id);
+	}
+
 }

+ 8 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/TradingBoxController.java

@@ -567,4 +567,12 @@ public class TradingBoxController extends BladeController {
 		return tradingBoxService.batchContainerNumber(tradingBox);
 	}
 
+	/**
+	 * 同步放箱号-箱明细信息
+	 */
+	@GetMapping("/synchronizationBoxInformation")
+	public R synchronizationBoxInformation( @RequestParam("id") Long id) {
+		return tradingBoxService.synchronizationBoxInformation(id);
+	}
+
 }

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

@@ -38,6 +38,7 @@ import org.springblade.los.box.dynamics.service.IBoxDynamicsRecordItemsService;
 import org.springblade.los.box.dynamics.service.IBoxDynamicsRecordService;
 import org.springblade.los.box.dynamics.vo.BoxDynamicsRecordVO;
 import org.springblade.los.box.excel.EmptyContainerAppearance;
+import org.springblade.los.box.excel.EmptyContainerExcel;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -199,9 +200,9 @@ public class BoxDynamicsRecordController extends BladeController {
 	/**
 	 * 导出模板
 	 */
-	@GetMapping("/exportTemplateById")
-	public void exportTemplateById(HttpServletResponse response, @RequestParam("id") String id, @RequestParam("ids") String ids) {
-		List<EmptyContainerAppearance> list = boxDynamicsRecordService.exportTemplateById(id, ids);
+	@PostMapping("/exportTemplateById")
+	public void exportTemplateById(HttpServletResponse response, @RequestBody EmptyContainerExcel excel) {
+		List<EmptyContainerAppearance> list = boxDynamicsRecordService.exportTemplateById(excel.getId(), excel.getIds());
 		ExcelUtil.export(response, "OW箱-客户还箱", "还箱明细", list, EmptyContainerAppearance.class);
 	}
 

File diff suppressed because it is too large
+ 299 - 619
blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java


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

@@ -109,4 +109,6 @@ public interface IPutBoxService extends IService<PutBox> {
 	List<PortItemExcel> listContainerNumberExportItems(BoxPoolDTO boxPoolDTO);
 
 	R synchronization(String ids,String status,String boxDynamics);
+
+	R podBoxCountStatistics(Long id);
 }

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

@@ -106,4 +106,6 @@ public interface ITradingBoxService extends IService<TradingBox> {
 	List<EmptyContainerAppearance> returnContainerReminderExport(ReturnContainerReminderExcel returnContainerReminderExcel);
 
     R batchContainerNumber(TradingBox tradingBox);
+
+	R synchronizationBoxInformation(Long id);
 }

+ 30 - 4
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ArchivesServiceImpl.java

@@ -446,7 +446,7 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 
 	@Override
 	public R<IPage<LongTermCabinetExcel>> selectLongTermCabinet(Archives archives, Query query) {
-		IPage<Archives> archivesList = this.page(Condition.getPage(query), new LambdaQueryWrapper<Archives>()
+		LambdaQueryWrapper<Archives> lambdaQueryWrapper = new LambdaQueryWrapper<Archives>()
 			.eq(Archives::getTenantId, AuthUtil.getTenantId())
 			.eq(Archives::getIsDeleted, 0)
 			.eq(ObjectUtils.isNotNull(archives.getContainerNumberType()), Archives::getContainerNumberType, archives.getContainerNumberType())
@@ -455,7 +455,20 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 			.eq(ObjectUtils.isNotNull(archives.getStationId()), Archives::getStationId, archives.getStationId())
 			.apply(ObjectUtils.isNotNull(archives.getCode()), "find_in_set(code,'" + archives.getCode() + "')")
 			.apply("DATEDIFF( NOW(), new_date ) > " + archives.getLongTermDays())
-			.orderByAsc(Archives::getNewDate));
+			.orderByAsc(Archives::getNewDate);
+		if (ObjectUtils.isNotNull(archives.getBoxDynamics())){
+			if ("进场".equals(archives.getBoxDynamics())){
+				lambdaQueryWrapper.apply("find_in_set(box_dynamics,'客户还箱,场内退租进场,无货返空,调拨新箱,驳空箱,新箱," +
+					"直接退租进场,直接调运进场,起租箱进场,场内起租进场,退租箱进场,空箱提箱进场,调箱进场')");
+			}else if ("出场".equals(archives.getBoxDynamics())){
+				lambdaQueryWrapper.apply("find_in_set(box_dynamics,'内点摆箱,外点背箱,空箱集港,退租出场,起租箱出场," +
+					"场内起租出场,新箱出场,直接调运出场,直接退租出场,场内退租出场,空箱出场,调箱出场')");
+			}else{
+				lambdaQueryWrapper.apply("find_in_set(box_dynamics,'更改放箱号,箱档案-更改箱状态,海运出口-拆单,装船,卸船')");
+			}
+		}
+		IPage<Archives> archivesList = this.page(Condition.getPage(query),lambdaQueryWrapper);
+
 		List<LongTermCabinetExcel> excelList = new ArrayList<>();
 		// 获取当前日期
 		LocalDate currentDate = LocalDate.now();
@@ -489,7 +502,7 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 
 	@Override
 	public List<LongTermCabinetExcel> longTermCabinetExport(Archives archives) {
-		List<Archives> archivesList = this.list(new LambdaQueryWrapper<Archives>()
+		LambdaQueryWrapper<Archives> lambdaQueryWrapper = new LambdaQueryWrapper<Archives>()
 			.eq(Archives::getTenantId, AuthUtil.getTenantId())
 			.eq(Archives::getIsDeleted, 0)
 			.eq(ObjectUtils.isNotNull(archives.getContainerNumberType()), Archives::getContainerNumberType, archives.getContainerNumberType())
@@ -497,7 +510,20 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 			.eq(ObjectUtils.isNotNull(archives.getBillNo()), Archives::getBillNo, archives.getBillNo())
 			.eq(ObjectUtils.isNotNull(archives.getStationId()), Archives::getStationId, archives.getStationId())
 			.apply(ObjectUtils.isNotNull(archives.getCode()), "find_in_set(code,'" + archives.getCode() + "')")
-			.apply("DATEDIFF( NOW(), new_date ) > " + archives.getLongTermDays()));
+			.apply("DATEDIFF( NOW(), new_date ) > " + archives.getLongTermDays())
+			.orderByAsc(Archives::getNewDate);
+		if (ObjectUtils.isNotNull(archives.getBoxDynamics())){
+			if ("进场".equals(archives.getBoxDynamics())){
+				lambdaQueryWrapper.apply("find_in_set(box_dynamics,'客户还箱,场内退租进场,无货返空,调拨新箱,驳空箱,新箱," +
+					"直接退租进场,直接调运进场,起租箱进场,场内起租进场,退租箱进场,空箱提箱进场,调箱进场')");
+			}else if ("出场".equals(archives.getBoxDynamics())){
+				lambdaQueryWrapper.apply("find_in_set(box_dynamics,'内点摆箱,外点背箱,空箱集港,退租出场,起租箱出场," +
+					"场内起租出场,新箱出场,直接调运出场,直接退租出场,场内退租出场,空箱出场,调箱出场')");
+			}else{
+				lambdaQueryWrapper.apply("find_in_set(box_dynamics,'更改放箱号,箱档案-更改箱状态,海运出口-拆单,装船,卸船')");
+			}
+		}
+		List<Archives> archivesList = this.list(lambdaQueryWrapper);
 		List<LongTermCabinetExcel> excelList = new ArrayList<>();
 		// 获取当前日期
 		LocalDate currentDate = LocalDate.now();

+ 38 - 14
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/PutBoxServiceImpl.java

@@ -417,6 +417,9 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 			.in(Archives::getCode, putBoxItemsList.stream().map(PutBoxItems::getBoxCode).distinct().collect(Collectors.toList())));
 		List<Archives> archives = new ArrayList<>();
 		for (PutBoxItems item : putBoxItemsList) {
+			if (!"待使用".equals(item.getStatus())) {
+				throw new RuntimeException("箱号状态不是待使用,修改放箱号失败");
+			}
 			if (!putBox1.getBoxType().equals(item.getBoxType())) {
 				throw new RuntimeException("箱型不符");
 			}
@@ -1830,24 +1833,20 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 	}
 
 	private StorageFees getStorageFees(List<StorageFees> storageFeesList, Bills bills, String type) {
-		StorageFees storageFees;
 		String portId;
+		String businessType;
 		if ("1".equals(type)) {
 			portId = bills.getPolId() + "";
-		} else {
+			businessType = "出口超期箱";
+		} else if ("2".equals(type)) {
 			portId = bills.getPodId() + "";
-		}
-		if ("SE".equals(bills.getBusinessType())) {
-			storageFees = storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
-				"出口超期箱".equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
-		} else if ("SI".equals(bills.getBusinessType())) {
-			storageFees = storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
-				"进口超期箱".equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
+			businessType = "进口超期箱";
 		} else {
-			storageFees = storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
-				"退关、无货返空箱".equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
+			portId = bills.getPolId() + "";
+			businessType = "退关、无货返空箱";
 		}
-		return storageFees;
+		return storageFeesList.stream().filter(e -> e.getBranchId().equals(bills.getBranchId()) &&
+			businessType.equals(e.getType()) && e.getPortId().contains(portId)).findFirst().orElse(null);
 	}
 
 	private FeeCenter addFeeCenter(PutBoxItems item, Bills bills, BFees fees,
@@ -5071,9 +5070,9 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 					putBox.setTotalNum(putBox.getTotalNum() + 1);
 				}
 			} else if ("场内退租出场".equals(boxDynamics) || "已返场".equals(boxDynamics) || "直接退租出场".equals(boxDynamics)
-				|| "空箱出场".equals(boxDynamics) || "退租出场".equals(boxDynamics)|| "调箱出场".equals(boxDynamics)) {
+				|| "空箱出场".equals(boxDynamics) || "退租出场".equals(boxDynamics) || "调箱出场".equals(boxDynamics)) {
 				if (!"场内退租出场".equals(item.getBoxDynamics()) && !"已返场".equals(item.getBoxDynamics()) && !"直接退租出场".equals(item.getBoxDynamics())
-					&& !"空箱出场".equals(item.getBoxDynamics()) && !"退租出场".equals(item.getBoxDynamics())&& !"调箱出场".equals(item.getBoxDynamics())) {
+					&& !"空箱出场".equals(item.getBoxDynamics()) && !"退租出场".equals(item.getBoxDynamics()) && !"调箱出场".equals(item.getBoxDynamics())) {
 					putBox.setRemainingNum(putBox.getRemainingNum() - 1);
 					putBox.setStorageNum(putBox.getStorageNum() - 1);
 					putBox.setTotalNum(putBox.getTotalNum() - 1);
@@ -5182,6 +5181,31 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 		return R.success("操作成功");
 	}
 
+	@Override
+	public R podBoxCountStatistics(Long id) {
+		List<PutBoxItems> putBoxItemsList = putBoxItemsService.list(new LambdaQueryWrapper<PutBoxItems>()
+			.eq(PutBoxItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PutBoxItems::getIsDeleted, 0)
+			.eq(PutBoxItems::getPid, id)
+			.eq(PutBoxItems::getStatus, "使用中")
+			.eq(PutBoxItems::getBoxDynamics, "空箱出场"));
+		List<Map<String, String>> mapList = new ArrayList<>();
+		if (!putBoxItemsList.isEmpty()) {
+			List<String> podList = putBoxItemsList.stream().map(PutBoxItems::getPodCname)
+				.filter(Objects::nonNull).distinct().collect(Collectors.toList());
+			for (String item : podList) {
+				long count = putBoxItemsList.stream().filter(e -> item.equals(e.getPodCname())).count();
+				if (count>0){
+					Map<String, String> map = new HashMap<>();
+					map.put("port", item);
+					map.put("count", count + "");
+					mapList.add(map);
+				}
+			}
+		}
+		return R.data(mapList);
+	}
+
 	private void countOverdueFeeV1(Bills billsHYJK, List<TradingBox> tradingBoxList,
 								   List<TradingBoxItem> tradingBoxItemOldList, List<PutBoxItems> putBoxItemsOldList,
 								   List<PutBox> putBoxList) {

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

@@ -3801,6 +3801,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R deleteById(String ids) {
 		List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
 			.eq(Containers::getTenantId, AuthUtil.getTenantId())
@@ -3809,15 +3810,43 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if (containersList.isEmpty()) {
 			throw new RuntimeException("未查到配箱信息");
 		}
+		List<Long> idList = containersList.stream().map(Containers::getPid).collect(Collectors.toList());
+		if (idList.isEmpty()) {
+			throw new RuntimeException("数据错误,请联系管理员");
+		}
+		List<Bills> billsList = billsService.list(new LambdaQueryWrapper<Bills>()
+			.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.in(Bills::getId, idList));
+		for (Containers item : containersList) {
+			if (!billsList.isEmpty()) {
+				Bills bills = billsList.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
+				if (bills != null && !"MM".equals(bills.getBillType())) {
+					if (ObjectUtils.isNotNull(item.getContainerNumber())) {
+						throw new RuntimeException("箱号:" + item.getCntrNo() + "存在放箱号,删除失败");
+					}
+				}
+			}
+			item.setIsDeleted(1);
+			item.setUpdateTime(new Date());
+			item.setUpdateUser(AuthUtil.getUserId());
+			item.setUpdateUserName(AuthUtil.getUserName());
+		}
+		containersService.updateBatchById(containersList);
 		List<Long> containersIdList = containersList.stream().map(Containers::getId).collect(Collectors.toList());
-		containersService.removeByIds(containersIdList);
 		logUtils.saveOperationLogBatch(OperatorType.DELETE, "配箱列表行删除", ids);
 		List<Containers> containersList1 = containersService.list(new LambdaQueryWrapper<Containers>()
 			.eq(Containers::getTenantId, AuthUtil.getTenantId())
 			.eq(Containers::getIsDeleted, 0)
 			.in(Containers::getSrcSplitOrderId, containersIdList));
 		if (!containersList1.isEmpty()) {
-			containersService.removeByIds(containersList1.stream().map(Containers::getId).collect(Collectors.toList()));
+			for (Containers item : containersList1) {
+				item.setIsDeleted(1);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(AuthUtil.getUserId());
+				item.setUpdateUserName(AuthUtil.getUserName());
+			}
+			containersService.updateBatchById(containersList1);
 		}
 		List<String> containerNumberList = containersList.stream().map(Containers::getContainerNumber)
 			.filter(Objects::nonNull).collect(Collectors.toList());
@@ -4070,19 +4099,19 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		tradingBox1.setCode(String.join(",", codeNew));
 		tradingBox1.setBoxNumber(tradingBox1.getBoxNumber() - tradingBox.getTradingBoxItemsList().size());
 		tradingBox1.setSuitcaseNum(tradingBox1.getSuitcaseNum() - tradingBox.getTradingBoxItemsList().size());
-		tradingBox1.setNotSuitcaseNum(tradingBox1.getBoxNumber()-tradingBox1.getSuitcaseNum());
+		tradingBox1.setNotSuitcaseNum(tradingBox1.getBoxNumber() - tradingBox1.getSuitcaseNum());
 		tradingBox1.setUpdateTime(new Date());
 		tradingBox1.setUpdateUser(AuthUtil.getUserId());
 		tradingBox1.setUpdateUserName(AuthUtil.getUserName());
 		int version = StringUtil.isBlank(tradingBox1.getVersion()) ? 1 : Integer.parseInt(tradingBox1.getVersion());
 		tradingBox1.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(tradingBox1);
-        //原放箱号单据
+		//原放箱号单据
 		putBox.setCode(String.join(",", codeNew));
-		if (putBox.getRemainingNum()<tradingBox.getTradingBoxItemsList().size()){
+		if (putBox.getRemainingNum() < tradingBox.getTradingBoxItemsList().size()) {
 			throw new RuntimeException("放箱号可用数量小于本次更改数量");
 		}
-		if (putBox.getStorageNum()<tradingBox.getTradingBoxItemsList().size()){
+		if (putBox.getStorageNum() < tradingBox.getTradingBoxItemsList().size()) {
 			throw new RuntimeException("放箱号盘存数量小于本次更改数量");
 		}
 		putBox.setTotalNum(putBox.getTotalNum() - tradingBox.getTradingBoxItemsList().size());
@@ -4091,15 +4120,15 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		putBox.setUpdateTime(new Date());
 		putBox.setUpdateUser(AuthUtil.getUserId());
 		putBox.setUpdateUserName(AuthUtil.getUserName());
-		putBox.setVersion(putBox.getVersion()+1);
+		putBox.setVersion(putBox.getVersion() + 1);
 		putBoxService.updateById(putBox);
 		//新OW拿单据
 		tradingBoxNew.setCode((ObjectUtils.isNull(tradingBoxNew.getCode()) ? "" : tradingBoxNew.getCode() + ",") + String.join(",", codeList));
-		if (tradingBoxNew.getNotSuitcaseNum() < tradingBox.getTradingBoxItemsList().size()){
+		if (tradingBoxNew.getNotSuitcaseNum() < tradingBox.getTradingBoxItemsList().size()) {
 			throw new RuntimeException("放箱号剩余未提箱数量小于本次更改数量");
 		}
-		tradingBoxNew.setSuitcaseNum(tradingBoxNew.getSuitcaseNum()+tradingBox.getTradingBoxItemsList().size());
-		tradingBoxNew.setNotSuitcaseNum(tradingBoxNew.getBoxNumber()-tradingBoxNew.getSuitcaseNum());
+		tradingBoxNew.setSuitcaseNum(tradingBoxNew.getSuitcaseNum() + tradingBox.getTradingBoxItemsList().size());
+		tradingBoxNew.setNotSuitcaseNum(tradingBoxNew.getBoxNumber() - tradingBoxNew.getSuitcaseNum());
 		tradingBoxNew.setUpdateTime(new Date());
 		tradingBoxNew.setUpdateUser(AuthUtil.getUserId());
 		tradingBoxNew.setUpdateUserName(AuthUtil.getUserName());
@@ -4114,10 +4143,13 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		putBoxNew.setUpdateTime(new Date());
 		putBoxNew.setUpdateUser(AuthUtil.getUserId());
 		putBoxNew.setUpdateUserName(AuthUtil.getUserName());
-		putBoxNew.setVersion(putBoxNew.getVersion()+1);
+		putBoxNew.setVersion(putBoxNew.getVersion() + 1);
 		putBoxService.updateById(putBoxNew);
 		//OW拿箱明细
 		for (TradingBoxItem item : tradingBox.getTradingBoxItemsList()) {
+			if (!"待使用".equals(item.getStatus())) {
+				throw new RuntimeException("箱号状态不是待使用,修改放箱号失败");
+			}
 			item.setContainerNumber(tradingBoxNew.getContainerNumber());
 			item.setPid(tradingBoxNew.getId());
 			item.setUpdateUserName(AuthUtil.getUserName());
@@ -4241,4 +4273,152 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		return null;
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R synchronizationBoxInformation(Long id) {
+		if (ObjectUtils.isNull(id)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		TradingBox tradingBox = baseMapper.selectById(id);
+		if (tradingBox == null) {
+			throw new RuntimeException("未查到单据");
+		}
+		List<TradingBoxItem> tradingBoxItemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
+			.eq(TradingBoxItem::getTenantId, AuthUtil.getTenantId())
+			.eq(TradingBoxItem::getIsDeleted, 0)
+			.eq(TradingBoxItem::getPid, id));
+		PutBox putBox = putBoxService.getOne(new LambdaQueryWrapper<PutBox>()
+			.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+			.eq(PutBox::getIsDeleted, 0)
+			.eq(PutBox::getSrcId, id)
+			.last("LIMIT 1"));
+		if (putBox == null) {
+			throw new RuntimeException("未查到对应放箱号单据");
+		}
+		List<PutBoxItems> putBoxItemsList = putBoxItemsService.list(new LambdaQueryWrapper<PutBoxItems>()
+			.eq(PutBoxItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PutBoxItems::getIsDeleted, 0)
+			.eq(PutBoxItems::getPid, putBox.getId()));
+		List<TradingBoxItem> tradingBoxItems = new ArrayList<>();
+		if (!putBoxItemsList.isEmpty()) {
+			for (PutBoxItems item : putBoxItemsList) {
+				TradingBoxItem tradingBoxItem;
+				if (!tradingBoxItemList.isEmpty()) {
+					tradingBoxItem = tradingBoxItemList.stream().filter(e -> e.getCode().equals(item.getBoxCode()))
+						.findFirst().orElse(null);
+					if (tradingBoxItem != null) {
+						tradingBoxItem = this.synchronizationBoxInformation(tradingBox, item, tradingBoxItem);
+					} else {
+						tradingBoxItem = this.synchronizationBoxInformation(tradingBox, item, null);
+					}
+				} else {
+					tradingBoxItem = this.synchronizationBoxInformation(tradingBox, item, null);
+				}
+				tradingBoxItems.add(tradingBoxItem);
+			}
+			if (!tradingBoxItems.isEmpty()) {
+				tradingBoxItemService.saveOrUpdateBatch(tradingBoxItems);
+			}
+		}
+		return R.success("同步成功");
+	}
+
+
+	public static TradingBoxItem synchronizationBoxInformation(TradingBox tradingBox,PutBoxItems item,TradingBoxItem tradingBoxItem) {
+		if (ObjectUtils.isNull(tradingBoxItem) || ObjectUtils.isNull(tradingBoxItem.getId())){
+			tradingBoxItem = new TradingBoxItem();
+			tradingBoxItem.setBoxBelongsTo("SOC");
+			if ("OW-N".equals(tradingBox.getType())) {
+				tradingBoxItem.setBoxCategory("OW(拿)");
+			} else if ("DL".equals(tradingBox.getType())) {
+				tradingBoxItem.setBoxCategory("代理箱");
+			} else if ("ZR".equals(tradingBox.getType())) {
+				tradingBoxItem.setBoxCategory("租箱");
+			}
+			tradingBoxItem.setBoxCondition("新");
+			tradingBoxItem.setCode(item.getBoxCode());
+			tradingBoxItem.setBoxType(item.getBoxType());
+			tradingBoxItem.setActivationDate(tradingBox.getActivationDate());
+			tradingBoxItem.setCreateUser(AuthUtil.getUserId());
+			tradingBoxItem.setCreateUserName(AuthUtil.getUserName());
+			tradingBoxItem.setCreateTime(new Date());
+			tradingBoxItem.setPid(tradingBox.getId());
+			tradingBoxItem.setWhetherEnable("1");
+		}else{
+			tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
+			tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
+			tradingBoxItem.setUpdateTime(new Date());
+		}
+		tradingBoxItem.setContainerNumber(item.getContainerNumber());
+		tradingBoxItem.setRentEndDate(item.getPolPickUpDate());
+		tradingBoxItem.setPolPickUpDate(item.getPolPickUpDate());
+		tradingBoxItem.setPolPreAppearanceDate(item.getPolPreAppearanceDate());
+		tradingBoxItem.setHblno(item.getHblno());
+		tradingBoxItem.setBoxDynamics(item.getBoxDynamics());
+		tradingBoxItem.setBoxStatus(item.getBoxStatus());
+		tradingBoxItem.setStatus(item.getStatus());
+		if ("已还箱".equals(tradingBoxItem.getStatus())) {
+			tradingBoxItem.setPortId(item.getPodId());
+			tradingBoxItem.setPortCode(item.getPodCode());
+			tradingBoxItem.setPortCname(item.getPodCname());
+			tradingBoxItem.setPortEname(item.getPodEname());
+			tradingBoxItem.setStationId(item.getPodStationId());
+			tradingBoxItem.setStationCode(item.getPodStationCode());
+			tradingBoxItem.setStationCname(item.getPodStationCname());
+			tradingBoxItem.setStationEname(item.getPodStationEname());
+			tradingBoxItem.setNewDate(item.getPodEmptyContainerReturnDate());
+		} else {
+			tradingBoxItem.setPortId(tradingBox.getPolId());
+			tradingBoxItem.setPortCode(tradingBox.getPolCode());
+			tradingBoxItem.setPortCname(tradingBox.getPolCname());
+			tradingBoxItem.setPortEname(tradingBox.getPolEname());
+			tradingBoxItem.setStationId(item.getPolCyId());
+			tradingBoxItem.setStationCode(item.getPolCyCode());
+			tradingBoxItem.setStationCname(item.getPolCyCname());
+			tradingBoxItem.setStationEname(item.getPolCyEname());
+			if ("使用中".equals(tradingBoxItem.getStatus())){
+				tradingBoxItem.setNewDate(item.getPolStationEmptyContainerExitDate());
+			}else{
+				tradingBoxItem.setNewDate(item.getPolPickUpDate());
+			}
+		}
+		tradingBoxItem.setBoxEastId(tradingBox.getPurchaseCompanyId());
+		tradingBoxItem.setBoxEastName(tradingBox.getPurchaseCompanyName());
+		tradingBoxItem.setEtd(item.getEtd());
+		tradingBoxItem.setPolCyId(item.getPolCyId());
+		tradingBoxItem.setPolCyCode(item.getPolCyCode());
+		tradingBoxItem.setPolCyCname(item.getPolCyCname());
+		tradingBoxItem.setPolCyEname(item.getPolCyEname());
+		tradingBoxItem.setPolFreeBoxUseDays(item.getPolFreeBoxUseDays());
+		tradingBoxItem.setPolPreAppearanceDate(item.getPolPreAppearanceDate());
+		tradingBoxItem.setPolStationEmptyContainerExitDate(item.getPolStationEmptyContainerExitDate());
+		tradingBoxItem.setPolReturnDate(item.getPolReturnDate());
+		tradingBoxItem.setPolOverdueBoxUseDays(item.getPolOverdueBoxUseDays());
+		tradingBoxItem.setEta(item.getEta());
+		tradingBoxItem.setPodEmptyContainerReturnDate(item.getPodEmptyContainerReturnDate());
+		tradingBoxItem.setPodStationId(item.getPodStationId());
+		tradingBoxItem.setPodStationCode(item.getPodStationCode());
+		tradingBoxItem.setPodStationCname(item.getPodStationCname());
+		tradingBoxItem.setPodStationEname(item.getPodStationEname());
+		tradingBoxItem.setPodFreeBoxUseDays(item.getPodFreeBoxUseDays());
+		tradingBoxItem.setPodBoxUseDays(item.getPodBoxUseDays());
+		tradingBoxItem.setAgentName(item.getAgentName());
+		tradingBoxItem.setCorpId(item.getCorpId());
+		tradingBoxItem.setCorpName(item.getCorpName());
+		tradingBoxItem.setMblno(item.getMblno());
+		tradingBoxItem.setHblno(item.getHblno());
+		tradingBoxItem.setShipNameId(item.getShipNameId());
+		tradingBoxItem.setShipCname(item.getShipCname());
+		tradingBoxItem.setShipEname(item.getShipEname());
+		tradingBoxItem.setShipCode(item.getShipCode());
+		tradingBoxItem.setVoyage(item.getVoyage());
+		tradingBoxItem.setPodCyAddress(item.getPodCyAddress());
+		tradingBoxItem.setPodCyContact(item.getPodCyContact());
+		tradingBoxItem.setPodCyEmail(item.getPodCyEmail());
+		tradingBoxItem.setPodCyTel(item.getPodCyTel());
+		tradingBoxItem.setActualEtd(item.getActualEtd());
+		tradingBoxItem.setActualEta(item.getActualEta());
+		return tradingBoxItem;
+	}
+
 }

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

@@ -145,18 +145,26 @@ public class BillsController extends BladeController {
 			lambdaQueryWrapper.ge(Bills::getEtd, bills.getEtdList().get(0));
 			lambdaQueryWrapper.le(Bills::getEtd, bills.getEtdList().get(1));
 		}
+		lambdaQueryWrapper.ge(ObjectUtils.isNotNull(bills.getEtdStart()),Bills::getEtd, bills.getEtdStart());
+		lambdaQueryWrapper.le(ObjectUtils.isNotNull(bills.getEtdEnd()),Bills::getEtd, bills.getEtdEnd());
 		if (ObjectUtils.isNotNull(bills.getEtaList()) && !bills.getEtaList().isEmpty()) {
 			lambdaQueryWrapper.ge(Bills::getEta, bills.getEtaList().get(0));
 			lambdaQueryWrapper.le(Bills::getEta, bills.getEtaList().get(1));
 		}
+		lambdaQueryWrapper.ge(ObjectUtils.isNotNull(bills.getEtaStart()),Bills::getEta, bills.getEtaStart());
+		lambdaQueryWrapper.le(ObjectUtils.isNotNull(bills.getEtaEnd()),Bills::getEta, bills.getEtaEnd());
 		if (ObjectUtils.isNotNull(bills.getActualEtdList()) && !bills.getActualEtdList().isEmpty()) {
 			lambdaQueryWrapper.ge(Bills::getActualEtd, bills.getActualEtdList().get(0));
 			lambdaQueryWrapper.le(Bills::getActualEtd, bills.getActualEtdList().get(1));
 		}
+		lambdaQueryWrapper.ge(ObjectUtils.isNotNull(bills.getActualEtdStart()),Bills::getActualEtd, bills.getActualEtdStart());
+		lambdaQueryWrapper.le(ObjectUtils.isNotNull(bills.getActualEtdEnd()),Bills::getActualEtd, bills.getActualEtdEnd());
 		if (ObjectUtils.isNotNull(bills.getActualEtaList()) && !bills.getActualEtaList().isEmpty()) {
 			lambdaQueryWrapper.ge(Bills::getActualEta, bills.getActualEtaList().get(0));
 			lambdaQueryWrapper.le(Bills::getActualEta, bills.getActualEtaList().get(1));
 		}
+		lambdaQueryWrapper.ge(ObjectUtils.isNotNull(bills.getActualEtdStart()),Bills::getActualEta, bills.getActualEtdStart());
+		lambdaQueryWrapper.le(ObjectUtils.isNotNull(bills.getActualEtdEnd()),Bills::getActualEta, bills.getActualEtdEnd());
 		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
 			lambdaQueryWrapper.eq(Bills::getBranchId, AuthUtil.getDeptId());
 			if (!AuthUtil.getUserRole().contains("secondaryAdmin") && !AuthUtil.getUserRole().contains("财务") && !AuthUtil.getUserRole().contains("操作经理")) {
@@ -1132,8 +1140,8 @@ public class BillsController extends BladeController {
 			.eq(Bills::getPolId, bills.getPolId())
 			.eq(Bills::getPodId, bills.getPodId())
 			.ne(Bills::getId, bills.getId())
-			.eq(ObjectUtils.isNotNull(bills.getBoxBelongsTo()),Bills::getBoxBelongsTo, bills.getBoxBelongsTo())
-			.apply("DATE_FORMAT(actual_etd,'%Y-%m-%d') > '" + formatter.format(new Date()) + "'");
+			.eq(ObjectUtils.isNotNull(bills.getBoxBelongsTo()),Bills::getBoxBelongsTo, bills.getBoxBelongsTo());
+//			.apply("DATE_FORMAT(actual_etd,'%Y-%m-%d') > '" + formatter.format(new Date()) + "'");
 		List<Bills> billsList = billsService.list(lambdaQueryWrapper);
 		return R.data(billsList);
 	}

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

@@ -792,6 +792,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					statusAta = true;
 				}
 			}
+			boolean mblno = ObjectUtils.isNotNull(bills.getMblno()) && !bills.getMblno().equals(details.getMblno());
+			boolean hblno = ObjectUtils.isNotNull(bills.getHblno()) && !bills.getHblno().equals(details.getHblno());
 			boolean statusVessel = ObjectUtils.isNotNull(bills.getVesselId()) && !bills.getVesselId().equals(details.getVesselId());
 			boolean statusVoyageNo = ObjectUtils.isNotNull(bills.getVoyageNo()) && !bills.getVoyageNo().equals(details.getVoyageNo());
 			boolean statusMblno = ObjectUtils.isNotNull(bills.getMblno()) && !bills.getMblno().equals(details.getMblno());
@@ -811,7 +813,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			boolean boxBelongsTo = ObjectUtils.isNotNull(bills.getBoxBelongsTo()) && !bills.getBoxBelongsTo().equals(details.getBoxBelongsTo());
 			if (statusEtd || statusEta || statusAtd || statusAta || statusVessel || statusVoyageNo || statusMblno || statusPolId
 				|| statusPodId || statusCyTrailerTime || statusCyReturnTime || statusLineId || statusForwarding || statusBookingAgentId
-				|| shippingAgencyId || bookingDate || carrierId || foreignAgencyId || issueDate || boxBelongsTo || issueAtId) {
+				|| shippingAgencyId || bookingDate || carrierId || foreignAgencyId || issueDate || boxBelongsTo || issueAtId || mblno|| hblno) {
 				String isOccupyNum = sysClient.getParamService("is.occupyNum");
 				if (!"获取数据失败".equals(isOccupyNum)) {
 					boolean status = false;
@@ -837,6 +839,10 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				for (FeeCenter item : feeCenterList) {
 					item.setEta(bills.getEta());
 					item.setEtd(bills.getEtd());
+					if (!"MM".equals(bills.getBillType())) {
+						item.setHblno(bills.getHblno());
+					}
+					item.setMblno(bills.getMblno());
 					item.setBillDate(bills.getBillDate());
 					item.setVesselId(bills.getVesselId());
 					item.setVesselCnName(bills.getVesselCnName());
@@ -859,6 +865,10 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				for (FinAccBills item : finAccBillsList) {
 					item.setEtd(bills.getEtd());
 					item.setEta(bills.getEta());
+					if (!"MM".equals(bills.getBillType())) {
+						item.setHblno(bills.getHblno());
+					}
+					item.setMblno(bills.getMblno());
 					item.setBillDate(bills.getBillDate());
 					item.setBusinessDate(bills.getBillDate());
 					item.setVesselId(bills.getVesselId());
@@ -961,6 +971,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		if (ObjectUtils.isNotNull(bills.getContainerNumberItemList())) {
 			for (SeaContainerNumberItem item : bills.getContainerNumberItemList()) {
 				item.setPid(bills.getId());
+				item.setMblno(bills.getMblno());
+				item.setHblno(bills.getHblno());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -1068,6 +1080,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				}
 			}
 			boolean statusVessel = ObjectUtils.isNotNull(bills.getVesselId()) && !bills.getVesselId().equals(details.getVesselId());
+			boolean mblno = ObjectUtils.isNotNull(bills.getMblno()) && !bills.getMblno().equals(details.getMblno());
 			boolean statusVoyageNo = ObjectUtils.isNotNull(bills.getVoyageNo()) && !bills.getVoyageNo().equals(details.getVoyageNo());
 			boolean statusMblno = ObjectUtils.isNotNull(bills.getMblno()) && !bills.getMblno().equals(details.getMblno());
 			boolean statusPolId = ObjectUtils.isNotNull(bills.getPolId()) && !bills.getPolId().equals(details.getPolId());
@@ -1086,7 +1099,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			boolean boxBelongsTo = ObjectUtils.isNotNull(bills.getBoxBelongsTo()) && !bills.getBoxBelongsTo().equals(details.getBoxBelongsTo());
 			if (statusEtd || statusEta || statusAtd || statusAta || statusVessel || statusVoyageNo || statusMblno || statusPolId
 				|| statusPodId || statusCyTrailerTime || statusCyReturnTime || statusLineId || statusForwarding || statusBookingAgentId
-				|| shippingAgencyId || bookingDate || carrierId || foreignAgencyId || issueDate || boxBelongsTo || issueAtId) {
+				|| shippingAgencyId || bookingDate || carrierId || foreignAgencyId || issueDate || boxBelongsTo || issueAtId || mblno) {
 				String isOccupyNum = sysClient.getParamService("is.occupyNum");
 				billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
 					.eq(Bills::getTenantId, AuthUtil.getTenantId())
@@ -1114,6 +1127,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 								archivesTrajectoryUtils.saveTrajectoryAndContainers(item);
 							}
 						}
+						item.setMblno(bills.getMblno());
 						item.setActualEta(bills.getActualEta());
 						item.setActualEtd(bills.getActualEtd());
 						item.setBillDate(bills.getBillDate());
@@ -1421,6 +1435,10 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		for (FeeCenter item : feeCenterList) {
 			item.setEta(bills.getEta());
 			item.setEtd(bills.getEtd());
+			item.setMblno(bills.getMblno());
+			if (!"MM".equals(bills.getBillType())) {
+				item.setHblno(bills.getHblno());
+			}
 			item.setBillDate(bills.getBillDate());
 			item.setVesselId(bills.getVesselId());
 			item.setVesselCnName(bills.getVesselCnName());
@@ -1443,6 +1461,10 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		for (FinAccBills item : finAccBillsList) {
 			item.setEtd(bills.getEtd());
 			item.setEta(bills.getEta());
+			item.setMblno(bills.getMblno());
+			if (!"MM".equals(bills.getBillType())) {
+				item.setHblno(bills.getHblno());
+			}
 			item.setBillDate(bills.getBillDate());
 			item.setBusinessDate(bills.getBillDate());
 			item.setVesselId(bills.getVesselId());
@@ -2957,6 +2979,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 						.eq(FeeCenter::getIsDeleted, 0)
 						.in(FeeCenter::getPid, billIds));
 					for (Bills item : details) {
+						item.setMblno(bills.getMblno());
 						BigDecimal amountDrMH = new BigDecimal("0.00");
 						BigDecimal amountCrMH = new BigDecimal("0.00");
 						BigDecimal amountProfitMH;
@@ -2979,9 +3002,25 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 						item.setBillDate(date1);
 						if (!feeCenterListMH.isEmpty()) {
 							for (FeeCenter itemMH : feeCenterListMH) {
+								itemMH.setVesselId(bills.getVesselId());
+								itemMH.setVesselCnName(bills.getVesselCnName());
+								itemMH.setVesselEnName(bills.getVesselEnName());
+								itemMH.setVoyageNo(bills.getVoyageNo());
+								itemMH.setPolId(bills.getPolId());
+								itemMH.setPolCnName(bills.getPolCnName());
+								itemMH.setPolEnName(bills.getPolEnName());
+								itemMH.setPolCode(bills.getPolCode());
+								itemMH.setPodId(bills.getPodId());
+								itemMH.setPodCnName(bills.getPodCnName());
+								itemMH.setPodEnName(bills.getPodEnName());
+								itemMH.setPodCode(bills.getPodCode());
 								itemMH.setEtd(bills.getEtd());
 								itemMH.setEta(bills.getEta());
 								itemMH.setBillDate(date1);
+								itemMH.setMblno(bills.getMblno());
+								if (!"MM".equals(bills.getBillType())) {
+									itemMH.setHblno(bills.getHblno());
+								}
 								if ("D".equals(itemMH.getDc())) {
 									if (exrateType.equals(itemMH.getCurCode())) {
 										amountDr = amountDr.add(itemMH.getAmount());
@@ -3040,9 +3079,25 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(FeeCenter::getPid, billId));
 			if (!feeCenterList.isEmpty()) {
 				for (FeeCenter item : feeCenterList) {
+					item.setVesselId(bills.getVesselId());
+					item.setVesselCnName(bills.getVesselCnName());
+					item.setVesselEnName(bills.getVesselEnName());
+					item.setVoyageNo(bills.getVoyageNo());
+					item.setPolId(bills.getPolId());
+					item.setPolCnName(bills.getPolCnName());
+					item.setPolEnName(bills.getPolEnName());
+					item.setPolCode(bills.getPolCode());
+					item.setPodId(bills.getPodId());
+					item.setPodCnName(bills.getPodCnName());
+					item.setPodEnName(bills.getPodEnName());
+					item.setPodCode(bills.getPodCode());
 					item.setEtd(bills.getEtd());
 					item.setEta(bills.getEta());
 					item.setBillDate(date1);
+					item.setMblno(bills.getMblno());
+					if (!"MM".equals(bills.getBillType())) {
+						item.setHblno(bills.getHblno());
+					}
 					if ("D".equals(item.getDc())) {
 						if (exrateType.equals(item.getCurCode())) {
 							amountDr = amountDr.add(item.getAmount());
@@ -3092,6 +3147,10 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			for (FinAccBills item : finAccBillsList) {
 				item.setEtd(bills.getEtd());
 				item.setEta(bills.getEta());
+				item.setMblno(bills.getMblno());
+				if (!"MM".equals(bills.getBillType())) {
+					item.setHblno(bills.getHblno());
+				}
 				item.setBillDate(bills.getBillDate());
 				item.setBusinessDate(bills.getBillDate());
 				item.setVesselId(bills.getVesselId());

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

@@ -230,12 +230,25 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 			.eq(Containers::getTenantId, AuthUtil.getTenantId())
 			.eq(Containers::getIsDeleted, 0)
 			.in(Containers::getId, ids));
+		List<Long> idList = containersList.stream().map(Containers::getPid).collect(Collectors.toList());
+		if (idList.isEmpty()) {
+			throw new RuntimeException("数据错误,请联系管理员");
+		}
+		List<Bills> billsList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
+			.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.in(Bills::getId, idList));
 		for (Containers item : containersList) {
 			if (item.getId() == null) {
 				throw new RuntimeException("请先保存");
 			}
-			if (ObjectUtils.isNotNull(item.getContainerNumber())){
-				throw new RuntimeException("放箱号已存在,清除失败");
+			if (!billsList.isEmpty()) {
+				Bills bills = billsList.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
+				if (bills != null && !"MM".equals(bills.getBillType())) {
+					if (ObjectUtils.isNotNull(item.getContainerNumber())) {
+						throw new RuntimeException("箱号:" + item.getCntrNo() + "存在放箱号,清除失败");
+					}
+				}
 			}
 			item.setCntrNo("");
 			item.setSealNo("");
@@ -254,12 +267,13 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 			.eq(ContainersBills::getTenantId, AuthUtil.getTenantId())
 			.eq(ContainersBills::getIsDeleted, 0)
 			.in(ContainersBills::getPid, toLongList));
+		List<Bills> billsList = new ArrayList<>();
 		if (ObjectUtils.isNotNull(containersBillsList)) {
 			List<Long> idList = containersBillsList.stream().map(ContainersBills::getPpId).collect(Collectors.toList());
 			if (idList.isEmpty()) {
 				throw new RuntimeException("数据错误,请联系管理员");
 			}
-			List<Bills> billsList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
+			billsList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
 				.eq(Bills::getTenantId, AuthUtil.getTenantId())
 				.eq(Bills::getIsDeleted, 0)
 				.in(Bills::getId, idList));
@@ -307,6 +321,14 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 			item.setUpdateUser(AuthUtil.getUserId());
 			item.setUpdateUserName(AuthUtil.getUserName());
 			item.setUpdateTime(new Date());
+			if (!billsList.isEmpty()) {
+				Bills bills = billsList.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
+				if (bills != null && !"MM".equals(bills.getBillType())) {
+					if (ObjectUtils.isNotNull(item.getContainerNumber())) {
+						throw new RuntimeException("箱号:" + item.getCntrNo() + "存在放箱号,清除失败");
+					}
+				}
+			}
 		}
 		this.updateBatchById(containersList);
 		return R.data("操作成功");
@@ -764,7 +786,7 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 		for (Containers item : containersList) {
 			if (!"MM".equals(bills.getBillType())) {
 				if (ObjectUtils.isNotNull(item.getContainerNumber())) {
-					throw new RuntimeException("箱号:" + item.getCntrNo() + "已出场,删除失败");
+					throw new RuntimeException("箱号:" + item.getCntrNo() + "存在放箱号,删除失败");
 				}
 			}
 			item.setUpdateUserName(AuthUtil.getUserName());
@@ -778,7 +800,7 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 
 	@Override
 	public List<ReturnContainerReminderExcel> returnContainerReminder(ReturnContainerReminderExcel returnContainerReminderExcel, IPage<ReturnContainerReminderExcel> page) {
-		return baseMapper.returnContainerReminder(returnContainerReminderExcel,page);
+		return baseMapper.returnContainerReminder(returnContainerReminderExcel, page);
 	}
 
 	@Override

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

@@ -448,6 +448,9 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 					if (ObjectUtils.isNotNull(item.getCntrNo())) {
 						throw new RuntimeException("存在箱号,请先清空后再操作!");
 					}
+					if (ObjectUtils.isNotNull(item.getContainerNumber())) {
+						throw new RuntimeException("配箱列表存在放箱号撤销失败!请先无货返空或撤销出场");
+					}
 					item.setUpdateTime(new Date());
 					item.setUpdateUserName(AuthUtil.getUserName());
 					item.setUpdateUser(AuthUtil.getUserId());

+ 0 - 75
blade-service/blade-los/src/main/java/org/springblade/los/excel/FinStlBillsExcel.java

@@ -61,91 +61,16 @@ public class FinStlBillsExcel implements Serializable {
 	@ExcelProperty(value = "HB/L NO")
 	private String hblnos;
 	/**
-	 * 业务类型,CHK=对账单 STL=结算单
-	 */
-	@ExcelProperty(value = "业务类型")
-	private String businessType;
-	/**
-	 * 单据编号
-	 */
-	@ExcelProperty(value = "JOB NO")
-	private String billNo;
-	/**
-	 * 来源单号
-	 */
-	@ExcelProperty(value = "来源单号")
-	private String requestNo;
-	/**
-	 * 费用名称
-	 */
-	@ExcelProperty(value = "费用名称")
-	private String feeCnName;
-	/**
-	 * 币别
-	 */
-	@ExcelProperty(value = "币别")
-	private String curCode;
-	/**
 	 * 结算日期
 	 */
 	@ExcelProperty(value = "结算日期")
 	private Date billDate;
 	/**
-	 * 提交日期
-	 */
-	@ExcelProperty(value = "提交日期")
-	private Date auditDateFrom;
-	/**
-	 * 审核日期
-	 */
-	@ExcelProperty(value = "审核日期")
-	private Date auditDateTo;
-	/**
 	 * 收/付
 	 */
 	@ExcelProperty(value = "收/付")
 	private String dc;
 	/**
-	 * 结算人
-	 */
-	@ExcelProperty(value = "结算人")
-	private String createUserName;
-	/**
-	 * 核销人
-	 */
-	@ExcelProperty(value = "核销人")
-	private String createUserNames;
-	/**
-	 * 业务编号
-	 */
-	@ExcelProperty(value = "业务编号")
-	private String businessNo;
-	/**
-	 * ACCT NO
-	 */
-	@ExcelProperty(value = "ACCT NO")
-	private String accountNo;
-	/**
-	 * 对账单号
-	 */
-	@ExcelProperty(value = "对账单号")
-	private String checkNo;
-	/**
-	 * 船名
-	 */
-	@ExcelProperty(value = "船名")
-	private String vesselCnName;
-	/**
-	 * 航次
-	 */
-	@ExcelProperty(value = "航次")
-	private String voyageNo;
-	/**
-	 * 发票汇率
-	 */
-	@ExcelProperty(value = "发票汇率")
-	private BigDecimal exrate;
-	/**
 	 * 本币
 	 */
 	@ExcelProperty(value = "本币")

+ 28 - 4
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/controller/StatisticAnalysisController.java

@@ -13,7 +13,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.los.excel.BoxNumberProfitExcel;
 import org.springblade.los.statisticAnalysis.BoxNumberProfitQ;
 import org.springblade.los.statisticAnalysis.DecisionAnalysis;
-import org.springblade.los.statisticAnalysis.FeeSettlementExcel;
+import org.springblade.los.statisticAnalysis.UnshippedGoodsAnalysis;
 import org.springblade.los.statisticAnalysis.service.IStatisticAnalysisService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -86,11 +86,11 @@ public class StatisticAnalysisController {
 	public void boxNumberProfitStatisticsExport(BoxNumberProfitQ boxNumberProfit, HttpServletResponse response) throws ParseException {
 		List<BoxNumberProfitExcel> list = statisticAnalysisService.boxNumberProfitStatisticsList(boxNumberProfit);
 		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
-		for (BoxNumberProfitExcel item : list){
-			if (ObjectUtils.isNotNull(item.getEtd())){
+		for (BoxNumberProfitExcel item : list) {
+			if (ObjectUtils.isNotNull(item.getEtd())) {
 				item.setEtd(formatter.format(formatter.parse(item.getEtd())));
 			}
-			if (ObjectUtils.isNotNull(item.getEta())){
+			if (ObjectUtils.isNotNull(item.getEta())) {
 				item.setEta(formatter.format(formatter.parse(item.getEta())));
 			}
 		}
@@ -105,4 +105,28 @@ public class StatisticAnalysisController {
 		return statisticAnalysisService.boxNumberProfitStatisticsChart(boxNumberProfit);
 	}
 
+	/**
+	 * app-票数统计
+	 */
+	@GetMapping("/voteCount")
+	public R voteCount(BoxNumberProfitQ boxNumberProfit) {
+		return statisticAnalysisService.voteCount(boxNumberProfit);
+	}
+
+	/**
+	 * app-航线统计
+	 */
+	@GetMapping("/lineCount")
+	public R lineCount(BoxNumberProfitQ boxNumberProfit) {
+		return statisticAnalysisService.lineCount(boxNumberProfit);
+	}
+
+	/**
+	 * app-未走货分析
+	 */
+	@GetMapping("/unshippedGoodsAnalysis")
+	public R unshippedGoodsAnalysis(UnshippedGoodsAnalysis unshippedGoodsAnalysis, Query query) {
+		return statisticAnalysisService.unshippedGoodsAnalysis(unshippedGoodsAnalysis,Condition.getPage(query));
+	}
+
 }

+ 7 - 0
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/IStatisticAnalysisService.java

@@ -19,6 +19,7 @@ package org.springblade.los.statisticAnalysis.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.corps.vo.BCorpsVO;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.excel.BoxNumberProfitExcel;
 import org.springblade.los.statisticAnalysis.*;
@@ -95,4 +96,10 @@ public interface IStatisticAnalysisService {
 	R<IPage<Bills>> arrivalReminderList(Bills bills, Query query);
 
 	List<AgingAnalysisRDItem> agingAnalysisExportItem(FeeSummaryQ feeSummaryQ);
+
+	R voteCount(BoxNumberProfitQ boxNumberProfit);
+
+	R lineCount(BoxNumberProfitQ boxNumberProfit);
+
+	R unshippedGoodsAnalysis(UnshippedGoodsAnalysis unshippedGoodsAnalysis, IPage<UnshippedGoodsAnalysis> page);
 }

+ 86 - 7
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/impl/StatisticAnalysisServiceImpl.java

@@ -10,8 +10,12 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.los.basic.corps.mapper.CorpsMapper;
+import org.springblade.los.basic.corps.vo.BCorpsVO;
 import org.springblade.los.basic.cur.entity.BCurrency;
 import org.springblade.los.basic.cur.service.IBCurrencyService;
+import org.springblade.los.basic.lines.entity.BLines;
+import org.springblade.los.basic.lines.service.IBLinesService;
 import org.springblade.los.box.entity.TradingBox;
 import org.springblade.los.box.service.ITradingBoxService;
 import org.springblade.los.business.amends.entity.Amends;
@@ -58,6 +62,8 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 	private final ITradingBoxService tradingBoxService;
 
 	private final ISysClient sysClient;
+	private final IBLinesService bLinesService;
+	private final CorpsMapper corpsMapper;
 
 	@Override
 	public R<IPage<DecisionAnalysis>> decisionAnalysis(DecisionAnalysis decisionAnalysis, IPage<DecisionAnalysis> page) {
@@ -229,7 +235,7 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 				.in(FeeCenter::getPid, idList));
 		}
 		for (FinanceProfitDtoList item : financeProfitList) {
-            if (("SEA".equals(item.getBusinessType()) || "SIA".equals(item.getBusinessType())
+			if (("SEA".equals(item.getBusinessType()) || "SIA".equals(item.getBusinessType())
 				|| "AEA".equals(item.getBusinessType()) || "AIA".equals(item.getBusinessType()))
 				&& !financeProfitDataList.isEmpty()) {
 				FinanceProfit profit = financeProfitDataList.stream().filter(e -> e.getMblno().equals(item.getMblNo())).findFirst().orElse(null);
@@ -265,7 +271,7 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 			.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 		item.setAmountDrUsd(amountDrUsd.setScale(2, RoundingMode.HALF_UP));
 		//实收美元
-		BigDecimal realAmountDrUsd =feeCenters.stream().filter(e -> "USD".equals(e.getCurCode()) && "D".equals(e.getDc()))
+		BigDecimal realAmountDrUsd = feeCenters.stream().filter(e -> "USD".equals(e.getCurCode()) && "D".equals(e.getDc()))
 			.map(FeeCenter::getStlTtlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 		item.setRealAmountDrUsd(realAmountDrUsd.setScale(2, RoundingMode.HALF_UP));
 		//未收美元
@@ -311,11 +317,11 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 		//未收其他
 		item.setNotReceivedDrOther(amountDrOther.subtract(realAmountDrOther));
 		//合计应收
-		BigDecimal amountDrLoc = feeCenters.stream().filter(e ->  "D".equals(e.getDc())).
+		BigDecimal amountDrLoc = feeCenters.stream().filter(e -> "D".equals(e.getDc())).
 			reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getAmount().multiply(y.getExrate()))), BigDecimal::add);
 		item.setAmountDrLoc(amountDrLoc.setScale(2, RoundingMode.HALF_UP));
 		//实际合计应收
-		BigDecimal realAmountDrLoc = feeCenters.stream().filter(e ->  "D".equals(e.getDc())).
+		BigDecimal realAmountDrLoc = feeCenters.stream().filter(e -> "D".equals(e.getDc())).
 			reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getStlTtlAmount().multiply(y.getExrate()))), BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
 		item.setRealAmountDrLoc(realAmountDrLoc.setScale(2, RoundingMode.HALF_UP));
 		//未收合计
@@ -361,7 +367,7 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 		//未付VND
 		item.setNotReceivedCrVnd(amountCrVnd.subtract(realAmountCrVnd));
 		//应付SGD
-		BigDecimal amountCrSgd =feeCenters.stream().filter(e -> "SGD".equals(e.getCurCode()) && "C".equals(e.getDc()))
+		BigDecimal amountCrSgd = feeCenters.stream().filter(e -> "SGD".equals(e.getCurCode()) && "C".equals(e.getDc()))
 			.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 		item.setAmountCrSgd(amountCrSgd.setScale(2, RoundingMode.HALF_UP));
 		//实付SGD
@@ -381,11 +387,11 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 		//未付其他
 		item.setNotReceivedCrOther(amountCrOther.subtract(realAmountCrOther));
 		//合计应付
-		BigDecimal amountCrLoc = feeCenters.stream().filter(e ->  "C".equals(e.getDc())).
+		BigDecimal amountCrLoc = feeCenters.stream().filter(e -> "C".equals(e.getDc())).
 			reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getAmount().multiply(y.getExrate()))), BigDecimal::add);
 		item.setAmountCrLoc(amountCrLoc.setScale(2, RoundingMode.HALF_UP));
 		//实际合计应付
-		BigDecimal realAmountCrLoc = feeCenters.stream().filter(e ->  "C".equals(e.getDc())).
+		BigDecimal realAmountCrLoc = feeCenters.stream().filter(e -> "C".equals(e.getDc())).
 			reduce(BigDecimal.ZERO, (x, y) -> x.add((y.getStlTtlAmount().multiply(y.getExrate()))), BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
 		item.setRealAmountCrLoc(realAmountCrLoc.setScale(2, RoundingMode.HALF_UP));
 		//未付合计
@@ -1981,4 +1987,77 @@ public class StatisticAnalysisServiceImpl implements IStatisticAnalysisService {
 		}
 		return finAccBillsMapper.agingAnalysisExportItem(feeSummaryQ);
 	}
+
+	@Override
+	public R voteCount(BoxNumberProfitQ boxNumberProfit) {
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.eq(ObjectUtils.isNotNull(boxNumberProfit.getBusinessType()), Bills::getBusinessType, boxNumberProfit.getBusinessType())
+			.eq(ObjectUtils.isNotNull(boxNumberProfit.getSrcCnName()), Bills::getSrcCnName, boxNumberProfit.getSrcCnName())
+			.eq(ObjectUtils.isNotNull(boxNumberProfit.getOperatorName()), Bills::getOperatorName, boxNumberProfit.getOperatorName());
+		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
+			boxNumberProfit.setBranchId(AuthUtil.getDeptId());
+		} else {
+			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(boxNumberProfit.getBranchId()), Bills::getBranchId, boxNumberProfit.getBranchId());
+		}
+		if (ObjectUtils.isNotNull(boxNumberProfit.getBillDateList()) && !boxNumberProfit.getBillDateList().isEmpty()) {
+			lambdaQueryWrapper.ge(Bills::getBillDate, boxNumberProfit.getBillDateList().get(0));
+			lambdaQueryWrapper.le(Bills::getBillDate, boxNumberProfit.getBillDateList().get(1));
+		}
+		List<Bills> billsList = billsMapper.selectList(lambdaQueryWrapper);
+		List<AppStatistics> appStatisticsList = new ArrayList<>();
+		if (!billsList.isEmpty()) {
+			for (Bills item : billsList) {
+				AppStatistics appStatistics = new AppStatistics();
+				appStatisticsList.add(appStatistics);
+			}
+		}
+		return R.data(appStatisticsList);
+	}
+
+	@Override
+	public R lineCount(BoxNumberProfitQ boxNumberProfit) {
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.eq(ObjectUtils.isNotNull(boxNumberProfit.getBusinessType()), Bills::getBusinessType, boxNumberProfit.getBusinessType())
+			.eq(ObjectUtils.isNotNull(boxNumberProfit.getSrcCnName()), Bills::getSrcCnName, boxNumberProfit.getSrcCnName())
+			.eq(ObjectUtils.isNotNull(boxNumberProfit.getOperatorName()), Bills::getOperatorName, boxNumberProfit.getOperatorName());
+		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
+			boxNumberProfit.setBranchId(AuthUtil.getDeptId());
+		} else {
+			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(boxNumberProfit.getBranchId()), Bills::getBranchId, boxNumberProfit.getBranchId());
+		}
+		if (ObjectUtils.isNotNull(boxNumberProfit.getBillDateList()) && !boxNumberProfit.getBillDateList().isEmpty()) {
+			lambdaQueryWrapper.ge(Bills::getBillDate, boxNumberProfit.getBillDateList().get(0));
+			lambdaQueryWrapper.le(Bills::getBillDate, boxNumberProfit.getBillDateList().get(1));
+		}
+		List<Bills> billsList = billsMapper.selectList(lambdaQueryWrapper);
+		List<BLines> linesList = bLinesService.list(new LambdaQueryWrapper<BLines>()
+			.eq(BLines::getTenantId, AuthUtil.getTenantId())
+			.eq(BLines::getIsDeleted, 0)
+			.eq(BLines::getStatus, 0));
+		List<AppStatistics> appStatisticsList = new ArrayList<>();
+		if (!linesList.isEmpty()) {
+			for (BLines item : linesList) {
+				AppStatistics appStatistics = new AppStatistics();
+				appStatistics.setName(item.getCnName());
+				if (!billsList.isEmpty()) {
+					appStatistics.setNumber(billsList.stream().filter(e -> item.getId().equals(e.getLineId())).count());
+				} else {
+					appStatistics.setNumber(0L);
+				}
+				appStatisticsList.add(appStatistics);
+			}
+		}
+		return R.data(appStatisticsList);
+	}
+
+	@Override
+	public R unshippedGoodsAnalysis(UnshippedGoodsAnalysis unshippedGoodsAnalysis,IPage<UnshippedGoodsAnalysis> page) {
+		List<UnshippedGoodsAnalysis> analysisList = corpsMapper.unshippedGoodsAnalysis(unshippedGoodsAnalysis,page);
+		page.setRecords(analysisList);
+		return null;
+	}
 }

Some files were not shown because too many files changed in this diff