Kaynağa Gözat

1.海运出口,客户订舱增加海关信息相关字段
2.客户订舱增加同步海关信息接口
3.对账,付费申请,费用明细,账单明细增加快递单号字段
4.财务获取账单接口增加快递单号检索条件
5.财务获取增加快递单号导入接口

纪新园 4 ay önce
ebeveyn
işleme
f8c50cc176
37 değiştirilmiş dosya ile 930 ekleme ve 150 silme
  1. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/ExpenseApplication.java
  2. 29 8
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBox.java
  3. 132 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/SeaBillsDetail.java
  4. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FeeCenter.java
  5. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FinAccBills.java
  6. 31 4
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/dto/FinStlBillsItemsReports.java
  7. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java
  8. 18 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBillsItems.java
  9. 7 4
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Role.java
  10. 2 2
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/controller/BCurrencyController.java
  11. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/IBCurrencyService.java
  12. 5 2
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/impl/BCurrencyServiceImpl.java
  13. 12 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java
  14. 2 2
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/PutBoxController.java
  15. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/TradingBoxController.java
  16. 15 8
      blade-service/blade-los/src/main/java/org/springblade/los/box/dynamics/service/impl/BoxDynamicsRecordServiceImpl.java
  17. 14 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ExpenseApplicationServiceImpl.java
  18. 201 81
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java
  19. 20 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/amends/service/impl/AmendsServiceImpl.java
  20. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/impl/MktSlotServiceImpl.java
  21. 14 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BookingCabinController.java
  22. 6 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.xml
  23. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java
  24. 153 24
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  25. 20 3
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/TemplateImportServiceImpl.java
  26. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java
  27. 14 1
      blade-service/blade-los/src/main/java/org/springblade/los/excel/BillsExcel.java
  28. 53 0
      blade-service/blade-los/src/main/java/org/springblade/los/excel/TrackingNumberExcel.java
  29. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FeeCenterController.java
  30. 29 8
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FinAccBillsController.java
  31. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java
  32. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FinAccBillsServiceImpl.java
  33. 29 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java
  34. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/operatingExpenses/controller/OperatingExpensesController.java
  35. 22 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/operatingExpenses/service/impl/OperatingExpensesServiceImpl.java
  36. 46 1
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java
  37. 15 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java

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

@@ -166,6 +166,12 @@ public class ExpenseApplication implements Serializable {
 	private String tenantId;
 
 	/**
+	 * 版本
+	 */
+	@ApiModelProperty(value = "版本")
+	private String version;
+
+	/**
 	 * 费用中心
 	 */
 	@TableField(exist = false)

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

@@ -151,26 +151,47 @@ public class PutBox implements Serializable {
 	@ApiModelProperty(value = "目的港代码")
 	private String podCode;
 	/**
-	 * 起运港场站
+	 * 实际起运港场站
 	 */
-	@ApiModelProperty(value = "起运港场站")
+	@ApiModelProperty(value = "实际起运港场站")
 	private Long polStationId;
 	/**
-	 * 起运港场站编码
+	 * 实际起运港场站编码
 	 */
-	@ApiModelProperty(value = "起运港场站编码")
+	@ApiModelProperty(value = "实际起运港场站编码")
 	private String polStationCode;
 	/**
-	 * 起运港场站中文
+	 * 实际起运港场站中文
 	 */
-	@ApiModelProperty(value = "起运港场站中文")
+	@ApiModelProperty(value = "实际起运港场站中文")
 	private String polStationCname;
 	/**
-	 * 起运港场站英文
+	 * 实际起运港场站英文
 	 */
-	@ApiModelProperty(value = "起运港场站英文")
+	@ApiModelProperty(value = "实际起运港场站英文")
 	private String polStationEname;
 	/**
+	 * 预计起运港场站
+	 */
+	@ApiModelProperty(value = "预计起运港场站")
+	private Long estimatedPolStationId;
+	/**
+	 * 预计起运港场站编码
+	 */
+	@ApiModelProperty(value = "预计起运港场站编码")
+	private String estimatedPolStationCode;
+	/**
+	 * 预计起运港场站中文
+	 */
+	@ApiModelProperty(value = "预计起运港场站中文")
+	private String estimatedPolStationCname;
+	/**
+	 * 预计起运港场站英文
+	 */
+	@ApiModelProperty(value = "预计起运港场站英文")
+	private String estimatedPolStationEname;
+
+	/**
 	 * 箱型
 	 */
 	@ApiModelProperty(value = "箱型")

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

@@ -553,5 +553,137 @@ public class SeaBillsDetail implements Serializable {
 	@TableField("m_notify2_cnty_name")
 	private String mnotify2CntyName;
 
+	/**
+	 * 海关信息 发货人代码
+	 */
+	@ApiModelProperty(value = "海关信息 发货人代码")
+	private String customsShipperCode;
+
+	/**
+	 * 海关信息 发货人名称
+	 */
+	@ApiModelProperty(value = "海关信息 发货人名称")
+	private String customsShipperName;
+
+	/**
+	 * 海关信息 发货人 联系人电话
+	 */
+	@ApiModelProperty(value = "海关信息 发货人 联系人电话")
+	private String customsShipperTel;
+
+	/**
+	 * 海关信息 发货人国家/地区
+	 */
+	@ApiModelProperty(value = "海关信息 发货人国家/地区")
+	private String customsShipperCountry;
+
+	/**
+	 * 海关信息 发货人 联系人邮件
+	 */
+	@ApiModelProperty(value = "海关信息 发货人 联系人邮件")
+	private String customsShipperEmail;
+
+	/**
+	 * 海关信息 发货人地址
+	 */
+	@ApiModelProperty(value = "海关信息 发货人地址")
+	private String customsShipperAddress;
+
+	/**
+	 * 海关信息 收货人代码
+	 */
+	@ApiModelProperty(value = "海关信息 收货人代码")
+	private String customsConsigneeCode;
+
+	/**
+	 * 海关信息 收货人名称
+	 */
+	@ApiModelProperty(value = "海关信息 收货人名称")
+	private String customsConsigneeName;
+
+	/**
+	 * 海关信息 收货人 联系人电话
+	 */
+	@ApiModelProperty(value = "海关信息 收货人 联系人电话")
+	private String customsConsigneeTel;
+
+	/**
+	 * 海关信息 收货人国家/地区
+	 */
+	@ApiModelProperty(value = "海关信息 收货人国家/地区")
+	private String customsConsigneeCountry;
+
+	/**
+	 * 海关信息 收货人 联系人邮件
+	 */
+	@ApiModelProperty(value = "海关信息 收货人 联系人邮件")
+	private String customsConsigneeEmail;
+
+	/**
+	 * 海关信息 收货人地址
+	 */
+	@ApiModelProperty(value = "海关信息 收货人地址")
+	private String customsConsigneeAddress;
+
+	/**
+	 * 海关信息 通知人代码
+	 */
+	@ApiModelProperty(value = "海关信息 通知人代码")
+	private String customsNotifyCode;
+
+	/**
+	 * 海关信息 通知人名称
+	 */
+	@ApiModelProperty(value = "海关信息 通知人名称")
+	private String customsNotifyName;
+
+	/**
+	 * 海关信息 通知人 联系人电话
+	 */
+	@ApiModelProperty(value = "海关信息 通知人 联系人电话")
+	private String customsNotifyTel;
+
+	/**
+	 * 海关信息 通知人国家/地区
+	 */
+	@ApiModelProperty(value = "海关信息 通知人国家/地区")
+	private String customsNotifyCountry;
+
+	/**
+	 * 海关信息 通知人 联系人邮件
+	 */
+	@ApiModelProperty(value = "海关信息 通知人 联系人邮件")
+	private String customsNotifyEmail;
+
+	/**
+	 * 海关信息 通知人地址
+	 */
+	@ApiModelProperty(value = "海关信息 通知人地址")
+	private String customsNotifyAddress;
+
+	/**
+	 * 海关货物类型  进口SI  出口SE
+	 */
+	@ApiModelProperty(value = "海关货物类型")
+	private String customsGoodsType;
+
+	/**
+	 * 提交人
+	 */
+	@ApiModelProperty(value = "提交人")
+	private Long submitterId;
+
+	/**
+	 * 提交人
+	 */
+	@ApiModelProperty(value = "提交人")
+	private String submitterName;
+
+	/**
+	 * 提交时间
+	 */
+	@ApiModelProperty(value = "提交时间")
+	private Date submitterDate;
+
 
 }

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FeeCenter.java

@@ -1070,6 +1070,11 @@ public class FeeCenter implements Serializable {
 	 */
 	@ApiModelProperty(value = "成本价")
 	private BigDecimal costPrice;
+	/**
+	 * 快递单号
+	 */
+	@ApiModelProperty(value = "快递单号")
+	private String trackingNumber;
 
 }
 

+ 6 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FinAccBills.java

@@ -858,5 +858,11 @@ public class FinAccBills implements Serializable {
 	@ApiModelProperty(value = "单据所属公司")
 	private String billBranchName;
 
+	/**
+	 * 快递单号
+	 */
+	@ApiModelProperty(value = "快递单号")
+	private String trackingNumber;
+
 
 }

+ 31 - 4
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/dto/FinStlBillsItemsReports.java

@@ -16,8 +16,6 @@
  */
 package org.springblade.los.finance.stl.dto;
 
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -129,14 +127,43 @@ public class FinStlBillsItemsReports implements Serializable {
 	 */
 	private Integer teu;
 	/**
-	 *箱型箱量
+	 * 箱型箱量
 	 */
 	private String quantityCntrDescr;
 
 	/**
-	 *币别
+	 * 币别
 	 */
 	private String curCode;
 
+	/**
+	 * 箱号
+	 */
+	private String boxNumber;
+
+	/**
+	 * 20GP
+	 */
+	private Integer quantityV20;
+
+	/**
+	 * 40GP
+	 */
+	private Integer quantityV40;
+
+	/**
+	 * 40HC
+	 */
+	private Integer quantityV40hc;
+
+	/**
+	 * 20HC
+	 */
+	private Integer quantityV20HC;
+	/**
+	 * 40FR
+	 */
+	private Integer quantityV40FR;
+
 
 }

+ 6 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java

@@ -639,6 +639,12 @@ public class FinStlBills implements Serializable {
 	private String whetherManual;
 
 	/**
+	 * 快递单号
+	 */
+	@ApiModelProperty(value = "快递单号")
+	private String trackingNumber;
+
+	/**
 	 * 联系人姓名
 	 */
 	@TableField(exist = false)

+ 18 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBillsItems.java

@@ -727,6 +727,24 @@ public class FinStlBillsItems implements Serializable {
 	@ApiModelProperty(value = "代收、付客户英文名称")
 	private String generationCorpEnName;
 
+	/**
+	 * 快递单号
+	 */
+	@ApiModelProperty(value = "快递单号")
+	private String trackingNumber;
+
+	/**
+	 * 快递金额
+	 */
+	@ApiModelProperty(value = "快递金额")
+	private BigDecimal expressDeliveryAmount;
+
+	/**
+	 * 快递状态 0=正常  1=金额不等
+	 */
+	@ApiModelProperty(value = "快递状态")
+	private String expressDeliveryStatus;
+
 
 	/**
 	 * 已申请金额

+ 7 - 4
blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Role.java

@@ -16,10 +16,7 @@
  */
 package org.springblade.system.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
@@ -86,5 +83,11 @@ public class Role implements Serializable {
 	@ApiModelProperty(value = "是否已删除")
 	private Integer isDeleted;
 
+	/**
+	 * 临时id
+	 */
+	@TableField(exist = false)
+	private Long srcId;
+
 
 }

+ 2 - 2
blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/controller/BCurrencyController.java

@@ -281,8 +281,8 @@ public class BCurrencyController extends BladeController {
 	 * 复制
 	 */
 	@GetMapping("/copy")
-	public R copy(@RequestParam("id")Long id) {
-		return bCurrencyService.copy(id);
+	public R copy(@RequestParam("id")Long id,@RequestParam("exrateYear")Integer exrateYear) {
+		return bCurrencyService.copy(id,exrateYear);
 	}
 
 

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/IBCurrencyService.java

@@ -103,5 +103,5 @@ public interface IBCurrencyService extends IService<BCurrency> {
 
 	List<BCurrency> getBCurrency(BCurrency reports);
 
-	R copy(Long id);
+	R copy(Long id,Integer exrateYear);
 }

+ 5 - 2
blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/impl/BCurrencyServiceImpl.java

@@ -980,7 +980,7 @@ public class BCurrencyServiceImpl extends ServiceImpl<CurrencyMapper, BCurrency>
 	}
 
 	@Override
-	public R copy(Long id) {
+	public R copy(Long id, Integer exrateYear) {
 		BCurrency currency = baseMapper.selectById(id);
 		List<BCurExrate> curExrateList = bCurExrateService.list(new LambdaQueryWrapper<BCurExrate>()
 			.eq(BCurExrate::getTenantId, AuthUtil.getTenantId())
@@ -990,6 +990,9 @@ public class BCurrencyServiceImpl extends ServiceImpl<CurrencyMapper, BCurrency>
 		if (!curExrateList.isEmpty()) {
 			List<BCurExrate> exrateList = new ArrayList<>();
 			for (BCurExrate item : curExrateList) {
+				if (exrateYear.equals(item.getExrateYear())) {
+					throw new RuntimeException(item.getExrateYear() + "年度汇率已存在,请先修改汇率年后再复制");
+				}
 				item.setId(null);
 				item.setCreateTime(null);
 				item.setCreateDept(null);
@@ -999,7 +1002,7 @@ public class BCurrencyServiceImpl extends ServiceImpl<CurrencyMapper, BCurrency>
 				item.setUpdateTime(null);
 				item.setUpdateUser(null);
 				item.setUpdateUserName(null);
-				item.setExrateYear(currency.getAnnual());
+				item.setExrateYear(exrateYear);
 				exrateList.add(item);
 			}
 			bCurExrateService.saveBatch(exrateList);

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

@@ -789,6 +789,18 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 								if (!billsList.isEmpty()) {
 									String quantityCntrDescr = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).map(Bills::getQuantityCntrDescr).collect(Collectors.joining(","));
 									finStlBillsItemsReports.setQuantityCntrTypesDescr(quantityCntrDescr);
+									String boxNumber = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).map(Bills::getExtendedData).collect(Collectors.joining(","));
+									finStlBillsItemsReports.setBoxNumber(boxNumber);
+									Integer quantityV20 = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).mapToInt(Bills::getQuantityV20).sum();
+									finStlBillsItemsReports.setQuantityV20(quantityV20);
+									Integer quantityV40 = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).mapToInt(Bills::getQuantityV40).sum();
+									finStlBillsItemsReports.setQuantityV40(quantityV40);
+									Integer quantityV40hc = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).mapToInt(Bills::getQuantityV40hc).sum();
+									finStlBillsItemsReports.setQuantityV40hc(quantityV40hc);
+									Integer quantityV20HC = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).mapToInt(Bills::getQuantityV45).sum();
+									finStlBillsItemsReports.setQuantityV20HC(quantityV20HC);
+									Integer quantityV40FR = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).mapToInt(Bills::getQuantityV48).sum();
+									finStlBillsItemsReports.setQuantityV40FR(quantityV40FR);
 								}
 								finStlBillsItemsReports.setMblno(item.getMblno());
 								finStlBillsItemsReports.setHblno(item.getHblno());

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

@@ -200,11 +200,11 @@ public class PutBoxController extends BladeController {
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(putBox.getCabinType()), PutBox::getCabinType, putBox.getCabinType());
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(putBox.getAirlineId()), PutBox::getAirlineId, putBox.getAirlineId());
 		}
