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

1.增加久置柜模块列表,导出接口
2.添加箱轨迹提取公共类
3.海运进出口修改atd或ata增加箱轨迹
4.进出场记录明细删除报错修改
5.增加还箱提醒模块列表,导出接口
6.OW(放)同步放箱号接口逻辑修改
7.OW拿或放生成费用区分收付

纪新园 2 дней назад
Родитель
Сommit
8d667c7444
18 измененных файлов с 765 добавлено и 98 удалено
  1. 8 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/Archives.java
  2. 9 9
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/EmptyContainerAppearance.java
  3. 66 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/LongTermCabinetExcel.java
  4. 86 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/ReturnContainerReminderExcel.java
  5. 115 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/ArchivesTrajectoryUtils.java
  6. 69 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/BoxReminderController.java
  7. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordItemsServiceImpl.java
  8. 17 14
      blade-service/blade-los/src/main/java/org/springblade/los/box/mapper/PutBoxItemsMapper.xml
  9. 42 63
      blade-service/blade-los/src/main/java/org/springblade/los/box/mapper/PutBoxMapper.xml
  10. 6 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/IArchivesService.java
  11. 7 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/ITradingBoxService.java
  12. 83 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ArchivesServiceImpl.java
  13. 85 9
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java
  14. 5 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersMapper.java
  15. 90 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersMapper.xml
  16. 5 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IContainersService.java
  17. 60 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  18. 11 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/ContainersServiceImpl.java

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

@@ -333,6 +333,9 @@ public class Archives implements Serializable {
 	/**
 	 * 放箱号类型
 	 */
+	/**
+	 * 放箱号类型
+	 */
 	@ApiModelProperty(value = "放箱号类型")
 	private String containerNumberType;
 
@@ -416,6 +419,11 @@ public class Archives implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String temporaryId;
+	/**
+	 * 久置天数
+	 */
+	@TableField(exist = false)
+	private Long longTermDays;
 
 
 }

+ 9 - 9
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/EmptyContainerAppearance.java

@@ -22,54 +22,54 @@ public class EmptyContainerAppearance {
 	/**
 	 * 放箱号
 	 */
-	@ExcelProperty(value = "放箱号*")
+	@ExcelProperty(value = "RELEASEREF*")
 	private String containerNumber;
 
 	/**
 	 * 箱号
 	 */
-	@ExcelProperty(value = "箱号*")
+	@ExcelProperty(value = "CONTAINERNO*")
 	private String boxCode;
 
 	/**
 	 * 箱型
 	 */
-	@ExcelProperty(value = "箱型*")
+	@ExcelProperty(value = "CONTAINERTYPE*")
 	private String boxType;
 
 	/**
 	 * 港口
 	 */
-	@ExcelProperty(value = "港口*")
+	@ExcelProperty(value = "PORT*")
 	private String portName;
 
 	/**
 	 * 场站
 	 */
-	@ExcelProperty(value = "场站*")
+	@ExcelProperty(value = "DEPOT*")
 	private String stationName;
 
 	/**
 	 * 提单号
 	 */
-	@ExcelProperty(value = "提单号*")
+	@ExcelProperty(value = "HBLNO*")
 	private String mblno;
 
 	/**
 	 * 动态日期
 	 */
-	@ExcelProperty(value = "动态日期*")
+	@ExcelProperty(value = "MOVEMENTTIME*")
 	private Date boxStatusDate;
 
 	/**
 	 * 目的
 	 */
-	@ExcelProperty(value = "目的*")
+	@ExcelProperty(value = "ACTOIN*")
 	private String objective;
 	/**
 	 * 箱好坏
 	 */
-	@ExcelProperty(value = "箱好坏(好/坏)")
+	@ExcelProperty(value = "STATUS")
 	private String status;
 
 }

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

@@ -0,0 +1,66 @@
+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;
+
+/**
+ * @author :jixinyuan
+ * @date : 2025/9/2
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class LongTermCabinetExcel {
+
+	/**
+	 * 箱号
+	 */
+	@ExcelProperty(value = "箱号")
+	private String code;
+	/**
+	 * 箱型
+	 */
+	@ExcelProperty(value = "箱型")
+	private String typeName;
+	/**
+	 * 放箱号
+	 */
+	@ExcelProperty(value = "放箱号")
+	private String containerNumber;
+	/**
+	 * 放箱号类型
+	 */
+	@ExcelProperty(value = "放箱号类型")
+	private String containerNumberType;
+	/**
+	 * 箱动态
+	 */
+	@ExcelProperty(value = "箱动态")
+	private String boxDynamics;
+	/**
+	 * 港口
+	 */
+	@ExcelProperty(value = "港口")
+	private String addressCname;
+	/**
+	 * 场站
+	 */
+	@ExcelProperty(value = "场站")
+	private String stationCname;
+	/**
+	 * 分单号
+	 */
+	@ExcelProperty(value = "分单号")
+	private String billNo;
+	/**
+	 * 久置天数
+	 */
+	@ExcelProperty(value = "久置天数")
+	private Long longTermDays;
+
+
+}

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

@@ -0,0 +1,86 @@
+package org.springblade.los.box.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+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;
+
+/**
+ * @author :jixinyuan
+ * @date : 2025/9/2
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ReturnContainerReminderExcel {
+
+	/**
+	 * ContainerNO(箱号)
+	 */
+	@ExcelProperty(value = "ContainerNO")
+	private String cntrNo;
+	/**
+	 * ReleaseRef(放箱号)
+	 */
+	@ExcelProperty(value = "ReleaseRef")
+	private String containerNumber;
+	/**
+	 * ContainerType(箱型)
+	 */
+	@ExcelProperty(value = "ContainerType")
+	private String boxType;
+	/**
+	 * POD(港口)
+	 */
+	@ExcelProperty(value = "POD")
+	private String podCnName;
+	/**
+	 * depot(场站)
+	 */
+	@ExcelProperty(value = "depot")
+	private String podStationCname;
+	/**
+	 * depotLink(场站联系人)
+	 */
+	@ExcelProperty(value = "depotLink")
+	private String podCyContact;
+	/**
+	 * depotTel(场站电话)
+	 */
+	@ExcelProperty(value = "depotTel")
+	private String podCyTel;
+	/**
+	 * depotEMail(场站邮箱)
+	 */
+	@ExcelProperty(value = "depotEMail")
+	private String podCyEmail;
+	/**
+	 * 提单号
+	 */
+	@ExcelProperty(value = "MBLNO")
+	private String mblno;
+	/**
+	 * 分单号
+	 */
+	@ExcelProperty(value = "HBLNO")
+	private String hblno;
+	/**
+	 * 租户号
+	 */
+	@ExcelIgnore
+	private String tenantId;
+	/**
+	 * 所属公司
+	 */
+	@ExcelIgnore
+	private String branchId;
+	/**
+	 * 放箱号类型
+	 */
+	@ExcelIgnore
+	private String boxSrcType;
+
+}

