Browse Source

1.箱轨迹修改增加操作日志
2.海运出口复制清楚截单日期
3.进出场明细删除接口增加操作日志
4.进出场excel导入增加箱号转大写
5.配箱列表,行删除,全部删除增加操作日志
6.进出场撤销接口调试
7.增加操作日志表
8.pod场站,空箱返场,ow批量修改pod场站增加操作日志
9.海运进出口修改占用箱量增加判断

纪新园 2 weeks ago
parent
commit
9b1f65caa4
29 changed files with 1360 additions and 646 deletions
  1. 96 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/dynamics/entity/BoxDynamicsRecordItems.java
  2. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/Archives.java
  3. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBox.java
  4. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBoxItems.java
  5. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/TradingBox.java
  6. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/TradingBoxItem.java
  7. 34 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/log/dto/GlobalOperationLogDTO.java
  8. 129 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/log/entity/GlobalOperationLog.java
  9. 36 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/log/vo/GlobalOperationLogVO.java
  10. 62 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/GlobalOperationLogUtils.java
  11. 32 0
      blade-service/blade-los/src/main/java/org/springblade/los/Util/OperatorType.java
  12. 2 2
      blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/controller/ReportsController.java
  13. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java
  14. 6 3
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/UseBoxPlanController.java
  15. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/controller/BoxDynamicsRecordItemsController.java
  16. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/IBoxDynamicsRecordItemsService.java
  17. 71 3
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordItemsServiceImpl.java
  18. 502 196
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java
  19. 11 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ArchivesTrajectoryServiceImpl.java
  20. 7 414
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/PutBoxServiceImpl.java
  21. 6 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java
  22. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/ContainersController.java
  23. 40 26
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  24. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/SeaContainerNumberItemServiceImpl.java
  25. 126 0
      blade-service/blade-los/src/main/java/org/springblade/los/log/controller/GlobalOperationLogController.java
  26. 42 0
      blade-service/blade-los/src/main/java/org/springblade/los/log/mapper/GlobalOperationLogMapper.java
  27. 31 0
      blade-service/blade-los/src/main/java/org/springblade/los/log/mapper/GlobalOperationLogMapper.xml
  28. 41 0
      blade-service/blade-los/src/main/java/org/springblade/los/log/service/IGlobalOperationLogService.java
  29. 41 0
      blade-service/blade-los/src/main/java/org/springblade/los/log/service/impl/GlobalOperationLogServiceImpl.java

+ 96 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/dynamics/entity/BoxDynamicsRecordItems.java

@@ -198,5 +198,101 @@ public class BoxDynamicsRecordItems implements Serializable {
 	@TableField(exist = false)
 	private String assigned;
 
+	//数据同步还原相关字段
+	/**
+	 * 来源放箱号id
+	 */
+	@ApiModelProperty(value = "来源放箱号id")
+	private Long srcPutBoxId;
+	/**
+	 * 来源放箱号明细id
+	 */
+	@ApiModelProperty(value = "来源放箱号明细id")
+	private Long srcPutBoxItemsId;
+	/**
+	 * 来源(OW拿,OW放,代理箱,买箱,租箱,退租,调拨)单据id
+	 */
+	@ApiModelProperty(value = "来源单据id")
+	private Long srcTradingBoxId;
+	/**
+	 * 来源(OW拿,OW放,代理箱,买箱,租箱,退租,调拨)单据明细id
+	 */
+	@ApiModelProperty(value = "来源单据明细id")
+	private Long srcTradingBoxItemsId;
+	/**
+	 * 来来源箱档案id
+	 */
+	@ApiModelProperty(value = "来源箱档案id")
+	private Long srcArchivesId;
+	/**
+	 * 来源pod放箱号id(客户还箱专用)
+	 */
+	@ApiModelProperty(value = "来源pod放箱号id")
+	private Long srcPutBoxPodId;
+	/**
+	 * 来源pod放箱号明细id(客户还箱专用)
+	 */
+	@ApiModelProperty(value = "来源pod放箱号明细id")
+	private Long srcPutBoxItemsPodId;
+	/**
+	 * 数据同步上一步箱动态
+	 */
+	@ApiModelProperty(value = "数据同步上一步箱动态")
+	private String srcBoxDynamics;
+	/**
+	 * 数据同步上一步箱状态
+	 */
+	@ApiModelProperty(value = "数据同步上一步箱状态")
+	private String srcBoxStatus;
+	/**
+	 * 数据同步状态
+	 */
+	@ApiModelProperty(value = "数据同步状态")
+	private String srcStatus;
+	/**
+	 * 数据同步上一步当前港口
+	 */
+	@ApiModelProperty(value = "数据同步上一步当前港口")
+	private Long srcPortId;
+	/**
+	 * 数据同步上一步当前港口编码
+	 */
+	@ApiModelProperty(value = "数据同步上一步当前港口编码")
+	private String srcPortCode;
+	/**
+	 * 数据同步上一步当前港口中文
+	 */
+	@ApiModelProperty(value = "数据同步上一步当前港口中文")
+	private String srcPortCname;
+	/**
+	 * 数据同步上一步当前港口英文
+	 */
+	@ApiModelProperty(value = "数据同步上一步当前港口英文")
+	private String srcPortEname;
+	/**
+	 * 数据同步上一步场站
+	 */
+	@ApiModelProperty(value = "数据同步上一步场站")
+	private Long srcStationId;
+	/**
+	 * 数据同步上一步场站编码
+	 */
+	@ApiModelProperty(value = "数据同步上一步场站编码")
+	private String srcStationCode;
+	/**
+	 * 数据同步上一步场站中文
+	 */
+	@ApiModelProperty(value = "数据同步上一步场站中文")
+	private String srcStationCname;
+	/**
+	 * 数据同步上一步场站英文
+	 */
+	@ApiModelProperty(value = "数据同步上一步场站英文")
+	private String srcStationEname;
 
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long temporaryId;
 }

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

@@ -411,6 +411,11 @@ public class Archives implements Serializable {
 	 */
 	@TableField(exist = false)
 	private List<String> newDateList;
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long temporaryId;
 
 
 }

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

@@ -485,5 +485,10 @@ public class PutBox implements Serializable {
 	@TableField(exist = false)
 	private String whetherDisplay;
 
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long temporaryId;
 
 }

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

@@ -378,4 +378,9 @@ public class PutBoxItems implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String unoccupied;
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long temporaryId;
 }

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

@@ -938,4 +938,10 @@ public class TradingBox implements Serializable {
 	@TableField(exist = false)
 	private String itemIds;
 
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long temporaryId;
+
 }

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

@@ -682,4 +682,10 @@ public class TradingBoxItem implements Serializable {
 	 */
 	@ApiModelProperty(value = "是否生成PickUp费用")
 	private String whetherGeneratePickUpCost;
+
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long temporaryId;
 }

+ 34 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/log/dto/GlobalOperationLogDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.dto;
+
+import org.springblade.los.log.entity.GlobalOperationLog;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 货代操作记录数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class GlobalOperationLogDTO extends GlobalOperationLog {
+	private static final long serialVersionUID = 1L;
+
+}

+ 129 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/log/entity/GlobalOperationLog.java

@@ -0,0 +1,129 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 货代操作记录实体类
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+@Data
+@TableName("los_global_operation_log")
+@ApiModel(value = "GlobalOperationLog对象", description = "货代操作记录")
+public class GlobalOperationLog implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 来源id
+	 */
+	@ApiModelProperty(value = "来源id")
+	private Long pid;
+	/**
+	 * 分公司 Id
+	 */
+	@ApiModelProperty(value = "分公司 Id")
+	private String branchId;
+	/**
+	 * 创建人 Id
+	 */
+	@ApiModelProperty(value = "创建人 Id")
+	private Long createUser;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private String createUserName;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**
+	 * 修改人 Id
+	 */
+	@ApiModelProperty(value = "修改人 Id")
+	private Long updateUser;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private String updateUserName;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**
+	 * 版本
+	 */
+	@ApiModelProperty(value = "版本")
+	private String version;
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0 否 1是)")
+	private Integer isDeleted;
+	/**
+	 * 分公司 Id
+	 */
+	@ApiModelProperty(value = "分公司 Id")
+	private String branchName;
+	/**
+	 * 操作人
+	 */
+	@ApiModelProperty(value = "操作人")
+	private Long operatorId;
+	/**
+	 * 操作人
+	 */
+	@ApiModelProperty(value = "操作人")
+	private String operatorName;
+	/**
+	 * 操作时间
+	 */
+	@ApiModelProperty(value = "操作时间")
+	private Date operatorDate;
+	/**
+	 * 操作类型
+	 */
+	@ApiModelProperty(value = "操作类型")
+	private String operatorType;
+	/**
+	 * 操作内容
+	 */
+	@ApiModelProperty(value = "操作内容")
+	private String operatorContent;
+	/**
+	 * 租户号
+	 */
+	@ApiModelProperty(value = "租户号")
+	private String tenantId;
+
+
+}

