Browse Source

2022年12月12日08:33:39

纪新园 3 years ago
parent
commit
425b07b56d
25 changed files with 828 additions and 265 deletions
  1. 6 6
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/dto/TradingBoxItemRentExcelEnter.java
  2. 3 3
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/dto/TransportItemExcelEnter.java
  3. 6 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/RepairFees.java
  4. 6 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/RepairItem.java
  5. 6 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxFees.java
  6. 6 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxItem.java
  7. 7 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TransportItem.java
  8. 6 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TransportItemFees.java
  9. 6 0
      blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Acc.java
  10. 6 0
      blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Items.java
  11. 27 2
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/ArchivesController.java
  12. 2 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/ArchivesTrajectoryController.java
  13. 46 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/RepairController.java
  14. 12 3
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TradingBoxController.java
  15. 46 3
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TradingBoxRentController.java
  16. 12 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TransportController.java
  17. 2 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/IRepairService.java
  18. 4 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/ITradingBoxService.java
  19. 2 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/ITransportService.java
  20. 141 68
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/RepairServiceImpl.java
  21. 353 149
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java
  22. 90 13
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java
  23. 19 2
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java
  24. 13 13
      blade-service/trade-finance/src/main/java/org/springblade/finance/controller/AccController.java
  25. 1 1
      blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

+ 6 - 6
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/dto/TradingBoxItemRentExcelEnter.java

@@ -41,17 +41,17 @@ public class TradingBoxItemRentExcelEnter implements Serializable {
 	/**
 	 * 箱号
 	 */
-	@ExcelProperty(value = "箱号")
+	@ExcelProperty(value = "箱号(必填)")
 	private String code;
 	/**
 	 * 箱类型
 	 */
-	@ExcelProperty(value = "箱类型")
+	@ExcelProperty(value = "箱类型(必填)")
 	private String boxType;
 	/**
 	 * 租金
 	 */
-	@ExcelProperty(value = "租金")
+	@ExcelProperty(value = "租金(必填)")
 	private BigDecimal price;
 	/**
 	 * 币别
@@ -81,12 +81,12 @@ public class TradingBoxItemRentExcelEnter implements Serializable {
 	/**
 	 * 箱来源
 	 */
-	@ExcelProperty(value = "箱来源")
+	@ExcelProperty(value = "箱来源(购买,租入)")
 	private String boxSource;
 	/**
 	 * 箱状态
 	 */
-	@ExcelProperty(value = "箱状态")
+	@ExcelProperty(value = "箱状态(好,坏)")
 	private String boxStatus;
 	/**
 	 * 空重
@@ -118,7 +118,7 @@ public class TradingBoxItemRentExcelEnter implements Serializable {
 	/**
 	 * 箱龄
 	 */
-	@ExcelProperty(value = "箱龄")
+	@ExcelProperty(value = "箱龄(月)")
 	private Integer boxAge;
 	/**
 	 * 毛重

+ 3 - 3
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/dto/TransportItemExcelEnter.java

@@ -41,12 +41,12 @@ public class TransportItemExcelEnter implements Serializable {
 	/**
 	 * 箱号
 	 */
-	@ExcelProperty(value = "箱号")
+	@ExcelProperty(value = "箱号(必填)")
 	private String code;
 	/**
 	 * 箱型
 	 */
-	@ExcelProperty(value = "箱型")
+	@ExcelProperty(value = "箱型(必填)")
 	private String boxType;
 	/**
 	 * 币别
@@ -61,7 +61,7 @@ public class TransportItemExcelEnter implements Serializable {
 	/**
 	 * 超期每天单价
 	 */
-	@ExcelProperty(value = "超期每天单价")
+	@ExcelProperty(value = "超期每天单价(必填)")
 	private BigDecimal price;
 	/**
 	 * 地点

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

@@ -175,5 +175,11 @@ public class RepairFees implements Serializable {
 	@ApiModelProperty(value = "汇率")
 	private BigDecimal exchangeRate;
 
+	/**
+	 * 业务类型(出口装运 CK/进口返程JK)
+	 */
+	@ApiModelProperty(value = "业务类型(出口装运 CK/进口返程JK)")
+	private String billType;
+
 
 }

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

@@ -131,5 +131,11 @@ public class RepairItem implements Serializable {
 	@ApiModelProperty(value = "箱类型id")
 	private Long boxTypeId;
 
+	/**
+	 * 修改char值
+	 */
+	@ApiModelProperty(value = "修改char值")
+	private String updateChar;
+
 
 }

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

@@ -214,5 +214,11 @@ public class TradingBoxFees implements Serializable {
 	@ApiModelProperty(value = "租金结束时间")
 	private Date rentEndDate;
 
+	/**
+	 * 业务类型(出口装运 CK/进口返程JK)
+	 */
+	@ApiModelProperty(value = "业务类型(出口装运 CK/进口返程JK)")
+	private String billType;
+
 
 }

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

@@ -238,4 +238,10 @@ public class TradingBoxItem implements Serializable {
 	@TableField(exist = false)
 	private int count;
 
+	/**
+	 * 修改char值
+	 */
+	@ApiModelProperty(value = "修改char值")
+	private String updateChar;
+
 }

+ 7 - 0
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TransportItem.java

@@ -167,5 +167,12 @@ public class TransportItem implements Serializable {
 	private List<ArchivesTrajectory> archivesTrajectoryList;
 
 
+	/**
+	 * 修改char值
+	 */
+	@ApiModelProperty(value = "修改char值")
+	private String updateChar;
+
+
 
 }

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

@@ -188,5 +188,11 @@ public class TransportItemFees implements Serializable {
 	@ApiModelProperty(value = "汇率")
 	private BigDecimal exchangeRate;
 
+	/**
+	 * 业务类型(出口装运 CK/进口返程JK)
+	 */
+	@ApiModelProperty(value = "业务类型(出口装运 CK/进口返程JK)")
+	private String billType;
+
 
 }

+ 6 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Acc.java

@@ -453,4 +453,10 @@ public class Acc implements Serializable {
 	@ApiModelProperty(value = "租金开始时间")
 	private Date rentStartDate;
 
+	/**
+	 * 来源业务模块
+	 */
+	@ApiModelProperty(value = "来源业务模块")
+	private String srcBoxBillType;
+
 }

+ 6 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Items.java

@@ -318,4 +318,10 @@ public class Items implements Serializable {
 	 */
 	@TableField(exist = false)
 	private Long belongToCorpId;
+
+	/**
+	 * 来源业务模块
+	 */
+	@ApiModelProperty(value = "来源业务模块")
+	private String srcBoxBillType;
 }

+ 27 - 2
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/ArchivesController.java

@@ -207,7 +207,7 @@ public class ArchivesController extends BladeController {
 			.eq(ObjectUtils.isNotNull(archives.getBoxSource()), Archives::getBoxSource, archives.getBoxSource());
 		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(archives.getBoxMakingCompanyId()), Archives::getBoxMakingCompanyId, archives.getBoxMakingCompanyId());
 		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(archives.getBoxStatus()), Archives::getBoxStatus, archives.getBoxStatus());
-		lambdaQueryWrapper.eq( Archives::getStatus, "待使用");
+		lambdaQueryWrapper.eq(Archives::getStatus, "待使用");
 		List<Archives> list = new ArrayList<>();
 		IPage<Archives> pages = archivesService.page(Condition.getPage(query), lambdaQueryWrapper);
 		if (pages.getRecords().size() > 0) {
@@ -248,7 +248,7 @@ public class ArchivesController extends BladeController {
 	@GetMapping("/export-archives-out")
 	@ApiOperationSupport(order = 9)
 	@ApiOperation(value = "导出数据")
-	public void exportArchivesOut(Archives archives,HttpServletResponse response) {
+	public void exportArchivesOut(Archives archives, HttpServletResponse response) {
 		LambdaQueryWrapper<Archives> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(Archives::getTenantId, AuthUtil.getTenantId())
 			.eq(Archives::getIsDeleted, 0)
@@ -276,5 +276,30 @@ public class ArchivesController extends BladeController {
 		ExcelUtil.export(response, "导出箱档案信息", "导出数据表", BeanUtil.copy(archivesList, ArchivesExcelOut.class), ArchivesExcelOut.class);
 	}
 
+	/**
+	 * 查询箱档案
+	 */
+	@GetMapping("/selectArchivesByCodeList")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "查询箱档案", notes = "传入archives")
+	public R selectArchivesByCodeList(Archives archives) {
+		LambdaQueryWrapper<Archives> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Archives::getTenantId, AuthUtil.getTenantId())
+			.eq(Archives::getIsDeleted, 0)
+			.like(ObjectUtils.isNotNull(archives.getContractNo()), Archives::getContractNo, archives.getContractNo())
+			.like(ObjectUtils.isNotNull(archives.getName()), Archives::getName, archives.getName())
+			.eq(ObjectUtils.isNotNull(archives.getAddressId()), Archives::getAddressId, archives.getAddressId())
+			.eq(ObjectUtils.isNotNull(archives.getLeasingCompanyId()), Archives::getLeasingCompanyId, archives.getLeasingCompanyId())
+			.eq(ObjectUtils.isNotNull(archives.getBoxSource()), Archives::getBoxSource, archives.getBoxSource());
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(archives.getBoxMakingCompanyId()), Archives::getBoxMakingCompanyId, archives.getBoxMakingCompanyId());
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(archives.getBoxStatus()), Archives::getBoxStatus, archives.getBoxStatus());
+		lambdaQueryWrapper.eq(ObjectUtils.isNotNull(archives.getStatus()), Archives::getStatus, archives.getStatus());
+		if (ObjectUtils.isNotNull(archives.getCode()) && !"undefined".equals(archives.getCode())){
+			lambdaQueryWrapper.apply(ObjectUtils.isNotNull(archives.getCode()), "find_in_set(code ,'" + archives.getCode() + "')");
+		}
+		List<Archives> list = archivesService.list( lambdaQueryWrapper);
+		return R.data(list);
+	}
+
 
 }

+ 2 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/ArchivesTrajectoryController.java