+ 115 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/ArchivesTrajectoryUtils.java

@@ -0,0 +1,115 @@
+package org.springblade.los.Util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.los.box.entity.ArchivesTrajectory;
+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.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2026/3/25
+ */
+@Component
+@AllArgsConstructor
+public class ArchivesTrajectoryUtils {
+
+	private final IArchivesTrajectoryService archivesTrajectoryService;
+
+	private final IContainersService containersService;
+
+	public void saveTrajectory() {
+
+	}
+
+	public void saveTrajectoryAndContainers(Bills bills) {
+		if ("SOC".equals(bills.getBoxBelongsTo())){
+			List<ArchivesTrajectory> archivesTrajectoryList = new ArrayList<>();
+			List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
+				.eq(Containers::getTenantId, AuthUtil.getTenantId())
+				.eq(Containers::getIsDeleted, 0)
+				.eq(Containers::getPid, bills.getId())
+				.ne(Containers::getCntrNo, "")
+				.isNotNull(Containers::getCntrNo));
+			for (Containers item : containersList) {
+				ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
+				if ("SE".equals(bills.getBusinessType())) {
+					archivesTrajectory.setPortId(bills.getPolId());
+					archivesTrajectory.setPortCode(bills.getPolCode());
+					archivesTrajectory.setPortCname(bills.getPolCnName());
+					archivesTrajectory.setPortEname(bills.getPolEnName());
+					archivesTrajectory.setStationId(bills.getCyId());
+					archivesTrajectory.setStationCode(bills.getCyCode());
+					archivesTrajectory.setStationCname(bills.getCyCnName());
+					archivesTrajectory.setStationEname(bills.getCyCnName());
+					archivesTrajectory.setBoxDynamics("海运出口修改ATD");
+					archivesTrajectory.setStatus("海运出口修改ATD");
+					archivesTrajectory.setEtd(bills.getActualEtd());
+				} else if ("SI".equals(bills.getBusinessType())) {
+					archivesTrajectory.setPortId(bills.getPodId());
+					archivesTrajectory.setPortCode(bills.getPodCode());
+					archivesTrajectory.setPortCname(bills.getPodCnName());
+					archivesTrajectory.setPortEname(bills.getPodEnName());
+					archivesTrajectory.setStationId(item.getPodStationId());
+					archivesTrajectory.setStationCode(item.getPodStationCode());
+					archivesTrajectory.setStationCname(item.getPodStationCname());
+					archivesTrajectory.setStationEname(item.getPodStationEname());
+					archivesTrajectory.setBoxDynamics("海运进口修改ATD");
+					archivesTrajectory.setStatus("海运进口修改ATD");
+					archivesTrajectory.setEtd(bills.getActualEta());
+				}
+				archivesTrajectory.setContainerNumber(item.getContainerNumber());
+				archivesTrajectory.setBoxType(item.getCntrTypeCode());
+				archivesTrajectory.setBoxCategory(item.getBoxSrcType());
+				archivesTrajectory.setMblno(item.getMblno());
+				archivesTrajectory.setHblno(item.getHblno());
+				archivesTrajectory.setNewDate(new Date());
+				archivesTrajectory.setPodId(bills.getPodId());
+				archivesTrajectory.setPodCode(bills.getPodCode());
+				archivesTrajectory.setPodCname(bills.getPodCnName());
+				archivesTrajectory.setPodEname(bills.getPodEnName());
+				archivesTrajectory.setBillType(bills.getBusinessType());
+				archivesTrajectory.setCode(item.getCntrNo());
+				archivesTrajectory.setCreateTime(new Date());
+				archivesTrajectory.setCreateUser(AuthUtil.getUserId());
+				archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
+				archivesTrajectory.setTenantId(AuthUtil.getTenantId());
+				archivesTrajectory.setSrcId(bills.getId());
+				archivesTrajectory.setPolCyId(item.getPolCyId());
+				archivesTrajectory.setPolCyCode(item.getPolCyCode());
+				archivesTrajectory.setPolCyCname(item.getPolCyCname());
+				archivesTrajectory.setPolCyEname(item.getPolCyEname());
+				archivesTrajectory.setPolFreeBoxUseDays(bills.getPolFreeBoxUseDays());
+				archivesTrajectory.setPolPreAppearanceDate(item.getPolPreAppearanceDate());
+				archivesTrajectory.setPolStationEmptyContainerExitDate(item.getPolStationEmptyContainerExitDate());
+				archivesTrajectory.setPolReturnDate(item.getPolReturnDate());
+				archivesTrajectory.setPolOverdueBoxUseDays(item.getPolOverdueBoxUseDays());
+				archivesTrajectory.setEta(bills.getEta());
+				archivesTrajectory.setPodEmptyContainerReturnDate(item.getPodEmptyContainerReturnDate());
+				archivesTrajectory.setPodStationId(item.getPodStationId());
+				archivesTrajectory.setPodStationCode(item.getPodStationCode());
+				archivesTrajectory.setPodStationCname(item.getPodStationCname());
+				archivesTrajectory.setPodStationEname(item.getPodStationEname());
+				archivesTrajectory.setPodFreeBoxUseDays(bills.getPodFreeBoxUseDays());
+				archivesTrajectory.setPodBoxUseDays(item.getPodBoxUseDays());
+				archivesTrajectory.setShipNameId(bills.getVesselId());
+				archivesTrajectory.setShipCname(bills.getVesselCnName());
+				archivesTrajectory.setShipEname(bills.getVesselEnName());
+				archivesTrajectory.setVoyage(bills.getVoyageNo());
+				archivesTrajectoryList.add(archivesTrajectory);
+			}
+			if (!archivesTrajectoryList.isEmpty()) {
+				archivesTrajectoryService.saveBatch(archivesTrajectoryList);
+			}
+		}
+	}
+}

+ 69 - 1
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/BoxReminderController.java

@@ -17,17 +17,25 @@
 package org.springblade.los.box.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.los.basic.corps.entity.BCorpsAttn;
 import org.springblade.los.basic.corps.service.IBCorpsAttnService;
+import org.springblade.los.box.entity.Archives;
 import org.springblade.los.box.entity.TradingBox;
 import org.springblade.los.box.entity.TradingBoxItem;
 import org.springblade.los.box.excel.BoxReminderExcel;
+import org.springblade.los.box.excel.EmptyContainerAppearance;
+import org.springblade.los.box.excel.LongTermCabinetExcel;
+import org.springblade.los.box.excel.ReturnContainerReminderExcel;
+import org.springblade.los.box.service.IArchivesService;
 import org.springblade.los.box.service.ITradingBoxItemService;
 import org.springblade.los.box.service.ITradingBoxService;
 import org.springblade.los.business.sea.entity.Bills;