-		if (ObjectUtils.isNotNull(putBox.getEtd())) {
+		/*if (ObjectUtils.isNotNull(putBox.getEtd())) {
 			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
 			lambdaQueryWrapper.apply("DATE_FORMAT(effective_start_date,'%Y-%m-%d') <= '" + formatter.format(putBox.getEtd()) + "'")
 				.apply("DATE_FORMAT(effective_end_date,'%Y-%m-%d') >= '" + formatter.format(putBox.getEtd()) + "'");
-		}
+		}*/
 		List<PutBox> putBoxList = putBoxService.list(lambdaQueryWrapper);
 		List<SeaContainerNumberItem> containerNumberItemList = new ArrayList<>();
 		for (PutBox item : putBoxList) {

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

@@ -391,7 +391,7 @@ public class TradingBoxController extends BladeController {
 	 * OW撤销费用 - PickUp
 	 */
 	@GetMapping("/revokePickUpCost")
-	public R revokePickUpCost(@RequestParam("id") Long id,@RequestParam("accountDate") String itemIds) {
+	public R revokePickUpCost(@RequestParam("id") Long id,@RequestParam(value = "itemIds",required = false) String itemIds) {
 		return tradingBoxService.revokePickUpCost(id,itemIds);
 	}
 

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

@@ -441,12 +441,13 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 								putBoxItem.setPolCyEname(item.getPortEname());
 								putBoxItem.setPolPickUpDate(item.getApproachExitDate());
 								putBoxItem.setPolPreAppearanceDate(item.getApproachExitDate());
+								putBoxItem.setBoxStatus(item.getBoxStatus());
 							} else {
 								putBoxItem = new PutBoxItems();
 								putBoxItem.setBoxClass(putBox.getBusType());
 								putBoxItem.setBoxBelongsTo("SOC");
 								putBoxItem.setBoxCondition("新");
-								putBoxItem.setBoxStatus("好");
+								putBoxItem.setBoxStatus(item.getBoxStatus());
 								putBoxItem.setStatus("待使用");
 								putBoxItem.setPid(putBox.getId());
 								putBoxItem.setContainerNumber(item.getContainerNumber());
@@ -467,7 +468,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							putBoxItem.setBoxClass(putBox.getBusType());
 							putBoxItem.setBoxBelongsTo("SOC");
 							putBoxItem.setBoxCondition("新");
-							putBoxItem.setBoxStatus("好");
+							putBoxItem.setBoxStatus(item.getBoxStatus());
 							putBoxItem.setStatus("待使用");
 							putBoxItem.setBoxClass(putBox.getBusType());
 							putBoxItem.setPid(putBox.getId());
@@ -541,7 +542,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 											}
 											putBoxItem.setBoxClass(putBox.getBusType());
 											tradingBoxItem.setBoxCondition("新");
-											tradingBoxItem.setBoxStatus("好");
+											tradingBoxItem.setBoxStatus(item.getBoxStatus());
 											tradingBoxItem.setPid(tradingBox.getId());
 											tradingBoxItem.setContainerNumber(item.getContainerNumber());
 											tradingBoxItem.setCode(item.getBoxCode());
@@ -581,7 +582,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										}
 										tradingBoxItem.setBoxBelongsTo("SOC");
 										tradingBoxItem.setBoxCondition("新");
-										tradingBoxItem.setBoxStatus("好");
+										tradingBoxItem.setBoxStatus(item.getBoxStatus());
 										tradingBoxItem.setPid(tradingBox.getId());
 										tradingBoxItem.setContainerNumber(item.getContainerNumber());
 										tradingBoxItem.setCode(item.getBoxCode());
@@ -912,6 +913,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										putBoxItem.setEta(billsHYJK.getEta());
 										putBoxItem.setStatus("已完成");
 										putBoxItem.setBoxDynamics("已返场");
+										putBoxItem.setBoxStatus(recordItems.getBoxStatus());
 										putBoxItemsOldList.add(putBoxItem);
 									} else {
 										throw new RuntimeException("未查到原放箱号:" + archives.getContainerNumber() + "中箱号为:" + item.getCntrNo() + "数据");
@@ -935,6 +937,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 													tradingBoxItem.setPodStationEname(recordItems.getStationEname());
 													tradingBoxItem.setPodStationCode(recordItems.getStationCode());
 													tradingBoxItem.setPodEmptyContainerReturnDate(recordItems.getApproachExitDate());
+													tradingBoxItem.setBoxStatus(recordItems.getBoxStatus());
 													tradingBoxItem.setBoxDynamics("已返场");
 													tradingBoxItem.setStatus("已完成");
 													tradingBoxItem.setPortId(billsHYJK.getPodId());
@@ -1084,6 +1087,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										putBoxItem.setPodStationCode(recordItems.getStationCname());
 										putBoxItem.setPodStationCname(recordItems.getStationEname());
 										putBoxItem.setPodStationEname(recordItems.getStationCode());
+										putBoxItem.setBoxStatus(recordItems.getBoxStatus());
 										putBoxItem.setPodFreeBoxUseDays(billsHYJK.getPodFreeBoxUseDays());
 										putBoxItem.setEta(billsHYJK.getEta());
 										putBoxItem.setStatus("已完成");
@@ -1110,6 +1114,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 												tradingBoxItem.setPodStationCode(recordItems.getStationCname());
 												tradingBoxItem.setPodStationCname(recordItems.getStationEname());
 												tradingBoxItem.setPodStationEname(recordItems.getStationCode());
+												tradingBoxItem.setBoxStatus(recordItems.getBoxStatus());
 												tradingBoxItem.setBoxDynamics("已返场");
 												tradingBoxItem.setStatus("已完成");
 												tradingBoxItem.setPortId(billsHYJK.getPodId());
@@ -1500,6 +1505,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							putBoxItem.setPid(putBoxData.getId());
 							putBoxItem.setMblno(bills.getMblno());
 							putBoxItem.setBoxDynamics("空箱出场");
+							putBoxItem.setBoxStatus(item.getBoxStatus());
 							putBoxItem.setPolCyId(item.getStationId());
 							putBoxItem.setPolCyCode(item.getStationCode());
 							putBoxItem.setPolCyCname(item.getStationCname());
@@ -1521,7 +1527,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 							putBoxItem.setBoxClass(putBoxData.getBusType());
 							putBoxItem.setBoxBelongsTo("SOC");
 							putBoxItem.setBoxCondition("新");
-							putBoxItem.setBoxStatus("好");
+							putBoxItem.setBoxStatus(item.getBoxStatus());
 							putBoxItem.setStatus("使用中");
 							putBoxItem.setPid(putBoxData.getId());
 							putBoxItem.setContainerNumber(item.getContainerNumber());
@@ -1550,7 +1556,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 						putBoxItem.setBoxClass(putBoxData.getBusType());
 						putBoxItem.setBoxBelongsTo("SOC");
 						putBoxItem.setBoxCondition("新");
-						putBoxItem.setBoxStatus("好");
+						putBoxItem.setBoxStatus(item.getBoxStatus());
 						putBoxItem.setStatus("使用中");
 						putBoxItem.setPid(putBoxData.getId());
 						putBoxItem.setContainerNumber(item.getContainerNumber());
@@ -1628,6 +1634,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										tradingBoxItem.setShipEname(bills.getVesselEnName());
 										tradingBoxItem.setPolFreeBoxUseDays(bills.getPolFreeBoxUseDays());
 										tradingBoxItem.setEtd(bills.getEtd());
+										tradingBoxItem.setBoxStatus(item.getBoxStatus());
 									} else {
 										tradingBoxItem = new TradingBoxItem();
 										tradingBoxItem.setBoxBelongsTo("SOC");
@@ -1638,7 +1645,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 										}
 										putBoxItem.setBoxClass(putBox.getBusType());
 										tradingBoxItem.setBoxCondition("新");
-										tradingBoxItem.setBoxStatus("好");
+										tradingBoxItem.setBoxStatus(item.getBoxStatus());
 										tradingBoxItem.setPid(tradingBox.getId());
 										tradingBoxItem.setAgentName(bills.getForeignAgencyCnName());
 										tradingBoxItem.setContainerNumber(item.getContainerNumber());
@@ -1684,7 +1691,7 @@ public class BoxDynamicsRecordServiceImpl extends ServiceImpl<BoxDynamicsRecordM
 									}
 									tradingBoxItem.setBoxBelongsTo("SOC");
 									tradingBoxItem.setBoxCondition("新");