+ 36 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/log/vo/GlobalOperationLogVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.vo;
+
+import org.springblade.los.log.entity.GlobalOperationLog;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 货代操作记录视图实体类
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "GlobalOperationLogVO对象", description = "货代操作记录")
+public class GlobalOperationLogVO extends GlobalOperationLog {
+	private static final long serialVersionUID = 1L;
+
+}

+ 62 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/GlobalOperationLogUtils.java

@@ -0,0 +1,62 @@
+package org.springblade.los.Util;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.los.log.entity.GlobalOperationLog;
+import org.springblade.los.log.service.IGlobalOperationLogService;
+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 GlobalOperationLogUtils {
+
+	private final IGlobalOperationLogService globalOperationLogService;
+
+
+	public void saveOperationLog(String operatorType, String operatorContent, Long srcId) {
+		GlobalOperationLog globalOperationLog = new GlobalOperationLog();
+		globalOperationLog.setPid(srcId);
+		globalOperationLog.setBranchId(AuthUtil.getDeptId());
+		globalOperationLog.setCreateUser(AuthUtil.getUserId());
+		globalOperationLog.setCreateUserName(AuthUtil.getUserName());
+		globalOperationLog.setCreateTime(new Date());
+		globalOperationLog.setOperatorId(AuthUtil.getUserId());
+		globalOperationLog.setOperatorName(AuthUtil.getUserName());
+		globalOperationLog.setOperatorDate(new Date());
+		globalOperationLog.setOperatorType(operatorType);
+		globalOperationLog.setOperatorContent(operatorContent);
+		globalOperationLog.setTenantId(AuthUtil.getTenantId());
+		globalOperationLogService.save(globalOperationLog);
+	}
+
+	public void saveOperationLogBatch(String operatorType, String operatorContent, String srcIds) {
+		String[] arr = srcIds.split(",");
+		List<GlobalOperationLog> logList = new ArrayList<>();
+		for (String srcId : arr){
+			GlobalOperationLog globalOperationLog = new GlobalOperationLog();
+			globalOperationLog.setPid(Long.parseLong(srcId));
+			globalOperationLog.setBranchId(AuthUtil.getDeptId());
+			globalOperationLog.setCreateUser(AuthUtil.getUserId());
+			globalOperationLog.setCreateUserName(AuthUtil.getUserName());
+			globalOperationLog.setCreateTime(new Date());
+			globalOperationLog.setOperatorId(AuthUtil.getUserId());
+			globalOperationLog.setOperatorName(AuthUtil.getUserName());
+			globalOperationLog.setOperatorDate(new Date());
+			globalOperationLog.setOperatorType(operatorType);
+			globalOperationLog.setOperatorContent(operatorContent);
+			globalOperationLog.setTenantId(AuthUtil.getTenantId());
+			logList.add(globalOperationLog);
+		}
+		if (!logList.isEmpty()){
+			globalOperationLogService.saveBatch(logList);
+		}
+	}
+}

+ 32 - 0
blade-service/blade-los/src/main/java/org/springblade/los/Util/OperatorType.java

@@ -0,0 +1,32 @@
+package org.springblade.los.Util;
+
+/**
+ * @author :jixinyuan
+ * @date : 2024/1/18
+ */
+public class OperatorType {
+
+	public static final String DELETE = "删除";
+	public static final String UPDATE = "修改";
+	public static final String DATA_REVOCATION = "进出场数据撤销";
+	public static final String DATA_DELETION = "进出场数据删除";
+	public static final String API_DATA_SYNCHRONIZATION = "数据同步";
+	public static final String EMPTY_CONTAINER_RETURN = "空箱返场";
+	public static final String POD_ENCORE = "POD场站";
+	public static final String OW_BOX = "OW箱";
+	public static final String JC = "进场-正常进场";
+	public static final String HX = "进场-客户还箱";
+	public static final String DBJ = "进场-调拨进场";
+	public static final String TG = "进场-退关";
+	public static final String DBC = "出场-调拨出场";
+	public static final String CC = "出场-正常出场";
+	public static final String TZ = "出场-退租";
+
+	public static final String TRAJECTORY_REVOCATION = "箱轨迹删除";
+
+	public static final String TRAJECTORY_RECOVER = "箱轨迹恢复";
+
+
+	private OperatorType() {}
+
+}

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