@@ -41,7 +49,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 /**
- * 航线利润 控制器
+ * 集装箱提醒 控制器
  *
  * @author BladeX
  * @since 2025-03-31
@@ -60,6 +68,8 @@ public class BoxReminderController extends BladeController {
 
 	private final IBillsService billsService;
 
+	private final IArchivesService archivesService;
+
 	/**
 	 * 提醒
 	 */
@@ -151,4 +161,62 @@ public class BoxReminderController extends BladeController {
 		return R.data(tradingBoxDetail);
 	}
 
+	/**
+	 * 还箱提醒
+	 */
+	@GetMapping("/returnContainerReminder")
+	public R<IPage<ReturnContainerReminderExcel>> returnContainerReminder(ReturnContainerReminderExcel returnContainerReminderExcel, Query query) {
+		returnContainerReminderExcel.setTenantId(AuthUtil.getTenantId());
+		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
+			returnContainerReminderExcel.setBranchId(AuthUtil.getDeptId());
+		}
+		if (ObjectUtils.isNotNull(returnContainerReminderExcel.getCntrNo())){
+			returnContainerReminderExcel.setCntrNo(returnContainerReminderExcel.getCntrNo().replaceAll(" ",","));
+		}
+		IPage<ReturnContainerReminderExcel> list = tradingBoxService.returnContainerReminder(returnContainerReminderExcel, Condition.getPage(query));
+		return R.data(list);
+	}
+
+	/**
+	 * 还箱提醒导出
+	 */
+	@GetMapping("/returnContainerReminderExport")
+	public void returnContainerReminderExport(ReturnContainerReminderExcel returnContainerReminderExcel, HttpServletResponse response) {
+		returnContainerReminderExcel.setTenantId(AuthUtil.getTenantId());
+		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
+			returnContainerReminderExcel.setBranchId(AuthUtil.getDeptId());
+		}
+		if (ObjectUtils.isNotNull(returnContainerReminderExcel.getCntrNo())){
+			returnContainerReminderExcel.setCntrNo(returnContainerReminderExcel.getCntrNo().replaceAll(" ",","));
+		}
+		List<EmptyContainerAppearance> list = tradingBoxService.returnContainerReminderExport(returnContainerReminderExcel);
+		ExcelUtil.export(response, "导入模板-客户还箱", "导入模板-客户还箱", list, EmptyContainerAppearance.class);
+	}
+
+	/**
+	 * 久置柜列表
+	 */
+	@GetMapping("/selectLongTermCabinet")
+	public R<IPage<LongTermCabinetExcel>> selectLongTermCabinet(Archives archives, Query query) {
+		archives.setTenantId(AuthUtil.getTenantId());
+		if (ObjectUtils.isNotNull(archives.getCode())){
+			archives.setCode(archives.getCode().replaceAll(" ",","));
+		}
+		return archivesService.selectLongTermCabinet(archives, query);
+	}
+
+	/**
+	 * 久置柜箱信息导出
+	 */
+	@GetMapping("/longTermCabinetExport")
+	public void longTermCabinetExport(Archives archives, HttpServletResponse response) {
+		archives.setTenantId(AuthUtil.getTenantId());
+		if (ObjectUtils.isNotNull(archives.getCode())){
+			archives.setCode(archives.getCode().replaceAll(" ",","));
+		}
+		List<LongTermCabinetExcel> list = archivesService.longTermCabinetExport(archives);
+		ExcelUtil.export(response, "久置柜箱明细", "久置柜箱明细", list, LongTermCabinetExcel.class);
+	}
+
+
 }

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

@@ -109,7 +109,7 @@ public class BoxDynamicsRecordItemsServiceImpl extends ServiceImpl<BoxDynamicsRe
 				operatorContent = OperatorType.TZ;
 			}
 			logUtils.saveOperationLogBatch(OperatorType.DATA_DELETION, operatorContent, ids);