-									tradingBoxItem.setBoxStatus("好");
+									tradingBoxItem.setBoxStatus(item.getBoxStatus());
 									tradingBoxItem.setPid(tradingBox.getId());
 									tradingBoxItem.setContainerNumber(item.getContainerNumber());
 									tradingBoxItem.setCode(item.getBoxCode());

+ 14 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/ExpenseApplicationServiceImpl.java

@@ -49,6 +49,7 @@ import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.finance.fee.service.IFinAccBillsService;
+import org.springblade.los.finance.operatingExpenses.entity.OperatingExpenses;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -121,8 +122,19 @@ public class ExpenseApplicationServiceImpl extends ServiceImpl<ExpenseApplicatio
 			expenseApplication.setCreateUser(AuthUtil.getUserId());
 			expenseApplication.setCreateUserName(AuthUtil.getUserName());
 			expenseApplication.setTenantId(AuthUtil.getTenantId());
+			expenseApplication.setVersion("1");
 			baseMapper.insert(expenseApplication);
 		} else {
+			ExpenseApplication dataSourceBill = baseMapper.selectOne(new LambdaQueryWrapper<ExpenseApplication>()
+				.select(ExpenseApplication::getId,  ExpenseApplication::getVersion)
+				.eq(ExpenseApplication::getId, expenseApplication.getId()));
+			if (!Objects.equals(dataSourceBill.getVersion(), expenseApplication.getVersion())) {
+				return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+			}
+			// 每更新一次往上累加一次版本
+			// 旧数据处理
+			int version = StringUtil.isBlank(dataSourceBill.getVersion()) ? 1 : Integer.parseInt(dataSourceBill.getVersion());
+			expenseApplication.setVersion(String.valueOf(version + 1));
 			expenseApplication.setUpdateTime(new Date());
 			expenseApplication.setUpdateUser(AuthUtil.getUserId());
 			expenseApplication.setUpdateUserName(AuthUtil.getUserName());
@@ -374,6 +386,7 @@ public class ExpenseApplicationServiceImpl extends ServiceImpl<ExpenseApplicatio
 					throw new RuntimeException("费用:" + item.getFeeCnName() + "缺少业务日期,请重新保存");
 				}
 				FinAccBills data = new FinAccBills();
+				data.setTrackingNumber(item.getTrackingNumber());
 				data.setGenerationCorpId(item.getGenerationCorpId());
 				data.setGenerationCorpCnName(item.getGenerationCorpCnName());
 				data.setGenerationCorpEnName(item.getGenerationCorpEnName());
@@ -751,6 +764,7 @@ public class ExpenseApplicationServiceImpl extends ServiceImpl<ExpenseApplicatio
 					throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单");
 				}
 				FinAccBills data = new FinAccBills();
+				data.setTrackingNumber(item.getTrackingNumber());
 				data.setGenerationCorpId(item.getGenerationCorpId());
 				data.setGenerationCorpCnName(item.getGenerationCorpCnName());
 				data.setGenerationCorpEnName(item.getGenerationCorpEnName());

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

@@ -302,6 +302,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			tradingBox.setTenantId(AuthUtil.getTenantId());
 			tradingBox.setStatus(0);
 			tradingBox.setBuxStaus("录入");