@@ -177,7 +177,7 @@ public class ReportsController extends BladeController {
 	@GetMapping("/getReportData")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入reports")
-	public R getReportData(@RequestParam(value = "billId") String billId,
+	public R getReportData(@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,
@@ -194,7 +194,7 @@ public class ReportsController extends BladeController {
 	@GetMapping("/getReportDataBox")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入reports")
-	public R getReportDataBox(@RequestParam(value = "billId") String billId,
+	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,

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java

@@ -185,7 +185,7 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 												String itemIds, String type, String curCode) {
 		Map<String, Object> map = new HashMap<>();
 		if (ObjectUtils.isNull(billId)) {
-			throw new RuntimeException("缺少比要参数");
+			return R.data(map);
 		}
 		R<Dept> res = sysClient.getDept(Long.parseLong(AuthUtil.getDeptId()));
 		Dept dept;

+ 6 - 3
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/UseBoxPlanController.java

@@ -33,7 +33,6 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.los.box.entity.UseBoxPlan;
 import org.springblade.los.box.service.IUseBoxPlanService;
 import org.springblade.los.box.vo.UseBoxPlanVO;
-import org.springblade.los.business.sea.entity.Bills;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -77,10 +76,12 @@ public class UseBoxPlanController extends BladeController {
 			.eq(ObjectUtils.isNotNull(useBoxPlan.getYear()), UseBoxPlan::getYear, useBoxPlan.getYear())
 			.eq(ObjectUtils.isNotNull(useBoxPlan.getWeek()), UseBoxPlan::getWeek, useBoxPlan.getWeek())
 			.eq(ObjectUtils.isNotNull(useBoxPlan.getLevel()), UseBoxPlan::getLevel, useBoxPlan.getLevel())
-			.ge(ObjectUtils.isNotNull(useBoxPlan.getStartDate()),UseBoxPlan::getStartDate, useBoxPlan.getStartDate())
-			.le(ObjectUtils.isNotNull(useBoxPlan.getEndDate()),UseBoxPlan::getEndDate, useBoxPlan.getEndDate())
+			.ge(ObjectUtils.isNotNull(useBoxPlan.getStartDate()), UseBoxPlan::getStartDate, useBoxPlan.getStartDate())
+			.le(ObjectUtils.isNotNull(useBoxPlan.getEndDate()), UseBoxPlan::getEndDate, useBoxPlan.getEndDate())
 			.orderByDesc(UseBoxPlan::getCreateTime)
 			.orderByDesc(UseBoxPlan::getLevel);
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(useBoxPlan.getBranchId()), UseBoxPlan::getBranchId, useBoxPlan.getBranchId());
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(useBoxPlan.getBranchName()), UseBoxPlan::getBranchName, useBoxPlan.getBranchName());
 		IPage<UseBoxPlan> pages = useBoxPlanService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}
@@ -144,6 +145,7 @@ public class UseBoxPlanController extends BladeController {
 	public R submitUseBoxPlan(@Valid @RequestBody UseBoxPlan useBoxPlan) {
 		return useBoxPlanService.submitUseBoxPlan(useBoxPlan);
 	}
+
 	/**
 	 * 撤销提交用箱计划
 	 */
@@ -151,6 +153,7 @@ public class UseBoxPlanController extends BladeController {
 	public R revokeUseBoxPlan(@Valid @RequestBody UseBoxPlan useBoxPlan) {
 		return useBoxPlanService.revokeUseBoxPlan(useBoxPlan);
 	}
+
 	/**
 	 * 详情
 	 */

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/controller/BoxDynamicsRecordItemsController.java

@@ -121,7 +121,7 @@ public class BoxDynamicsRecordItemsController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(boxDynamicsRecordItemsService.removeByIds(Func.toLongList(ids)));
+		return boxDynamicsRecordItemsService.detele(ids);
 	}
 
 }

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/IBoxDynamicsRecordItemsService.java

@@ -23,6 +23,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 /**
  * 箱动态记录明细表 服务类
  *
@@ -39,4 +41,6 @@ public interface IBoxDynamicsRecordItemsService extends IService<BoxDynamicsReco
 	 * @return
 	 */
 	IPage<BoxDynamicsRecordItemsVO> selectBoxDynamicsRecordItemsPage(IPage<BoxDynamicsRecordItemsVO> page, BoxDynamicsRecordItemsVO boxDynamicsRecordItems);
+
+    R detele(String ids);
 }

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

@@ -16,14 +16,23 @@
  */
 package org.springblade.los.box.dynamics.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.los.Util.GlobalOperationLogUtils;
+import org.springblade.los.Util.OperatorType;
 import org.springblade.los.box.dynamics.entity.BoxDynamicsRecordItems;
-import org.springblade.los.box.dynamics.vo.BoxDynamicsRecordItemsVO;
 import org.springblade.los.box.dynamics.mapper.BoxDynamicsRecordItemsMapper;
 import org.springblade.los.box.dynamics.service.IBoxDynamicsRecordItemsService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.los.box.dynamics.vo.BoxDynamicsRecordItemsVO;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 箱动态记录明细表 服务实现类
@@ -32,10 +41,69 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
  * @since 2025-08-13
  */
 @Service
+@AllArgsConstructor
 public class BoxDynamicsRecordItemsServiceImpl extends ServiceImpl<BoxDynamicsRecordItemsMapper, BoxDynamicsRecordItems> implements IBoxDynamicsRecordItemsService {
 
+	private final GlobalOperationLogUtils logUtils;
+
 	@Override
 	public IPage<BoxDynamicsRecordItemsVO> selectBoxDynamicsRecordItemsPage(IPage<BoxDynamicsRecordItemsVO> page, BoxDynamicsRecordItemsVO boxDynamicsRecordItems) {
 		return page.setRecords(baseMapper.selectBoxDynamicsRecordItemsPage(page, boxDynamicsRecordItems));
 	}
+
+	@Override
+	public R detele(String ids) {
+		List<BoxDynamicsRecordItems> itemsList = baseMapper.selectList(new LambdaQueryWrapper<BoxDynamicsRecordItems>()
+			.eq(BoxDynamicsRecordItems::getIsDeleted, 0)
+			.eq(BoxDynamicsRecordItems::getTenantId, AuthUtil.getTenantId())
+			.in(BoxDynamicsRecordItems::getId, Func.toLongList(ids)));
+		if (!itemsList.isEmpty()) {
+			String operatorContent = "";
+			//新箱进场
+			List<BoxDynamicsRecordItems> itemsListJC = itemsList.stream().filter(e -> ("CT".equals(e.getObjective()) ||
+				"XX".equals(e.getObjective()) || "ZI".equals(e.getObjective())
+				|| "QX".equals(e.getObjective()) || "QZ".equals(e.getObjective()) || "T".equals(e.getObjective()))).collect(Collectors.toList());
+			if (!itemsListJC.isEmpty()) {
+				operatorContent = OperatorType.JC;
+			}
+			//客户还箱
+			List<BoxDynamicsRecordItems> itemsListFCs = itemsList.stream().filter(e -> "C".equals(e.getObjective())).collect(Collectors.toList());
+			if (!itemsListFCs.isEmpty()) {
+				operatorContent = OperatorType.HX;
+			}
+			//调拨进场
+			List<BoxDynamicsRecordItems> itemsListZJ = itemsList.stream().filter(e -> "ZJ".equals(e.getObjective())
+				|| "K".equals(e.getObjective()) || "X".equals(e.getObjective())).collect(Collectors.toList());
+			if (!itemsListZJ.isEmpty()) {
+				operatorContent = OperatorType.DBJ;
+			}
+			//退关箱
+			List<BoxDynamicsRecordItems> itemsListWHFK = itemsList.stream().filter(e -> "TJ".equals(e.getObjective())).collect(Collectors.toList());
+			if (!itemsListWHFK.isEmpty()) {
+				operatorContent = OperatorType.TG;
+			}
+			//调拨出场/空箱集港
+			List<BoxDynamicsRecordItems> itemsListZD = itemsList.stream().filter(e -> "ZD".equals(e.getObjective())
+				|| "KC".equals(e.getObjective())).collect(Collectors.toList());
+			if (!itemsListZD.isEmpty()) {
+				operatorContent = OperatorType.DBC;
+			}
+			//正常出场
+			List<BoxDynamicsRecordItems> itemsListCC = itemsList.stream().filter(e -> "BX".equals(e.getObjective())
+				|| "WD".equals(e.getObjective()) || "Q".equals(e.getObjective()) || "QZ".equals(e.getObjective())
+				|| "XO".equals(e.getObjective())).collect(Collectors.toList());
+			if (!itemsListCC.isEmpty()) {
+				operatorContent = OperatorType.CC;
+			}
+			//退租出场
+			List<BoxDynamicsRecordItems> itemsListTZX = itemsList.stream().filter(e -> "OF".equals(e.getObjective())
+				|| "ZT".equals(e.getObjective()) || "CN".equals(e.getObjective())).collect(Collectors.toList());
+			if (!itemsListTZX.isEmpty()) {
+				operatorContent = OperatorType.TZ;
+			}
+			logUtils.saveOperationLogBatch(OperatorType.DATA_DELETION, operatorContent, ids);
+		}
+		this.removeByIds(Func.toLongList(ids));
+		return R.success("操作成功");
+	}
 }

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


+ 11 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ArchivesTrajectoryServiceImpl.java

@@ -19,9 +19,12 @@ package org.springblade.los.box.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.los.Util.GlobalOperationLogUtils;
+import org.springblade.los.Util.OperatorType;
 import org.springblade.los.box.entity.ArchivesTrajectory;
 import org.springblade.los.box.mapper.ArchivesTrajectoryMapper;
 import org.springblade.los.box.service.IArchivesTrajectoryService;
@@ -39,8 +42,11 @@ import java.util.Map;
  * @since 2022-11-16
  */
 @Service
+@AllArgsConstructor
 public class ArchivesTrajectoryServiceImpl extends ServiceImpl<ArchivesTrajectoryMapper, ArchivesTrajectory> implements IArchivesTrajectoryService {
 
+	private final GlobalOperationLogUtils logUtils;
+
 	@Override
 	public IPage<ArchivesTrajectoryVO> selectArchivesTrajectoryPage(IPage<ArchivesTrajectoryVO> page, ArchivesTrajectoryVO archivesTrajectory) {
 		return page.setRecords(baseMapper.selectArchivesTrajectoryPage(page, archivesTrajectory));
@@ -71,6 +77,11 @@ public class ArchivesTrajectoryServiceImpl extends ServiceImpl<ArchivesTrajector
 		trajectory.setUpdateUserName(AuthUtil.getUserName());
 		trajectory.setUpdateTime(new Date());
 		baseMapper.updateById(trajectory);
+		if ("0".equals(type)) {
+			logUtils.saveOperationLog(OperatorType.TRAJECTORY_RECOVER, "箱轨迹状态", Long.parseLong(id));
+		} else {
+			logUtils.saveOperationLog(OperatorType.TRAJECTORY_REVOCATION, "箱轨迹状态", Long.parseLong(id));
+		}
 		return R.success("操作成功");
 	}
 

+ 7 - 414
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/PutBoxServiceImpl.java

@@ -30,6 +30,8 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.los.Util.CurrencyUtils;
+import org.springblade.los.Util.GlobalOperationLogUtils;
+import org.springblade.los.Util.OperatorType;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.basic.cntr.entity.BCntrTypes;
@@ -139,7 +141,7 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 
 	private final ICostProfitCalculationService costProfitCalculationService;
 
-	private final PutBoxMapper putBoxMapper;
+	private final GlobalOperationLogUtils logUtils;
 
 	@Override
 	public IPage<PutBoxVO> selectPutBoxPage(IPage<PutBoxVO> page, PutBoxVO putBox) {
@@ -3198,419 +3200,6 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 					throw new RuntimeException("箱号:" + item.getCntrNo() + "已返场");
 				}
 			}
-			/*if ("1".equals(podStationR.getType())) {
-				List<String> boxNum = containersHYJKList.stream().map(Containers::getCntrNo).filter(Objects::nonNull)
-					.collect(Collectors.toList());
-				if (boxNum.isEmpty()) {
-					throw new RuntimeException("所选配箱信息箱号不能为空");
-				}
-				//箱档案数据
-				List<Archives> archivesList = archivesService.list(new LambdaQueryWrapper<Archives>()
-					.eq(Archives::getTenantId, AuthUtil.getTenantId())
-					.eq(Archives::getIsDeleted, 0)
-					.in(Archives::getCode, boxNum)
-					.eq(Archives::getStatus, "使用中"));
-				if (archivesList.isEmpty()) {
-					throw new RuntimeException("未查到对应箱档案信息");
-				}
-				if (boxNum.size() > archivesList.size()) {
-					List<String> boxCode = archivesList.stream().map(Archives::getCode).collect(Collectors.toList());
-					throw new RuntimeException("箱号:" + boxNum.stream().filter(e -> !boxCode.contains(e))
-						.collect(Collectors.joining(",")) + "未查到对应箱档案信息");
-				}
-				List<String> containerNumberList = archivesList.stream().map(Archives::getContainerNumber)
-					.distinct().collect(Collectors.toList());
-				List<String> containerNumberOwList = archivesList.stream().map(Archives::getContainerNumberOw)
-					.distinct().collect(Collectors.toList());
-				if (!containerNumberOwList.isEmpty()) {
-					containerNumberList.addAll(containerNumberOwList);
-				}
-				List<PutBox> putBoxList = baseMapper.selectList(new LambdaQueryWrapper<PutBox>()
-					.eq(PutBox::getTenantId, AuthUtil.getTenantId())
-					.eq(PutBox::getIsDeleted, 0)
-					.and(i -> i.in(PutBox::getContainerNumber, containerNumberList).or()
-						.in(PutBox::getSrcContainerNumber, containerNumberList)));
-				if (putBoxList.isEmpty()) {
-					throw new RuntimeException("未查到放箱号单据");
-				}
-				List<Long> putBoxIdList = putBoxList.stream().map(PutBox::getId).collect(Collectors.toList());
-				List<PutBoxItems> putBoxItemsList = putBoxItemsService.list(new LambdaQueryWrapper<PutBoxItems>()
-					.eq(PutBoxItems::getIsDeleted, 0)
-					.eq(PutBoxItems::getTenantId, AuthUtil.getTenantId())
-					.in(PutBoxItems::getPid, putBoxIdList));
-				List<Long> srcIdList = putBoxList.stream().map(PutBox::getSrcId).collect(Collectors.toList());
-				List<TradingBox> tradingBoxList = new ArrayList<>();
-				if (!srcIdList.isEmpty()) {
-					tradingBoxList = tradingBoxMapper.selectList(new LambdaQueryWrapper<TradingBox>()
-						.eq(TradingBox::getTenantId, AuthUtil.getTenantId())
-						.eq(TradingBox::getIsDeleted, 0)
-						.in(TradingBox::getId, srcIdList));
-				}
-				List<TradingBoxItem> tradingBoxItemList = new ArrayList<>();
-				if (!tradingBoxList.isEmpty()) {
-					List<Long> tradingBoxIdList = tradingBoxList.stream().map(TradingBox::getId).collect(Collectors.toList());
-					tradingBoxItemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
-						.eq(TradingBoxItem::getIsDeleted, 0)
-						.eq(TradingBoxItem::getTenantId, AuthUtil.getTenantId())
-						.in(TradingBoxItem::getPid, tradingBoxIdList));
-				}
-				BusinessType businessType = bBusinessTypeService.getOne(new LambdaQueryWrapper<BusinessType>()
-					.select(BusinessType::getId)
-					.eq(BusinessType::getTenantId, AuthUtil.getTenantId())
-					.eq(BusinessType::getIsDeleted, 0)
-					.eq(BusinessType::getStatus, 0)
-					.eq(BusinessType::getCode, "FXH"));
-				if (businessType == null) {
-					throw new RuntimeException("未找到可用业务类型");
-				}
-				List<Bills> billsHYJKListFD = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
-					.eq(Bills::getTenantId, AuthUtil.getTenantId())
-					.eq(Bills::getIsDeleted, 0)
-					.eq(Bills::getBusinessType, "SI")
-					.in(Bills::getId, billsIds));
-				if (billsHYJKListFD.isEmpty()) {
-					throw new RuntimeException("未查到海运进口单据");
-				}
-				List<Long> idHYJKList = new ArrayList<>();
-				List<Bills> billsHYJKListZD = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
-					.eq(Bills::getTenantId, AuthUtil.getTenantId())
-					.eq(Bills::getIsDeleted, 0)
-					.in(Bills::getMasterId, billsHYJKListFD.stream().map(Bills::getMasterId).collect(Collectors.toList())));
-				if (!billsHYJKListZD.isEmpty()) {
-					idHYJKList.addAll(billsHYJKListFD.stream().map(Bills::getId).collect(Collectors.toList()));
-				}
-				List<Containers> containersHYJKListZD = containersService.list(new LambdaQueryWrapper<Containers>()
-					.eq(Containers::getTenantId, AuthUtil.getTenantId())
-					.eq(Containers::getIsDeleted, 0)
-					.in(Containers::getPid, idHYJKList)
-					.in(Containers::getCntrNo, boxNum));
-				List<Containers> containersListNew = new ArrayList<>();
-				for (Bills billsHYJK : billsHYJKListFD) {
-					//自有箱-箱档案数据更新
-					List<Archives> archivesArrayList = new ArrayList<>();
-					//新放箱号单据
-					List<PutBox> putBoxNewList = new ArrayList<>();
-					//新放箱号单据明细数据
-					List<PutBoxItems> putBoxItemsNewList = new ArrayList<>();
-					//原放箱号单据明细数据
-					List<PutBoxItems> putBoxItemsOldList = new ArrayList<>();
-					//原OW单据明细数据
-					List<TradingBoxItem> tradingBoxItemOldList = new ArrayList<>();
-					//OW(拿)-箱档案数据删除
-					List<Long> archivesDateleList = new ArrayList<>();
-					List<Containers> containersList = containersHYJKList.stream().filter(e -> e.getPid().equals(billsHYJK.getId()))
-						.collect(Collectors.toList());
-					for (Containers item : containersList) {
-						if (ObjectUtils.isNull(item.getHblno())) {
-							throw new RuntimeException("分单号不能为空");
-						}
-						//箱档案信息处理
-						Archives archives = archivesList.stream().filter(e -> e.getCode().equals(item.getCntrNo())).findFirst().orElse(null);
-						if (archives == null) {
-							throw new RuntimeException("未查到箱号:" + item.getCntrNo() + "箱档案数据");
-						}
-						String containerNumberType = "";
-						//原放箱号数据处理
-						PutBox putBoxOld = putBoxList.stream().filter(e -> e.getContainerNumber().equals(archives.getContainerNumberOw())
-							&& e.getPolId().equals(archives.getAddressId()) && e.getPolStationId().equals(archives.getStationId())
-							&& e.getBoxType().equals(archives.getTypeName())).findFirst().orElse(null);
-						if (putBoxOld != null) {
-							containerNumberType = putBoxOld.getBoxClass();
-							PutBoxItems putBoxItem;
-							if (!putBoxItemsList.isEmpty()) {
-								putBoxItem = putBoxItemsList.stream().filter(e -> e.getBoxCode().equals(item.getCntrNo())
-									&& e.getPid().equals(putBoxOld.getId())).findFirst().orElse(null);
-								if (putBoxItem != null) {
-									putBoxItem.setPodEmptyContainerReturnDate(podStationR.getReturnEmptyTime());
-									putBoxItem.setPodStationId(podStationR.getPodStationId());
-									putBoxItem.setPodStationCode(podStationR.getPodStationCode());
-									putBoxItem.setPodStationCname(podStationR.getPodStationCname());
-									putBoxItem.setPodStationEname(podStationR.getPodStationEname());
-									putBoxItem.setStatus("已还箱");
-									putBoxItem.setBoxDynamics("已返场");
-									putBoxItem.setUpdateUser(AuthUtil.getUserId());
-									putBoxItem.setUpdateUserName(AuthUtil.getUserName());
-									putBoxItem.setUpdateTime(new Date());
-									putBoxItem.setPodFreeBoxUseDays(billsHYJK.getPodFreeBoxUseDays());
-									putBoxItem.setEta(billsHYJK.getEta());
-									putBoxItem.setActualEta(billsHYJK.getActualEta());
-									putBoxItemsOldList.add(putBoxItem);
-								}
-							}
-							if (!tradingBoxList.isEmpty()) {
-								TradingBox tradingBox = tradingBoxList.stream().filter(e -> e.getId().equals(putBoxOld.getSrcId()))
-									.findFirst().orElse(null);
-								if (tradingBox != null) {
-									TradingBoxItem tradingBoxItem;
-									if (!tradingBoxItemList.isEmpty()) {
-										tradingBoxItem = tradingBoxItemList.stream().filter(e -> e.getCode().equals(item.getCntrNo()))
-											.findFirst().orElse(null);
-										if (tradingBoxItem != null) {
-											tradingBoxItem.setPid(tradingBox.getId());
-											tradingBoxItem.setPodEmptyContainerReturnDate(podStationR.getReturnEmptyTime());
-											tradingBoxItem.setPodStationId(podStationR.getPodStationId());
-											tradingBoxItem.setPodStationCode(podStationR.getPodStationCode());
-											tradingBoxItem.setPodStationCname(podStationR.getPodStationCname());
-											tradingBoxItem.setPodStationEname(podStationR.getPodStationEname());
-											tradingBoxItem.setBoxDynamics("已返场");
-											tradingBoxItem.setStatus("已还箱");
-											tradingBoxItem.setStationId(podStationR.getPodStationId());
-											tradingBoxItem.setStationCode(podStationR.getPodStationCode());
-											tradingBoxItem.setStationCname(podStationR.getPodStationCname());
-											tradingBoxItem.setStationEname(podStationR.getPodStationEname());
-											tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
-											tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
-											tradingBoxItem.setUpdateTime(new Date());
-											tradingBoxItem.setPortId(billsHYJK.getPodId());
-											tradingBoxItem.setPortCode(billsHYJK.getPodCode());
-											tradingBoxItem.setPortCname(billsHYJK.getPodCnName());
-											tradingBoxItem.setPortEname(billsHYJK.getPodEnName());
-											tradingBoxItem.setPodFreeBoxUseDays(billsHYJK.getPodFreeBoxUseDays());
-											tradingBoxItem.setEta(billsHYJK.getEta());
-											tradingBoxItem.setActualEta(billsHYJK.getActualEta());
-											tradingBoxItemOldList.add(tradingBoxItem);
-										}
-									}
-								}
-							}
-							if ("OW(拿)".contains(putBoxOld.getBoxClass())) {
-								archivesDateleList.add(archives.getId());
-							}
-						}
-						archives.setUpdateTime(new Date());
-						archives.setUpdateUser(AuthUtil.getUserId());
-						archives.setUpdateUserName(AuthUtil.getUserName());
-						archives.setStatus("待使用");
-						archives.setNewDate(podStationR.getReturnEmptyTime());
-						archives.setBoxDynamics("空箱提箱进场");
-						archives.setWhetherTransfer("0");
-						archives.setAddressId(billsHYJK.getPodId());
-						archives.setAddressCode(billsHYJK.getPodCode());
-						archives.setAddressCname(billsHYJK.getPodCnName());
-						archives.setAddressEname(billsHYJK.getPodEnName());
-						archives.setStationId(podStationR.getPodStationId());
-						archives.setStationCode(podStationR.getPodStationCode());
-						archives.setStationCname(podStationR.getPodStationCname());
-						archives.setStationEname(podStationR.getPodStationEname());
-						archives.setContainerNumberOw("");
-						archives.setContainerNumberTypeOw("");
-						archivesArrayList.add(archives);
-						if (!containerNumberType.equals("OW(拿)")) {
-							//新放箱号数据处理
-							PutBox putBox = putBoxList.stream().filter(e -> e.getContainerNumber().equals(archives.getContainerNumber())
-								&& e.getPolId().equals(archives.getAddressId()) && e.getPolStationId().equals(archives.getStationId())
-								&& e.getBoxType().equals(archives.getTypeName())).findFirst().orElse(null);
-							if (putBox != null) {
-								//放箱号明细数据处理
-								PutBoxItems putBoxItem;
-								if (!putBoxItemsList.isEmpty()) {
-									putBoxItem = putBoxItemsList.stream().filter(e -> e.getBoxCode().equals(archives.getCode())
-										&& putBox.getId().equals(e.getPid())).findFirst().orElse(null);
-									if (putBoxItem != null) {
-										putBoxItem.setBoxDynamics("空箱提箱进场");
-										putBoxItem.setStatus("待使用");
-										putBoxItem.setPolCyId(podStationR.getPodStationId());
-										putBoxItem.setPolCyCode(podStationR.getPodStationCode());
-										putBoxItem.setPolCyCname(podStationR.getPodStationCname());
-										putBoxItem.setPolCyEname(podStationR.getPodStationEname());
-										putBoxItem.setPolPickUpDate(podStationR.getReturnEmptyTime());
-										putBoxItem.setPolPreAppearanceDate(podStationR.getReturnEmptyTime());
-										putBoxItem.setUpdateUser(AuthUtil.getUserId());
-										putBoxItem.setUpdateUserName(AuthUtil.getUserName());
-										putBoxItem.setUpdateTime(new Date());
-
-										putBoxItem.setPodEmptyContainerReturnDate(null);
-										putBoxItem.setPodStationId(null);
-										putBoxItem.setPodStationCode(null);
-										putBoxItem.setPodStationCname(null);
-										putBoxItem.setPodStationEname(null);
-										putBoxItem.setEta(null);
-										putBoxItem.setCorpId(0L);
-										putBoxItem.setCorpName("");
-										putBoxItem.setMblno("");
-										putBoxItem.setHblno("");
-										putBoxItem.setShipNameId(0L);
-										putBoxItem.setShipCname("");
-										putBoxItem.setShipEname("");
-										putBoxItem.setShipCode("");
-										putBoxItem.setVoyage("");
-										putBoxItem.setPodCyAddress("");
-										putBoxItem.setPodCyContact("");
-										putBoxItem.setPodCyEmail("");
-										putBoxItem.setPodCyTel("");
-										putBoxItem.setEtd(null);
-										putBoxItem.setPolFreeBoxUseDays(0);
-										putBoxItem.setPolStationEmptyContainerExitDate(null);
-										putBoxItem.setPolReturnDate(null);
-										putBoxItem.setPolOverdueBoxUseDays(0);
-										putBoxItem.setPodFreeBoxUseDays(0);
-										putBoxItem.setPodBoxUseDays(0);
-										putBoxItem.setAgentName("");
-										putBoxItem.setActualEtd(null);
-										putBoxItem.setActualEta(null);
-									} else {
-										putBoxItem = new PutBoxItems();
-										putBoxItem.setBoxClass(putBox.getBoxClass());
-										putBoxItem.setBoxBelongsTo("SOC");
-										putBoxItem.setBoxCondition("新");
-										putBoxItem.setBoxStatus("好");
-										putBoxItem.setStatus("待使用");
-										putBoxItem.setPid(putBox.getId());
-										putBoxItem.setContainerNumber(archives.getContainerNumber());
-										putBoxItem.setBoxCode(archives.getCode());
-										putBoxItem.setBoxType(archives.getTypeName());
-										putBoxItem.setBoxClass(putBox.getBoxClass());
-										putBoxItem.setBoxDynamics("空箱提箱进场");
-										putBoxItem.setPolCyId(podStationR.getPodStationId());
-										putBoxItem.setPolCyCode(podStationR.getPodStationCode());
-										putBoxItem.setPolCyCname(podStationR.getPodStationCname());
-										putBoxItem.setPolCyEname(podStationR.getPodStationEname());
-										putBoxItem.setPolPickUpDate(podStationR.getReturnEmptyTime());
-										putBoxItem.setPolPreAppearanceDate(podStationR.getReturnEmptyTime());
-										putBoxItem.setCreateUser(AuthUtil.getUserId());
-										putBoxItem.setCreateUserName(AuthUtil.getUserName());
-										putBoxItem.setCreateTime(new Date());
-									}
-								} else {
-									putBoxItem = new PutBoxItems();
-									putBoxItem.setBoxClass(putBox.getBoxClass());
-									putBoxItem.setBoxBelongsTo("SOC");
-									putBoxItem.setBoxCondition("新");
-									putBoxItem.setBoxStatus("好");
-									putBoxItem.setStatus("待使用");
-									putBoxItem.setPid(putBox.getId());
-									putBoxItem.setContainerNumber(archives.getContainerNumber());
-									putBoxItem.setBoxCode(archives.getCode());
-									putBoxItem.setBoxType(archives.getTypeName());
-									putBoxItem.setBoxClass(putBox.getBoxClass());
-									putBoxItem.setBoxDynamics("空箱提箱进场");
-									putBoxItem.setPolCyId(podStationR.getPodStationId());
-									putBoxItem.setPolCyCode(podStationR.getPodStationCode());
-									putBoxItem.setPolCyCname(podStationR.getPodStationCname());
-									putBoxItem.setPolCyEname(podStationR.getPodStationEname());
-									putBoxItem.setPolPickUpDate(podStationR.getReturnEmptyTime());
-									putBoxItem.setPolPreAppearanceDate(podStationR.getReturnEmptyTime());
-									putBoxItem.setCreateUser(AuthUtil.getUserId());
-									putBoxItem.setCreateUserName(AuthUtil.getUserName());
-									putBoxItem.setCreateTime(new Date());
-								}
-								putBoxItemsNewList.add(putBoxItem);
-								if (putBoxNewList.isEmpty()) {
-									putBoxNewList.add(putBox);
-								} else {
-									PutBox putBox2 = putBoxNewList.stream().filter(e -> e.getContainerNumber().equals(putBox.getContainerNumber())
-										&& e.getPolId().equals(putBox.getPolId()) && e.getPolStationId().equals(putBox.getPolStationId())
-										&& e.getBoxType().equals(putBox.getBoxType())).findFirst().orElse(null);
-									if (putBox2 == null) {
-										putBoxNewList.add(putBox2);
-									}
-								}
-							} else {
-								throw new RuntimeException("放箱号:" + archives.getContainerNumberOw() + "未查到");
-							}
-						}
-						item.setPodEmptyContainerReturnDate(podStationR.getReturnEmptyTime());
-						item.setPodStationId(podStationR.getPodStationId());
-						item.setPodStationCname(podStationR.getPodStationCname());
-						item.setPodStationEname(podStationR.getPodStationEname());
-						item.setPodStationCode(podStationR.getPodStationCode());
-						item.setWhetherFee("1");
-						item.setUpdateTime(new Date());
-						item.setUpdateUser(AuthUtil.getUserId());
-						item.setUpdateUserName(AuthUtil.getUserName());
-						containersListNew.add(item);
-					}
-					if (!archivesArrayList.isEmpty()) {
-						archivesService.updateBatchById(archivesArrayList);
-					}
-					if (!putBoxNewList.isEmpty()) {
-						for (PutBox item : putBoxNewList) {
-							if (!putBoxItemsNewList.isEmpty()) {
-								long count = putBoxItemsNewList.stream().filter(e -> e.getPid().equals(item.getId())).count();
-								item.setTotalNum((ObjectUtils.isNull(item.getTotalNum()) ? 0 : item.getTotalNum())
-									+ Integer.parseInt(count + ""));
-								item.setRemainingNum((ObjectUtils.isNull(item.getRemainingNum()) ? 0 : item.getRemainingNum()) + Integer.parseInt(count + ""));
-								item.setStorageNum((ObjectUtils.isNull(item.getStorageNum()) ? 0 : item.getStorageNum()) + Integer.parseInt(count + ""));
-								item.setVersion(ObjectUtils.isNull(item.getVersion()) ? 1 : item.getVersion() + 1);
-								putBoxMapper.updateById(item);
-							}
-						}
-					}
-					if (!putBoxItemsNewList.isEmpty()) {
-						putBoxItemsService.saveOrUpdateBatch(putBoxItemsNewList);
-						for (PutBoxItems item : putBoxItemsNewList) {
-							PutBox putBox = putBoxNewList.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
-							if (putBox != null) {
-								//记录箱轨迹信息
-								ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-								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());
-								archivesTrajectory.setContainerNumber(item.getContainerNumber());
-								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.setBoxDynamics("客户还箱");
-								archivesTrajectory.setStatus(item.getBoxDynamics());
-								archivesTrajectory.setBillType(putBox.getBoxClass());
-								archivesTrajectory.setCode(item.getBoxCode());
-								archivesTrajectory.setNewDate(new Date());
-								archivesTrajectory.setCreateTime(new Date());
-								archivesTrajectory.setCreateUser(AuthUtil.getUserId());
-								archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
-								archivesTrajectory.setTenantId(AuthUtil.getTenantId());
-								archivesTrajectory.setSrcId(putBox.getId());
-								archivesTrajectory.setEtd(item.getEtd());
-								archivesTrajectory.setPolCyId(item.getPolCyId());
-								archivesTrajectory.setPolCyCode(item.getPolCyCode());
-								archivesTrajectory.setPolCyCname(item.getPolCyCname());
-								archivesTrajectory.setPolCyEname(item.getPolCyEname());
-								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.setPodStationId(item.getPodStationId());
-								archivesTrajectory.setPodStationCode(item.getPodStationCode());
-								archivesTrajectory.setPodStationCname(item.getPodStationCname());
-								archivesTrajectory.setPodStationEname(item.getPodStationEname());
-								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());
-								archivesTrajectoryMapper.insert(archivesTrajectory);
-							}
-						}
-					}
-					if (!putBoxItemsOldList.isEmpty()) {
-						putBoxItemsService.updateBatchById(putBoxItemsOldList);
-					}
-					if (!tradingBoxItemOldList.isEmpty()) {
-						tradingBoxItemService.updateBatchById(tradingBoxItemOldList);
-					}
-					if (!containersListNew.isEmpty()) {
-						containersService.updateBatchById(containersListNew);
-					}
-					if (!archivesDateleList.isEmpty()) {
-						archivesService.removeByIds(archivesDateleList);
-					}
-					//计算超期箱使费
-					this.countOverdueFeeV1(billsHYJK, tradingBoxList, tradingBoxItemOldList, putBoxItemsOldList, putBoxList);
-				}
-			} else {*/
 			for (Containers item : containersHYJKList) {
 				if (ObjectUtils.isNull(item.getHblno())) {
 					throw new RuntimeException("分单号不能为空");
@@ -3628,6 +3217,7 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 				item.setUpdateTime(new Date());
 				item.setUpdateUser(AuthUtil.getUserId());
 				item.setUpdateUserName(AuthUtil.getUserName());
+				logUtils.saveOperationLog(OperatorType.EMPTY_CONTAINER_RETURN, "修改Pod场站", item.getId());
 			}
 			containersService.updateBatchById(containersHYJKList);
 			List<Bills> billsHYJKList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -3663,6 +3253,7 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 						item.setUpdateTime(new Date());
 						item.setUpdateUser(AuthUtil.getUserId());
 						item.setUpdateUserName(AuthUtil.getUserName());
+						logUtils.saveOperationLog(OperatorType.EMPTY_CONTAINER_RETURN, "修改Pod场站", item.getId());
 					}
 					containersService.updateBatchById(containersList);
 				}
@@ -3685,6 +3276,7 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 				item.setUpdateTime(new Date());
 				item.setUpdateUser(AuthUtil.getUserId());
 				item.setUpdateUserName(AuthUtil.getUserName());
+				logUtils.saveOperationLog(OperatorType.POD_ENCORE, "修改POD场站", item.getId());
 			}
 			containersService.updateBatchById(containersHYJKList);
 			List<Bills> billsHYJKList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -3719,6 +3311,7 @@ public class PutBoxServiceImpl extends ServiceImpl<PutBoxMapper, PutBox> impleme
 						item.setUpdateTime(new Date());
 						item.setUpdateUser(AuthUtil.getUserId());
 						item.setUpdateUserName(AuthUtil.getUserName());