-			BoxDynamicsRecord boxDynamicsRecord = boxDynamicsRecordMapper.selectById(itemsList.get(0).getId());
+			BoxDynamicsRecord boxDynamicsRecord = boxDynamicsRecordMapper.selectById(itemsList.get(0).getPid());
 			if (ObjectUtils.isNotNull(boxDynamicsRecord.getBoxCode())) {
 				List<String> boxCode = itemsList.stream().map(BoxDynamicsRecordItems::getBoxCode).distinct().collect(Collectors.toList());
 				List<String> arrList = new ArrayList<>();

+ 17 - 14
blade-service/blade-los/src/main/java/org/springblade/los/box/mapper/PutBoxItemsMapper.xml

@@ -58,27 +58,30 @@
     </select>
     <select id="selectPutBoxItemsList" resultType="org.springblade.los.box.excel.PortItemExcel">
         SELECT
-            lpb.container_number as containerNumber,
-            lpb.box_class as busType,
-            lpb.pol_cname as portName,
-            lpb.pol_station_cname as stationName,
-            lpb.box_type as boxType,
-            item.*
+        lpb.container_number as containerNumber,
+        lpb.box_class as busType,
+        lpb.pol_cname as portName,
+        corp.cn_name as stationName,
+        lpb.box_type as boxType,
+        item.*
         FROM
-            logistics_put_box lpb
-                LEFT JOIN logistics_put_box_items item ON lpb.id = item.pid
+        logistics_put_box lpb
+        LEFT JOIN logistics_put_box_items item ON lpb.id = item.pid
+        LEFT JOIN los_b_corps corp on lpb.pol_station_id = corp.id
         WHERE
-            lpb.is_deleted = 0
-          AND lpb.tenant_id = #{tenantId}
-          AND item.is_deleted = 0
-          AND item.tenant_id = #{tenantId}
-          AND item.`status` = '待使用'
+        lpb.is_deleted = 0
+        AND lpb.tenant_id = #{tenantId}
+        AND item.is_deleted = 0
+        AND item.tenant_id = #{tenantId}
+        AND corp.is_deleted = 0
+        AND corp.tenant_id = #{tenantId}
+        AND item.`status` = '待使用'
         AND lpb.whether_deactivate = '0'
         <if test="portId !=null and portId != ''">
             and lpb.pol_id = #{portId}
         </if>
         <if test="stationId !=null and stationId != ''">
-            and item.pol_cy_id = #{stationId}
+            and lpb.pol_station_id = #{stationId}
         </if>
         <if test="busType != null and busType != ''">
             and lpb.box_class like concat(concat('%', #{busType}),'%')

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

@@ -107,23 +107,23 @@
     </select>
     <select id="listPort" resultType="org.springblade.los.box.dto.BoxPoolPortDTO">
         SELECT
-        lp.id AS portId,
-        lp.cn_name AS portName,
-        item.pol_cy_cname AS stationName,
-        item.pol_cy_id AS stationId,
-        lpb.box_class AS busType,
-        sum( lpb.remaining_num ) AS remainingTotal
+        lp.id as portId,
+        lp.cn_name as portName,
+        corp.cn_name as stationName,
+        lpb.pol_station_id as stationId,
+        lpb.box_class as busType,
+        sum(lpb.remaining_num) as remainingTotal
         FROM
-        logistics_put_box_items item
-        LEFT JOIN logistics_put_box lpb on item.pid = lpb.id
+        logistics_put_box lpb
         LEFT JOIN los_b_ports lp ON FIND_IN_SET( lp.id, lpb.pol_id )
+        LEFT JOIN los_b_corps corp on lpb.pol_station_id = corp.id
         WHERE
         lpb.tenant_id = #{data.tenantId}
         AND lpb.is_deleted = '0'
         AND lp.tenant_id = #{data.tenantId}
         AND lp.is_deleted = '0'
-        AND item.is_deleted = '0'
-        AND item.tenant_id = #{data.tenantId}
+        AND corp.tenant_id = #{data.tenantId}
+        AND corp.is_deleted = '0'
         AND lpb.remaining_num > 0
         AND lpb.whether_deactivate = '0'
         <if test='data.containerNumber != null and data.containerNumber != ""'>
@@ -133,7 +133,7 @@
             and lpb.pol_id like concat(concat('%', #{data.polId}),'%')
         </if>
         <if test="data.stationId!=null and data.stationId != ''">
-            and item.pol_cy_id = #{data.stationId}
+            and lpb.pol_station_id = #{data.stationId}
         </if>
         <if test="data.podId!=null and data.podId != ''">
             and lpb.pod_id like concat(concat('%', #{data.podId}),'%')
@@ -161,7 +161,7 @@
             and DATE_FORMAT(lpb.effective_end_date,'%Y-%m-%d') &lt;= DATE_FORMAT(CURDATE(), '%Y-%m-%d')
         </if>
         GROUP BY
-        lp.id,lpb.box_class,item.pol_cy_id
+        lp.id,lpb.box_class,lpb.pol_station_id
     </select>
     <select id="selectBoxNumber" resultType="java.util.Map">
         SELECT
@@ -177,9 +177,6 @@
         AND box_status = '好箱'
         AND status = '待使用'
         AND box_type = '20GP'
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS gP20Good,
         (
         SELECT
@@ -193,9 +190,6 @@
         AND box_status = '好箱'
         AND status = '待使用'
         AND box_type = '40GP'
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS gP40Good,
         (
         SELECT
@@ -209,9 +203,6 @@
         AND box_status = '好箱'
         AND status = '待使用'
         AND box_type = '40HC'
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS hG40Good,
         (
         SELECT
@@ -225,9 +216,6 @@
         AND box_status = '好箱'
         AND status = '待使用'
         AND NOT FIND_IN_SET( box_type, '40HC,40GP,20GP' )
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS otherGood,
         (
         SELECT
@@ -241,9 +229,6 @@
         AND box_status = '坏箱'
         AND status = '待使用'
         AND box_type = '20GP'
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS gP20Bad,
         (
         SELECT
@@ -257,9 +242,6 @@
         AND box_status = '坏箱'
         AND status = '待使用'
         AND box_type = '40GP'
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS gP40Bad,
         (
         SELECT
@@ -273,9 +255,6 @@
         AND box_status = '坏箱'
         AND status = '待使用'
         AND box_type = '40HC'
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS hG40Bad,
         (
         SELECT
@@ -289,19 +268,19 @@
         AND box_status = '坏箱'
         AND status = '待使用'
         AND NOT FIND_IN_SET( box_type, '40HC,40GP,20GP' )
-        <if test="stationId !=null and stationId != ''">
-            and pol_cy_id = #{stationId}
-        </if>
         ) AS otherBad
         FROM
-            logistics_put_box lpb
+        logistics_put_box lpb
         WHERE
-            lpb.tenant_id = #{tenantId}
-          AND lpb.is_deleted = '0'
+        lpb.tenant_id = #{tenantId}
+        AND lpb.is_deleted = '0'
         AND lpb.whether_deactivate = '0'
         <if test="portId !=null and portId != ''">
             and lpb.pol_id like concat(concat('%', #{portId}),'%')
         </if>
+        <if test="stationId !=null and stationId != ''">
+            and lpb.pol_station_id = #{stationId}
+        </if>
         <if test="busType != null and busType != ''">
             and lpb.box_class like concat(concat('%', #{busType}),'%')
         </if>
@@ -312,21 +291,21 @@
     </select>
     <select id="getBoxNumber" resultType="org.springblade.los.excel.RouteCostProfitExcel">
         SELECT
-            lpb.pol_id as polId,
-            lpb.pol_cname as podCname,
-            lpb.pod_id as podId,
-            lpb.pod_cname as destinationCname,
-            lpb.box_type as boxType,
-            lpb.bus_type as busType,
-            lpb.remaining_num as remainingNum,
-            count(lpbi.id) as sum
+        lpb.pol_id as polId,
+        lpb.pol_cname as podCname,
+        lpb.pod_id as podId,
+        lpb.pod_cname as destinationCname,
+        lpb.box_type as boxType,
+        lpb.bus_type as busType,
+        lpb.remaining_num as remainingNum,
+        count(lpbi.id) as sum
         FROM
-            logistics_put_box lpb
-            LEFT JOIN logistics_put_box_items lpbi ON lpb.id = lpbi.pid AND lpbi.is_deleted = '0'
+        logistics_put_box lpb
+        LEFT JOIN logistics_put_box_items lpbi ON lpb.id = lpbi.pid AND lpbi.is_deleted = '0'
         AND lpbi.tenant_id = '128478'
         WHERE
-            lpb.is_deleted = '0'
-          AND lpb.tenant_id = #{data.tenantId}
+        lpb.is_deleted = '0'
+        AND lpb.tenant_id = #{data.tenantId}
         <if test="data.podCname !=null and data.podCname != ''">
             and lpb.pol_cname like concat(concat('%', #{data.podCname}),'%')
         </if>
@@ -337,23 +316,23 @@
     </select>
     <select id="listPortExport" resultType="org.springblade.los.box.dto.BoxPoolPortDTO">
         SELECT
-        lp.id AS portId,
-        lp.cn_name AS portName,
-        item.pol_cy_cname AS stationName,
-        item.pol_cy_id AS stationId,
-        lpb.box_class AS busType,
-        sum( lpb.remaining_num ) AS remainingTotal
+        lp.id as portId,
+        lp.cn_name as portName,
+        corp.cn_name as stationName,
+        lpb.pol_station_id as stationId,
+        lpb.box_class as busType,
+        sum(lpb.remaining_num) as remainingTotal
         FROM
-        logistics_put_box_items item
-        LEFT JOIN logistics_put_box lpb on item.pid = lpb.id
+        logistics_put_box lpb
         LEFT JOIN los_b_ports lp ON FIND_IN_SET( lp.id, lpb.pol_id )
+        LEFT JOIN los_b_corps corp on lpb.pol_station_id = corp.id
         WHERE
         lpb.tenant_id = #{data.tenantId}
         AND lpb.is_deleted = '0'
         AND lp.tenant_id = #{data.tenantId}
         AND lp.is_deleted = '0'
-        AND item.is_deleted = '0'
-        AND item.tenant_id = #{data.tenantId}
+        AND corp.tenant_id = #{data.tenantId}
+        AND corp.is_deleted = '0'
         AND lpb.remaining_num > 0
         AND lpb.whether_deactivate = '0'
         <if test='data.containerNumber != null and data.containerNumber != ""'>
@@ -363,7 +342,7 @@
             and lpb.pol_id like concat(concat('%', #{data.polId}),'%')
         </if>
         <if test="data.stationId!=null and data.stationId != ''">
-            and item.pol_cy_id = #{data.stationId}
+            and lpb.pol_station_id = #{data.stationId}
         </if>
         <if test="data.podId!=null and data.podId != ''">
             and lpb.pod_id like concat(concat('%', #{data.podId}),'%')
@@ -391,7 +370,7 @@
             and DATE_FORMAT(lpb.effective_end_date,'%Y-%m-%d') &lt;= DATE_FORMAT(CURDATE(), '%Y-%m-%d')
         </if>
         GROUP BY
-        lp.id,lpb.box_class,item.pol_cy_id
+        lp.id,lpb.box_class,lpb.pol_station_id
     </select>
     <select id="listContainerNumberExport" resultType="org.springblade.los.box.dto.BoxPoolContainerNumberDTO">
         SELECT

+ 6 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/IArchivesService.java

@@ -18,8 +18,10 @@ package org.springblade.los.box.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.support.Query;
 import org.springblade.los.box.dto.ArchivesExcelEnter;
 import org.springblade.los.box.entity.Archives;
+import org.springblade.los.box.excel.LongTermCabinetExcel;
 import org.springblade.los.box.vo.ArchivesVO;
 import org.springblade.core.tool.api.R;
 
@@ -78,4 +80,8 @@ public interface IArchivesService extends IService<Archives> {
     void updateCode(Archives archives);
 
     List<Archives> selectDetele(List<Long> archivesIdList, String tenantId);
+
+	R<IPage<LongTermCabinetExcel>> selectLongTermCabinet(Archives archives, Query query);
+
+	List<LongTermCabinetExcel> longTermCabinetExport(Archives archives);
 }

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

@@ -16,10 +16,13 @@
  */
 package org.springblade.los.box.service;
 
+import org.springblade.los.box.dto.BoxPoolPortDTO;
 import org.springblade.los.box.dto.ExportTradingBoxItemOut;
 import org.springblade.los.box.dto.TradingBoxItemRentExcelEnter;
 import org.springblade.los.box.entity.TradingBox;
 import org.springblade.los.box.excel.BoxReminderExcel;
+import org.springblade.los.box.excel.EmptyContainerAppearance;
+import org.springblade.los.box.excel.ReturnContainerReminderExcel;
 import org.springblade.los.box.vo.TradingBoxVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -97,4 +100,8 @@ public interface ITradingBoxService extends IService<TradingBox> {
 	R deleteById(String ids);
 
 	R removeIds(List<Long> longList);
+
+	IPage<ReturnContainerReminderExcel> returnContainerReminder(ReturnContainerReminderExcel returnContainerReminderExcel, IPage<ReturnContainerReminderExcel> page);
+
+	List<EmptyContainerAppearance> returnContainerReminderExport(ReturnContainerReminderExcel returnContainerReminderExcel);
 }

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

@@ -19,12 +19,15 @@ package org.springblade.los.box.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springblade.client.entity.BasicContainerDesc;
 import org.springblade.client.entity.BasicPortDesc;
 import org.springblade.client.feign.IContainerDescClient;
 import org.springblade.client.feign.IPortClient;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
@@ -39,6 +42,7 @@ import org.springblade.los.box.dto.ArchivesExcelEnter;
 import org.springblade.los.box.entity.Archives;
 import org.springblade.los.box.entity.ArchivesFiles;
 import org.springblade.los.box.entity.TradingBox;
+import org.springblade.los.box.excel.LongTermCabinetExcel;
 import org.springblade.los.box.mapper.ArchivesFilesMapper;
 import org.springblade.los.box.mapper.ArchivesMapper;
 import org.springblade.los.box.mapper.TradingBoxMapper;
@@ -48,6 +52,10 @@ import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -433,7 +441,81 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 
 	@Override
 	public List<Archives> selectDetele(List<Long> archivesIdList, String tenantId) {
-		return baseMapper.selectDetele(archivesIdList,tenantId);
+		return baseMapper.selectDetele(archivesIdList, tenantId);
+	}
+
+	@Override
+	public R<IPage<LongTermCabinetExcel>> selectLongTermCabinet(Archives archives, Query query) {
+		IPage<Archives> archivesList = this.page(Condition.getPage(query), new LambdaQueryWrapper<Archives>()
+			.eq(Archives::getTenantId, AuthUtil.getTenantId())
+			.eq(Archives::getIsDeleted, 0)
+			.eq(ObjectUtils.isNotNull(archives.getContainerNumberType()), Archives::getContainerNumberType, archives.getContainerNumberType())
+			.eq(ObjectUtils.isNotNull(archives.getAddressId()), Archives::getAddressId, archives.getAddressId())
+			.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()));
+		List<LongTermCabinetExcel> excelList = new ArrayList<>();
+		// 获取当前日期
+		LocalDate currentDate = LocalDate.now();
+		for (Archives item : archivesList.getRecords()) {
+			LongTermCabinetExcel excel = new LongTermCabinetExcel();
+			excel.setCode(item.getCode());
+			excel.setTypeName(item.getTypeName());
+			excel.setContainerNumber(item.getContainerNumber());
+			excel.setContainerNumberType(item.getContainerNumberType());
+			excel.setBoxDynamics(item.getBoxDynamics());
+			excel.setAddressCname(item.getAddressCname());
+			excel.setStationCname(item.getStationCname());
+			excel.setBillNo(item.getBillNo());
+			if (ObjectUtils.isNotNull(item.getNewDate())) {
+				// 解析目标日期
+				Instant instant = item.getNewDate().toInstant();
+				ZoneId zoneId = ZoneId.systemDefault();
+				excel.setLongTermDays(ChronoUnit.DAYS.between(currentDate, instant.atZone(zoneId).toLocalDate()));
+			}
+			excelList.add(excel);
+		}
+		IPage<LongTermCabinetExcel> page = new Page<>();
+		page.setRecords(excelList);
+		page.setSize(archivesList.getSize());
+		page.setPages(archivesList.getPages());
+		page.setCurrent(archivesList.getCurrent());
+		page.setTotal(archivesList.getTotal());
+		return R.data(page);
+	}
+
+	@Override
+	public List<LongTermCabinetExcel> longTermCabinetExport(Archives archives) {
+		List<Archives> archivesList = this.list(new LambdaQueryWrapper<Archives>()
+			.eq(Archives::getTenantId, AuthUtil.getTenantId())
+			.eq(Archives::getIsDeleted, 0)
+			.eq(ObjectUtils.isNotNull(archives.getContainerNumberType()), Archives::getContainerNumberType, archives.getContainerNumberType())
+			.eq(ObjectUtils.isNotNull(archives.getAddressId()), Archives::getAddressId, archives.getAddressId())
+			.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()));
+		List<LongTermCabinetExcel> excelList = new ArrayList<>();
+		// 获取当前日期
+		LocalDate currentDate = LocalDate.now();
+		for (Archives item : archivesList) {
+			LongTermCabinetExcel excel = new LongTermCabinetExcel();
+			excel.setCode(item.getCode());
+			excel.setTypeName(item.getTypeName());
+			excel.setContainerNumber(item.getContainerNumber());
+			excel.setContainerNumberType(item.getContainerNumberType());
+			excel.setBoxDynamics(item.getBoxDynamics());
+			excel.setAddressCname(item.getAddressCname());
+			excel.setStationCname(item.getStationCname());
+			excel.setBillNo(item.getBillNo());
+			if (ObjectUtils.isNotNull(item.getNewDate())) {
+				// 解析目标日期
+				Instant instant = item.getNewDate().toInstant();
+				ZoneId zoneId = ZoneId.systemDefault();
+				excel.setLongTermDays(ChronoUnit.DAYS.between(currentDate, instant.atZone(zoneId).toLocalDate()));
+			}
+			excelList.add(excel);
+		}
+		return excelList;
 	}
 
 }

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

@@ -17,6 +17,7 @@
 package org.springblade.los.box.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -39,6 +40,8 @@ import org.springblade.los.billno.service.IBusinessBillNoService;
 import org.springblade.los.box.dto.ExportTradingBoxItemOut;
 import org.springblade.los.box.entity.*;
 import org.springblade.los.box.excel.BoxReminderExcel;
+import org.springblade.los.box.excel.EmptyContainerAppearance;
+import org.springblade.los.box.excel.ReturnContainerReminderExcel;
 import org.springblade.los.box.mapper.TradingBoxMapper;
 import org.springblade.los.box.service.*;
 import org.springblade.los.business.sea.entity.Bills;
@@ -2894,13 +2897,56 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			}
 			putBoxItemsService.updateBatchById(putBoxItemsList);
 		}
-		if (tradingBox.getBoxNumber() < putBox.getOccupyNum()) {
-			throw new RuntimeException("箱量不能小于已占用数量");
-		}
-		if (putBox.getRemainingNum() < tradingBox.getCancelNumber()) {
-			throw new RuntimeException("取消数量大于放箱号可用数量");
+		TradingBox tradingBoxOld = baseMapper.selectById(tradingBox.getId());
+		int subNumber = tradingBoxOld.getCancelNumber() - tradingBox.getCancelNumber();
+		if (subNumber != 0) {
+			if ("OW-F".contains(tradingBox.getType())) {
+				SeaContainerNumberItem containerNumberItem = seaContainerNumberItemService.getOne(new LambdaQueryWrapper<SeaContainerNumberItem>()
+					.eq(SeaContainerNumberItem::getTenantId, AuthUtil.getTenantId())
+					.eq(SeaContainerNumberItem::getIsDeleted, 0)
+					.eq(SeaContainerNumberItem::getPid, tradingBox.getId())
+					.last("LIMIT 1"));
+				if (containerNumberItem != null) {
+					if (containerNumberItem.getOutNum() > tradingBox.getCancelNumber()) {
+						throw new RuntimeException("已出场数量大于本次修改箱量");
+					}
+					PutBox putBoxOld = putBoxService.getById(tradingBox.getSrcContainerNumberId());
+					if (putBoxOld == null) {
+						throw new RuntimeException("未查到原放箱号数据");
+					}
+					if (subNumber > 0) {
+						if (putBoxOld.getRemainingNum() > subNumber) {
+							throw new RuntimeException("放箱号可用数量小于本次增加的占用数量");
+						}
+					} else {
+						if (containerNumberItem.getOccupyNum() - containerNumberItem.getOutNum() < subNumber) {
+							throw new RuntimeException("剩余占用数量小于本次取消占用数量");
+						}
+						if (putBoxOld.getOccupyNum() < subNumber) {
+							throw new RuntimeException("取消数量大于放箱号可用数量");
+						}
+					}
+					containerNumberItem.setOccupyNum(containerNumberItem.getOccupyNum() + subNumber);
+					containerNumberItem.setActualOccupyNum(containerNumberItem.getActualOccupyNum() + subNumber);
+					containerNumberItem.setUpdateUser(AuthUtil.getUserId());
+					containerNumberItem.setUpdateUserName(AuthUtil.getUserName());
+					containerNumberItem.setUpdateTime(new Date());
+					seaContainerNumberItemService.updateById(containerNumberItem);
+					putBoxOld.setRemainingNum(putBoxOld.getRemainingNum() + subNumber);
+					putBoxOld.setOccupyNum(putBoxOld.getOccupyNum() + subNumber);
+					putBoxOld.setUpdateTime(new Date());
+					putBoxOld.setUpdateUser(AuthUtil.getUserId());
+					putBoxOld.setUpdateUserName(AuthUtil.getUserName());
+					putBoxOld.setVersion(putBoxOld.getVersion() + 1);
+					putBoxService.updateById(putBoxOld);
+				}
+			} else {
+				if (subNumber > 0 && putBox.getRemainingNum() > subNumber) {
+					throw new RuntimeException("放箱号可用数量小于本次增加的占用数量");
+				}
+			}
+			putBox.setRemainingNum(putBox.getRemainingNum() + subNumber);
 		}
-		putBox.setRemainingNum(tradingBox.getBoxNumber() - putBox.getOccupyNum() - alreadyAppeared - tradingBox.getCancelNumber());
 		putBox.setVersion(putBox.getVersion() + 1);
 		putBoxService.updateById(putBox);
 		return R.data(tradingBox);
@@ -3146,10 +3192,14 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			feeCenter.setCreateUser(AuthUtil.getUserId());
 			feeCenter.setCreateUserName(AuthUtil.getUserName());
 			feeCenter.setPid(detail.getId());
-			if ("OW-N".equals(detail.getType())) {
-				feeCenter.setDc("C");
+			if ("1".equals(centerItems.getFeeType())) {
+				feeCenter.setDc(detail.getDc().toUpperCase());
 			} else {
-				feeCenter.setDc("D");
+				if ("OW-N".equals(detail.getType())) {
+					feeCenter.setDc("C");
+				} else {
+					feeCenter.setDc("D");
+				}
 			}
 			feeCenter.setFeeId(centerItems.getFeeId());
 			feeCenter.setFeeCode(centerItems.getFeeCode());
@@ -3935,4 +3985,30 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		return R.success("操作成功");
 	}
 
+	@Override
+	public IPage<ReturnContainerReminderExcel> returnContainerReminder(ReturnContainerReminderExcel returnContainerReminderExcel, IPage<ReturnContainerReminderExcel> page) {
+		List<ReturnContainerReminderExcel> excelList = containersService.returnContainerReminder(returnContainerReminderExcel, page);
+		return page.setRecords(excelList);
+	}
+
+	@Override
+	public List<EmptyContainerAppearance> returnContainerReminderExport(ReturnContainerReminderExcel returnContainerReminderExcel) {
+		List<ReturnContainerReminderExcel> excelList = containersService.returnContainerReminderExport(returnContainerReminderExcel);
+		List<EmptyContainerAppearance> appearanceList = new ArrayList<>();
+		for (ReturnContainerReminderExcel item : excelList) {
+			EmptyContainerAppearance appearance = new EmptyContainerAppearance();
+			appearance.setContainerNumber(item.getContainerNumber());
+			appearance.setBoxCode(item.getCntrNo());
+			appearance.setBoxType(item.getBoxType());
+			appearance.setPortName(item.getPodCnName());
+			appearance.setStationName(item.getPodStationCname());
+			appearance.setMblno(item.getHblno());
+			appearance.setBoxStatusDate(null);
+			appearance.setObjective("C");
+			appearance.setStatus("好箱");
+			appearanceList.add(appearance);
+		}
+		return appearanceList;
+	}
+
 }

+ 5 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersMapper.java

@@ -19,6 +19,7 @@ package org.springblade.los.business.sea.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.los.box.excel.ReturnContainerReminderExcel;
 import org.springblade.los.business.sea.entity.Containers;
 import org.springblade.los.business.sea.vo.ContainersVO;
 import org.springblade.los.excel.UpdatePodStationExcel;
@@ -51,4 +52,8 @@ public interface ContainersMapper extends BaseMapper<Containers> {
 	List<UpdatePodStationExcel> updatePodStationPage(IPage<UpdatePodStationExcel> page, @Param("data")UpdatePodStationExcel excel);
 
 	List<UpdatePodStationExcel> updatePodStationList(@Param("data")UpdatePodStationExcel excel);
+
+    List<ReturnContainerReminderExcel> returnContainerReminder(@Param("data")ReturnContainerReminderExcel returnContainerReminderExcel,IPage page);
+
+	List<ReturnContainerReminderExcel> returnContainerReminderExport(@Param("data")ReturnContainerReminderExcel returnContainerReminderExcel);
 }

+ 90 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersMapper.xml

@@ -296,5 +296,95 @@
     <select id="selectContainersPage" resultMap="containersResultMap">
         select * from los_sea_containers where is_deleted = 0
     </select>
+    <select id="returnContainerReminder"
+            resultType="org.springblade.los.box.excel.ReturnContainerReminderExcel">
+        SELECT
+        lsc.container_number as containerNumber,
+        lsc.cntr_no as cntrNo,
+        lsc.cntr_type_code as boxType,
+        lsc.pod_cn_name as podCnName,
+        lsc.pod_station_cname as podStationCname,
+        lsc.pod_cy_contact as podCyContact,
+        lsc.pod_cy_tel as podCyTel,
+        lsc.pod_cy_email as podCyEmail,
+        lsc.hblno as hblno,
+        lsc.mblno as mblno,
+        lsc.pod_empty_container_return_date as podEmptyContainerReturnDate
+        FROM
+        los_sea_containers lsc
+        LEFT JOIN los_sea_bills lsb ON lsc.pid = lsb.id
+        WHERE
+        lsc.tenant_id = #{data.tenantId}
+        AND lsc.is_deleted = '0'
+        AND lsb.tenant_id = #{data.tenantId}
+        AND lsb.is_deleted = '0'
+        AND lsb.business_type = 'SI'
+        AND lsc.pod_empty_container_return_date IS NULL
+        AND NOW() > DATE_ADD( lsb.actual_eta, INTERVAL lsb.pod_free_box_use_days DAY )
+        AND lsb.bill_type IN ( 'DD', 'MH' )
+        <if test='data.branchId != null and data.branchId != ""'>
+            and lsb.branch_id = #{data.branchId}
+        </if>
+        <if test="data.cntrNo != null and data.cntrNo != ''">
+            and find_in_set(lsc.cntr_no,#{data.cntrNo})
+        </if>
+        <if test="data.containerNumber != null and data.containerNumber != ''">
+            and lsc.container_number like concat('%', #{data.containerNumber}, '%')
+        </if>
+        <if test="data.hblno != null and data.hblno != ''">
+            and lsc.hblno like concat('%', #{data.hblno}, '%')
+        </if>
+        <if test="data.mblno != null and data.mblno != ''">
+            and lsc.mblno like concat('%', #{data.mblno}, '%')
+        </if>
+        <if test="data.boxSrcType != null and data.boxSrcType != ''">
+            and lsc.box_src_type like concat('%', #{data.boxSrcType}, '%')
+        </if>
+    </select>
+    <select id="returnContainerReminderExport"
+            resultType="org.springblade.los.box.excel.ReturnContainerReminderExcel">
+        SELECT
+        lsc.container_number as containerNumber,
+        lsc.cntr_no as cntrNo,
+        lsc.cntr_type_code as boxType,
+        lsc.pod_cn_name as podCnName,
+        lsc.pod_station_cname as podStationCname,
+        lsc.pod_cy_contact as podCyContact,
+        lsc.pod_cy_tel as podCyTel,
+        lsc.pod_cy_email as podCyEmail,
+        lsc.hblno as hblno,
+        lsc.mblno as mblno,
+        lsc.pod_empty_container_return_date as podEmptyContainerReturnDate
+        FROM
+        los_sea_containers lsc
+        LEFT JOIN los_sea_bills lsb ON lsc.pid = lsb.id
+        WHERE
+        lsc.tenant_id = #{data.tenantId}
+        AND lsc.is_deleted = '0'
+        AND lsb.tenant_id = #{data.tenantId}
+        AND lsb.is_deleted = '0'
+        AND lsb.business_type = 'SI'
+        AND lsc.pod_empty_container_return_date IS NULL
+        AND NOW() > DATE_ADD( lsb.actual_eta, INTERVAL lsb.pod_free_box_use_days DAY )
+        AND lsb.bill_type IN ( 'DD', 'MH' )
+        <if test='data.branchId != null and data.branchId != ""'>
+            and lsb.branch_id = #{data.branchId}
+        </if>
+        <if test="data.cntrNo != null and data.cntrNo != ''">
+            and find_in_set(lsc.cntr_no,#{data.cntrNo})
+        </if>
+        <if test="data.containerNumber != null and data.containerNumber != ''">
+            and lsc.container_number like concat('%', #{data.containerNumber}, '%')
+        </if>
+        <if test="data.hblno != null and data.hblno != ''">
+            and lsc.hblno like concat('%', #{data.hblno}, '%')
+        </if>
+        <if test="data.mblno != null and data.mblno != ''">
+            and lsc.mblno like concat('%', #{data.mblno}, '%')
+        </if>
+        <if test="data.boxSrcType != null and data.boxSrcType != ''">
+            and lsc.box_src_type like concat('%', #{data.boxSrcType}, '%')
+        </if>
+    </select>
 
 </mapper>

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

@@ -19,6 +19,7 @@ package org.springblade.los.business.sea.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.box.excel.ReturnContainerReminderExcel;
 import org.springblade.los.business.sea.entity.Containers;
 import org.springblade.los.business.sea.vo.ContainersVO;
 import org.springblade.los.excel.BoxAndLeadSealNoExcel;
@@ -93,4 +94,8 @@ public interface IContainersService extends IService<Containers> {
 	List<UpdatePodStationExcel> updatePodStationList(UpdatePodStationExcel excel);
 
 	R detele(String ids);
+
+    List<ReturnContainerReminderExcel> returnContainerReminder(ReturnContainerReminderExcel returnContainerReminderExcel, IPage<ReturnContainerReminderExcel> page);
+
+	List<ReturnContainerReminderExcel> returnContainerReminderExport(ReturnContainerReminderExcel returnContainerReminderExcel);
 }

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

@@ -159,6 +159,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 
 	private final IBPortsService bPortsService;
 
+	private final ArchivesTrajectoryUtils archivesTrajectoryUtils;
+
 	@Override
 	public IPage<Bills> selectBillsPage(IPage<Bills> page, Bills bills) {
 		return page.setRecords(baseMapper.selectBillsPage(page, bills));
@@ -734,6 +736,28 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				details.setGrossWeight(grossWeightM);
 				details.setMeasurement(measurementM);
 				this.updateById(details);
+			}else{
+				String isOccupyNum = sysClient.getParamService("is.occupyNum");
+				if (!"获取数据失败".equals(isOccupyNum)){
+					Bills bills1 = baseMapper.selectById(bills.getId());
+					if (bills1 != null){
+						boolean status = false;
+						if ("SE".equals(bills.getBusinessType())) {
+							if (ObjectUtils.isNotNull(bills1.getActualEtd()) && ObjectUtils.isNotNull(bills.getActualEtd()) &&
+								!bills1.getEtd().equals(bills.getActualEtd())) {
+								status = true;
+							}
+						} else if ("SI".equals(bills.getBusinessType())) {
+							if (ObjectUtils.isNotNull(bills1.getActualEta()) && ObjectUtils.isNotNull(bills.getActualEta()) &&
+								!bills1.getEtd().equals(bills.getActualEta())) {
+								status = true;
+							}
+						}
+						if (status){
+							archivesTrajectoryUtils.saveTrajectoryAndContainers(bills);
+						}
+					}
+				}
 			}
 		} else {
 			Bills details = baseMapper.selectById(bills.getId());
@@ -788,6 +812,24 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			if (statusEtd || statusEta || statusAtd || statusAta || statusVessel || statusVoyageNo || statusMblno || statusPolId
 				|| statusPodId || statusCyTrailerTime || statusCyReturnTime || statusLineId || statusForwarding || statusBookingAgentId
 				|| shippingAgencyId || bookingDate || carrierId || foreignAgencyId || issueDate || boxBelongsTo || issueAtId) {
+				String isOccupyNum = sysClient.getParamService("is.occupyNum");
+				if (!"获取数据失败".equals(isOccupyNum)){
+					boolean status = false;
+					if ("SE".equals(bills.getBusinessType())) {
+						if (ObjectUtils.isNotNull(details.getActualEtd()) && ObjectUtils.isNotNull(bills.getActualEtd()) &&
+							!details.getEtd().equals(bills.getActualEtd())) {
+							status = true;
+						}
+					} else if ("SI".equals(bills.getBusinessType())) {
+						if (ObjectUtils.isNotNull(details.getActualEta()) && ObjectUtils.isNotNull(bills.getActualEta()) &&
+							!details.getEtd().equals(bills.getActualEta())) {
+							status = true;
+						}
+					}
+					if (status){
+						archivesTrajectoryUtils.saveTrajectoryAndContainers(bills);
+					}
+				}
 				List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 					.eq(FeeCenter::getIsDeleted, 0)
@@ -1045,6 +1087,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			if (statusEtd || statusEta || statusAtd || statusAta || statusVessel || statusVoyageNo || statusMblno || statusPolId
 				|| statusPodId || statusCyTrailerTime || statusCyReturnTime || statusLineId || statusForwarding || statusBookingAgentId
 				|| shippingAgencyId || bookingDate || carrierId || foreignAgencyId || issueDate || boxBelongsTo || issueAtId) {
+				String isOccupyNum = sysClient.getParamService("is.occupyNum");
 				billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
 					.eq(Bills::getTenantId, AuthUtil.getTenantId())
 					.eq(Bills::getIsDeleted, 0)
@@ -1054,6 +1097,23 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					for (Bills item : billsList) {
 						item.setEtd(bills.getEtd());
 						item.setEta(bills.getEta());
+						if (!"获取数据失败".equals(isOccupyNum)){
+							boolean status = false;
+							if ("SE".equals(bills.getBusinessType())) {
+								if (ObjectUtils.isNotNull(details.getActualEtd()) && ObjectUtils.isNotNull(bills.getActualEtd()) &&
+									!details.getEtd().equals(bills.getActualEtd())) {
+									status = true;
+								}
+							} else if ("SI".equals(bills.getBusinessType())) {
+								if (ObjectUtils.isNotNull(details.getActualEta()) && ObjectUtils.isNotNull(bills.getActualEta()) &&
+									!details.getEtd().equals(bills.getActualEta())) {
+									status = true;
+								}
+							}
+							if (status){
+								archivesTrajectoryUtils.saveTrajectoryAndContainers(item);
+							}
+						}
 						item.setActualEta(bills.getActualEta());
 						item.setActualEtd(bills.getActualEtd());
 						item.setBillDate(bills.getBillDate());

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

@@ -29,6 +29,7 @@ import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.los.Util.BoxNumUtils;
 import org.springblade.los.Util.GlobalOperationLogUtils;
 import org.springblade.los.Util.OperatorType;
+import org.springblade.los.box.excel.ReturnContainerReminderExcel;
 import org.springblade.los.business.sea.dto.WaitingBox;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.Containers;
@@ -772,5 +773,15 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 		return R.success("操作成功");
 	}
 
+	@Override
+	public List<ReturnContainerReminderExcel> returnContainerReminder(ReturnContainerReminderExcel returnContainerReminderExcel, IPage<ReturnContainerReminderExcel> page) {
+		return baseMapper.returnContainerReminder(returnContainerReminderExcel,page);
+	}
+
+	@Override
+	public List<ReturnContainerReminderExcel> returnContainerReminderExport(ReturnContainerReminderExcel returnContainerReminderExcel) {
+		return baseMapper.returnContainerReminderExport(returnContainerReminderExcel);
+	}
+
 
 }