+			tradingBox.setVersion("1");
 			baseMapper.insert(tradingBox);
 		} else {
 			TradingBox dataTradingBox = baseMapper.selectOne(new LambdaQueryWrapper<TradingBox>()
@@ -932,6 +933,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if (!feeCenterList.isEmpty()) {
 			feeCenterService.saveOrUpdateBatch(feeCenterList);
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		tradingBox.setTradingBoxItemsList(tradingBoxItemList);
 		return tradingBox;
@@ -1035,6 +1038,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			}
 		}
 		detail.setRentEndDate(tradingBox.getRentDate());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		if (!itemList.isEmpty()) {
 			tradingBoxItemService.updateBatchById(itemList);
@@ -1105,6 +1110,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			detail.setRentEndDate(itemList.get(0).getRentEndDate());
 			tradingBoxItemService.updateBatchById(itemList);
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		detail.setTradingBoxItemsList(tradingBoxItemList);
 		return detail;
@@ -1285,6 +1292,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			detail.setRentingOutDate(null);
 			tradingBoxItemService.updateBatchById(itemList);
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		if (!archivesListNew.isEmpty()) {
 			archivesService.saveOrUpdateBatch(archivesListNew);
@@ -1540,6 +1549,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			throw new RuntimeException("必要参数未填写");
 		}
 		TradingBox tradingBox = baseMapper.selectById(detail.getId());
+		int version = StringUtil.isBlank(tradingBox.getVersion()) ? 1 : Integer.parseInt(tradingBox.getVersion());
+		tradingBox.setVersion(String.valueOf(version + 1));
 		if ("OW-N,OW-F".contains(tradingBox.getType())) {
 			tradingBox.setWhetherEnable("是");
 			tradingBox.setContainerNumber(detail.getContainerNumber());
@@ -1637,6 +1648,10 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				putBox.setPolStationCode(detail.getPolStationCode());
 				putBox.setPolStationCname(detail.getPolStationCname());
 				putBox.setPolStationEname(detail.getPolStationEname());
+				putBox.setEstimatedPolStationId(detail.getPolStationId());
+				putBox.setEstimatedPolStationCode(detail.getPolStationCode());
+				putBox.setEstimatedPolStationCname(detail.getPolStationCname());
+				putBox.setEstimatedPolStationEname(detail.getPolStationEname());
 				putBox.setPodStationId(detail.getPodStationId());
 				putBox.setPodStationCode(detail.getPodStationCode());
 				putBox.setPodStationCname(detail.getPodStationCname());
@@ -1985,6 +2000,10 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				putBox.setPolStationCname(detail.getPolStationCname());
 				putBox.setPolStationEname(detail.getPolStationEname());
 				putBox.setPolStationCode(detail.getPolStationCode());
+				putBox.setEstimatedPolStationId(detail.getPolStationId());
+				putBox.setEstimatedPolStationCode(detail.getPolStationCode());
+				putBox.setEstimatedPolStationCname(detail.getPolStationCname());
+				putBox.setEstimatedPolStationEname(detail.getPolStationEname());
 				putBox.setPodId(detail.getPodId());
 				putBox.setPodCname(detail.getPodCname());
 				putBox.setPodEname(detail.getPodEname());
@@ -2071,90 +2090,142 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		tradingBox.setUpdateTime(new Date());
 		tradingBox.setUpdateUser(AuthUtil.getUserId());
 		tradingBox.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(tradingBox.getVersion()) ? 1 : Integer.parseInt(tradingBox.getVersion());
+		tradingBox.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(tradingBox);
-		/*if ("XGDX".equals(tradingBox.getType()) || "CCSQ".equals(tradingBox.getType())) {
-			List<TradingBoxItem> tradingBoxItemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
-				.eq(TradingBoxItem::getPid, tradingBox.getId())
-				.eq(TradingBoxItem::getTenantId, AuthUtil.getTenantId())
-				.eq(TradingBoxItem::getIsDeleted, 0));
-			if (tradingBoxItemList.isEmpty()) {
-				throw new RuntimeException("调箱明细不能为空");
-			}
-			List<String> boxCode = tradingBoxItemList.stream().map(TradingBoxItem::getCode).collect(Collectors.toList());
-			List<Archives> archivesList = archivesService.list(new LambdaQueryWrapper<Archives>()
-				.eq(Archives::getTenantId, AuthUtil.getTenantId())
-				.eq(Archives::getIsDeleted, 0)
-				.eq(Archives::getStatus, "待使用")
-				.in(Archives::getCode, boxCode));
-			if (archivesList.isEmpty()) {
-				throw new RuntimeException("未查到可调箱");
-			}
-			List<Archives> archivesListNew = new ArrayList<>();
-			List<ArchivesTrajectory> archivesTrajectoryList = new ArrayList<>();
-			for (TradingBoxItem item : tradingBoxItemList) {
-				Archives archives = archivesList.stream().filter(e -> e.getCode().equals(item.getCode())).findFirst().orElse(null);
-				if (archives == null) {
-					throw new RuntimeException("箱号:" + item.getCode() + "未查到或状态不可用");
-				}
-				archives.setNewDate(new Date());
-				archives.setAddressId(Long.parseLong(tradingBox.getPodId()));
-				archives.setAddressCode(tradingBox.getPodCode());
-				archives.setAddressCname(tradingBox.getPodCname());
-				archives.setAddressEname(tradingBox.getPodEname());
-				archives.setStationId(tradingBox.getPodStationId());
-				archives.setStationCode(tradingBox.getPodStationCode());
-				archives.setStationCname(tradingBox.getPodStationCname());
-				archives.setStationEname(tradingBox.getPodStationEname());
-				archives.setUpdateTime(new Date());
-				archives.setUpdateUser(AuthUtil.getUserId());
-				archives.setUpdateUserName(AuthUtil.getUserName());
-				archivesListNew.add(archives);
-				//记录箱轨迹信息
-				ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-				if ("CCSQ".equals(tradingBox.getType())){
-					archivesTrajectory.setStatus("出场申请");
-				}else if ("XGDX".equals(tradingBox.getType())){
-					archivesTrajectory.setStatus("调箱");
-				}else{
-					archivesTrajectory.setStatus("");
-				}
-				archivesTrajectory.setPortId(Long.parseLong(tradingBox.getPodId()));
-				archivesTrajectory.setPortCode(tradingBox.getPodCode());
-				archivesTrajectory.setPortCname(tradingBox.getPodCname());
-				archivesTrajectory.setPortEname(tradingBox.getPodEname());
-				archivesTrajectory.setStationId(tradingBox.getPodStationId());
-				archivesTrajectory.setStationCode(tradingBox.getPodStationCode());
-				archivesTrajectory.setStationCname(tradingBox.getPodStationCname());
-				archivesTrajectory.setStationEname(tradingBox.getPodStationEname());
-				archivesTrajectory.setContainerNumber(item.getContainerNumber());
-				archivesTrajectory.setBoxType(item.getBoxType());
-				archivesTrajectory.setBoxCategory(item.getBoxCategory());
-				archivesTrajectory.setBoxEastId(item.getBoxEastId());
-				archivesTrajectory.setBoxEastName(item.getBoxEastName());
-				archivesTrajectory.setMblno(item.getMblno());
-				archivesTrajectory.setBoxDynamics(item.getBoxDynamics());
-				archivesTrajectory.setNewDate(tradingBox.getRentDate());
-				archivesTrajectory.setCorpId(tradingBox.getPurchaseCompanyId());
-				archivesTrajectory.setCorpName(tradingBox.getPurchaseCompanyName());
-				archivesTrajectory.setContractNo(tradingBox.getContractNo());
-				archivesTrajectory.setBillType(tradingBox.getType());
-				archivesTrajectory.setCode(item.getCode());
-				archivesTrajectory.setPortCname(tradingBox.getAddressCname());
-				archivesTrajectory.setNewDate(new Date());
-				archivesTrajectory.setCreateTime(new Date());
-				archivesTrajectory.setCreateUser(AuthUtil.getUserId());
-				archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
-				archivesTrajectory.setTenantId(AuthUtil.getTenantId());
-				archivesTrajectory.setSrcId(tradingBox.getId());
-				archivesTrajectoryList.add(archivesTrajectory);
-			}
-			if (!archivesListNew.isEmpty()) {
-				archivesService.updateBatchById(archivesListNew);
+		if ("XGDX".equals(tradingBox.getType()) || "CCSQ".equals(tradingBox.getType())) {
+			PutBox putBox = putBoxService.getOne(new LambdaQueryWrapper<PutBox>()
+				.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+				.eq(PutBox::getIsDeleted, 0)
+				.eq(PutBox::getContainerNumber, tradingBox.getContainerNumber())
+				.eq(PutBox::getPolId, tradingBox.getPodId())
+				.eq(PutBox::getPolStationId, tradingBox.getPodStationId())
+				.eq(PutBox::getBoxType, tradingBox.getBoxTypeQuantityOne())
+			);
+			if (putBox != null) {
+				PutBox finalPutBox = putBox;
+				if (!putBox.getBoxEastId().contains(tradingBox.getPurchaseCompanyId() + "")) {
+					putBox.setBoxEastId(putBox.getBoxEastId() + "," + tradingBox.getPurchaseCompanyId());
+					putBox.setBoxEastName(putBox.getBoxEastName() + "," + tradingBox.getPurchaseCompanyName());
+				}
+				putBox.setUpdateUser(AuthUtil.getUserId());
+				putBox.setUpdateTime(new Date());
+				putBox.setUpdateUserName(AuthUtil.getUserName());
+
+				putBox.setTotalNum(putBox.getTotalNum() + tradingBox.getBoxNumber());
+				putBox.setRemainingNum(putBox.getTotalNum() - putBox.getOccupyNum());
+				putBox.setStorageNum(putBox.getStorageNum() + tradingBox.getBoxNumber());
+
+				if (ObjectUtils.isNotNull(putBox.getPodId())) {
+					String podId = putBox.getPodId() + "," + tradingBox.getPodId();
+					List<String> podIdList = Arrays.asList(podId.trim().split(","));
+					String podCode = putBox.getPodCode() + "," + tradingBox.getPodCode();
+					List<String> podCodeList = Arrays.asList(podCode.trim().split(","));
+					putBox.setPodId(String.join(",", podIdList));
+					putBox.setPodCname(String.join(",", podCodeList));
+					putBox.setPodEname(String.join(",", podCodeList));
+					putBox.setPodCode(String.join(",", podCodeList));
+				} else {
+					putBox.setPodId(tradingBox.getPodId());
+					putBox.setPodCname(tradingBox.getPodCname());
+					putBox.setPodEname(tradingBox.getPodEname());
+					putBox.setPodCode(tradingBox.getPodCode());
+				}
+				putBoxService.updateById(putBox);
+			} else {
+				putBox = new PutBox();
+				putBox.setCreateUser(AuthUtil.getUserId());
+				putBox.setCreateTime(new Date());
+				putBox.setCreateUserName(AuthUtil.getUserName());
+				putBox.setWhetherManuallyCreate("1");
+				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("未找到可用业务类型");
+				}
+				String code;
+				if ("DL".equals(tradingBox.getType())) {
+					putBox.setBusType("代理箱");
+					putBox.setBoxClass("代理箱");
+					code = "FXH-DL";
+				} else {
+					putBox.setBusType("自有箱");
+					putBox.setBoxClass("自有箱");
+					code = "FXH-ZY";
+				}
+				BusinessBillNo businessBillNo = new BusinessBillNo();
+				businessBillNo.setBusinessTypeId(businessType.getId());
+				businessBillNo.setCode(code);
+				R clientBillNo = businessBillNoService.getBillNoLos(businessBillNo);
+				if (!clientBillNo.isSuccess()) {
+					throw new RuntimeException("生成订单编号失败");
+				}
+				putBox.setSysNo((String) clientBillNo.getData());
+				putBox.setBoxEastId(tradingBox.getPurchaseCompanyId() + "");
+				putBox.setBoxEastName(tradingBox.getPurchaseCompanyName());
+				putBox.setAgentId(tradingBox.getPurchaseCompanyId());
+				putBox.setAgentName(tradingBox.getPurchaseCompanyName());
+				putBox.setContainerNumber(tradingBox.getContainerNumber());
+				if ("DL".equals(tradingBox.getType())) {
+					putBox.setBusType("代理箱");
+					putBox.setBoxClass("代理箱");
+				} else {
+					putBox.setBusType("自有箱");
+					putBox.setBoxClass("自有箱");
+				}
+				if (ObjectUtils.isNotNull(tradingBox.getInternalContainerNumber())) {
+					putBox.setInternalContainerNumber(tradingBox.getInternalContainerNumber());
+				} else {
+					BusinessBillNo businessBillNo1 = new BusinessBillNo();
+					businessBillNo1.setBusinessTypeId(businessType.getId());
+					businessBillNo1.setCode("FXH-N");
+					R clientBillNo1 = businessBillNoService.getBillNoLos(businessBillNo1);
+					if (!clientBillNo1.isSuccess()) {
+						throw new RuntimeException("生成订单编号失败");
+					}
+					putBox.setInternalContainerNumber((String) clientBillNo1.getData());
+				}
+				putBox.setBoxBelongsTo("SOC");
+				putBox.setPolId(Long.parseLong(tradingBox.getPodId()));
+				putBox.setPolCname(tradingBox.getPodCname());
+				putBox.setPolEname(tradingBox.getPodEname());
+				putBox.setPolCode(tradingBox.getPodCode());
+				putBox.setPolStationId(tradingBox.getPodStationId());
+				putBox.setPolStationCname(tradingBox.getPodStationCname());
+				putBox.setPolStationEname(tradingBox.getPodStationEname());
+				putBox.setPolStationCode(tradingBox.getPodStationCode());
+				putBox.setBoxCondition("");
+				putBox.setBoxType(tradingBox.getBoxTypeQuantityOne());
+				putBox.setBoxClass("");
+				putBox.setTotalNum(tradingBox.getBoxNumber());
+				putBox.setRemainingNum(tradingBox.getBoxNumber());
+				putBox.setStorageNum(tradingBox.getBoxNumber());
+				putBoxService.save(putBox);
 			}
-			if (!archivesTrajectoryList.isEmpty()) {
-				archivesTrajectoryService.saveBatch(archivesTrajectoryList);
+			PutBox putBoxOld = putBoxService.getOne(new LambdaQueryWrapper<PutBox>()
+				.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+				.eq(PutBox::getIsDeleted, 0)
+				.eq(PutBox::getContainerNumber, tradingBox.getContainerNumber())
+				.eq(PutBox::getPolId, tradingBox.getPolId())
+				.eq(PutBox::getPolStationId, tradingBox.getPolStationId())
+				.eq(PutBox::getBoxType, tradingBox.getBoxTypeQuantityOne())
+			);
+			if (putBoxOld == null){
+				throw new RuntimeException("未查到调出放箱号单据");
 			}
-		}*/
+			putBoxOld.setUpdateUser(AuthUtil.getUserId());
+			putBoxOld.setUpdateTime(new Date());
+			putBoxOld.setUpdateUserName(AuthUtil.getUserName());
+
+			putBoxOld.setTotalNum(putBoxOld.getTotalNum() - tradingBox.getBoxNumber());
+			putBoxOld.setRemainingNum(putBoxOld.getTotalNum() - putBoxOld.getOccupyNum());
+			putBoxOld.setStorageNum(putBoxOld.getStorageNum() - tradingBox.getBoxNumber());
+			putBoxService.updateById(putBoxOld);
+		}
 		return tradingBox;
 	}
 
@@ -2168,7 +2239,50 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		tradingBox.setUpdateTime(new Date());
 		tradingBox.setUpdateUser(AuthUtil.getUserId());
 		tradingBox.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(tradingBox.getVersion()) ? 1 : Integer.parseInt(tradingBox.getVersion());
+		tradingBox.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(tradingBox);
+		if ("XGDX".equals(tradingBox.getType()) || "CCSQ".equals(tradingBox.getType())) {
+			PutBox putBox = putBoxService.getOne(new LambdaQueryWrapper<PutBox>()
+				.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+				.eq(PutBox::getIsDeleted, 0)
+				.eq(PutBox::getContainerNumber, tradingBox.getContainerNumber())
+				.eq(PutBox::getPolId, tradingBox.getPodId())
+				.eq(PutBox::getPolStationId, tradingBox.getPodStationId())
+				.eq(PutBox::getBoxType, tradingBox.getBoxTypeQuantityOne())
+			);
+			if (putBox != null) {
+				PutBox finalPutBox = putBox;
+				putBox.setUpdateUser(AuthUtil.getUserId());
+				putBox.setUpdateTime(new Date());
+				putBox.setUpdateUserName(AuthUtil.getUserName());
+				putBox.setTotalNum(putBox.getTotalNum() - tradingBox.getBoxNumber());
+				putBox.setRemainingNum(putBox.getTotalNum() - putBox.getOccupyNum());
+				putBox.setStorageNum(putBox.getStorageNum() - tradingBox.getBoxNumber());
+				putBoxService.updateById(putBox);
+			} else{
+				throw new RuntimeException("未查到对应放箱号数据");
+			}
+			PutBox putBoxOld = putBoxService.getOne(new LambdaQueryWrapper<PutBox>()
+				.eq(PutBox::getTenantId, AuthUtil.getTenantId())
+				.eq(PutBox::getIsDeleted, 0)
+				.eq(PutBox::getContainerNumber, tradingBox.getContainerNumber())
+				.eq(PutBox::getPolId, tradingBox.getPolId())
+				.eq(PutBox::getPolStationId, tradingBox.getPolStationId())
+				.eq(PutBox::getBoxType, tradingBox.getBoxTypeQuantityOne())
+			);
+			if (putBoxOld == null){
+				throw new RuntimeException("未查到调出放箱号单据");
+			}
+			putBoxOld.setUpdateUser(AuthUtil.getUserId());
+			putBoxOld.setUpdateTime(new Date());
+			putBoxOld.setUpdateUserName(AuthUtil.getUserName());
+
+			putBoxOld.setTotalNum(putBoxOld.getTotalNum() + tradingBox.getBoxNumber());
+			putBoxOld.setRemainingNum(putBoxOld.getTotalNum() - putBoxOld.getOccupyNum());
+			putBoxOld.setStorageNum(putBoxOld.getStorageNum() + tradingBox.getBoxNumber());
+			putBoxService.updateById(putBoxOld);
+		}
 		return tradingBox;
 	}
 
@@ -3214,6 +3328,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		}
 		TradingBox tradingBox = baseMapper.selectById(detail.getId());
 		tradingBox.setWhetherEnable("否");
+		int version = StringUtil.isBlank(tradingBox.getVersion()) ? 1 : Integer.parseInt(tradingBox.getVersion());
+		tradingBox.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(tradingBox);
 		List<TradingBoxItem> itemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
 			.eq(TradingBoxItem::getPid, tradingBox.getId())