+						logUtils.saveOperationLog(OperatorType.POD_ENCORE, "修改POD场站", item.getId());
 					}
 					containersService.updateBatchById(containersList);
 				}

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

@@ -28,6 +28,8 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.los.Util.BoxNumUtils;
 import org.springblade.los.Util.CurrencyUtils;
+import org.springblade.los.Util.GlobalOperationLogUtils;
+import org.springblade.los.Util.OperatorType;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.basic.cur.entity.BCurExrate;
@@ -126,6 +128,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 
 	private final IBPortsService bPortsService;
 
+	private final GlobalOperationLogUtils logUtils;
+
 	@Override
 	public TradingBox getDetail(TradingBox tradingBox) {
 		if (tradingBox.getId() == null) {
@@ -2733,6 +2737,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					containers.setOffhireReference(tradingBox.getOffhireReference());
 					containers.setContainerNumber(tradingBox.getContainerNumber());
 					containersListNew.add(containers);
+					logUtils.saveOperationLog(OperatorType.OW_BOX, "OW修改pod场站", containers.getId());
 				}
 				if (!containersListNew.isEmpty()) {
 					containersService.updateBatchById(containersListNew);
@@ -3799,6 +3804,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		}
 		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)

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/ContainersController.java

@@ -33,6 +33,8 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.los.Util.GlobalOperationLogUtils;
+import org.springblade.los.Util.OperatorType;
 import org.springblade.los.business.sea.entity.Containers;
 import org.springblade.los.business.sea.service.IContainersService;
 import org.springblade.los.business.sea.vo.ContainersVO;