@@ -77,7 +77,8 @@ public class ArchivesTrajectoryController extends BladeController {
 			.like(ObjectUtils.isNotNull(archivesTrajectory.getCode()), ArchivesTrajectory::getCode, archivesTrajectory.getCode())//箱号
 			.like(ObjectUtils.isNotNull(archivesTrajectory.getAddress()), ArchivesTrajectory::getAddress, archivesTrajectory.getAddress())//地点
 			.eq(ObjectUtils.isNotNull(archivesTrajectory.getBillType()), ArchivesTrajectory::getBillType, archivesTrajectory.getBillType())//业务类型
-			.eq(ObjectUtils.isNotNull(archivesTrajectory.getStatus()), ArchivesTrajectory::getStatus, archivesTrajectory.getStatus());//状态
+			.eq(ObjectUtils.isNotNull(archivesTrajectory.getStatus()), ArchivesTrajectory::getStatus, archivesTrajectory.getStatus())//状态
+			.eq(ObjectUtils.isNotNull(archivesTrajectory.getCorpId()), ArchivesTrajectory::getCorpId, archivesTrajectory.getCorpId());//客户
 		if (archivesTrajectory.getNewDateList() != null && archivesTrajectory.getNewDateList().size() > 1) {//日期
 			lambdaQueryWrapper.ge(ArchivesTrajectory::getNewDate, archivesTrajectory.getNewDateList().get(0));
 			lambdaQueryWrapper.le(ArchivesTrajectory::getNewDate, archivesTrajectory.getNewDateList().get(1));

+ 46 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/RepairController.java

@@ -25,8 +25,11 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.box.tube.dto.ExportRepairOut;
-import org.springblade.box.tube.entity.Archives;
+import org.springblade.box.tube.entity.Files;
 import org.springblade.box.tube.entity.Repair;
+import org.springblade.box.tube.entity.RepairItem;
+import org.springblade.box.tube.service.IFilesService;
+import org.springblade.box.tube.service.IRepairItemService;
 import org.springblade.box.tube.service.IRepairService;
 import org.springblade.box.tube.vo.RepairVO;
 import org.springblade.common.annotation.RepeatSubmit;
@@ -58,6 +61,11 @@ public class RepairController extends BladeController {
 
 	private final IRepairService repairService;
 
+	private final IFilesService filesService;
+
+	private final IRepairItemService repairItemService;
+
+
 	/**
 	 * 详情
 	 */
@@ -129,6 +137,7 @@ public class RepairController extends BladeController {
 	 */
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
+
 	@ApiOperation(value = "新增或修改", notes = "传入repair")
 	@RepeatSubmit
 	public R submit(@Valid @RequestBody Repair repair) {
@@ -255,5 +264,41 @@ public class RepairController extends BladeController {
 
 	}
 
+	/**
+	 * 复制单据
+	 */
+	@GetMapping("/copyDocument")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入repair")
+	public R<Repair> copyDocument(Repair repair) {
+		Repair detail = repairService.copyDocument(repair);
+		return R.data(detail);
+	}
+
+	/**
+	 * 明细详情
+	 */
+	@GetMapping("/itemDetails")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "repairItem")
+	public R<RepairItem> itemDetails(RepairItem repairItem) {
+		if (null == repairItem.getId()) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		RepairItem details = repairItemService.getById(repairItem.getId());
+		LambdaQueryWrapper<Files> tradingBoxFilesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		tradingBoxFilesLambdaQueryWrapper.eq(Files::getIsDeleted, 0)
+			.eq(Files::getTenantId, AuthUtil.getTenantId())
+			.eq(Files::getType, "2")
+			.eq(Files::getPid, repairItem.getId());
+		List<Files> filesList = filesService.list(tradingBoxFilesLambdaQueryWrapper);
+		for (Files files : filesList) {
+			files.setLabel(files.getFileName());
+			files.setValue(files.getUrl());
+		}
+		details.setItemFilesList(filesList);
+		return R.data(details);
+	}
+
 
 }

+ 12 - 3
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TradingBoxController.java

@@ -24,11 +24,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
-import org.springblade.box.tube.dto.ArchivesExcelOut;
 import org.springblade.box.tube.dto.ExportTradingBoxOut;
-import org.springblade.box.tube.entity.Archives;
 import org.springblade.box.tube.entity.TradingBox;
-import org.springblade.box.tube.entity.Transport;
 import org.springblade.box.tube.service.ITradingBoxService;
 import org.springblade.box.tube.vo.TradingBoxVO;
 import org.springblade.common.annotation.RepeatSubmit;
@@ -258,4 +255,16 @@ public class TradingBoxController extends BladeController {
 		}
 		ExcelUtil.export(response, "导出订单信息", "导出数据表", BeanUtil.copy(tradingBoxList, ExportTradingBoxOut.class), ExportTradingBoxOut.class);
 	}
+
+	/**
+	 * 复制单据
+	 */
+	@GetMapping("/copyDocument")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入repair")
+	public R<TradingBox> copyDocument(TradingBox tradingBox) {
+		TradingBox detail = tradingBoxService.copyDocument(tradingBox);
+		return R.data(detail);
+	}
+
 }

+ 46 - 3
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TradingBoxRentController.java

@@ -28,6 +28,10 @@ import lombok.AllArgsConstructor;
 import org.springblade.box.tube.dto.TradingBoxItemRentExcelEnter;
 import org.springblade.box.tube.entity.Archives;
 import org.springblade.box.tube.entity.TradingBox;
+import org.springblade.box.tube.entity.TradingBoxFiles;
+import org.springblade.box.tube.entity.TradingBoxItem;
+import org.springblade.box.tube.service.ITradingBoxFilesService;
+import org.springblade.box.tube.service.ITradingBoxItemService;
 import org.springblade.box.tube.service.ITradingBoxService;
 import org.springblade.box.tube.vo.TradingBoxVO;
 import org.springblade.common.annotation.RepeatSubmit;
@@ -61,6 +65,10 @@ public class TradingBoxRentController extends BladeController {
 
 	private final ITradingBoxService tradingBoxService;
 
+	private final ITradingBoxFilesService tradingBoxFilesService;
+
+	private final ITradingBoxItemService tradingBoxItemService;
+
 	/**
 	 * 详情
 	 */
@@ -273,9 +281,9 @@ public class TradingBoxRentController extends BladeController {
 	@ApiOperationSupport(order = 12)
 	@ApiOperation(value = "导入箱明细", notes = "传入excel")
 	public R importTradingBoxInfo(MultipartFile file,
-								  @RequestParam(value = "corpId",required = false) Long corpId,
-								  @RequestParam(value = "corpName",required = false) String corpName,
-								  @RequestParam(value = "billType",required = false) String billType) {
+								  @RequestParam(value = "corpId", required = false) Long corpId,
+								  @RequestParam(value = "corpName", required = false) String corpName,
+								  @RequestParam(value = "billType", required = false) String billType) {
 		List<TradingBoxItemRentExcelEnter> excelList = ExcelUtil.read(file, TradingBoxItemRentExcelEnter.class);
 		if (CollectionUtils.isEmpty(excelList)) {
 			throw new SecurityException("数据不能为空");
@@ -283,5 +291,40 @@ public class TradingBoxRentController extends BladeController {
 		return tradingBoxService.importTradingBoxInfo(excelList, false, corpId, corpName, billType);
 	}
 
+	/**
+	 * 明细详情
+	 */
+	@GetMapping("/itemDetails")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入repair")
+	public R<TradingBoxItem> itemDetails(TradingBoxItem tradingBoxItem) {
+		if (null == tradingBoxItem.getId()) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		TradingBoxItem details = tradingBoxItemService.getById(tradingBoxItem.getId());
+		LambdaQueryWrapper<TradingBoxFiles> tradingBoxFilesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		tradingBoxFilesLambdaQueryWrapper.eq(TradingBoxFiles::getIsDeleted, 0)
+			.eq(TradingBoxFiles::getTenantId, AuthUtil.getTenantId())
+			.eq(TradingBoxFiles::getType, "2")
+			.eq(TradingBoxFiles::getPid, tradingBoxItem.getId());
+		List<TradingBoxFiles> tradingBoxFilesList = tradingBoxFilesService.list(tradingBoxFilesLambdaQueryWrapper);
+		for (TradingBoxFiles tradingBoxFiles : tradingBoxFilesList) {
+			tradingBoxFiles.setLabel(tradingBoxFiles.getFileName());
+			tradingBoxFiles.setValue(tradingBoxFiles.getUrl());
+		}
+		details.setTradingBoxFilesList(tradingBoxFilesList);
+		return R.data(details);
+	}
+
+	/**
+	 * 撤销退租
+	 */
+	@PostMapping("/revokeRentingOut")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入tradingBox")
+	@RepeatSubmit
+	public R revokeRentingOut(@Valid @RequestBody TradingBox tradingBox) {
+		return R.data(tradingBoxService.revokeRentingOut(tradingBox));
+	}
 
 }

+ 12 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TransportController.java

@@ -28,6 +28,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.box.tube.dto.ExportTransportOut;
 import org.springblade.box.tube.dto.TransportItemExcelEnter;
 import org.springblade.box.tube.entity.Archives;
+import org.springblade.box.tube.entity.TradingBox;
 import org.springblade.box.tube.entity.Transport;
 import org.springblade.box.tube.service.ITransportService;
 import org.springblade.box.tube.vo.TransportVO;
@@ -316,5 +317,16 @@ public class TransportController extends BladeController {
 		return transportService.importTransportInfo(excelList, false,corpId,corpName,billType);
 	}
 
+	/**
+	 * 复制单据
+	 */
+	@GetMapping("/copyDocument")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入repair")
+	public R<Transport> copyDocument(Transport transport) {
+		Transport detail = transportService.copyDocument(transport);
+		return R.data(detail);
+	}
+
 
 }

+ 2 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/IRepairService.java

@@ -53,4 +53,6 @@ public interface IRepairService extends IService<Repair> {
 	R passCancel(Long id);
 
 	Repair withdrawRepair(Repair repair);
+
+    Repair copyDocument(Repair repair);
 }

+ 4 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/ITradingBoxService.java

@@ -66,4 +66,8 @@ public interface ITradingBoxService extends IService<TradingBox> {
 	TradingBox revokeRentCalculation(TradingBox tradingBox);
 
 	R importTradingBoxInfo(List<TradingBoxItemRentExcelEnter> excelList, boolean b, Long corpId, String corpName, String billType);
+
+    TradingBox copyDocument(TradingBox tradingBox);
+
+	Object revokeRentingOut(TradingBox tradingBox);
 }

+ 2 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/ITransportService.java

@@ -61,4 +61,6 @@ public interface ITransportService extends IService<Transport> {
 	Transport withdrawTransport(Transport transport);
 
 	R importTransportInfo(List<TransportItemExcelEnter> excelList, boolean b, Long corpId, String corpName,String billType);
+
+    Transport copyDocument(Transport transport);
 }

+ 141 - 68
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/RepairServiceImpl.java

@@ -17,12 +17,10 @@
 package org.springblade.box.tube.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 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.core.toolkit.StringUtils;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
@@ -143,11 +141,11 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 			List<RepairFees> repairFeesList = repairFeesMapper.selectList(repairFeesLambdaQueryWrapper);
 			for (RepairFees repairFees : repairFeesList) {
 				R<FeesDesc> r = feesDescClient.detail(repairFees.getItemId());
-				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())){
+				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
 					repairFees.setItemName(r.getData().getCname());
 				}
 				CorpsDesc corpsDesc = corpsDescClient.getCorpId(repairFees.getCorpId());
-				if (ObjectUtils.isNotNull(corpsDesc)){
+				if (ObjectUtils.isNotNull(corpsDesc)) {
 					repairFees.setCorpName(corpsDesc.getCname());
 				}
 			}
@@ -206,71 +204,74 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 				boxNumber += GeneralToolsUtils.boxNumber(repairItem.getBoxType());
 				//明细
 				List<Files> itemFilesList = repairItem.getItemFilesList();
-					if (repairItem.getId() == null) {
-						repairItem.setCreateUser(AuthUtil.getUserId());
-						repairItem.setBillType(repair.getBillType());
-						repairItem.setCreateTime(new Date());
-						repairItem.setTenantId(AuthUtil.getTenantId());
-						repairItem.setPid(repair.getId());
-						repairItem.setCreateUserName(AuthUtil.getUserName());
-						repairItemMapper.insert(repairItem);
+				if (repairItem.getId() == null) {
+					repairItem.setCreateUser(AuthUtil.getUserId());
+					repairItem.setBillType(repair.getBillType());
+					repairItem.setCreateTime(new Date());
+					repairItem.setTenantId(AuthUtil.getTenantId());
+					repairItem.setPid(repair.getId());
+					repairItem.setCreateUserName(AuthUtil.getUserName());
+					repairItemMapper.insert(repairItem);
+				} else {
+					repairItem.setBillType(repair.getBillType());
+					repairItem.setUpdateUser(AuthUtil.getUserId());
+					repairItem.setUpdateTime(new Date());
+					repairItem.setPid(repair.getId());
+					repairItem.setUpdateUserName(AuthUtil.getUserName());
+					repairItemMapper.updateById(repairItem);
+				}
+				//明细附件
+				for (Files files : itemFilesList) {
+					if (files.getId() == null) {
+						files.setCreateUser(AuthUtil.getUserId());
+						files.setCreateTime(new Date());
+						files.setTenantId(AuthUtil.getTenantId());
+						files.setPid(repairItem.getId());
+						files.setType("2");
+						files.setFileName(files.getLabel());
+						files.setUrl(files.getValue());
+						filesMapper.insert(files);
 					} else {
-						repairItem.setBillType(repair.getBillType());
-						repairItem.setUpdateUser(AuthUtil.getUserId());
-						repairItem.setUpdateTime(new Date());
-						repairItem.setPid(repair.getId());
-						repairItem.setUpdateUserName(AuthUtil.getUserName());
-						repairItemMapper.updateById(repairItem);
+						files.setUpdateUser(AuthUtil.getUserId());
+						files.setUpdateTime(new Date());
+						files.setPid(repairItem.getId());
+						files.setFileName(files.getLabel());
+						files.setUrl(files.getValue());
+						filesMapper.updateById(files);
 					}
-					//明细附件
-					for (Files files : itemFilesList) {
-						if (files.getId() == null) {
-							files.setCreateUser(AuthUtil.getUserId());
-							files.setCreateTime(new Date());
-							files.setTenantId(AuthUtil.getTenantId());
-							files.setPid(repairItem.getId());
-							files.setType("2");
-							files.setFileName(files.getLabel());
-							files.setUrl(files.getValue());
-							filesMapper.insert(files);
-						} else {
-							files.setUpdateUser(AuthUtil.getUserId());
-							files.setUpdateTime(new Date());
-							files.setPid(repairItem.getId());
-							files.setFileName(files.getLabel());
-							files.setUrl(files.getValue());
-							filesMapper.updateById(files);
+				}
+				String updateChar = repairItem.getCode() + repairItem.getBillType();
+				if (ObjectUtils.isNull(repairItem.getUpdateChar()) || !updateChar.equals(repairItem.getUpdateChar())) {
+					//更新箱档案数据
+					if (ObjectUtils.isNotNull(repairItem.getCode())) {
+						Archives archives = new Archives();
+						archives.setCode(repairItem.getCode());
+						archives.setAddress(repair.getAddress());
+						archives.setAddressId(repair.getAddressId());
+						archives.setNewDate(repair.getNewDate());
+						archivesMapper.updateCode(archives);
+
+						//记录箱轨迹信息
+						ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
+						if ("REPAIR".equals(repair.getBillType())) {
+							archivesTrajectory.setStatus("修箱");
+						} else if ("WASH".equals(repair.getBillType())) {
+							archivesTrajectory.setStatus("洗箱");
 						}
+						archivesTrajectory.setCorpId(repair.getCompanyId());
+						archivesTrajectory.setCorpName(repair.getCompany());
+						archivesTrajectory.setBillType(repair.getBillType());
+						archivesTrajectory.setCode(repairItem.getCode());
+						archivesTrajectory.setAddress(repair.getAddress());
+						archivesTrajectory.setNewDate(repair.getNewDate());
+						archivesTrajectory.setCreateTime(new Date());
+						archivesTrajectory.setCreateUser(AuthUtil.getUserId());
+						archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
+						archivesTrajectory.setTenantId(AuthUtil.getTenantId());
+						archivesTrajectoryMapper.insert(archivesTrajectory);
+					} else {
+						throw new RuntimeException("箱号不能为空");
 					}
-				//更新箱档案数据
-				if (ObjectUtils.isNotNull(repairItem.getCode())) {
-					Archives archives = new Archives();
-					archives.setCode(repairItem.getCode());
-					archives.setAddress(repair.getAddress());
-					archives.setAddressId(repair.getAddressId());
-					archives.setNewDate(repair.getNewDate());
-					archivesMapper.updateCode(archives);
-
-					//记录箱轨迹信息
-					ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-					if ("REPAIR".equals(repair.getBillType())) {
-						archivesTrajectory.setStatus("修箱");
-					} else if ("WASH".equals(repair.getBillType())) {
-						archivesTrajectory.setStatus("洗箱");
-					}
-					archivesTrajectory.setCorpId(repair.getCompanyId());
-					archivesTrajectory.setCorpName(repair.getCompany());
-					archivesTrajectory.setBillType(repair.getBillType());
-					archivesTrajectory.setCode(repairItem.getCode());
-					archivesTrajectory.setAddress(repair.getAddress());
-					archivesTrajectory.setNewDate(repair.getNewDate());
-					archivesTrajectory.setCreateTime(new Date());
-					archivesTrajectory.setCreateUser(AuthUtil.getUserId());
-					archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
-					archivesTrajectory.setTenantId(AuthUtil.getTenantId());
-					archivesTrajectoryMapper.insert(archivesTrajectory);
-				} else {
-					throw new RuntimeException("箱号不能为空");
 				}
 				repairItem.setItemFilesList(itemFilesList);
 			}
@@ -284,6 +285,11 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 		if (ObjectUtils.isNotNull(repairFeesList) && repairFeesList.size() > 0) {
 			for (RepairFees repairFees : repairFeesList) {
 				if (repairFees.getId() == null) {
+					if ("REPAIR".equals(repair.getBillType())) {
+						repairFees.setBillType("修箱");
+					} else {
+						repairFees.setBillType("洗箱");
+					}
 					repairFees.setCreateUser(AuthUtil.getUserId());
 					repairFees.setCreateTime(new Date());
 					repairFees.setTenantId(AuthUtil.getTenantId());
@@ -388,7 +394,7 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 				String[] arr = selectRepair.getCode().split(",");
 				//数量
 				auditProecessDTO.setOrderQuantity(new BigDecimal(arr.length + 1));
-			}else{
+			} else {
 				auditProecessDTO.setOrderQuantity(new BigDecimal("0"));
 			}
 			//单据金额
@@ -486,7 +492,7 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 		acc.setSrcType(7);
 		R<List<Acc>> r = financeClient.getAccListByCondition(acc);
 		if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
-			for (Acc acc_:r.getData()) {
+			for (Acc acc_ : r.getData()) {
 				//判断账单是否已有结算  true 不允许撤销审核  false 删除账单并撤销审核
 				if (!acc_.getSettlementAmount().equals(new BigDecimal("0.00"))) {
 					throw new SecurityException("订单已结算,不允许撤销");
@@ -507,7 +513,7 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 		repairFeesLambdaQueryWrapper.eq(RepairFees::getTenantId, AuthUtil.getTenantId());
 		repairFeesLambdaQueryWrapper.eq(RepairFees::getSubmitPay, 1);
 		List<RepairFees> tradingBoxFeesList = repairFeesMapper.selectList(repairFeesLambdaQueryWrapper);
-		for (RepairFees tradingBoxFees:tradingBoxFeesList) {
+		for (RepairFees tradingBoxFees : tradingBoxFeesList) {
 			tradingBoxFees.setSubmitPay(0);
 			repairFeesMapper.updateById(tradingBoxFees);
 		}
@@ -515,6 +521,72 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 		return selectRepair;
 	}
 
+	@Override
+	public Repair copyDocument(Repair repair) {
+		if (repair.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		Repair details = baseMapper.selectById(repair.getId());
+		if (ObjectUtils.isNotNull(details)) {
+			//获取明细信息
+			LambdaQueryWrapper<RepairItem> repairItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			repairItemLambdaQueryWrapper.eq(RepairItem::getIsDeleted, 0)
+				.eq(RepairItem::getTenantId, AuthUtil.getTenantId())
+				.eq(RepairItem::getPid, details.getId());
+			List<RepairItem> repairItemList = repairItemMapper.selectList(repairItemLambdaQueryWrapper);
+			for (RepairItem repairItem : repairItemList) {
+				repairItem.setId(null);
+				repairItem.setPid(null);
+				repairItem.setCreateUserName(null);
+				repairItem.setCreateUser(null);
+				repairItem.setCreateTime(null);
+				repairItem.setUpdateUserName(null);
+				repairItem.setUpdateTime(null);
+				repairItem.setUpdateUser(null);
+				repairItem.setItemFilesList(new ArrayList<>());
+			}
+			details.setRepairItemList(repairItemList);
+
+			//获取费用信息
+			LambdaQueryWrapper<RepairFees> repairFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			repairFeesLambdaQueryWrapper.eq(RepairFees::getIsDeleted, 0)
+				.eq(RepairFees::getTenantId, AuthUtil.getTenantId())
+				.eq(RepairFees::getPid, details.getId());
+			List<RepairFees> repairFeesList = repairFeesMapper.selectList(repairFeesLambdaQueryWrapper);
+			for (RepairFees repairFees : repairFeesList) {
+				repairFees.setId(null);
+				repairFees.setPid(null);
+				repairFees.setCreateUser(null);
+				repairFees.setCreateTime(null);
+				repairFees.setUpdateTime(null);
+				repairFees.setUpdateUser(null);
+				repairFees.setSubmitPay(0);
+				R<FeesDesc> r = feesDescClient.detail(repairFees.getItemId());
+				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+					repairFees.setItemName(r.getData().getCname());
+				}
+				CorpsDesc corpsDesc = corpsDescClient.getCorpId(repairFees.getCorpId());
+				if (ObjectUtils.isNotNull(corpsDesc)) {
+					repairFees.setCorpName(corpsDesc.getCname());
+				}
+			}
+			details.setRepairFeesList(repairFeesList);
+			details.setFilesList(new ArrayList<>());
+		}
+		details.setId(null);
+		details.setCreateUserName(null);
+		details.setCreateUser(null);
+		details.setCreateTime(null);
+		details.setUpdateUserName(null);
+		details.setUpdateTime(null);
+		details.setUpdateUser(null);
+		details.setStatus(0);
+		details.setApprovalStatus(null);
+		details.setPageStatus(null);
+		details.setSysNo(null);
+		return details;
+	}
+
 
 	/**
 	 * 订单生成账单 并且推送财务消息
@@ -558,6 +630,7 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 				} else {
 					items.setSrcFeesType("付费");
 				}
+				items.setSrcBoxBillType(repairFees.getBillType());
 				items.setItemType(itemType);
 				items.setPrice(price);
 				//账单数据

+ 353 - 149
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java

@@ -136,7 +136,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					.eq(TradingBoxFees::getPid, details.getId());
 				int count = tradingBoxFeesMapper.selectCount(tradingBoxFeesLambdaQueryWrapper);
 				tradingBoxItem.setCount(count);
-				//获取明细图片
+				/*//获取明细图片
 				LambdaQueryWrapper<TradingBoxFiles> tradingBoxFilesLambdaQueryWrapper = new LambdaQueryWrapper<>();
 				tradingBoxFilesLambdaQueryWrapper.eq(TradingBoxFiles::getIsDeleted, 0)
 					.eq(TradingBoxFiles::getTenantId, AuthUtil.getTenantId())
@@ -147,7 +147,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					tradingBoxFiles.setLabel(tradingBoxFiles.getFileName());
 					tradingBoxFiles.setValue(tradingBoxFiles.getUrl());
 				}
-				tradingBoxItem.setTradingBoxFilesList(tradingBoxFilesList);
+				tradingBoxItem.setTradingBoxFilesList(tradingBoxFilesList);*/
 			}
 			details.setTradingBoxItemsList(tradingBoxItemList);
 
@@ -265,81 +265,84 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					}
 					tradingBoxItem.setTradingBoxFilesList(tradingBoxItemFilesList);
 				}
-				if (ObjectUtils.isNotNull(tradingBoxItem.getCode())) {
-					//更新箱档案信息
-					Archives archivesR = archivesMapper.selectOne(new LambdaQueryWrapper<Archives>().eq(Archives::getIsDeleted, 0).eq(Archives::getTenantId, AuthUtil.getTenantId()).eq(Archives::getCode, tradingBoxItem.getCode()));
-					Archives archives = new Archives();
-					if (ObjectUtils.isNotNull(archivesR)) {
-						BeanUtil.copy(archivesR, archives);
-					}
-					archives.setCode(tradingBoxItem.getCode());
-					archives.setName(tradingBoxItem.getBoxType());
-					archives.setVolume(tradingBoxItem.getVolume());
-					archives.setGorssWeight(tradingBoxItem.getGrossWeight());
-					archives.setStatus(tradingBoxItem.getStatus());
-					archives.setTypeId(tradingBoxItem.getBoxTypeId());
-					archives.setAddressId(tradingBoxItem.getAddressId());
-					archives.setAddress(tradingBoxItem.getAddress());
-					archives.setNewDate(tradingBoxItem.getNewDate());
-					archives.setLeasingCompanyId(tradingBox.getPurchaseCompanyId());
-					archives.setLeasingCompany(tradingBox.getPurchaseCompanyName());
-					archives.setBoxSource(tradingBoxItem.getBoxSource());
-					archives.setBoxStatus(tradingBoxItem.getBoxStatus());
-					archives.setEmptyWeight(tradingBoxItem.getEmptyWeight());
-					archives.setTare(tradingBoxItem.getTare());
-					archives.setLoadingWeight(tradingBoxItem.getLoadingWeight());
-					archives.setBoxMakingCompany(tradingBoxItem.getBoxMakingCompany());
-					archives.setBoxMakingCompanyId(tradingBoxItem.getBoxMakingCompanyId());
-					archives.setBoxMakingDate(tradingBoxItem.getBoxMakingDate());
-					archives.setLeaseCommencementDate(tradingBoxItem.getLeaseCommencementDate());
-					archives.setBoxAge(tradingBoxItem.getBoxAge());
-					archives.setPurchaseDate(tradingBox.getPurchaseDate());
-					archives.setContractNo(tradingBox.getContractNo());
-					if (ObjectUtils.isNotNull(archivesR)) {
-						archives.setUpdateTime(new Date());
-						archives.setUpdateUserName(AuthUtil.getUserName());
-						archives.setUpdateUser(AuthUtil.getUserId());
-						archivesMapper.updateById(archives);
+				String updateChar = tradingBoxItem.getCode() + tradingBoxItem.getBoxType() + tradingBoxItem.getAddress() + tradingBoxItem.getNewDate() + tradingBoxItem.getStatus();
+				if (ObjectUtils.isNull(tradingBoxItem.getUpdateChar()) || !updateChar.equals(tradingBoxItem.getUpdateChar())) {
+					if (ObjectUtils.isNotNull(tradingBoxItem.getCode())) {
+						//更新箱档案信息
+						Archives archivesR = archivesMapper.selectOne(new LambdaQueryWrapper<Archives>().eq(Archives::getIsDeleted, 0).eq(Archives::getTenantId, AuthUtil.getTenantId()).eq(Archives::getCode, tradingBoxItem.getCode()));
+						Archives archives = new Archives();
+						if (ObjectUtils.isNotNull(archivesR)) {
+							BeanUtil.copy(archivesR, archives);
+						}
+						archives.setCode(tradingBoxItem.getCode());
+						archives.setName(tradingBoxItem.getBoxType());
+						archives.setVolume(tradingBoxItem.getVolume());
+						archives.setGorssWeight(tradingBoxItem.getGrossWeight());
+						archives.setStatus(tradingBoxItem.getStatus());
+						archives.setTypeId(tradingBoxItem.getBoxTypeId());
+						archives.setAddressId(tradingBoxItem.getAddressId());
+						archives.setAddress(tradingBoxItem.getAddress());
+						archives.setNewDate(tradingBoxItem.getNewDate());
+						archives.setLeasingCompanyId(tradingBox.getPurchaseCompanyId());
+						archives.setLeasingCompany(tradingBox.getPurchaseCompanyName());
+						archives.setBoxSource(tradingBoxItem.getBoxSource());
+						archives.setBoxStatus(tradingBoxItem.getBoxStatus());
+						archives.setEmptyWeight(tradingBoxItem.getEmptyWeight());
+						archives.setTare(tradingBoxItem.getTare());
+						archives.setLoadingWeight(tradingBoxItem.getLoadingWeight());
+						archives.setBoxMakingCompany(tradingBoxItem.getBoxMakingCompany());
+						archives.setBoxMakingCompanyId(tradingBoxItem.getBoxMakingCompanyId());
+						archives.setBoxMakingDate(tradingBoxItem.getBoxMakingDate());
+						archives.setLeaseCommencementDate(tradingBoxItem.getLeaseCommencementDate());
+						archives.setBoxAge(tradingBoxItem.getBoxAge());
+						archives.setPurchaseDate(tradingBox.getPurchaseDate());
+						archives.setContractNo(tradingBox.getContractNo());
+						if (ObjectUtils.isNotNull(archivesR)) {
+							archives.setUpdateTime(new Date());
+							archives.setUpdateUserName(AuthUtil.getUserName());
+							archives.setUpdateUser(AuthUtil.getUserId());
+							archivesMapper.updateById(archives);
 
-					} else {
-						archives.setCreateUser(AuthUtil.getUserId());
-						archives.setCreateTime(new Date());
-						archives.setCreateUserName(AuthUtil.getUserName());
-						archives.setTenantId(AuthUtil.getTenantId());
-						archivesMapper.insert(archives);
-						List<ArchivesFiles> archivesFilesList = BeanUtil.copy(tradingBoxItem.getTradingBoxFilesList(), ArchivesFiles.class);
-						for (ArchivesFiles archivesFiles : archivesFilesList) {
-							archivesFiles.setId(null);
-							archivesFiles.setPid(archives.getId());
-							archivesFiles.setFileName(archivesFiles.getLabel());
-							archivesFiles.setUrl(archivesFiles.getValue());
-							archivesFiles.setCreateUser(AuthUtil.getUserId());
-							archivesFiles.setCreateTime(new Date());
-							archivesFilesMapper.insert(archivesFiles);
+						} else {
+							archives.setCreateUser(AuthUtil.getUserId());
+							archives.setCreateTime(new Date());
+							archives.setCreateUserName(AuthUtil.getUserName());
+							archives.setTenantId(AuthUtil.getTenantId());
+							archivesMapper.insert(archives);
+							List<ArchivesFiles> archivesFilesList = BeanUtil.copy(tradingBoxItem.getTradingBoxFilesList(), ArchivesFiles.class);
+							for (ArchivesFiles archivesFiles : archivesFilesList) {
+								archivesFiles.setId(null);
+								archivesFiles.setPid(archives.getId());
+								archivesFiles.setFileName(archivesFiles.getLabel());
+								archivesFiles.setUrl(archivesFiles.getValue());
+								archivesFiles.setCreateUser(AuthUtil.getUserId());
+								archivesFiles.setCreateTime(new Date());
+								archivesFilesMapper.insert(archivesFiles);
+							}
 						}
-					}
 
-					//记录箱轨迹信息
-					ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-					if ("BUY".equals(tradingBox.getType())) {
-						archivesTrajectory.setStatus("买箱");
-					} else if ("SELL".equals(tradingBox.getType())) {
-						archivesTrajectory.setStatus("卖箱");
+						//记录箱轨迹信息
+						ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
+						if ("BUY".equals(tradingBox.getType())) {
+							archivesTrajectory.setStatus("买箱");
+						} else if ("SELL".equals(tradingBox.getType())) {
+							archivesTrajectory.setStatus("卖箱");
+						}
+						archivesTrajectory.setCorpId(tradingBox.getPurchaseCompanyId());
+						archivesTrajectory.setCorpName(tradingBox.getPurchaseCompanyName());
+						archivesTrajectory.setContractNo(tradingBox.getContractNo());
+						archivesTrajectory.setBillType(tradingBox.getType());
+						archivesTrajectory.setCode(tradingBoxItem.getCode());
+						archivesTrajectory.setAddress(tradingBoxItem.getAddress());
+						archivesTrajectory.setNewDate(tradingBoxItem.getNewDate());
+						archivesTrajectory.setCreateTime(new Date());
+						archivesTrajectory.setCreateUser(AuthUtil.getUserId());
+						archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
+						archivesTrajectory.setTenantId(AuthUtil.getTenantId());
+						archivesTrajectoryMapper.insert(archivesTrajectory);
+					} else {
+						throw new RuntimeException("箱号不能为空");
 					}
-					archivesTrajectory.setCorpId(tradingBox.getPurchaseCompanyId());
-					archivesTrajectory.setCorpName(tradingBox.getPurchaseCompanyName());
-					archivesTrajectory.setContractNo(tradingBox.getContractNo());
-					archivesTrajectory.setBillType(tradingBox.getType());
-					archivesTrajectory.setCode(tradingBoxItem.getCode());
-					archivesTrajectory.setAddress(tradingBoxItem.getAddress());
-					archivesTrajectory.setNewDate(tradingBoxItem.getNewDate());
-					archivesTrajectory.setCreateTime(new Date());
-					archivesTrajectory.setCreateUser(AuthUtil.getUserId());
-					archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
-					archivesTrajectory.setTenantId(AuthUtil.getTenantId());
-					archivesTrajectoryMapper.insert(archivesTrajectory);
-				} else {
-					throw new RuntimeException("箱号不能为空");
 				}
 			}
 			tradingBox.setTradingBoxItemsList(tradingBoxItemList);
@@ -351,6 +354,11 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if (ObjectUtils.isNotNull(tradingBoxFeesList) && tradingBoxFeesList.size() > 0) {
 			for (TradingBoxFees tradingBoxFees : tradingBoxFeesList) {
 				if (tradingBoxFees.getId() == null) {
+					if ("BUY".equals(tradingBox.getType())) {
+						tradingBoxFees.setBillType("买箱");
+					} else {
+						tradingBoxFees.setBillType("卖箱");
+					}
 					tradingBoxFees.setCreateUser(AuthUtil.getUserId());
 					tradingBoxFees.setCreateTime(new Date());
 					tradingBoxFees.setTenantId(AuthUtil.getTenantId());
@@ -418,6 +426,9 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		List<TradingBoxItem> tradingBoxItemList = tradingBox.getTradingBoxItemsList();
 		int boxNumber = 0;
 		if (ObjectUtils.isNotNull(tradingBoxItemList) && tradingBoxItemList.size() > 0) {
+			//箱号拼接字符串
+			List<String> codes = tradingBoxItemList.stream().map(TradingBoxItem::getCode).distinct().collect(Collectors.toList());
+			tradingBox.setCode(String.join(",", codes));
 			for (TradingBoxItem tradingBoxItem : tradingBoxItemList) {
 				boxNumber += GeneralToolsUtils.boxNumber(tradingBoxItem.getBoxType());
 				if (tradingBox.getType().equals("ZR")) {
@@ -481,81 +492,84 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					}
 					tradingBoxItem.setTradingBoxFilesList(tradingBoxItemFilesList);
 				}
-				if (ObjectUtils.isNotNull(tradingBoxItem.getCode())) {
-					//更新箱档案信息
-					Archives archivesR = archivesMapper.selectOne(new LambdaQueryWrapper<Archives>().eq(Archives::getIsDeleted, 0).eq(Archives::getTenantId, AuthUtil.getTenantId()).eq(Archives::getCode, tradingBoxItem.getCode()));
-					Archives archives = new Archives();
-					if (ObjectUtils.isNotNull(archivesR)) {
-						BeanUtil.copy(archivesR, archives);
-					}
-					archives.setCode(tradingBoxItem.getCode());
-					archives.setName(tradingBoxItem.getBoxType());
-					archives.setVolume(tradingBoxItem.getVolume());
-					archives.setGorssWeight(tradingBoxItem.getGrossWeight());
-					archives.setStatus(tradingBoxItem.getStatus());
-					archives.setTypeId(tradingBoxItem.getBoxTypeId());
-					archives.setAddressId(tradingBoxItem.getAddressId());
-					archives.setAddress(tradingBoxItem.getAddress());
-					archives.setNewDate(tradingBoxItem.getNewDate());
-					archives.setLeasingCompanyId(tradingBox.getPurchaseCompanyId());
-					archives.setLeasingCompany(tradingBox.getPurchaseCompanyName());
-					archives.setBoxSource(tradingBoxItem.getBoxSource());
-					archives.setBoxStatus(tradingBoxItem.getBoxStatus());
-					archives.setEmptyWeight(tradingBoxItem.getEmptyWeight());
-					archives.setTare(tradingBoxItem.getTare());
-					archives.setLoadingWeight(tradingBoxItem.getLoadingWeight());
-					archives.setBoxMakingCompany(tradingBoxItem.getBoxMakingCompany());
-					archives.setBoxMakingCompanyId(tradingBoxItem.getBoxMakingCompanyId());
-					archives.setBoxMakingDate(tradingBoxItem.getBoxMakingDate());
-					archives.setLeaseCommencementDate(tradingBoxItem.getLeaseCommencementDate());
-					archives.setBoxAge(tradingBoxItem.getBoxAge());
-					archives.setPurchaseDate(tradingBoxItem.getLeaseCommencementDate());
-					archives.setContractNo(tradingBox.getContractNo());
-					if (ObjectUtils.isNotNull(archivesR)) {
-						archives.setUpdateTime(new Date());
-						archives.setUpdateUserName(AuthUtil.getUserName());
-						archives.setUpdateUser(AuthUtil.getUserId());
-						archivesMapper.updateById(archives);
+				String updateChar = tradingBoxItem.getCode() + tradingBoxItem.getBoxType() + tradingBoxItem.getAddress() + tradingBoxItem.getNewDate() + tradingBoxItem.getStatus();
+				if (ObjectUtils.isNull(tradingBoxItem.getUpdateChar()) || !updateChar.equals(tradingBoxItem.getUpdateChar())) {
+					if (ObjectUtils.isNotNull(tradingBoxItem.getCode())) {
+						//更新箱档案信息
+						Archives archivesR = archivesMapper.selectOne(new LambdaQueryWrapper<Archives>().eq(Archives::getIsDeleted, 0).eq(Archives::getTenantId, AuthUtil.getTenantId()).eq(Archives::getCode, tradingBoxItem.getCode()));
+						Archives archives = new Archives();
+						if (ObjectUtils.isNotNull(archivesR)) {
+							BeanUtil.copy(archivesR, archives);
+						}
+						archives.setCode(tradingBoxItem.getCode());
+						archives.setName(tradingBoxItem.getBoxType());
+						archives.setVolume(tradingBoxItem.getVolume());
+						archives.setGorssWeight(tradingBoxItem.getGrossWeight());
+						archives.setStatus(tradingBoxItem.getStatus());
+						archives.setTypeId(tradingBoxItem.getBoxTypeId());
+						archives.setAddressId(tradingBoxItem.getAddressId());
+						archives.setAddress(tradingBoxItem.getAddress());
+						archives.setNewDate(tradingBoxItem.getNewDate());
+						archives.setLeasingCompanyId(tradingBox.getPurchaseCompanyId());
+						archives.setLeasingCompany(tradingBox.getPurchaseCompanyName());
+						archives.setBoxSource(tradingBoxItem.getBoxSource());
+						archives.setBoxStatus(tradingBoxItem.getBoxStatus());
+						archives.setEmptyWeight(tradingBoxItem.getEmptyWeight());
+						archives.setTare(tradingBoxItem.getTare());
+						archives.setLoadingWeight(tradingBoxItem.getLoadingWeight());
+						archives.setBoxMakingCompany(tradingBoxItem.getBoxMakingCompany());
+						archives.setBoxMakingCompanyId(tradingBoxItem.getBoxMakingCompanyId());
+						archives.setBoxMakingDate(tradingBoxItem.getBoxMakingDate());
+						archives.setLeaseCommencementDate(tradingBoxItem.getLeaseCommencementDate());
+						archives.setBoxAge(tradingBoxItem.getBoxAge());
+						archives.setPurchaseDate(tradingBoxItem.getLeaseCommencementDate());
+						archives.setContractNo(tradingBox.getContractNo());
+						if (ObjectUtils.isNotNull(archivesR)) {
+							archives.setUpdateTime(new Date());
+							archives.setUpdateUserName(AuthUtil.getUserName());
+							archives.setUpdateUser(AuthUtil.getUserId());
+							archivesMapper.updateById(archives);
 
-					} else {
-						archives.setCreateUser(AuthUtil.getUserId());
-						archives.setCreateTime(new Date());
-						archives.setCreateUserName(AuthUtil.getUserName());
-						archives.setTenantId(AuthUtil.getTenantId());
-						archivesMapper.insert(archives);
-						List<ArchivesFiles> archivesFilesList = BeanUtil.copy(tradingBoxItem.getTradingBoxFilesList(), ArchivesFiles.class);
-						for (ArchivesFiles archivesFiles : archivesFilesList) {
-							archivesFiles.setId(null);
-							archivesFiles.setPid(archives.getId());
-							archivesFiles.setFileName(archivesFiles.getLabel());
-							archivesFiles.setUrl(archivesFiles.getValue());
-							archivesFiles.setCreateUser(AuthUtil.getUserId());
-							archivesFiles.setCreateTime(new Date());
-							archivesFilesMapper.insert(archivesFiles);
+						} else {
+							archives.setCreateUser(AuthUtil.getUserId());
+							archives.setCreateTime(new Date());
+							archives.setCreateUserName(AuthUtil.getUserName());
+							archives.setTenantId(AuthUtil.getTenantId());
+							archivesMapper.insert(archives);
+							List<ArchivesFiles> archivesFilesList = BeanUtil.copy(tradingBoxItem.getTradingBoxFilesList(), ArchivesFiles.class);
+							for (ArchivesFiles archivesFiles : archivesFilesList) {
+								archivesFiles.setId(null);
+								archivesFiles.setPid(archives.getId());
+								archivesFiles.setFileName(archivesFiles.getLabel());
+								archivesFiles.setUrl(archivesFiles.getValue());
+								archivesFiles.setCreateUser(AuthUtil.getUserId());
+								archivesFiles.setCreateTime(new Date());
+								archivesFilesMapper.insert(archivesFiles);
+							}
 						}
-					}
 
-					//记录箱轨迹信息
-					ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-					if ("ZR".equals(tradingBox.getType())) {
-						archivesTrajectory.setStatus("租入");
-					} else if ("ZC".equals(tradingBox.getType())) {
-						archivesTrajectory.setStatus("租出");
+						//记录箱轨迹信息
+						ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
+						if ("ZR".equals(tradingBox.getType())) {
+							archivesTrajectory.setStatus("租入");
+						} else if ("ZC".equals(tradingBox.getType())) {
+							archivesTrajectory.setStatus("租出");
+						}
+						archivesTrajectory.setCorpId(tradingBox.getPurchaseCompanyId());
+						archivesTrajectory.setCorpName(tradingBox.getPurchaseCompanyName());
+						archivesTrajectory.setContractNo(tradingBox.getContractNo());
+						archivesTrajectory.setBillType(tradingBox.getType());
+						archivesTrajectory.setCode(tradingBoxItem.getCode());
+						archivesTrajectory.setAddress(tradingBoxItem.getAddress());
+						archivesTrajectory.setNewDate(tradingBoxItem.getNewDate());
+						archivesTrajectory.setCreateTime(new Date());
+						archivesTrajectory.setCreateUser(AuthUtil.getUserId());
+						archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
+						archivesTrajectory.setTenantId(AuthUtil.getTenantId());
+						archivesTrajectoryMapper.insert(archivesTrajectory);
+					} else {
+						throw new RuntimeException("箱号不能为空");
 					}
-					archivesTrajectory.setCorpId(tradingBox.getPurchaseCompanyId());
-					archivesTrajectory.setCorpName(tradingBox.getPurchaseCompanyName());
-					archivesTrajectory.setContractNo(tradingBox.getContractNo());
-					archivesTrajectory.setBillType(tradingBox.getType());
-					archivesTrajectory.setCode(tradingBoxItem.getCode());
-					archivesTrajectory.setAddress(tradingBoxItem.getAddress());
-					archivesTrajectory.setNewDate(tradingBoxItem.getNewDate());
-					archivesTrajectory.setCreateTime(new Date());
-					archivesTrajectory.setCreateUser(AuthUtil.getUserId());
-					archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
-					archivesTrajectory.setTenantId(AuthUtil.getTenantId());
-					archivesTrajectoryMapper.insert(archivesTrajectory);
-				} else {
-					throw new RuntimeException("箱号不能为空");
 				}
 			}
 			tradingBox.setTradingBoxItemsList(tradingBoxItemList);
@@ -567,10 +581,14 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if (ObjectUtils.isNotNull(tradingBoxFeesList) && tradingBoxFeesList.size() > 0) {
 			for (TradingBoxFees tradingBoxFees : tradingBoxFeesList) {
 				if (tradingBoxFees.getId() == null) {
+					if ("ZR".equals(tradingBox.getType())) {
+						tradingBoxFees.setBillType("租入");
+					} else {
+						tradingBoxFees.setBillType("租出");
+					}
 					tradingBoxFees.setCreateUser(AuthUtil.getUserId());
 					tradingBoxFees.setCreateTime(new Date());
 					tradingBoxFees.setTenantId(AuthUtil.getTenantId());
-
 					tradingBoxFeesMapper.insert(tradingBoxFees);
 				} else {
 					tradingBoxFees.setUpdateUser(AuthUtil.getUserId());
@@ -994,8 +1012,10 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				}
 				if ("ZR".equals(tradingBox.getType())) {
 					tradingBoxFees.setFeesType(2);
+					tradingBoxFees.setBillType("租入");
 				} else {
 					tradingBoxFees.setFeesType(1);
+					tradingBoxFees.setBillType("租出");
 				}
 				tradingBoxFees.setPid(tradingBox.getId());
 				tradingBoxFees.setSrcOrderNo(tradingBox.getContractNo());
@@ -1016,6 +1036,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				} else {
 					items.setSrcFeesType("付费");
 				}
+				items.setSrcBoxBillType(tradingBoxFees.getBillType());
 				items.setItemType(tradingBox.getType());
 				items.setPrice(tradingBoxFees.getPrice());
 				//账单数据
@@ -1145,8 +1166,10 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			}
 			if ("ZR".equals(tradingBox.getType())) {
 				tradingBoxFees.setFeesType(2);
+				tradingBoxFees.setBillType("租入");
 			} else {
 				tradingBoxFees.setFeesType(1);
+				tradingBoxFees.setBillType("租出");
 			}
 			tradingBoxFees.setPid(tradingBox.getId());
 			tradingBoxFees.setSrcOrderNo(tradingBox.getContractNo());
@@ -1174,6 +1197,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			} else {
 				items.setSrcFeesType("付费");
 			}
+			items.setSrcBoxBillType(tradingBoxFees.getBillType());
 			items.setItemType(tradingBox.getType());
 			items.setPrice(tradingBoxFees.getPrice());
 			//账单数据
@@ -1289,8 +1313,13 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			tradingBoxItem.setUpdateTime(new Date());
 			tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
 			tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
-			tradingBoxItem.setRentEndDate(tradingBoxFeesList.get(0).getRentEndDate());
-			tradingBoxItem.setRentStartDate(tradingBoxFeesList.get(0).getRentStartDate());
+			if (tradingBoxFeesList.size() == 1) {
+				tradingBoxItem.setRentEndDate(tradingBoxItem.getLeaseCommencementDate());
+				tradingBoxItem.setRentStartDate(tradingBoxItem.getLeaseCommencementDate());
+			} else {
+				tradingBoxItem.setRentEndDate(tradingBoxFeesList.get(0).getRentEndDate());
+				tradingBoxItem.setRentStartDate(tradingBoxFeesList.get(0).getRentStartDate());
+			}
 			tradingBoxItemMapper.updateById(tradingBoxItem);
 		}
 		tradingBox.setTradingBoxItemsList(tradingBoxItemList);
@@ -1300,8 +1329,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
-	public R
-	importTradingBoxInfo(List<TradingBoxItemRentExcelEnter> excelList, boolean b, Long corpId, String corpName, String billType) {
+	public R importTradingBoxInfo(List<TradingBoxItemRentExcelEnter> excelList, boolean b, Long corpId, String corpName, String billType) {
 		List<TradingBoxItem> tradingBoxItemList = new ArrayList<>();
 		List<TradingBoxFees> tradingBoxFeesList = new ArrayList<>();
 		for (TradingBoxItemRentExcelEnter tradingBoxItemExcelEnter : excelList) {
@@ -1318,6 +1346,16 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				Archives archives = archivesMapper.selectOne(lambdaQueryWrapper);
 				if (ObjectUtils.isNull(archives)) {
 					throw new RuntimeException("箱号:" + tradingBoxItem.getCode() + "不存在,请修改后再进行操作!");
+				} else {
+					if ("SELL".equals(billType)) {
+						if (!"购买".equals(archives.getBoxSource()) || !"待使用".equals(archives.getStatus())) {
+							throw new RuntimeException("箱号:" + tradingBoxItem.getCode() + "。不是购买的或正在使用不能卖出");
+						}
+					} else {
+						if (!"待使用".equals(archives.getStatus())) {
+							throw new RuntimeException("箱号:" + tradingBoxItem.getCode() + "。正在使用不能重复使用");
+						}
+					}
 				}
 			}
 			if (ObjectUtils.isNull(tradingBoxItem.getAddress())) {
@@ -1405,6 +1443,171 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		}
 	}
 
+	@Override
+	public TradingBox copyDocument(TradingBox tradingBox) {
+		if (tradingBox.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		TradingBox details = baseMapper.selectById(tradingBox.getId());
+
+		Long feesId = null;
+
+		//获取费用id
+		R<FeesDesc> fees = feesDescClient.getFeesByName("租金");
+		if (fees.isSuccess() && fees.getData() != null) {
+			feesId = fees.getData().getId();
+		}
+		if (ObjectUtils.isNotNull(details)) {
+			//获取明细信息
+			LambdaQueryWrapper<TradingBoxItem> tradingBoxItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			tradingBoxItemLambdaQueryWrapper.eq(TradingBoxItem::getIsDeleted, 0)
+				.eq(TradingBoxItem::getTenantId, AuthUtil.getTenantId())
+				.eq(TradingBoxItem::getPid, details.getId());
+			List<TradingBoxItem> tradingBoxItemList = tradingBoxItemMapper.selectList(tradingBoxItemLambdaQueryWrapper);
+			for (TradingBoxItem tradingBoxItem : tradingBoxItemList) {
+				//获取费用信息
+				LambdaQueryWrapper<TradingBoxFees> tradingBoxFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getIsDeleted, 0)
+					.eq(TradingBoxFees::getTenantId, AuthUtil.getTenantId())
+					.eq(TradingBoxFees::getCode, tradingBoxItem.getCode())
+					.eq(ObjectUtils.isNotNull(feesId), TradingBoxFees::getItemId, feesId)
+					.eq(TradingBoxFees::getPid, details.getId());
+				int count = tradingBoxFeesMapper.selectCount(tradingBoxFeesLambdaQueryWrapper);
+				tradingBoxItem.setCount(count);
+				tradingBoxItem.setId(null);
+				tradingBoxItem.setPid(null);
+				tradingBoxItem.setCreateUserName(null);
+				tradingBoxItem.setCreateUser(null);
+				tradingBoxItem.setCreateTime(null);
+				tradingBoxItem.setUpdateUserName(null);
+				tradingBoxItem.setUpdateTime(null);
+				tradingBoxItem.setUpdateUser(null);
+				if ("ZR".equals(tradingBox.getType()) || "ZC".equals(tradingBox.getType())) {
+					tradingBoxItem.setLeaseCommencementDate(null);
+					tradingBoxItem.setRentingOutDate(null);
+					tradingBoxItem.setRentEndDate(null);
+					tradingBoxItem.setRentStartDate(null);
+					if ("ZR".equals(tradingBox.getType())) {
+						tradingBoxItem.setStatus("录入");
+					} else {
+						tradingBoxItem.setStatus("使用");
+					}
+				}
+				tradingBoxItem.setTradingBoxFilesList(new ArrayList<>());
+			}
+			details.setTradingBoxItemsList(tradingBoxItemList);
+
+			//获取费用信息
+			LambdaQueryWrapper<TradingBoxFees> tradingBoxFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getIsDeleted, 0)
+				.eq(TradingBoxFees::getTenantId, AuthUtil.getTenantId())
+				.eq(TradingBoxFees::getPid, details.getId());
+			List<TradingBoxFees> tradingBoxFeesList = tradingBoxFeesMapper.selectList(tradingBoxFeesLambdaQueryWrapper);
+			for (TradingBoxFees tradingBoxFees : tradingBoxFeesList) {
+				R<FeesDesc> r = feesDescClient.detail(tradingBoxFees.getItemId());
+				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+					tradingBoxFees.setItemName(r.getData().getCname());
+				}
+				CorpsDesc corpsDesc = corpsDescClient.getCorpId(tradingBoxFees.getCorpId());
+				if (ObjectUtils.isNotNull(corpsDesc)) {
+					tradingBoxFees.setCorpName(corpsDesc.getCname());
+				}
+				tradingBoxFees.setId(null);
+				tradingBoxFees.setPid(null);
+				tradingBoxFees.setCreateUser(null);
+				tradingBoxFees.setCreateTime(null);
+				tradingBoxFees.setUpdateTime(null);
+				tradingBoxFees.setUpdateUser(null);
+				tradingBoxFees.setSubmitPay(0);
+			}
+			details.setTradingBoxFeesList(tradingBoxFeesList);
+			details.setTradingBoxFilesList(new ArrayList<>());
+		}
+		details.setId(null);
+		details.setCreateUserName(null);
+		details.setCreateUser(null);
+		details.setCreateTime(null);
+		details.setUpdateUserName(null);
+		details.setUpdateTime(null);
+		details.setUpdateUser(null);
+		details.setStatus(0);
+		details.setApprovalStatus(null);
+		details.setPageStatus(null);
+		details.setSysNo(null);
+		return details;
+	}
+
+	@Override
+	public Object revokeRentingOut(TradingBox tradingBox) {
+		List<TradingBoxItem> tradingBoxItemList = tradingBox.getTradingBoxItemsList();
+		if (tradingBoxItemList.size() < 1) {
+			throw new RuntimeException("明细不能为空");
+		}
+		for (TradingBoxItem tradingBoxItem : tradingBoxItemList) {
+			//获取订单费用信息
+			LambdaQueryWrapper<TradingBoxFees> tradingBoxFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getIsDeleted, 0);
+			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getPid, tradingBox.getId());
+			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getTenantId, AuthUtil.getTenantId());
+			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getSubmitPay, 1);
+			tradingBoxFeesLambdaQueryWrapper.eq(TradingBoxFees::getCode, tradingBoxItem.getCode());
+			tradingBoxFeesLambdaQueryWrapper.orderByDesc(TradingBoxFees::getCreateTime);
+			List<TradingBoxFees> tradingBoxFeesList = tradingBoxFeesMapper.selectList(tradingBoxFeesLambdaQueryWrapper);
+			if (tradingBoxFeesList.size() > 0) {
+				tradingBoxFeesMapper.deleteById(tradingBoxFeesList.get(0).getId());
+				//获取账单信息
+				Acc acc = new Acc();
+				acc.setSrcParentId(tradingBox.getId());
+				acc.setSrcFeesId(tradingBoxFeesList.get(0).getId());
+				if ("ZR".equals(tradingBox.getType())) {
+					acc.setBillType("申请");
+					tradingBoxItem.setStatus("待使用");
+				} else {
+					acc.setBillType("收费");
+					tradingBoxItem.setStatus("使用");
+				}
+				acc.setTradeType("BOX");
+				acc.setSrcType(5);
+				R<List<Acc>> r = financeClient.getAccListByCondition(acc);
+				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+					for (Acc acc_ : r.getData()) {
+						//判断是否有结算 true 不允许撤销审核  false 删除账单信息并撤销审核
+						if (!acc_.getSettlementAmount().equals(new BigDecimal("0.00"))) {
+							throw new SecurityException("订单已结算,不允许撤销");
+						} else {
+							financeClient.remove(acc_.getId() + "");
+						}
+					}
+				}
+			} else {
+				throw new SecurityException("箱号:" + tradingBoxItem.getCode() + "未计算租金,撤销失败");
+			}
+			tradingBoxItem.setUpdateTime(new Date());
+			tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
+			tradingBoxItem.setUpdateUserName(AuthUtil.getUserName());
+			tradingBoxItem.setRentEndDate(tradingBoxFeesList.get(0).getRentEndDate());
+			tradingBoxItem.setRentStartDate(tradingBoxFeesList.get(0).getRentStartDate());
+			tradingBoxItem.setRentingOutDate(null);
+			tradingBoxItemMapper.updateById(tradingBoxItem);
+			if (ObjectUtils.isNotNull(tradingBoxItem.getCode())) {
+				//更新箱档案信息
+				Archives archivesR = archivesMapper.selectOne(new LambdaQueryWrapper<Archives>().eq(Archives::getIsDeleted, 0).eq(Archives::getTenantId, AuthUtil.getTenantId()).eq(Archives::getCode, tradingBoxItem.getCode()));
+				if (ObjectUtils.isNotNull(archivesR)) {
+					archivesR.setUpdateTime(new Date());
+					archivesR.setUpdateUserName(AuthUtil.getUserName());
+					archivesR.setUpdateUser(AuthUtil.getUserId());
+					if ("ZR".equals(tradingBox.getType())) {
+						archivesR.setStatus("待使用");
+					} else {
+						archivesR.setStatus("使用");
+					}
+					archivesMapper.updateById(archivesR);
+				}
+			}
+		}
+		return tradingBox;
+	}
+
 	/**
 	 * 订单生成账单 并且推送财务消息
 	 *
@@ -1452,6 +1655,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				} else {
 					items.setSrcFeesType("付费");
 				}
+				items.setSrcBoxBillType(tradingBoxFees.getBillType());
 				items.setItemType(itemType);
 				items.setPrice(price);
 				//账单数据

+ 90 - 13
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java

@@ -192,9 +192,8 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 			//箱号拼接字符串
 			List<String> codes = transportItemList.stream().map(TransportItem::getCode).distinct().collect(Collectors.toList());
 			transport.setCode(String.join(",", codes));
-			if (ObjectUtils.isNotNull(transport.getTotalAmount())) {
-				transport.setTotalAmount(transportItemList.stream().map(TransportItem::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
-			}
+			transport.setTotalAmount(transportItemList.stream().map(TransportItem::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			transport.setOverdueAmount(transportItemList.stream().map(TransportItem::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 			for (TransportItem transportItem : transportItemList) {
 				boxNumber += GeneralToolsUtils.boxNumber(transportItem.getBoxType());
 				//明细数据修改添加
@@ -235,6 +234,11 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 		if (ObjectUtils.isNotNull(transportItemFeesList) && transportItemFeesList.size() > 0) {
 			for (TransportItemFees transportItemFees : transportItemFeesList) {
 				if (transportItemFees.getId() == null) {
+					if ("CKZY".equals(transport.getBillType())) {
+						transportItemFees.setBillType("出口装运");
+					} else {
+						transportItemFees.setBillType("进口返程");
+					}
 					transportItemFees.setCreateUser(AuthUtil.getUserId());
 					transportItemFees.setCreateTime(new Date());
 					transportItemFees.setTenantId(AuthUtil.getTenantId());
@@ -342,6 +346,11 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 							transportItemFees.setTenantId(AuthUtil.getTenantId());
 							transportItemFees.setPid(transport.getId());
 							transportItemFees.setFeesType(1);
+							if ("CKZY".equals(transport.getBillType())){
+								transportItemFees.setBillType("出口装运");
+							}else{
+								transportItemFees.setBillType("进口返程");
+							}
 							transportItemFees.setCode(transportItem.getCode());
 							transportItemFees.setSort(1);
 							transportItemFees.setItemId(feesDescR.getData().getId());
@@ -374,10 +383,10 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 
 			//添加箱轨迹信息
 			ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-			if (ObjectUtils.isNotNull(transport.getCorpId())){
+			if (ObjectUtils.isNotNull(transport.getCorpId())) {
 				archivesTrajectory.setCorpId(transport.getCorpId());
 				archivesTrajectory.setCorpName(transport.getCorpName());
-			}else{
+			} else {
 				archivesTrajectory.setCorpId(transport.getShippingCompanyId());
 				archivesTrajectory.setCorpName(transport.getShippingCompany());
 			}
@@ -636,7 +645,7 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 	}
 
 	@Override
-	public R importTransportInfo(List<TransportItemExcelEnter> excelList, boolean b, Long corpId, String corpName,String billType) {
+	public R importTransportInfo(List<TransportItemExcelEnter> excelList, boolean b, Long corpId, String corpName, String billType) {
 		List<TransportItem> transportItemList = new ArrayList<>();
 		List<TransportItemFees> transportItemFeesList = new ArrayList<>();
 		for (TransportItemExcelEnter transportItemExcelEnter : excelList) {
@@ -697,16 +706,16 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 				transportItemFees.setItemName("租金");
 			}
 			transportItemFees.setAmount(transportItem.getAmount());
-			if ("CKZY".equals(billType)){
+			if ("CKZY".equals(billType)) {
 				transportItemFees.setFeesType(1);
-			}else{
+			} else {
 				transportItemFees.setFeesType(2);
 			}
 			transportItemFees.setUnit(transportItem.getBoxType());
 			transportItemFees.setCurrency(transportItem.getCurrency());
-			if ("CNY".equals(transportItem.getCurrency())){
+			if ("CNY".equals(transportItem.getCurrency())) {
 				transportItemFees.setExchangeRate(new BigDecimal(1));
-			}else{
+			} else {
 				transportItemFees.setExchangeRate(new BigDecimal("6.30"));
 			}
 			transportItemFees.setAutoGenerate("1");
@@ -716,12 +725,79 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 			transportItemFees.setCode(transportItem.getCode());
 			transportItemFeesList.add(transportItemFees);
 		}
-		Map<String,Object> map = new HashMap<>();
-		map.put("transportItemList",transportItemList);
-		map.put("transportItemFeesList",transportItemFeesList);
+		Map<String, Object> map = new HashMap<>();
+		map.put("transportItemList", transportItemList);
+		map.put("transportItemFeesList", transportItemFeesList);
 		return R.data(map);
 	}
 
+	@Override
+	public Transport copyDocument(Transport transport) {
+		if (transport.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+
+		Transport detail = baseMapper.selectById(transport.getId());
+		if (ObjectUtils.isNotNull(detail)) {
+			//获取明细信息
+			LambdaQueryWrapper<TransportItem> transportItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			transportItemLambdaQueryWrapper.eq(TransportItem::getIsDeleted, 0)
+				.eq(TransportItem::getTenantId, AuthUtil.getTenantId())
+				.eq(TransportItem::getPid, detail.getId());
+			List<TransportItem> transportItemList = transportItemMapper.selectList(transportItemLambdaQueryWrapper);
+			for (TransportItem transportItem : transportItemList) {
+				transportItem.setId(null);
+				transportItem.setPid(null);
+				transportItem.setCreateUserName(null);
+				transportItem.setCreateUser(null);
+				transportItem.setCreateTime(null);
+				transportItem.setUpdateUserName(null);
+				transportItem.setUpdateTime(null);
+				transportItem.setUpdateUser(null);
+				transportItem.setStatus("录入");
+			}
+			detail.setTransportItemList(transportItemList);
+
+			//获取费用信息
+			LambdaQueryWrapper<TransportItemFees> transportItemFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			transportItemFeesLambdaQueryWrapper.eq(TransportItemFees::getIsDeleted, 0)
+				.eq(TransportItemFees::getTenantId, AuthUtil.getTenantId())
+				.eq(TransportItemFees::getPid, detail.getId());
+			List<TransportItemFees> transportItemFeesList = transportItemFeesMapper.selectList(transportItemFeesLambdaQueryWrapper);
+			for (TransportItemFees transportItemFees : transportItemFeesList) {
+				R<FeesDesc> r = feesDescClient.detail(transportItemFees.getItemId());
+				if (r.isSuccess() && ObjectUtils.isNotNull(r.getData())) {
+					transportItemFees.setItemName(r.getData().getCname());
+				}
+				CorpsDesc corpsDesc = corpsDescClient.getCorpId(transportItemFees.getCorpId());
+				if (ObjectUtils.isNotNull(corpsDesc)) {
+					transportItemFees.setCorpName(corpsDesc.getCname());
+				}
+				transportItemFees.setId(null);
+				transportItemFees.setPid(null);
+				transportItemFees.setCreateUser(null);
+				transportItemFees.setCreateTime(null);
+				transportItemFees.setUpdateTime(null);
+				transportItemFees.setUpdateUser(null);
+				transportItemFees.setSubmitPay(0);
+			}
+			detail.setTransportItemFeesList(transportItemFeesList);
+			detail.setTransportFilesList(new ArrayList<>());
+		}
+		detail.setId(null);
+		detail.setCreateUserName(null);
+		detail.setCreateUser(null);
+		detail.setCreateTime(null);
+		detail.setUpdateUserName(null);
+		detail.setUpdateTime(null);
+		detail.setUpdateUser(null);
+		detail.setStatus(0);
+		detail.setApprovalStatus(null);
+		detail.setPageStatus(null);
+		detail.setSysNo(null);
+		return detail;
+	}
+
 	/**
 	 * 订单生成账单 并且推送财务消息
 	 *
@@ -768,6 +844,7 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 				} else {
 					items.setSrcFeesType("付费");
 				}
+				items.setSrcBoxBillType(transportItemFees.getBillType());
 				items.setItemType(itemType);
 				items.setPrice(price);
 				//账单数据

+ 19 - 2
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

@@ -1928,6 +1928,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				.eq(OrderItems::getPid, order.getId());
 			List<OrderItems> orderItemsList = orderItemsService.list(orderItemsLambdaQueryWrapper);
 			for (OrderItems orderItems : orderItemsList) {
+				if (ObjectUtils.isNull(orderItems.getPrice())){
+					orderItems.setPrice(new BigDecimal("0.00"));
+				}
+				if (ObjectUtils.isNull(orderItems.getPurchasePrice())){
+					orderItems.setPurchasePrice(new BigDecimal("0.00"));
+				}
+
 				BigDecimal stockPrice = new BigDecimal("0.00");
 				BigDecimal surplusRouteQuantity = new BigDecimal("0.00");
 				BigDecimal balanceQuantity = new BigDecimal("0.00");
@@ -1950,7 +1957,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 						r.getData().setOutQuantity(r.getData().getOutQuantity().add(orderItems.getStorageInQuantity()));
 						r.getData().setOutAmount(r.getData().getOutAmount().add(orderItems.getAmount()));
 
-
 						BigDecimal grossProfits =  orderItems.getPrice().subtract(orderItems.getPurchasePrice());
 						grossProfit = grossProfit.add(orderItems.getStorageInQuantity().multiply(grossProfits));
 
@@ -2160,7 +2166,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 				settlementList = order.getSettlementList();
 			}
 			Settlement settlement = new Settlement();
-			settlement.setDc("d");
+			if("XS".equals(order.getBillType())){
+				settlement.setDc("d");
+				settlement.setBillType("收费");
+			}else{
+				settlement.setDc("c");
+				settlement.setBillType("付费");
+			}
 			settlement.setSettlementDate(new Date());
 			settlement.setAccount(order.getAccount());
 			settlement.setAmount(order.getCurrentAmount());
@@ -2382,6 +2394,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
 		order.setSettlmentAmount(order.getOrderAmount().subtract(order.getOrderAmount()));
 		baseMapper.updateById(order);
+		// 保存订单文件信息
+		if (CollectionUtils.isNotEmpty(order.getOrderFilesList())) {
+			List<OrderFiles> orderFilesList = orderFilesService.saveOrderFileMessage(order.getOrderFilesList(), date, order.getId());
+			order.setOrderFilesList(orderFilesList);
+		}
 		return R.data(order);
 	}
 

+ 13 - 13
blade-service/trade-finance/src/main/java/org/springblade/finance/controller/AccController.java

@@ -185,34 +185,34 @@ public class AccController extends BladeController {
 			}
 		}
 		List<CorpsDesc> corpsDescList = corpsDescClient.selectByCorpIds(corpIds);
-		pages.getRecords().forEach(e -> {
+		for (Acc acc_:pages.getRecords()) {
 			//录入人
-			e.setCreateUserName(iUserClient.userInfoById(e.getCreateUser()).getData().getRealName());
+			acc_.setCreateUserName(iUserClient.userInfoById(acc_.getCreateUser()).getData().getRealName());
 			//费用名称
-			if (StringUtils.isNotBlank(e.getCostType())) {
-				R<FeesDesc> detail = iFeesDescClient.detail(Long.valueOf(e.getCostType()));
+			if (StringUtils.isNotBlank(acc_.getCostType())) {
+				R<FeesDesc> detail = iFeesDescClient.detail(Long.valueOf(acc_.getCostType()));
 				if (detail.isSuccess() && detail.getData() != null) {
-					e.setItemName(detail.getData().getCname());
+					acc_.setItemName(detail.getData().getCname());
 				}
 			}
 			//客户名称
-			if (e.getCorpId() != null) {
+			if (acc_.getCorpId() != null) {
 				if (ObjectUtil.isNotEmpty(corpsDescList)) {
-					CorpsDesc corpsDesc = corpsDescList.stream().filter(d -> d.getId().equals(e.getCorpId())).findFirst().orElse(null);
+					CorpsDesc corpsDesc = corpsDescList.stream().filter(d -> d.getId().equals(acc_.getCorpId())).findFirst().orElse(null);
 					if (ObjectUtils.isNotNull(corpsDesc)) {
-						e.setCorpName(corpsDesc.getCname());
+						acc_.setCorpName(corpsDesc.getCname());
 					}
 				}
 			}
-			e.setOutstandingAmount(e.getAmount().subtract(e.getSettlementAmount()));
+			acc_.setOutstandingAmount(acc_.getAmount().subtract(acc_.getSettlementAmount()));
 			//获取所属公司中文名
-			if (e.getCompanyid() != null) {
-				R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(e.getCompanyid());
+			if (acc_.getCompanyid() != null) {
+				R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(acc_.getCompanyid());
 				if (corpMessage.isSuccess() && corpMessage.getData() != null) {
-					e.setCompany(corpMessage.getData().getCname());
+					acc_.setCompany(corpMessage.getData().getCname());
 				}
 			}
-		});
+		}
 		return R.data(pages);
 	}
 

+ 1 - 1
blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

@@ -2495,7 +2495,7 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 				if (settlement.getId() == null) {
 					Settlement model = new Settlement();
 					model.setSrcOrderno(acc.getAccSysNo());
-					model.setBillType(acc.getDc());
+					model.setBillType(settlement.getBillType());
 					model.setCorpId(acc.getCorpId());
 					model.setCorpName(acc.getCorpName());
 					model.setPlanSettlementDate(acc.getRetrieval());