@@ -3396,6 +3512,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 			.eq(FeeCenter::getIsDeleted, 0)
@@ -3489,6 +3607,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(tradingBox.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 			.eq(FeeCenter::getIsDeleted, 0)

+ 20 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/amends/service/impl/AmendsServiceImpl.java

@@ -24,6 +24,7 @@ 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.StringUtil;
 import org.springblade.los.Util.CurrencyUtils;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
@@ -34,6 +35,7 @@ import org.springblade.los.business.amends.entity.Amends;
 import org.springblade.los.business.amends.mapper.AmendsMapper;
 import org.springblade.los.business.amends.service.IAmendsService;
 import org.springblade.los.business.amends.vo.AmendsVO;
+import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
 import org.springblade.los.check.entity.LosAuditPathsActs;
 import org.springblade.los.check.entity.LosAuditPathsLevels;
@@ -161,7 +163,17 @@ public class AmendsServiceImpl extends ServiceImpl<AmendsMapper, Amends> impleme
 			amends.setBranchName(deptName);
 			amends.setCreateDept(deptId);
 			amends.setCreateDeptName(deptName);
+			amends.setVersion("1");
 		} else {
+			Amends dataSourceBill = baseMapper.selectOne(new LambdaQueryWrapper<Amends>().select(Amends::getId, Amends::getVersion)
+				.eq(Amends::getId, amends.getId()));
+			if (!Objects.equals(dataSourceBill.getVersion(), amends.getVersion())) {
+				return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+			}
+			// 每更新一次往上累加一次版本
+			// 旧数据处理
+			int version = StringUtil.isBlank(dataSourceBill.getVersion()) ? 1 : Integer.parseInt(dataSourceBill.getVersion());
+			amends.setVersion(String.valueOf(version + 1));
 			amends.setUpdateUser(AuthUtil.getUserId());
 			amends.setUpdateTime(new Date());
 			amends.setUpdateUserName(AuthUtil.getUserName());
@@ -343,6 +355,8 @@ public class AmendsServiceImpl extends ServiceImpl<AmendsMapper, Amends> impleme
 				throw new SecurityException("操作失败,请联系管理员");
 			}
 		}
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		declare.setStatus(1);
 		baseMapper.updateById(declare);
 		return declare;
@@ -359,6 +373,8 @@ public class AmendsServiceImpl extends ServiceImpl<AmendsMapper, Amends> impleme
 		if (!financeProcess.isSuccess()) {
 			throw new SecurityException("操作失败,请联系管理员");
 		}
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		declare.setStatus(0);
 		baseMapper.updateById(declare);
 		return declare;
@@ -373,6 +389,8 @@ public class AmendsServiceImpl extends ServiceImpl<AmendsMapper, Amends> impleme
 		}
 		bills.setStatus(3);
 		bills.setBillStatus(2);
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
@@ -380,6 +398,8 @@ public class AmendsServiceImpl extends ServiceImpl<AmendsMapper, Amends> impleme
 			.eq(FeeCenter::getAccStatus, 0)
 			.eq(FeeCenter::getPid, bills.getId()));
 		for (FeeCenter item : feeCenterList) {
+			int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version1 + 1));
 			item.setApproverId(AuthUtil.getUserId());
 			item.setApproverName(AuthUtil.getUserName());
 			item.setApproveTime(new Date());

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

@@ -233,6 +233,8 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 			throw new RuntimeException("未查到单据信息");
 		}
 		for (MktSlot item : mktSlotList) {
+			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version + 1));
 			item.setUpdateUser(AuthUtil.getUserId());
 			item.setUpdateTime(new Date());
 			item.setUpdateUserName(AuthUtil.getUserName());
@@ -256,6 +258,8 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 			throw new RuntimeException("未查到单据信息");
 		}
 		for (MktSlot item : mktSlotList) {
+			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version + 1));
 			item.setUpdateUser(AuthUtil.getUserId());
 			item.setUpdateTime(new Date());
 			item.setUpdateUserName(AuthUtil.getUserName());
@@ -459,6 +463,8 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 				throw new SecurityException("操作失败,请联系管理员");
 			}
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus("1");
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -475,6 +481,8 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateTime(new Date());
 		detail.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		R financeProcess = auditProecessService.deteleByBillId(id);
 		if (!financeProcess.isSuccess()) {

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

@@ -342,6 +342,12 @@ public class BookingCabinController extends BladeController {
 				.eq(SeaBillsDetail::getTenantId, AuthUtil.getTenantId())
 				.in(SeaBillsDetail::getPid, idList));
 			for (Bills item : pages.getRecords()) {
+				item.setCreateUser(null);
+				item.setCreateUserName(null);
+				item.setCreateTime(null);
+				item.setUpdateTime(null);
+				item.setUpdateUserName(null);
+				item.setUpdateUser(null);
 				if (!preContainersList.isEmpty()) {
 					List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getId()))
 						.collect(Collectors.toList());
@@ -383,5 +389,13 @@ public class BookingCabinController extends BladeController {
 		return R.data(bills != null ? bills.getId() : "未查到订单数据");
 	}
 
+	/**
+	 * 同步海关信息
+	 */
+	@PostMapping("/synchronizeCustoms")
+	public R synchronizeCustoms(@Valid @RequestBody Bills bills) {
+		return billsService.synchronizeCustoms(bills);
+	}
+
 }
 

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

@@ -435,6 +435,9 @@
         <if test="acc.accBillNo != null and acc.accBillNo != ''">
             and find_in_set(fee.acc_bill_no,#{acc.accBillNo})
         </if>
+        <if test="acc.trackingNumber != null and acc.trackingNumber != ''">
+            and find_in_set (acc.tracking_number,#{acc.trackingNumber})
+        </if>
         <if test="acc.mblno != null and acc.mblno != ''">
             <if test="acc.vagueM == null or acc.vagueM == ''">
                 and fee.mblno like concat('%', #{acc.mblno}, '%')
@@ -1079,6 +1082,9 @@
         <if test="acc.accBillNo != null and acc.accBillNo != ''">
             and find_in_set(fee.acc_bill_no,#{acc.accBillNo})
         </if>
+        <if test="acc.trackingNumber != null and acc.trackingNumber != ''">
+            and find_in_set (acc.tracking_number,#{acc.trackingNumber})
+        </if>
         <if test="acc.mblno != null and acc.mblno != ''">
             <if test="acc.vagueM == null or acc.vagueM == ''">
                 and fee.mblno like concat('%', #{acc.mblno}, '%')

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java

@@ -248,4 +248,6 @@ public interface IBillsService extends IService<Bills> {
 	R sendDeliveryPaper(String ids);
 
 	List<DeliveryPaperExcel> sendDeliveryPaperExport(String ids);
+
+	R synchronizeCustoms(Bills bills);
 }

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

@@ -1668,6 +1668,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			.eq(Bills::getIsDeleted, 0)
 			.in(Bills::getId, Func.toLongList(ids)));
 		for (Bills item : billsList) {
+			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version + 1));
 			if ("MH".equals(item.getBillType()) && ObjectUtils.isNotNull(item.getMasterBillNo())) {
 				throw new RuntimeException("单号:" + item.getBillNo() + "已添加主单,请先撤销在退舱");
 			}
@@ -1938,6 +1940,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		}
 		declare.setStatus(0);
 		declare.setBillStatus(0);
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(declare);
 		if ("KHTS".equals(declare.getBusinessType())) {
 			return declare;
@@ -1952,8 +1956,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					.eq(Bills::getBillType, "MH"));
 				if (!billsList.isEmpty()) {
 					for (Bills item : billsList) {
-						int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-						item.setVersion(String.valueOf(version + 1));
+						int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+						item.setVersion(String.valueOf(version1 + 1));
 						item.setStatus(0);
 						item.setBillStatus(0);
 						item.setUpdateTime(new Date());
@@ -1975,8 +1979,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					if (ObjectUtils.isNull(item.getCorpId())) {
 						throw new RuntimeException("单号:" + item.getBillNo() + "费用明细结算单位不能为空");
 					}
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setUpdateTime(new Date());
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -1999,6 +2003,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		}
 		bills.setStatus(3);
 		bills.setBillStatus(2);
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		List<FeeCenter> feeCenterList;
 		feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
@@ -2025,8 +2031,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			}
 		}
 		for (FeeCenter item : feeCenterList) {
-			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-			item.setVersion(String.valueOf(version + 1));
+			int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version1 + 1));
 			item.setApproverId(AuthUtil.getUserId());
 			item.setApproverName(AuthUtil.getUserName());
 			item.setApproveTime(new Date());
@@ -2381,6 +2387,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			.eq(Bills::getIsDeleted, 0)
 			.in(Bills::getId, ids));
 		for (Bills item : billsList) {
+			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version + 1));
 			if (item.getBillStatus() == 0) {
 				throw new RuntimeException("已取消退舱,请勿重复操作");
 			}