@@ -58,6 +60,7 @@ import java.util.List;
 public class ContainersController extends BladeController {
 
 	private final IContainersService containersService;
+	private final GlobalOperationLogUtils logUtils;
 
 	/**
 	 * 详情
@@ -222,6 +225,7 @@ public class ContainersController extends BladeController {
 	@ApiOperation(value = "删除", notes = "传入ids")
 	@RepeatSubmit
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		logUtils.saveOperationLogBatch(OperatorType.DELETE, "配箱列表全部删除", ids);
 		return R.status(containersService.removeByIds(Func.toLongList(ids)));
 	}
 

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

@@ -44,10 +44,6 @@ import org.springblade.los.basic.ports.entity.BPorts;
 import org.springblade.los.basic.ports.service.IBPortsService;
 import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
-import org.springblade.los.box.entity.RouteCost;
-import org.springblade.los.box.entity.RouteCostItem;
-import org.springblade.los.box.service.IRouteCostItemService;
-import org.springblade.los.box.service.IRouteCostService;
 import org.springblade.los.business.amends.entity.Amends;
 import org.springblade.los.business.amends.mapper.AmendsMapper;
 import org.springblade.los.business.files.entity.FilesCenter;
@@ -65,7 +61,6 @@ import org.springblade.los.check.entity.LosAuditPathsLevels;
 import org.springblade.los.check.service.IAuditPathsActsService;
 import org.springblade.los.check.service.IAuditPathsLevelsService;
 import org.springblade.los.check.service.IAuditProecessService;
-import org.springblade.los.excel.DeliveryPaperExcel;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
@@ -90,7 +85,10 @@ import java.time.LocalDateTime;
 import java.time.Year;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -155,9 +153,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 
 	private final IReceiptService receiptService;
 
-	private final IRouteCostService routeCostService;
-
-	private final IRouteCostItemService routeCostItemService;
+	private final GlobalOperationLogUtils logUtils;
 
 	private final IBillUtils billUtils;
 
@@ -1692,6 +1688,17 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					throw new RuntimeException("该分单已添加到主单,请先撤销分单");
 				}
 			}
+			String type = "";
+			if ("SE".equals(item.getBusinessType())) {
+				type = "海运出口";
+			} else if ("SI".equals(item.getBusinessType())) {
+				type = "海运进口";
+			} else if ("YDC".equals(item.getBusinessType())) {
+				type = "预定舱";
+			} else if ("KHTS".equals(item.getBusinessType())) {
+				type = "客户订舱";
+			}
+			logUtils.saveOperationLog(OperatorType.DELETE, type, item.getId());
 		}
 		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
@@ -1767,27 +1774,28 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
 			.eq(Bills::getIsDeleted, 0)
 			.in(Bills::getId, Func.toLongList(ids)));
-		if (!billsList.isEmpty()){
+		if (!billsList.isEmpty()) {
 			List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
-				.eq(PreContainers::getIsDeleted,0)
-				.eq(PreContainers::getContainerNumberStatus,"已选择")
-				.eq(PreContainers::getTenantId,AuthUtil.getTenantId())
-				.in(PreContainers::getPid,Func.toLongList(ids)));
-			if (!preContainersList.isEmpty()){
+				.eq(PreContainers::getIsDeleted, 0)
+				.eq(PreContainers::getContainerNumberStatus, "已选择")
+				.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+				.in(PreContainers::getPid, Func.toLongList(ids)));
+			if (!preContainersList.isEmpty()) {
 				throw new RuntimeException("已占用放箱号,请先撤销后再退舱");
 			}
 			List<Long> idList = billsList.stream().map(Bills::getTemporaryId).filter(Objects::nonNull).collect(Collectors.toList());
-			if (!idList.isEmpty()){
+			if (!idList.isEmpty()) {
 				List<Bills> bills = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
 					.eq(Bills::getTenantId, AuthUtil.getTenantId())
 					.eq(Bills::getIsDeleted, 0)
 					.in(Bills::getId, idList));
-				if (!bills.isEmpty()){
-					for (Bills item : bills){
+				if (!bills.isEmpty()) {
+					for (Bills item : bills) {
 						item.setUpdateUserName(AuthUtil.getUserName());
 						item.setUpdateUser(AuthUtil.getUserId());
 						item.setUpdateTime(new Date());
 						item.setBillStatus(1);
+						item.setIssueStatus("10");
 						int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
 						item.setVersion(String.valueOf(version + 1));
 					}
@@ -2480,6 +2488,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		copyBills.setReceiveStatus(null);
 		copyBills.setChangeOrdersStatus(null);
 		copyBills.setReturningSecurityMoneyStatus(null);
+		copyBills.setCyTrailerTime(null);
+		copyBills.setCyReturnTime(null);
+		copyBills.setShippingCompanyDeadline(null);
 		copyBills.setAmountDr(new BigDecimal("0.00"));
 		copyBills.setAmountCr(new BigDecimal("0.00"));
 		copyBills.setAmountProfit(new BigDecimal("0.00"));
@@ -4221,6 +4232,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			copyBills.setCfsQuantity(new BigDecimal("0.00"));
 			copyBills.setCfsGrossWeight(new BigDecimal("0.00"));
 			copyBills.setCfsMeasurement(new BigDecimal("0.00"));
+			copyBills.setCyTrailerTime(null);
+			copyBills.setCyReturnTime(null);
+			copyBills.setShippingCompanyDeadline(null);
 			copyBillsList.add(copyBills);
 		}
 		this.saveBatch(copyBillsList);
@@ -4246,7 +4260,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			}
 			if (ObjectUtils.isNotNull(copyFee) && "1".equals(copyFee) && !feeCenterList.isEmpty()) {
 				if (AuthUtil.getUserRole().contains("总部") || AuthUtil.getUserRole().contains("admin")
-					|| AuthUtil.getUserRole().contains("应付修改")){
+					|| AuthUtil.getUserRole().contains("应付修改")) {
 					List<FeeCenter> feeCenters = feeCenterList.stream().filter(e -> e.getPid().equals(item.getTemporaryId())
 						&& "C".equals(e.getDc())).collect(Collectors.toList());
 					for (FeeCenter feeCenter : feeCenters) {
@@ -4324,9 +4338,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					}
 				}
 				if (AuthUtil.getUserRole().contains("总部") || AuthUtil.getUserRole().contains("admin")
-					|| AuthUtil.getUserRole().contains("应收修改")){
+					|| AuthUtil.getUserRole().contains("应收修改")) {
 					List<FeeCenter> feeCenters = feeCenterList.stream().filter(e -> e.getPid().equals(item.getTemporaryId())
-							&& "D".equals(e.getDc())).collect(Collectors.toList());
+						&& "D".equals(e.getDc())).collect(Collectors.toList());
 					for (FeeCenter feeCenter : feeCenters) {
 						feeCenter.setId(null);
 						feeCenter.setPid(item.getId());
@@ -6122,11 +6136,11 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			.eq(Bills::getTemporaryId, bills.getId()));
 		if (detail != null) {
 			List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
-				.eq(PreContainers::getIsDeleted,0)
-				.eq(PreContainers::getContainerNumberStatus,"已选择")
-				.eq(PreContainers::getTenantId,AuthUtil.getTenantId())
-				.eq(PreContainers::getPid,detail.getId()));
-			if (!preContainersList.isEmpty()){
+				.eq(PreContainers::getIsDeleted, 0)
+				.eq(PreContainers::getContainerNumberStatus, "已选择")
+				.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+				.eq(PreContainers::getPid, detail.getId()));
+			if (!preContainersList.isEmpty()) {
 				throw new RuntimeException("海运出口已占用放箱号,请先联系客服撤销放箱号");
 			}
 			detail.setUpdateUserName(AuthUtil.getUserName());

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

@@ -121,6 +121,9 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 			}
 			item.setOccupyNum(item.getOccupyNum() + containerNumberItem.getOccupyNum());
 			item.setRemainingNum(item.getRemainingNum() - containerNumberItem.getOccupyNum());
+			if(item.getRemainingNum()<0){
+				throw new RuntimeException("放箱号:"+item.getContainerNumber()+"可用数量不足");
+			}
 		}
 		putBoxService.updateBatchByIdAndVersion(putBoxList);
 		PreContainers preContainers = preContainersService.getOne(new LambdaQueryWrapper<PreContainers>()
@@ -503,6 +506,11 @@ public class SeaContainerNumberItemServiceImpl extends ServiceImpl<SeaContainerN
 				if (item.getOccupyNum() == 0) {
 					deteleIdList.add(item.getId());
 				}
+				if (item.getOccupyNum().equals(item.getOutNum())){
+					item.setWhetherAppearStatus("1");
+				}else{
+					item.setWhetherAppearStatus("0");
+				}
 			}
 			this.updateBatchById(containerNumberItemListOld);
 			if (!deteleIdList.isEmpty()) {

+ 126 - 0
blade-service/blade-los/src/main/java/org/springblade/los/log/controller/GlobalOperationLogController.java

@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.log.entity.GlobalOperationLog;
+import org.springblade.los.log.vo.GlobalOperationLogVO;
+import org.springblade.los.log.service.IGlobalOperationLogService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 货代操作记录 控制器
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/globaloperationlog")
+@Api(value = "货代操作记录", tags = "货代操作记录接口")
+public class GlobalOperationLogController extends BladeController {
+
+	private final IGlobalOperationLogService globalOperationLogService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入globalOperationLog")
+	public R<GlobalOperationLog> detail(GlobalOperationLog globalOperationLog) {
+		GlobalOperationLog detail = globalOperationLogService.getOne(Condition.getQueryWrapper(globalOperationLog));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 货代操作记录
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入globalOperationLog")
+	public R<IPage<GlobalOperationLog>> list(GlobalOperationLog globalOperationLog, Query query) {
+		IPage<GlobalOperationLog> pages = globalOperationLogService.page(Condition.getPage(query), Condition.getQueryWrapper(globalOperationLog));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 货代操作记录
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入globalOperationLog")
+	public R<IPage<GlobalOperationLogVO>> page(GlobalOperationLogVO globalOperationLog, Query query) {
+		IPage<GlobalOperationLogVO> pages = globalOperationLogService.selectGlobalOperationLogPage(Condition.getPage(query), globalOperationLog);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 货代操作记录
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入globalOperationLog")
+	public R save(@Valid @RequestBody GlobalOperationLog globalOperationLog) {
+		return R.status(globalOperationLogService.save(globalOperationLog));
+	}
+
+	/**
+	 * 修改 货代操作记录
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入globalOperationLog")
+	public R update(@Valid @RequestBody GlobalOperationLog globalOperationLog) {
+		return R.status(globalOperationLogService.updateById(globalOperationLog));
+	}
+
+	/**
+	 * 新增或修改 货代操作记录
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入globalOperationLog")
+	public R submit(@Valid @RequestBody GlobalOperationLog globalOperationLog) {
+		return R.status(globalOperationLogService.saveOrUpdate(globalOperationLog));
+	}
+
+	
+	/**
+	 * 删除 货代操作记录
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(globalOperationLogService.removeByIds(Func.toLongList(ids)));
+	}
+
+	
+}

+ 42 - 0
blade-service/blade-los/src/main/java/org/springblade/los/log/mapper/GlobalOperationLogMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.mapper;
+
+import org.springblade.los.log.entity.GlobalOperationLog;
+import org.springblade.los.log.vo.GlobalOperationLogVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 货代操作记录 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+public interface GlobalOperationLogMapper extends BaseMapper<GlobalOperationLog> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param globalOperationLog
+	 * @return
+	 */
+	List<GlobalOperationLogVO> selectGlobalOperationLogPage(IPage page, GlobalOperationLogVO globalOperationLog);
+
+}