@@ -2735,6 +2743,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateTime(new Date());
 		detail.setShippingStaffId(bills.getShippingStaffId());
 		detail.setShippingStaffName(bills.getShippingStaffName());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		if ("MM".equals(detail.getBillType())) {
 			List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -2743,8 +2753,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setLogisticsStatus("已提交");
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -2789,6 +2799,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateTime(new Date());
 		detail.setShippingStaffId(null);
 		detail.setShippingStaffName("");
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		if ("MM".equals(detail.getBillType())) {
 			List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -2797,8 +2809,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setLogisticsStatus("录入");
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -2830,6 +2842,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setPodCompanyName(bills.getPodCompanyName());
 		detail.setPodStaffId(bills.getPodStaffId());
 		detail.setPodStaffName(bills.getPodStaffName());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		Bills billsJk = new Bills();
 		BeanUtil.copyProperties(detail, billsJk);
@@ -2964,8 +2978,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!details.isEmpty()) {
 				for (Bills item : details) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setTransferOrderStatus("已转单");
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -3318,6 +3332,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		Bills billsJk = baseMapper.selectOne(new LambdaQueryWrapper<Bills>()
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
@@ -3336,8 +3352,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, detail.getId()));
 			if (!details1.isEmpty()) {
 				for (Bills item : details1) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setTransferOrderStatus("录入");
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -3381,6 +3397,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		Bills bills1 = baseMapper.selectById(detail.getSrcBusId());
 		if (bills1 != null) {
@@ -3388,6 +3406,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			bills1.setUpdateUser(AuthUtil.getUserId());
 			bills1.setUpdateUserName(AuthUtil.getUserName());
 			bills1.setUpdateTime(new Date());
+			int version1 = StringUtil.isBlank(bills1.getVersion()) ? 1 : Integer.parseInt(bills1.getVersion());
+			bills1.setVersion(String.valueOf(version1 + 1));
 			baseMapper.updateById(bills1);
 			if ("MM".equals(bills1.getBillType())) {
 				List<Bills> billsList1 = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -3396,8 +3416,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					.eq(Bills::getMasterId, bills1.getId()));
 				if (!billsList1.isEmpty()) {
 					for (Bills item : billsList1) {
-						int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-						item.setVersion(String.valueOf(version + 1));
+						int version2 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+						item.setVersion(String.valueOf(version2 + 1));
 						item.setReceiveStatus("已接收");
 						item.setUpdateUser(AuthUtil.getUserId());
 						item.setUpdateUserName(AuthUtil.getUserName());
@@ -3414,6 +3434,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setReceiveStatus("已接收");
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -3439,6 +3461,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		Bills bills1 = baseMapper.selectById(bills.getSrcBusId());
 		if (bills1 != null) {
@@ -3446,6 +3470,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			bills1.setUpdateUser(AuthUtil.getUserId());
 			bills1.setUpdateUserName(AuthUtil.getUserName());
 			bills1.setUpdateTime(new Date());
+			int version1 = StringUtil.isBlank(bills1.getVersion()) ? 1 : Integer.parseInt(bills1.getVersion());
+			bills1.setVersion(String.valueOf(version1 + 1));
 			baseMapper.updateById(bills1);
 			if ("MM".equals(bills1.getBillType())) {
 				List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -3454,8 +3480,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					.eq(Bills::getMasterId, bills1.getId()));
 				if (!billsList.isEmpty()) {
 					for (Bills item : billsList) {
-						int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-						item.setVersion(String.valueOf(version + 1));
+						int version2 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+						item.setVersion(String.valueOf(version2 + 1));
 						item.setReceiveStatus("录入");
 						item.setUpdateUser(AuthUtil.getUserId());
 						item.setUpdateUserName(AuthUtil.getUserName());
@@ -3472,6 +3498,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setReceiveStatus("录入");
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateUserName(AuthUtil.getUserName());
@@ -3505,6 +3533,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
 		detail.setChangeOrderDate(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		if ("MM".equals(detail.getBillType())) {
 			List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -3513,8 +3543,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					if ("录入".equals(item.getChangeOrdersStatus())) {
 						item.setChangeOrdersStatus("可换单");
 					} else {
@@ -3553,6 +3583,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
 		detail.setChangeOrderDate(null);
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		if ("MM".equals(detail.getBillType())) {
 			List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -3561,8 +3593,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getMasterId, bills.getId()));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					if ("可换单".equals(item.getChangeOrdersStatus())) {
 						item.setChangeOrdersStatus("录入");
 					} else {
@@ -3600,6 +3632,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -3625,6 +3659,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateTime(new Date());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -4788,6 +4824,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			if (ObjectUtils.isNotNull(commodityDescr)) {
 				bills.setCommodityDescr(commodityDescr);
 			}
+			int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+			bills.setVersion(String.valueOf(version + 1));
 			baseMapper.updateById(bills);
 		}
 		return R.data("操作成功");
@@ -4979,6 +5017,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateTime(new Date());
 		bills.setIssueStatus("2");
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		LocalDateTime now = LocalDateTime.now();
 		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -5018,6 +5058,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateTime(new Date());
 		bills.setIssueStatus("0");
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		Bills detail = baseMapper.selectById(bills.getId());
 		if (detail != null && ObjectUtils.isNotNull(detail.getCustomerServiceId())) {
@@ -5075,6 +5117,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		}
 		declare.setStatus(0);
 		declare.setBillStatus(0);
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(declare);
 		if ("MM".equals(declare.getBillType())) {
 			List<Bills> billsList = baseMapper.selectList(new LambdaQueryWrapper<Bills>()
@@ -5084,8 +5128,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(Bills::getBillType, "MH"));
 			if (!billsList.isEmpty()) {
 				for (Bills item : billsList) {
-					int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
-					item.setVersion(String.valueOf(version + 1));
+					int version1 = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+					item.setVersion(String.valueOf(version1 + 1));
 					item.setStatus(0);
 					item.setBillStatus(0);
 					item.setUpdateTime(new Date());
@@ -5159,6 +5203,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		billsFd.setCorpAttnName(billsBooking.getCorpAttnName());
 		billsFd.setCorpAttnTel(billsBooking.getCorpAttnTel());
 		billsFd.setCorpAttnEmail(billsBooking.getCorpAttnEmail());
+		int version = StringUtil.isBlank(billsFd.getVersion()) ? 1 : Integer.parseInt(billsFd.getVersion());
+		billsFd.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(billsFd);
 		//覆盖主表从表明细信息
 		seaBillsDetailFd.setHnotifyDetails(seaBillsDetailBooking.getHnotifyDetails());
@@ -5353,6 +5399,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setQuantityV48(V48);
 		bills.setQuantityOther(other);
 		bills.setTeu(teu.intValue());
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		if (ObjectUtils.isNotNull(bills.getContainersList())) {
 			for (Containers item : bills.getContainersList()) {
@@ -5463,6 +5511,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					if (!bookingList.isEmpty() && ObjectUtils.isNotNull(item.getTemporaryId())) {
 						Bills bills1 = bookingList.stream().filter(e -> e.getId().equals(item.getTemporaryId())).findFirst().orElse(null);
 						if (bills1 != null) {
+							int versionBills1 = StringUtil.isBlank(bills1.getVersion()) ? 1 : Integer.parseInt(bills1.getVersion());
+							bills1.setVersion(String.valueOf(versionBills1 + 1));
 							bills1.setMblno(item.getMblno());
 							bills1.setHblno(item.getHblno());
 							bills1.setVesselId(item.getVesselId());
@@ -5584,6 +5634,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bookingCabin.setUpdateUser(AuthUtil.getUserId());
 		bookingCabin.setUpdateTime(new Date());
 		bookingCabin.setWhetherModify("1");
+		int version = StringUtil.isBlank(bookingCabin.getVersion()) ? 1 : Integer.parseInt(bookingCabin.getVersion());
+		bookingCabin.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bookingCabin);
 		Bills detail = baseMapper.selectOne(new LambdaQueryWrapper<Bills>()
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
@@ -5594,6 +5646,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			detail.setUpdateUser(AuthUtil.getUserId());
 			detail.setUpdateTime(new Date());
 			detail.setWhetherModify("1");
+			int version1 = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+			detail.setVersion(String.valueOf(version1 + 1));
 			baseMapper.updateById(detail);
 			if (ObjectUtils.isNotNull(detail.getCustomerServiceId())) {
 				R<User> res = userClient.userInfoById(detail.getCustomerServiceId());
@@ -5670,6 +5724,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateTime(new Date());
 		detail.setWhetherModify("2");
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		Bills bookingCabin = baseMapper.selectById(detail.getTemporaryId());
 		if (bookingCabin == null) {
@@ -5679,6 +5735,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bookingCabin.setUpdateUser(AuthUtil.getUserId());
 		bookingCabin.setUpdateTime(new Date());
 		bookingCabin.setWhetherModify("2");
+		int versionBookingCabin = StringUtil.isBlank(bookingCabin.getVersion()) ? 1 : Integer.parseInt(bookingCabin.getVersion());
+		bookingCabin.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bookingCabin);
 		List<PreContainers> containersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
 			.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
@@ -5810,6 +5868,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateTime(new Date());
 		bills.setBillStatus(1);
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		Bills detail = baseMapper.selectOne(new LambdaQueryWrapper<Bills>()
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
@@ -5820,6 +5880,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			detail.setUpdateUser(AuthUtil.getUserId());
 			detail.setUpdateTime(new Date());
 			detail.setBillStatus(1);
+			int version1 = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+			detail.setVersion(String.valueOf(version1 + 1));
 			baseMapper.updateById(detail);
 			if (ObjectUtils.isNotNull(detail.getCustomerServiceId())) {
 				R<User> res = userClient.userInfoById(detail.getCustomerServiceId());
@@ -5886,6 +5948,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateTime(new Date());
 		bills.setIssueStatus("6");
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		R<User> res = userClient.userInfoById(bills.getCreateUser());
 		if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
@@ -5941,6 +6005,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateTime(new Date());
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		return R.data(bills);
 	}
@@ -5964,6 +6030,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateTime(new Date());
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		return R.data(bills);
 	}
@@ -5984,6 +6052,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateTime(new Date());
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		return R.data(bills);
 	}
@@ -6012,6 +6082,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateTime(new Date());
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		return R.data(bills);
 	}
@@ -6030,6 +6102,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			throw new RuntimeException("未查到单据信息");
 		}
 		for (Bills item : billsList) {
+			int version = StringUtil.isBlank(item.getVersion()) ? 1 : Integer.parseInt(item.getVersion());
+			item.setVersion(String.valueOf(version + 1));
 			if ("已提交".equals(item.getEquipmentSingleStatus())) {
 				throw new RuntimeException("已提交设备单,请勿重复提交");
 			}
@@ -6133,6 +6207,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			if (ObjectUtils.isNotNull(bills.getOperatorId())) {
 				billUtils.sendMessage(bills, url, pageLabel, pageStatus, messageBody, "1", bills.getOperatorId(), null);
 			}
+			int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+			detail.setVersion(String.valueOf(version + 1));
 			detail.setHarvestBoxPackingDate(bills.getHarvestBoxPackingDate());
 			detail.setUpdateTime(new Date());
 			detail.setUpdateUser(AuthUtil.getUserId());
@@ -6164,6 +6240,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		detail.setUpdateTime(new Date());
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -6219,6 +6297,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setUpdateTime(new Date());
 		bills.setUpdateUser(AuthUtil.getUserId());
 		bills.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(bills);
 		return R.data(bills);
 	}
@@ -6450,4 +6530,53 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		}
 		return excelList;
 	}
+
+	@Override
+	public R synchronizeCustoms(Bills bills) {
+
+		if (bills.getId() == null) {
+			throw new SecurityException("缺少必要参数");
+		}
+		Bills detail = baseMapper.selectOne(new LambdaQueryWrapper<Bills>()
+			.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.eq(Bills::getTemporaryId, bills.getId())
+			.last("LIMIT 1"));
+		if (detail == null) {
+			throw new SecurityException("未查到单据信息");
+		}
+		SeaBillsDetail seaBillsDetail = seaBillsDetailService.getOne(new LambdaQueryWrapper<SeaBillsDetail>()
+			.eq(SeaBillsDetail::getTenantId, AuthUtil.getTenantId())
+			.eq(SeaBillsDetail::getPid, detail.getId()));
+		if (seaBillsDetail != null && ObjectUtils.isNotNull(bills.getDetail())) {
+			seaBillsDetail.setUpdateUser(AuthUtil.getUserId());
+			seaBillsDetail.setUpdateUserName(AuthUtil.getUserName());
+			seaBillsDetail.setUpdateTime(new Date());
+			seaBillsDetail.setCustomsShipperCode(bills.getDetail().getCustomsShipperCode());
+			seaBillsDetail.setCustomsShipperName(bills.getDetail().getCustomsShipperName());
+			seaBillsDetail.setCustomsShipperTel(bills.getDetail().getCustomsShipperTel());
+			seaBillsDetail.setCustomsShipperCountry(bills.getDetail().getCustomsShipperCountry());
+			seaBillsDetail.setCustomsShipperEmail(bills.getDetail().getCustomsShipperEmail());
+			seaBillsDetail.setCustomsShipperAddress(bills.getDetail().getCustomsShipperAddress());
+			seaBillsDetail.setCustomsConsigneeCode(bills.getDetail().getCustomsConsigneeCode());
+			seaBillsDetail.setCustomsConsigneeName(bills.getDetail().getCustomsConsigneeName());
+			seaBillsDetail.setCustomsConsigneeTel(bills.getDetail().getCustomsConsigneeTel());
+			seaBillsDetail.setCustomsConsigneeCountry(bills.getDetail().getCustomsConsigneeCountry());
+			seaBillsDetail.setCustomsConsigneeEmail(bills.getDetail().getCustomsConsigneeEmail());
+			seaBillsDetail.setCustomsConsigneeAddress(bills.getDetail().getCustomsConsigneeAddress());
+			seaBillsDetail.setCustomsNotifyCode(bills.getDetail().getCustomsNotifyCode());
+			seaBillsDetail.setCustomsNotifyName(bills.getDetail().getCustomsNotifyName());
+			seaBillsDetail.setCustomsNotifyTel(bills.getDetail().getCustomsNotifyTel());
+			seaBillsDetail.setCustomsNotifyCountry(bills.getDetail().getCustomsNotifyCountry());
+			seaBillsDetail.setCustomsNotifyEmail(bills.getDetail().getCustomsNotifyEmail());
+			seaBillsDetail.setCustomsNotifyAddress(bills.getDetail().getCustomsNotifyAddress());
+			seaBillsDetail.setCustomsGoodsType(bills.getDetail().getCustomsGoodsType());
+			seaBillsDetail.setSubmitterId(AuthUtil.getUserId());
+			seaBillsDetail.setSubmitterName(AuthUtil.getUserName());
+			seaBillsDetail.setSubmitterDate(new Date());
+			seaBillsDetailService.updateById(bills.getDetail());
+			seaBillsDetailService.updateById(seaBillsDetail);
+		}
+		return R.data(bills);
+	}
 }

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

@@ -16,9 +16,11 @@ import org.springblade.los.basic.vessels.entity.BVessels;
 import org.springblade.los.basic.vessels.service.IBVesselsService;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.Containers;
+import org.springblade.los.business.sea.entity.PreContainers;
 import org.springblade.los.business.sea.entity.SeaBillsDetail;
 import org.springblade.los.business.sea.service.IBillsService;
 import org.springblade.los.business.sea.service.IContainersService;
+import org.springblade.los.business.sea.service.IPreContainersService;
 import org.springblade.los.business.sea.service.ITemplateImportService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -51,6 +53,8 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 
 	private final IContainersService containersService;
 
+	private final IPreContainersService preContainersService;
+
 	public static double splitNumericPrefixFromString(String str) {
 		str = str.replace(" ", "").trim();
 		String str2 = "", str3 = "";
@@ -1439,7 +1443,7 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 			if (lastDigitIndex > 0) {
 				String number = quantity.substring(0, lastDigitIndex + 1);
 				bills.setQuantity(new BigDecimal(number));
-				String packingUnit = quantity.substring(lastDigitIndex+ 1);
+				String packingUnit = quantity.substring(lastDigitIndex + 1);
 				if (ObjectUtils.isNotNull(packingUnit)) {
 					BPackages packages = bPackagesService.getOne(new LambdaQueryWrapper<BPackages>()
 						.eq(BPackages::getTenantId, AuthUtil.getTenantId())
@@ -1565,7 +1569,15 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				}
 			}
 			if (!containersList.isEmpty()) {
-				List<String> cntrTypeList = billsService.cntrTypeList(billId);
+				List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+					.eq(PreContainers::getPid, billId)
+					.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+					.eq(PreContainers::getIsDeleted, 0));
+				if (preContainersList.isEmpty()) {
+					throw new RuntimeException("请先维护单据箱型");
+				}
+				List<String> cntrTypeList = preContainersList.stream().map(PreContainers::getCntrTypeCode).distinct()
+					.collect(Collectors.toList());
 				for (Containers item : containersList) {
 					if (!cntrTypeList.isEmpty()) {
 						if (!cntrTypeList.contains(item.getCntrTypeCode())) {
@@ -1583,6 +1595,11 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				bills.setMeasurement(containersList.stream().map(Containers::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP));
 				bills.setCfsMeasurement(bills.getMeasurement());
 				containersService.saveBatch(containersList);
+				for (PreContainers item : preContainersList) {
+					long count = containersList.stream().filter(e -> e.getCntrTypeCode().equals(item.getCntrTypeCode())).count();
+					item.setQuantity(Integer.parseInt(String.valueOf(count)));
+				}
+				preContainersService.updateBatchById(preContainersList);
 			}
 			bills.setContainersList(containersList);
 		}
@@ -1749,7 +1766,7 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 			if (lastDigitIndex > 0) {
 				String number = quantity.substring(0, lastDigitIndex + 1);
 				bills.setQuantity(new BigDecimal(number));
-				String packingUnit = quantity.substring(lastDigitIndex+ 1);
+				String packingUnit = quantity.substring(lastDigitIndex + 1);
 				if (ObjectUtils.isNotNull(packingUnit)) {
 					BPackages packages = bPackagesService.getOne(new LambdaQueryWrapper<BPackages>()
 						.eq(BPackages::getTenantId, AuthUtil.getTenantId())

+ 1 - 0
blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java

@@ -2446,6 +2446,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 					throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单");
 				}
 				FinAccBills data = new FinAccBills();
+				data.setTrackingNumber(item.getTrackingNumber());
 				data.setGenerationCorpId(item.getGenerationCorpId());
 				data.setGenerationCorpCnName(item.getGenerationCorpCnName());
 				data.setGenerationCorpEnName(item.getGenerationCorpEnName());

+ 14 - 1
blade-service/blade-los/src/main/java/org/springblade/los/excel/BillsExcel.java

@@ -93,12 +93,19 @@ public class BillsExcel implements Serializable {
 	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date etd;
 	/**
+	 * 实际开船日期
+	 */
+	@ExcelProperty(value = "实际开船日期")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date actualEtd;
+	/**
 	 * 到港日期
 	 */
 	@ExcelProperty(value = "到港日期")
 	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
 	@DateTimeFormat(pattern = "yyyy-MM-dd")
-	private Date eta;
+	private Date actualEta;
 	/**
 	 * 船公司英文名称
 	 */
@@ -129,6 +136,12 @@ public class BillsExcel implements Serializable {
 	private String quantityCntrDescr;
 
 	/**
+	 * 箱号
+	 */
+	@ExcelProperty(value = "箱号")
+	private String extendedData;
+
+	/**
 	 * 业务来源
 	 */
 	@ExcelProperty(value = "业务来源")

+ 53 - 0
blade-service/blade-los/src/main/java/org/springblade/los/excel/TrackingNumberExcel.java

@@ -0,0 +1,53 @@
+/*
+ *      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.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 物流-基础资料-往来单位实体类
+ *
+ * @author BladeX
+ * @since 2023-10-07
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class TrackingNumberExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 快递单号
+	 */
+	@ExcelProperty(value = "快递单号")
+	private String trackingNumber;
+	/**
+	 * 快递费
+	 */
+	@ExcelProperty(value = "快递费")
+	private BigDecimal amount;
+}

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FeeCenterController.java

@@ -116,6 +116,8 @@ public class FeeCenterController extends BladeController {
 				.like(FeeCenter::getCorpEnName, feeCenter.getCorpCnName()))
 			.and(ObjectUtils.isNotNull(feeCenter.getBillCorpCnName()), i -> i.like(FeeCenter::getBillCorpCnName, feeCenter.getBillCorpCnName()).or()
 				.like(FeeCenter::getBillCorpEnName, feeCenter.getBillCorpCnName()))
+			.and(ObjectUtils.isNotNull(feeCenter.getFeeCnName()), i -> i.like(FeeCenter::getFeeCnName, feeCenter.getFeeCnName()).or()
+				.like(FeeCenter::getFeeEnName, feeCenter.getFeeCnName()))
 			.and(ObjectUtils.isNotNull(feeCenter.getVesselCnName()), i -> i.like(FeeCenter::getVesselCnName, feeCenter.getVesselCnName()).or()
 				.like(FeeCenter::getVesselEnName, feeCenter.getVesselCnName()))
 			.like(ObjectUtils.isNotNull(feeCenter.getVoyageNo()), FeeCenter::getVoyageNo, feeCenter.getVoyageNo())

+ 29 - 8
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FinAccBillsController.java

@@ -18,6 +18,7 @@ package org.springblade.los.finance.fee.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
@@ -36,17 +37,14 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.los.basic.corps.entity.BCorps;
 import org.springblade.los.basic.corps.service.IBCorpsService;
 import org.springblade.los.enums.BusinessTypeEnums;
-import org.springblade.los.excel.FeeCountByCorpCExcel;
-import org.springblade.los.excel.FeeCountByCorpDExcel;
-import org.springblade.los.excel.FeeCountByCorpExcel;
+import org.springblade.los.excel.*;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.entity.ListAccBillVO;
 import org.springblade.los.finance.fee.service.IFinAccBillsService;
 import org.springblade.los.finance.fee.vo.AccBillExcel;
 import org.springblade.los.finance.fee.vo.FinAccBillsVO;
-import org.springblade.los.statisticAnalysis.FeeSummaryDetailNotRC;
-import org.springblade.los.statisticAnalysis.FeeSummaryDetailNotRD;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
@@ -685,9 +683,9 @@ public class FinAccBillsController extends BladeController {
 			}
 		}
 		List<AccBillExcel> accBillExcelList = new ArrayList<>();
-		for (FinAccBillsVO item : finAccBillsVOPage){
+		for (FinAccBillsVO item : finAccBillsVOPage) {
 			AccBillExcel accBillExcel = new AccBillExcel();
-			BeanUtil.copyProperties(item,accBillExcel);
+			BeanUtil.copyProperties(item, accBillExcel);
 			if ("2".equals(type)) {
 				//收
 				if ("D".equals(listAccBillVO.getDc())) {
@@ -709,7 +707,7 @@ public class FinAccBillsController extends BladeController {
 			}
 			accBillExcelList.add(accBillExcel);
 		}
-		ExcelUtil.export(response, "账单明细", "账单明细",accBillExcelList, AccBillExcel.class);
+		ExcelUtil.export(response, "账单明细", "账单明细", accBillExcelList, AccBillExcel.class);
 	}
 
 	/**
@@ -840,5 +838,28 @@ public class FinAccBillsController extends BladeController {
 		}
 	}
 
+	/**
+	 * 导出快递单号模板
+	 */
+	@GetMapping("/exportTrackingNumber/template")
+	public void exportBCorpsTemplate(HttpServletResponse response) {
+		List<TrackingNumberExcel> list = new ArrayList<>();
+		ExcelUtil.export(response, "导入快递单号模板", "快递单号", list, TrackingNumberExcel.class);
+	}
+
+	/**
+	 * 导入 快递单号
+	 */
+	@PostMapping("/importTrackingNumber")
+	@RepeatSubmit
+	public R importTrackingNumber(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<TrackingNumberExcel> excelList = ExcelUtil.read(file, TrackingNumberExcel.class);
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("数据不能为空");
+		}
+		return R.data(excelList.stream().map(TrackingNumberExcel::getTrackingNumber).distinct().collect(Collectors.joining(",")));
+	}
+
 
 }

+ 1 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java

@@ -781,6 +781,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 			}
 			List<Long> feeCenterIdList = new ArrayList<>();
 			for (FeeCenter feeCenter : list) {
+				feeCenter.setBillDate(bills.getBillDate());
 				feeCenter.setBookingAgentId(bills.getBookingAgentId());
 				feeCenter.setBookingAgentCnName(bills.getBookingAgentCnName());
 				feeCenter.setBookingAgentEnName(bills.getBookingAgentEnName());

+ 1 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FinAccBillsServiceImpl.java

@@ -251,6 +251,7 @@ public class FinAccBillsServiceImpl extends ServiceImpl<FinAccBillsMapper, FinAc
 			data.setPodCode(item.getPodCode());
 			data.setPodEnName(item.getPodEnName());
 			data.setPodNamePrint(finAccBills.getPodNamePrint());
+			data.setTrackingNumber(item.getTrackingNumber());
 			BigDecimal amountDrLoc = new BigDecimal("0.00");
 			BigDecimal amountCrLoc = new BigDecimal("0.00");
 			if (exrateType.equals(item.getCurCode())) {

+ 29 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java

@@ -159,10 +159,21 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				finInvoices.setBranchId(branchId);
 				finInvoices.setCreateDeptName(deptName);
 			}
+			finInvoices.setVersion("1");
 		} else {
 			finInvoices.setUpdateUser(AuthUtil.getUserId());
 			finInvoices.setUpdateTime(new Date());
 			finInvoices.setUpdateUserName(AuthUtil.getUserName());
+			FinInvoices dataSourceBill = baseMapper.selectOne(new LambdaQueryWrapper<FinInvoices>()
+				.select(FinInvoices::getId, FinInvoices::getVersion)
+				.eq(FinInvoices::getId, finInvoices.getId()));
+			if (!Objects.equals(dataSourceBill.getVersion(), finInvoices.getVersion())) {
+				return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+			}
+			// 每更新一次往上累加一次版本
+			// 旧数据处理
+			int version = StringUtil.isBlank(dataSourceBill.getVersion()) ? 1 : Integer.parseInt(dataSourceBill.getVersion());
+			finInvoices.setVersion(String.valueOf(version + 1));
 		}
 		this.saveOrUpdate(finInvoices);
 		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
@@ -485,6 +496,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		if (invoiceAmount.compareTo(finInvoices.getAmountLoc()) > 0) {
 			throw new RuntimeException("开票失败:开票金额大于合计金额,保存失败");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(3);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -832,6 +845,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(0);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -946,6 +961,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		if (invoiceAmount.compareTo(finInvoices.getAmountLoc()) > 0) {
 			throw new RuntimeException("开票失败:开票金额大于合计金额,保存失败");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(3);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1040,6 +1057,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(0);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1051,6 +1070,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		if (bills == null) {
 			throw new SecurityException("审批通过失败");
 		}
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		bills.setStatus(3);
 		baseMapper.updateById(bills);
 		return R.success("操作成功");
@@ -1731,6 +1752,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		/*if (invoiceAmount.compareTo(finInvoices.getAmountLoc()) > 0) {
 			throw new RuntimeException("开票失败:开票金额大于合计金额,保存失败");
 		}*/
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(3);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1765,6 +1788,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				}
 			}
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(0);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1807,6 +1832,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		/*if (invoiceAmount.compareTo(finInvoices.getAmountLoc()) > 0) {
 			throw new RuntimeException("开票失败:开票金额大于合计金额,保存失败");
 		}*/
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(3);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1854,6 +1881,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(0);
 		baseMapper.updateById(detail);
 		return R.data(detail);

+ 1 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/operatingExpenses/controller/OperatingExpensesController.java

@@ -104,6 +104,7 @@ public class OperatingExpensesController extends BladeController {
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(operatingExpenses.getBranchId()), OperatingExpenses::getBranchId, operatingExpenses.getBranchId());
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(operatingExpenses.getBranchName()), OperatingExpenses::getBranchName, operatingExpenses.getBranchName());
 		}
+		lambdaQueryWrapper.orderByDesc(OperatingExpenses::getCreateTime);
 		IPage<OperatingExpenses> pages = operatingExpensesService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}

+ 22 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/operatingExpenses/service/impl/OperatingExpensesServiceImpl.java

@@ -25,12 +25,14 @@ import lombok.AllArgsConstructor;
 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.StringUtil;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
 import org.springblade.los.business.files.entity.FilesCenter;
 import org.springblade.los.business.files.service.IFilesCenterService;
+import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
 import org.springblade.los.check.entity.LosAuditPathsActs;
 import org.springblade.los.check.entity.LosAuditPathsLevels;
@@ -52,6 +54,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 营业费用 服务实现类
@@ -142,8 +145,19 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 			operatingExpenses.setCreateUser(AuthUtil.getUserId());
 			operatingExpenses.setCreateUserName(AuthUtil.getUserName());
 			operatingExpenses.setBranchId(branchId);
+			operatingExpenses.setVersion("1");
 			baseMapper.insert(operatingExpenses);
 		} else {
+			OperatingExpenses dataSourceBill = baseMapper.selectOne(new LambdaQueryWrapper<OperatingExpenses>()
+				.select(OperatingExpenses::getId,  OperatingExpenses::getVersion)
+				.eq(OperatingExpenses::getId, operatingExpenses.getId()));
+			if (!Objects.equals(dataSourceBill.getVersion(), operatingExpenses.getVersion())) {
+				return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+			}
+			// 每更新一次往上累加一次版本
+			// 旧数据处理
+			int version = StringUtil.isBlank(dataSourceBill.getVersion()) ? 1 : Integer.parseInt(dataSourceBill.getVersion());
+			operatingExpenses.setVersion(String.valueOf(version + 1));
 			operatingExpenses.setUpdateUser(AuthUtil.getUserId());
 			operatingExpenses.setUpdateTime(new Date());
 			operatingExpenses.setUpdateUserName(AuthUtil.getUserName());
@@ -259,6 +273,8 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 		declare.setUpdateUser(AuthUtil.getUserId());
 		declare.setUpdateTime(new Date());
 		declare.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}
@@ -275,6 +291,8 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 		declare.setUpdateUser(AuthUtil.getUserId());
 		declare.setUpdateTime(new Date());
 		declare.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}
@@ -289,6 +307,8 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 		declare.setUpdateUser(AuthUtil.getUserId());
 		declare.setUpdateTime(new Date());
 		declare.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}
@@ -303,6 +323,8 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 		declare.setUpdateUser(AuthUtil.getUserId());
 		declare.setUpdateTime(new Date());
 		declare.setUpdateUserName(AuthUtil.getUserName());
+		int version = StringUtil.isBlank(declare.getVersion()) ? 1 : Integer.parseInt(declare.getVersion());
+		declare.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}

+ 46 - 1
blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java

@@ -227,6 +227,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				finStlBills.setBranchId(branchId);
 				finStlBills.setCreateDeptName(deptName);
 			}
+			finStlBills.setVersion("1");
 		} else {
 			List<FinStlBills> finStlBillsList = baseMapper.selectList(new LambdaQueryWrapper<FinStlBills>()
 				.eq(FinStlBills::getBranchId, finStlBills.getBranchId())
@@ -241,6 +242,16 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			finStlBills.setUpdateUser(AuthUtil.getUserId());
 			finStlBills.setUpdateTime(new Date());
 			finStlBills.setUpdateUserName(AuthUtil.getUserName());
+			FinStlBills dataSourceBill = baseMapper.selectOne(new LambdaQueryWrapper<FinStlBills>()
+				.select(FinStlBills::getId, FinStlBills::getVersion)
+				.eq(FinStlBills::getId, finStlBills.getId()));
+			if (!Objects.equals(dataSourceBill.getVersion(), finStlBills.getVersion())) {
+				return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+			}
+			// 每更新一次往上累加一次版本
+			// 旧数据处理
+			int version = StringUtil.isBlank(dataSourceBill.getVersion()) ? 1 : Integer.parseInt(dataSourceBill.getVersion());
+			finStlBills.setVersion(String.valueOf(version + 1));
 		}
 		this.saveOrUpdate(finStlBills);
 		if (ObjectUtils.isNotNull(finStlBills.getFinStlBillsItemsList())) {
@@ -526,6 +537,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(3);
 		detail.setBillStatus("1");
 		baseMapper.updateById(detail);
@@ -814,6 +827,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(0);
 		detail.setBillStatus("0");
 		baseMapper.updateById(detail);
@@ -1179,6 +1194,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		String status = sysClient.getParamService("retreat.pledge");
 		if (ObjectUtils.isNotNull(status) && "1".equals(status) && "D".equals(finStlBills.getDc())) {
@@ -1483,6 +1500,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		String status = sysClient.getParamService("retreat.pledge");
 		if (ObjectUtils.isNotNull(status) && "1".equals(status) && "D".equals(finStlBills.getDc())) {
@@ -1554,6 +1573,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		}
 		feeCenterService.saveOrUpdateBatch(feeCenterList);
 		finStlBillsItemsService.saveOrUpdateBatch(finStlBillsItemsList);
+		int version = StringUtil.isBlank(bills.getVersion()) ? 1 : Integer.parseInt(bills.getVersion());
+		bills.setVersion(String.valueOf(version + 1));
 		bills.setStatus(3);
 		baseMapper.updateById(bills);
 		return R.success("操作成功");
@@ -1669,6 +1690,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setIsSignfor(1);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1695,6 +1718,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setIsSignfor(2);
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1872,6 +1897,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -1976,6 +2003,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 
@@ -2191,6 +2220,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -2229,6 +2260,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -2277,7 +2310,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 						FeeCenter::getQuantityCntrDescr, FeeCenter::getApproveTime, FeeCenter::getApplyTime,
 						FeeCenter::getSignforDate, FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
 						FeeCenter::getStlDate, FeeCenter::getCheckDate, FeeCenter::getAccDate,
-						FeeCenter::getId, FeeCenter::getAccBillId, FeeCenter::getVersion,FeeCenter::getUnsettledAmount,
+						FeeCenter::getId, FeeCenter::getAccBillId, FeeCenter::getVersion, FeeCenter::getUnsettledAmount,
 						FeeCenter::getAmount, FeeCenter::getReconciliationAmount)
 					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 					.eq(FeeCenter::getAccStatus, 1)
@@ -3186,6 +3219,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(3);
 		detail.setBillStatus("1");
 		baseMapper.updateById(detail);
@@ -3219,6 +3254,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		detail.setStatus(0);
 		detail.setBillStatus("0");
 		baseMapper.updateById(detail);
@@ -3330,6 +3367,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -3381,6 +3420,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
@@ -3888,6 +3929,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		String status = sysClient.getParamService("retreat.pledge");
 		if (ObjectUtils.isNotNull(status) && "1".equals(status) && "D".equals(finStlBills.getDc())) {
@@ -3966,6 +4009,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		} else {
 			throw new RuntimeException("请选择明细");
 		}
+		int version = StringUtil.isBlank(detail.getVersion()) ? 1 : Integer.parseInt(detail.getVersion());
+		detail.setVersion(String.valueOf(version + 1));
 		baseMapper.updateById(detail);
 		String status = sysClient.getParamService("retreat.pledge");
 		if (ObjectUtils.isNotNull(status) && "1".equals(status) && "D".equals(finStlBills.getDc())) {

+ 15 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/TenantServiceImpl.java

@@ -228,13 +228,28 @@ public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> imp
 			// 角色
 			List<Role> roleLinkedList = new ArrayList<>();
 			List<Role> roleList = roleService.selectList(tenantId);
+			List<RoleMenu> roleMenus = roleMenuService.list(new LambdaQueryWrapper<RoleMenu>()
+				.in(RoleMenu::getRoleId,roleList.stream().map(Role::getId).collect(Collectors.toList())));
 			for (Role item : roleList) {
+				item.setSrcId(item.getId());
 				item.setId(null);
 				item.setTenantId(tenantIdCopy);
 				roleLinkedList.add(item);
 			}
 			if (!roleLinkedList.isEmpty()){
 				roleService.saveBatch(roleLinkedList);
+				List<RoleMenu> menuList = new ArrayList<>();
+				for (RoleMenu item : roleMenus){
+					Role role = roleLinkedList.stream().filter(e-> e.getSrcId().equals(item.getRoleId())).findFirst().orElse(null);
+					if (role != null){
+						item.setRoleId(role.getId());
+						item.setId(null);
+						menuList.add(item);
+					}
+				}
+				if (!menuList.isEmpty()){
+					roleMenuService.saveBatch(menuList);
+				}
 			}
 		} else if (type.contains("3")) {
 			// 审批流程