+ 31 - 0
blade-service/blade-los/src/main/java/org/springblade/los/log/mapper/GlobalOperationLogMapper.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.los.log.mapper.GlobalOperationLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="globalOperationLogResultMap" type="org.springblade.los.log.entity.GlobalOperationLog">
+        <id column="id" property="id"/>
+        <result column="pid" property="pid"/>
+        <result column="branch_id" property="branchId"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_user_name" property="createUserName"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_user_name" property="updateUserName"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="version" property="version"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="branch_name" property="branchName"/>
+        <result column="operator_id" property="operatorId"/>
+        <result column="operator_name" property="operatorName"/>
+        <result column="operator_date" property="operatorDate"/>
+        <result column="operator_type" property="operatorType"/>
+        <result column="operator_content" property="operatorContent"/>
+    </resultMap>
+
+
+    <select id="selectGlobalOperationLogPage" resultMap="globalOperationLogResultMap">
+        select * from los_global_operation_log where is_deleted = 0
+    </select>
+
+</mapper>

+ 41 - 0
blade-service/blade-los/src/main/java/org/springblade/los/log/service/IGlobalOperationLogService.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.service;
+
+import org.springblade.los.log.entity.GlobalOperationLog;
+import org.springblade.los.log.vo.GlobalOperationLogVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 货代操作记录 服务类
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+public interface IGlobalOperationLogService extends IService<GlobalOperationLog> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param globalOperationLog
+	 * @return
+	 */
+	IPage<GlobalOperationLogVO> selectGlobalOperationLogPage(IPage<GlobalOperationLogVO> page, GlobalOperationLogVO globalOperationLog);
+
+}

+ 41 - 0
blade-service/blade-los/src/main/java/org/springblade/los/log/service/impl/GlobalOperationLogServiceImpl.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.log.service.impl;
+
+import org.springblade.los.log.entity.GlobalOperationLog;
+import org.springblade.los.log.vo.GlobalOperationLogVO;
+import org.springblade.los.log.mapper.GlobalOperationLogMapper;
+import org.springblade.los.log.service.IGlobalOperationLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 货代操作记录 服务实现类
+ *
+ * @author BladeX
+ * @since 2026-03-25
+ */
+@Service
+public class GlobalOperationLogServiceImpl extends ServiceImpl<GlobalOperationLogMapper, GlobalOperationLog> implements IGlobalOperationLogService {
+
+	@Override
+	public IPage<GlobalOperationLogVO> selectGlobalOperationLogPage(IPage<GlobalOperationLogVO> page, GlobalOperationLogVO globalOperationLog) {
+		return page.setRecords(baseMapper.selectGlobalOperationLogPage(page, globalOperationLog));
+	}
+
+}

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