Browse Source

销售管理、销售退货、采购管理、采购退货增加版本控制

liyuan 2 months ago
parent
commit
565b6cb8c8

+ 8 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/funding/vo/PjpfBalanceResetVO.java

@@ -21,6 +21,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import io.swagger.annotations.ApiModel;
 
+import java.util.List;
+
 /**
  * 可用余额充值视图实体类
  *
@@ -33,4 +35,10 @@ import io.swagger.annotations.ApiModel;
 public class PjpfBalanceResetVO extends PjpfBalanceReset {
 	private static final long serialVersionUID = 1L;
 
+
+	private List<String> confirmingPersonDateList;
+
+	private List<String> createTimeList;
+
+
 }

+ 23 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/annotation/VersionControl.java

@@ -0,0 +1,23 @@
+package org.springblade.salesPart.annotation;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 版本控制
+ * 返回值必须是 R
+ * @author Rain
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface VersionControl {
+
+
+	/**
+	 * service 地址
+	 * @return 无
+	 */
+	String value() default "";
+
+}

+ 73 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/aspectj/VersionControlAspectj.java

@@ -0,0 +1,73 @@
+package org.springblade.salesPart.aspectj;
+
+import com.alibaba.fastjson.JSONObject;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springblade.common.enums.CommonEnum;
+import org.springblade.common.enums.NumberEnum;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.salesPart.annotation.VersionControl;
+import org.springblade.salesPart.enums.FinalMap;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+
+/**
+ * @author Rain
+ */
+@Aspect
+@Component
+public class VersionControlAspectj {
+
+
+	@Pointcut("@annotation(org.springblade.salesPart.annotation.VersionControl)")
+	public void versionControlCut() {
+	}
+
+
+	@Around("versionControlCut()")
+	public R doAround(ProceedingJoinPoint joinPoint) throws Throwable {
+		try {
+			MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+			VersionControl customAnnotation = signature.getMethod().getAnnotation(VersionControl.class);
+			Object obj = joinPoint.getArgs()[0];
+			JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(obj));
+			String id = jsonObject.getString(FinalMap.ID);
+			String sourceVersion = jsonObject.getString(FinalMap.VERSION);
+			has: if (StringUtils.hasText(id) && StringUtils.hasText(sourceVersion)) {
+				Object objBean = SpringUtil.getBean(customAnnotation.value());
+				Method method = objBean.getClass().getDeclaredMethod(FinalMap.GET_BY_ID, Serializable.class);
+				method.setAccessible(true);
+				Object result = method.invoke(objBean, Long.valueOf(id));
+				if (ObjectUtils.isEmpty(result)) {
+					break has;
+				}
+				JSONObject entityData = JSONObject.parseObject(JSONObject.toJSONString(result));
+				if (entityData.containsKey(FinalMap.IS_DELETE)) {
+					if (CommonEnum.ONE.info.equals(entityData.getString(FinalMap.IS_DELETE))) {
+						return R.fail("该单据已被删除,请返回列表页刷新后重试");
+					}
+				}
+				if (!entityData.containsKey(FinalMap.VERSION)) {
+					break has;
+				}
+				if (!sourceVersion.equals(entityData.getString(FinalMap.VERSION))) {
+					return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
+				}
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+		return (R) joinPoint.proceed();
+	}
+
+}

+ 9 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/enums/FinalMap.java

@@ -23,4 +23,13 @@ public class FinalMap {
 
 	public static final Integer FIFTEEN = 15;
 
+
+	public static final String VERSION = "version";
+
+	public static final String IS_DELETE = "isDeleted";
+
+	public static final String ID = "id";
+
+	public static final String GET_BY_ID = "getById";
+
 }

+ 13 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/funding/controller/PjpfBalanceResetController.java

@@ -32,6 +32,8 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.salesPart.funding.entity.PjpfBalanceReset;
 import org.springblade.salesPart.funding.service.IPjpfBalanceResetService;
 import org.springblade.salesPart.funding.vo.PjpfBalanceResetVO;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -65,11 +67,21 @@ public class PjpfBalanceResetController extends BladeController {
 	@GetMapping("/list")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入pjpfBalanceReset")
-	public R<IPage<PjpfBalanceReset>> list(PjpfBalanceReset pjpfBalanceReset, Query query) {
+	public R<IPage<PjpfBalanceReset>> list(PjpfBalanceResetVO pjpfBalanceReset, Query query) {
 		LambdaQueryWrapper<PjpfBalanceReset> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(PjpfBalanceReset::getTenantId, AuthUtil.getTenantId())
 			.eq(PjpfBalanceReset::getIsDeleted, 0)
+			.like(StringUtils.hasText(pjpfBalanceReset.getConfirmingPersonName()), PjpfBalanceReset::getConfirmingPersonName, pjpfBalanceReset.getConfirmingPersonName())
+			.like(StringUtils.hasText(pjpfBalanceReset.getCreateUserName()), PjpfBalanceReset::getCreateUserName, pjpfBalanceReset.getCreateUserName())
 			.orderByDesc(PjpfBalanceReset::getCreateTime);
+		if (!CollectionUtils.isEmpty(pjpfBalanceReset.getCreateTimeList()) && pjpfBalanceReset.getCreateTimeList().size() > 1) {
+			lambdaQueryWrapper.ge(PjpfBalanceReset::getCreateTime, pjpfBalanceReset.getCreateTimeList().get(0));
+			lambdaQueryWrapper.le(PjpfBalanceReset::getCreateTime, pjpfBalanceReset.getCreateTimeList().get(1));
+		}
+		if (!CollectionUtils.isEmpty(pjpfBalanceReset.getConfirmingPersonDateList()) && pjpfBalanceReset.getConfirmingPersonDateList().size() > 1) {
+			lambdaQueryWrapper.ge(PjpfBalanceReset::getConfirmingPersonDate, pjpfBalanceReset.getConfirmingPersonDateList().get(0));
+			lambdaQueryWrapper.le(PjpfBalanceReset::getConfirmingPersonDate, pjpfBalanceReset.getConfirmingPersonDateList().get(1));
+		}
 		IPage<PjpfBalanceReset> pages = pjpfBalanceResetService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}

+ 9 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java

@@ -22,6 +22,7 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.salesPart.annotation.VersionControl;
 import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.corps.service.ICorpsDescService;
 import org.springblade.salesPart.entity.*;
@@ -105,7 +106,7 @@ public class OrderController extends BladeController {
 				PjOrder::getInterest, PjOrder::getFundingAmount, PjOrder::getBondAmount, PjOrder::getProportion,
 				PjOrder::getGoodsTotalShipAmount, PjOrder::getOutGoodsTotalShipNum, PjOrder::getOutGoodsTotalShipAmount,
 				PjOrder::getGoodsTotalShipNum, PjOrder::getSalesAmount, PjOrder::getRefno, PjOrder::getPrimaryGoodsTotalNum,
-				PjOrder::getPrimaryFundingAmount, PjOrder::getUseAdvanceChargeAmount, PjOrder::getProduceAdvanceChargeAmount,
+				PjOrder::getPrimaryFundingAmount, PjOrder::getUseAdvanceChargeAmount, PjOrder::getProduceAdvanceChargeAmount, PjOrder::getVersion,
 				PjOrder::getDeliveryBusinesDate, PjOrder::getSalesCompanyId, PjOrder::getBillType, PjOrder::getRemarks, PjOrder::getPaymentRecoveredBalance)
 			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getIsDeleted, 0)
@@ -442,6 +443,7 @@ public class OrderController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R submit(@Valid @RequestBody PjOrder order) {
 		if (StringUtils.isBlank(order.getBsType())) {
 			throw new RuntimeException("缺少必要参数");
@@ -863,6 +865,7 @@ public class OrderController extends BladeController {
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "请核", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R checkOrderCg(@RequestBody PjOrder order) {
 		PjOrder declare = orderService.checkOrderCG(order);
 		return R.data(declare);
@@ -875,6 +878,7 @@ public class OrderController extends BladeController {
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "撤销请核", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeCheckOrderCg(@RequestBody PjOrder order) {
 		PjOrder declare = orderService.revokeCheckOrderCG(order);
 		return R.data(declare);
@@ -1283,6 +1287,7 @@ public class OrderController extends BladeController {
 	@PostMapping("/confirmWarehouse")
 	@ApiOperationSupport(order = 9)
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R confirmWarehouse(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -1296,6 +1301,7 @@ public class OrderController extends BladeController {
 	@PostMapping("/revokeWarehouse")
 	@ApiOperationSupport(order = 9)
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeWarehouse(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -1309,6 +1315,7 @@ public class OrderController extends BladeController {
 	@PostMapping("/confirmRedeem")
 	@ApiOperationSupport(order = 9)
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R confirmRedeem(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -1322,6 +1329,7 @@ public class OrderController extends BladeController {
 	@PostMapping("/revokeRedeem")
 	@ApiOperationSupport(order = 9)
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeRedeem(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");

+ 10 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/ReturnsController.java

@@ -18,6 +18,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.annotation.VersionControl;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.excel.PjOrderExportExcelCG;
@@ -311,6 +312,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R submit(@Valid @RequestBody PjOrder order) {
 		if (StringUtils.isBlank(order.getBsType())) {
 			throw new RuntimeException("缺少必要参数");
@@ -336,6 +338,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "生成出库任务", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R generateShipTaskReturns(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -350,6 +353,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "生成出库任务", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeGenerateShipTaskReturns(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -364,6 +368,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 9)
 	@ApiOperation(value = "生成入库任务", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R inboundTaskReturns(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -378,6 +383,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 9)
 	@ApiOperation(value = "生成入库任务", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeInboundTaskReturns(@Valid @RequestBody PjOrder order) {
 		if (order.getId() == null) {
 			throw new RuntimeException("来源信息错误");
@@ -393,6 +399,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "请核", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R checkOrderReturns(@RequestBody PjOrder order) {
 		PjOrder declare = orderService.checkOrderReturns(order);
 		return R.data(declare);
@@ -405,6 +412,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "撤销请核", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeCheckOrderReturns(@RequestBody PjOrder order) {
 		PjOrder declare = orderService.revokeCheckOrderReturns(order);
 		return R.data(declare);
@@ -417,6 +425,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "请核", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R checkOrderCgReturns(@RequestBody PjOrder order) {
 		PjOrder declare = orderService.checkOrderCGReturns(order);
 		return R.data(declare);
@@ -429,6 +438,7 @@ public class ReturnsController {
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "撤销请核", notes = "传入order")
 	@RepeatSubmit
+	@VersionControl("orderServiceImpl")
 	public R revokeCheckOrderCgReturns(@RequestBody PjOrder order) {
 		PjOrder declare = orderService.revokeCheckOrderCGReturns(order);
 		return R.data(declare);

+ 32 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -42,6 +42,7 @@ import org.springblade.salesPart.brand.service.IBrandFilesService;
 import org.springblade.salesPart.check.dto.PjAuditProecessDTO;
 import org.springblade.salesPart.check.entity.PjAuditPathsActs;
 import org.springblade.salesPart.check.entity.PjAuditPathsLevels;
+import org.springblade.salesPart.check.entity.PjAuditProecess;
 import org.springblade.salesPart.check.service.IAuditPathsActsService;
 import org.springblade.salesPart.check.service.IAuditPathsLevelsService;
 import org.springblade.salesPart.check.service.IAuditProecessService;
@@ -1583,6 +1584,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		pjShip.setSalesCompanyName(pjOrder.getSalesCompanyName());
 		pjShip.setSourceCompanyId(pjOrder.getSalesCompanyId());
 		pjShip.setSourceCompanyName(pjOrder.getSalesCompanyName());
+		pjShip.setVersion(1);
 		shipMapper.insert(pjShip);
 
 		pjOrder.setVersion(pjOrder.getVersion() + 1);
@@ -1618,6 +1620,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		selectOne.setRefundType("线下退款");
 		selectOne.setReturnsNumber(selectOne.getReturnsNumber().add(pjOrder.getReturnsNumber()));
 		selectOne.setReturnsAmount(selectOne.getReturnsAmount().add(pjOrder.getReturnsAmount()));
+		selectOne.setVersion(selectOne.getVersion() + 1);
 		baseMapper.updateById(selectOne);
 		List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
 			.eq(PjOrderItems::getPid, pjOrder.getId())
@@ -1713,6 +1716,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		if (new BigDecimal("0.00").compareTo(selectOne.getReturnsNumber()) == 0) {
 			selectOne.setRefundType("未退款");
 		}
+		selectOne.setVersion(selectOne.getVersion() + 1);
 		baseMapper.updateById(selectOne);
 		List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
 			.eq(PjOrderItems::getPid, pjOrder.getId())
@@ -1854,6 +1858,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		} else {
 			selectOne.setReturnsStatus("部分");
 		}
+		selectOne.setVersion(selectOne.getVersion() + 1);
 		baseMapper.updateById(selectOne);
 		// 创建线程池
 		ExecutorService executor = Executors.newSingleThreadExecutor();
@@ -2175,6 +2180,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		if (!financeProcess.isSuccess()) {
 			throw new SecurityException("操作失败,请联系管理员");
 		}
+		long auditSuccessCount = auditProecessService.count(new LambdaQueryWrapper<PjAuditProecess>().eq(PjAuditProecess::getTenantId, declare.getTenantId())
+			.eq(PjAuditProecess::getBillId, declare.getId()).eq(PjAuditProecess::getBillNo, declare.getOrdNo()).eq(PjAuditProecess::getIsDelete, NumberEnum.Zero.number)
+			.eq(PjAuditProecess::getAuditStatus, "A"));
+		if (auditSuccessCount > 0) {
+			throw new SecurityException("当前单据已被审核,无法撤销!");
+		}
 		declare.setStatus("录入");
 		declare.setCheckStatus("审核撤销");
 		baseMapper.updateById(declare);
@@ -2788,6 +2799,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				throw new RuntimeException("未找到融资总账信息");
 			}
 		}
+		order.setVersion(Objects.isNull(order.getVersion()) ? 1 : order.getVersion() + 1);
 		baseMapper.updateById(order);
 		PjShip ship = shipMapper.selectOne(new LambdaQueryWrapper<PjShip>()
 			.eq(PjShip::getIsDeleted, 0)
@@ -2798,6 +2810,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
 			ship.setGoodsTotalNum(order.getGoodsTotalShipNum());
+			ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 			shipMapper.updateById(ship);
 		}
 		List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
@@ -2918,6 +2931,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				throw new RuntimeException("未找到融资总账信息");
 			}
 		}
+		order.setVersion(Objects.isNull(order.getVersion())? 1 : order.getVersion() + 1);
 		baseMapper.updateById(order);
 		PjShip ship = shipMapper.selectOne(new LambdaQueryWrapper<PjShip>()
 			.eq(PjShip::getIsDeleted, 0)
@@ -2928,6 +2942,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
 			ship.setGoodsTotalNum(order.getPrimaryGoodsTotalNum());
+			ship.setVersion(Objects.isNull(ship.getVersion())? 1 : ship.getVersion() + 1);
 			shipMapper.updateById(ship);
 		}
 		List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
@@ -2955,6 +2970,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		order.setUpdateUserName(AuthUtil.getUserName());
 		order.setUpdateUser(AuthUtil.getUserId());
 		order.setUpdateTime(new Date());
+		order.setVersion(Objects.isNull(order.getVersion()) ? 1 : order.getVersion() + 1);
 		baseMapper.updateById(order);
 		List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
 			.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
@@ -3068,6 +3084,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		order.setUpdateUserName(AuthUtil.getUserName());
 		order.setUpdateUser(AuthUtil.getUserId());
 		order.setUpdateTime(new Date());
+		order.setVersion(order.getVersion() + 1);
 		baseMapper.updateById(order);
 		List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
 			.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
@@ -4780,7 +4797,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				order.setStatus(OrderTypeEnum.XSLR.getType());
 				order.setBusinessSource(OrderTypeEnum.WEB.getType());
 				order.setActualPaymentStatus(1);
-
+				order.setVersion(1);
 				//根据客户账期计算应结日期
 				if (ObjectUtil.isNotEmpty(corpsDesc.getAccountPeriod()) && ObjectUtils.isNotNull(order.getBusinesDate())) {
 					Date now = order.getBusinesDate();
@@ -5476,6 +5493,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		pjShip.setSalesCompanyName(pjOrder.getSalesCompanyName());
 		pjShip.setSourceCompanyId(pjOrder.getSalesCompanyId());
 		pjShip.setSourceCompanyName(pjOrder.getSalesCompanyName());
+		pjShip.setVersion(1);
 		shipMapper.insert(pjShip);
 		pjOrder.setVersion(pjOrder.getVersion() + 1);
 		//修改销售状态为待发货
@@ -5824,6 +5842,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		//修改销售状态为待发货
 		pjOrder.setStatus(OrderTypeEnum.XSDQR.getType());
 		pjOrder.setGenerateTask(OrderTypeEnum.NSCRW.getType());
+		pjOrder.setVersion(pjOrder.getVersion() + 1);
 		baseMapper.updateById(pjOrder);
 		//内部销售修改上架管理的库存
 		if (pjOrder.getBusinessSource().equals(OrderTypeEnum.WEB.getType()) && 0 == pjOrder.getBillType()) {
@@ -6813,7 +6832,19 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	@Transactional(rollbackFor = Exception.class)
 	public PjOrder revokeCheckOrderCG(PjOrder order) {
 		PjOrder declare = baseMapper.selectById(order.getId());
+		if (org.springframework.util.ObjectUtils.isEmpty(declare)) {
+			throw new NullPointerException("没有找到当前单据,请返回列表刷新重试");
+		}
+		if (NumberEnum.ONE.number.equals(declare.getIsDeleted())) {
+			throw new NullPointerException("该单据已被删除,请返回列表刷新后重试!");
+		}
 		declare.setVersion(declare.getVersion() + 1);
+		long auditSuccessCount = auditProecessService.count(new LambdaQueryWrapper<PjAuditProecess>().eq(PjAuditProecess::getTenantId, declare.getTenantId())
+			.eq(PjAuditProecess::getBillId, declare.getId()).eq(PjAuditProecess::getBillNo, declare.getOrdNo()).eq(PjAuditProecess::getIsDelete, NumberEnum.Zero.number)
+			.eq(PjAuditProecess::getAuditStatus, "A"));
+		if (auditSuccessCount > 0) {
+			throw new SecurityException("当前单据已被审核,无法撤销!");
+		}
 		if ("RZCG".equals(declare.getBsType())) {
 			if (ObjectUtils.isNotNull(declare.getUseAdvanceChargeAmount()) &&
 				new BigDecimal("0.00").compareTo(declare.getUseAdvanceChargeAmount()) != 0) {

+ 5 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipController.java

@@ -34,6 +34,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.annotation.VersionControl;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.entity.PjShip;
@@ -243,6 +244,7 @@ public class ShipController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入ship")
 	@RepeatSubmit
+	@VersionControl("shipServiceImpl")
 	public R submit(@Valid @RequestBody PjShip ship) {
 		if (ObjectUtil.isEmpty(ship.getBizTypeName())) {
 			throw new RuntimeException("缺少必要参数");
@@ -320,6 +322,7 @@ public class ShipController extends BladeController {
 	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "出库完成", notes = "传入ship")
 	@RepeatSubmit
+	@VersionControl("shipServiceImpl")
 	public R revokeOutboundCompleted(@Valid @RequestBody PjShip ship) {
 		return shipService.revokeOutboundCompleted(ship);
 	}
@@ -345,6 +348,7 @@ public class ShipController extends BladeController {
 	@ApiOperationSupport(order = 12)
 	@ApiOperation(value = "入库完成", notes = "传入ship")
 	@RepeatSubmit
+//	@VersionControl("shipServiceImpl")
 	public R warehousingComplete(@Valid @RequestBody PjShip ship) {
 		return shipService.warehousingComplete(ship);
 	}
@@ -356,6 +360,7 @@ public class ShipController extends BladeController {
 	@ApiOperationSupport(order = 12)
 	@ApiOperation(value = "撤销入库", notes = "传入ship")
 	@RepeatSubmit
+	@VersionControl("shipServiceImpl")
 	public R revokeWarehousing(@Valid @RequestBody PjShip ship) {
 		return shipService.revokeWarehousing(ship);
 	}

+ 4 - 11
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipReturnsController.java

@@ -26,33 +26,23 @@ import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.common.annotation.RepeatSubmit;
 import org.springblade.core.boot.ctrl.BladeController;
-import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
-import org.springblade.salesPart.entity.PjOrderItems;
+import org.springblade.salesPart.annotation.VersionControl;
 import org.springblade.salesPart.entity.PjShip;
 import org.springblade.salesPart.entity.PjShipItems;
 import org.springblade.salesPart.enums.OrderTypeEnum;
-import org.springblade.salesPart.excel.PjShipStockDetails;
-import org.springblade.salesPart.excel.ShipItemImportCodeExcel;
-import org.springblade.salesPart.excel.ShipItemImportExcel;
 import org.springblade.salesPart.ship.service.IShipItemsService;
 import org.springblade.salesPart.ship.service.IShipService;
-import org.springblade.salesPart.vo.ShipVO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -210,6 +200,7 @@ public class ShipReturnsController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入ship")
 	@RepeatSubmit
+	@VersionControl("shipServiceImpl")
 	public R submitReturns(@Valid @RequestBody PjShip ship) {
 		if (ObjectUtil.isEmpty(ship.getBizTypeName())) {
 			throw new RuntimeException("缺少必要参数");
@@ -259,6 +250,7 @@ public class ShipReturnsController extends BladeController {
 	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "出库完成", notes = "传入ship")
 	@RepeatSubmit
+	@VersionControl("shipServiceImpl")
 	public R revokeOutboundCompletedReturns(@Valid @RequestBody PjShip ship) {
 		return shipService.revokeOutboundCompletedReturns(ship);
 	}
@@ -295,6 +287,7 @@ public class ShipReturnsController extends BladeController {
 	@ApiOperationSupport(order = 12)
 	@ApiOperation(value = "撤销入库", notes = "传入ship")
 	@RepeatSubmit
+	@VersionControl("shipServiceImpl")
 	public R revokeWarehousingReturns(@Valid @RequestBody PjShip ship) {
 		return shipService.revokeWarehousingReturns(ship);
 	}

+ 46 - 20
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java

@@ -17,6 +17,8 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import okhttp3.*;
 import org.springblade.client.entity.Message;
 import org.springblade.client.feign.IMessageClient;
+import org.springblade.common.enums.CommonEnum;
+import org.springblade.common.enums.NumberEnum;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
@@ -26,6 +28,7 @@ import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.pay.tonglianPayment.entity.Parameters;
 import org.springblade.pay.tonglianPayment.fegin.ITongLianPaymentClient;
 import org.springblade.salesPart.entity.*;
+import org.springblade.salesPart.enums.FinalMap;
 import org.springblade.salesPart.enums.OrderTypeEnum;
 import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.excel.ShipItemImportCodeExcel;
@@ -126,7 +129,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	@Override
 	public PjShip getMessageById(PjShip ship) {
 		PjShip detail = baseMapper.selectById(ship.getId());
-
+		if (NumberEnum.ONE.number.equals(detail.getIsDeleted())) {
+			throw new NullPointerException("该单据已被删除,请返回列表刷新后重试!");
+		}
 		//明细
 		LambdaQueryWrapper<PjShipItems> itemsLambdaQueryWrapper = new LambdaQueryWrapper<>();
 		itemsLambdaQueryWrapper.eq(PjShipItems::getTenantId, AuthUtil.getTenantId())
@@ -187,12 +192,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public R saveShipMessage(PjShip ship) {
-		if(!org.springframework.util.ObjectUtils.isEmpty(ship.getId())) {
-			PjShip srcShip = baseMapper.selectById(ship.getId());
-			if (ObjectUtils.isNotNull(srcShip) && !Objects.equals(ship.getVersion(), srcShip.getVersion())) {
-				return R.fail(601, "数据已被其他用户更新,请等待刷新后重试");
-			}
-		}
 		//获得所属公司
 		R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
 		if (ObjectUtil.isNotEmpty(dept)) {
@@ -226,15 +225,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			ship.setCreateUser(AuthUtil.getUserId());
 			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 			ship.setTenantId(AuthUtil.getTenantId());
+			ship.setVersion(1);
 			baseMapper.insert(ship);
 		} else {
-			PjShip shipVersion = baseMapper.selectById(ship.getId());
-			if (shipVersion != null && !shipVersion.getVersion().equals(ship.getVersion())) {
-				throw new RuntimeException("数据已被修改,请返回列表重新操作!");
-			}
 			ship.setVersion(ship.getVersion() + 1);
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
+			ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 			baseMapper.updateById(ship);
 		}
 
@@ -930,6 +927,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				order.setLogisticsCorpId(ship.getLogisticsCorpId());
 				order.setLogisticsCorpName(ship.getLogisticsCorpName());
 				order.setExpressNo(ship.getExpressNo());
+				order.setVersion(order.getVersion() + 1);
 				System.err.println("=============出库完成-" + order.getOrdNo() + "==============");
 				if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
 					System.err.println("=============数量等于发货数量-" + order.getOrdNo() + "==============");
@@ -1190,6 +1188,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 											}
 										}
 									}
+									items.setVersion(items.getVersion() + 1);
 									orderMapper.updateById(items);
 								}
 							}
@@ -1245,10 +1244,11 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		ship.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
 		ship.setUpdateUser(AuthUtil.getUserId());
 		ship.setUpdateTime(new Date());
-		PjShip shipVersion = baseMapper.selectById(ship.getId());
+		ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
+/*		PjShip shipVersion = baseMapper.selectById(ship.getId());
 		if (shipVersion != null && !shipVersion.getVersion().equals(ship.getVersion())) {
 			throw new RuntimeException("数据已被修改,请返回列表重新操作!");
-		}
+		}*/
 		baseMapper.updateById(ship);
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
 		// 保存订单明细
@@ -1418,6 +1418,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			order.setDeliveryBusinesDate(null);
 			order.setStatus(OrderTypeEnum.XSDFH.getType());
 			order.setXcxStatus(OrderTypeEnum.XSDFH.getType());
+			order.setVersion(order.getVersion() + 1);
 			orderMapper.updateById(order);
 		} else {
 			throw new RuntimeException("数据异常请联系管理员");
@@ -1425,7 +1426,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 		if (ObjectUtils.isNotNull(status) && "1".equals(status)) {
 			BigDecimal sendNumFinancing = itemsList.stream().map(PjShipItems::getSendNumFinancing).reduce(BigDecimal.ZERO, BigDecimal::add);
-			if (new BigDecimal("0.00").compareTo(sendNumFinancing) != 0) {
+			if (FinalMap.ZERO_POINT_ZERO.compareTo(sendNumFinancing) != 0) {
 				List<ShipItemsRecord> recordList = shipItemsRecordService.list(new LambdaQueryWrapper<ShipItemsRecord>()
 					.eq(ShipItemsRecord::getIsDeleted, 0)
 					.eq(ShipItemsRecord::getTenantId, AuthUtil.getTenantId())
@@ -1830,12 +1831,14 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			ship.setCreateUser(AuthUtil.getUserId());
 			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 			ship.setTenantId(AuthUtil.getTenantId());
+			ship.setVersion(1);
 			baseMapper.insert(ship);
 		} else {
 			ship.setVersion(ship.getVersion() + 1);
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
 			ship.setStorageName(storageDescMapper.selectById(ship.getStorageId()).getCname());
+			ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 			baseMapper.updateById(ship);
 		}
 		BigDecimal number = new BigDecimal("0.00");
@@ -2066,6 +2069,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		//修改任务发货数量
 		PjShip rwShip = baseMapper.selectById(ship.getTaskId());
 		if (ObjectUtils.isNotNull(rwShip)) {
+			ship.setVersion(Objects.isNull(rwShip.getVersion()) ? 1 : rwShip.getVersion() + 1);
 			if (ObjectUtils.isNotNull(rwShip.getSendTotalNum())) {
 				rwShip.setSendTotalNum(rwShip.getSendTotalNum().add(number));
 			} else {
@@ -2097,9 +2101,11 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				BigDecimal goodsTotalShipAmount = orderItemsList.stream().map(PjOrderItems::getGoodsTotalShipAmount).filter(Objects::nonNull)
 					.reduce(BigDecimal.ZERO, BigDecimal::add);
 				if (ObjectUtil.isNotEmpty(order)) {
+					order.setVersion(order.getVersion() + 1);
 					order.setGoodsTotalShipNum(sendNum);
 					order.setGoodsTotalShipAmount(goodsTotalShipAmount);
-					if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
+					if (goodsNum.compareTo(sendNum) == 0) {
+						//数量等于发货数量修改销售订单状态
 						order.setStatus(OrderTypeEnum.RECEIVEDGOODS.getType());
 						order.setXcxStatus(OrderTypeEnum.RECEIVEDGOODS.getType());
 						order.setDeliveryBusinesDate(new Date());
@@ -2507,10 +2513,10 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public R revokeWarehousing(PjShip ship) {
-		PjShip shipVersion = baseMapper.selectById(ship.getId());
+/*		PjShip shipVersion = baseMapper.selectById(ship.getId());
 		if (shipVersion != null && !shipVersion.getVersion().equals(ship.getVersion())) {
 			throw new RuntimeException("数据已被修改,请返回列表重新操作!");
-		}
+		}*/
 		// 保存订单明细
 		BigDecimal number = new BigDecimal("0.00");
 		List<PjShipItems> shipItemsList = new ArrayList<>();
@@ -2687,10 +2693,12 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		saveHistory(ship.getId(), OrderTypeEnum.TREATWAREHOUSING.getType());
 
 		ship.setStatusName(OrderTypeEnum.TREATWAREHOUSING.getType());
+		ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 		baseMapper.updateById(ship);
 		//修改任务发货数量
 		PjShip rwShip = baseMapper.selectById(ship.getTaskId());
 		if (ObjectUtils.isNotNull(rwShip)) {
+			rwShip.setVersion(Objects.isNull(rwShip.getVersion()) ? 1 : rwShip.getVersion() + 1);
 			rwShip.setSendTotalNum(rwShip.getSendTotalNum().subtract(number));
 			if (rwShip.getSendTotalNum().compareTo(rwShip.getGoodsTotalNum()) == 0) {
 				rwShip.setStatusName("已完成");
@@ -2724,6 +2732,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				order.setGoodsTotalShipNum(sendNum);
 				order.setGoodsTotalShipAmount(goodsTotalShipAmount);
 			}
+			order.setVersion(order.getVersion() + 1);
 			order.setStatus(OrderTypeEnum.GOODSRECEIVED.getType());
 			order.setXcxStatus(OrderTypeEnum.GOODSRECEIVED.getType());
 			order.setDeliveryBusinesDate(null);
@@ -3665,11 +3674,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			ship.setCreateUser(AuthUtil.getUserId());
 			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 			ship.setTenantId(AuthUtil.getTenantId());
+			ship.setVersion(1);
 			baseMapper.insert(ship);
 		} else {
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
 			ship.setStorageName(storageDescMapper.selectById(ship.getStorageId()).getCname());
+			ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 			baseMapper.updateById(ship);
 		}
 		// 保存订单明细
@@ -3838,6 +3849,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			//修改任务发货数量
 			PjShip rwShip = baseMapper.selectById(ship.getTaskId());
 			if (ObjectUtils.isNotNull(rwShip)) {
+				rwShip.setVersion(Objects.isNull(rwShip.getVersion()) ? 1 : rwShip.getVersion() + 1);
 				if (ObjectUtils.isNotNull(rwShip.getSendTotalNum())) {
 					rwShip.setSendTotalNum(rwShip.getSendTotalNum().add(number));
 				} else {
@@ -3861,11 +3873,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		BigDecimal amount = pjOrderItemsList.stream().map(PjOrderItems::getSubTotalMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
 		if (ObjectUtil.isNotEmpty(order)) {
+			order.setVersion(order.getVersion() + 1);
 			order.setShipType(ship.getShipType());
 			order.setLogisticsCorpId(ship.getLogisticsCorpId());
 			order.setLogisticsCorpName(ship.getLogisticsCorpName());
 			order.setExpressNo(ship.getExpressNo());
-			if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
+			if (goodsNum.compareTo(sendNum) == 0) {
+				// 数量等于发货数量修改销售订单状态
 				order.setStatus("已完成");
 				order.setXcxStatus("已完成");
 				order.setDeliveryBusinesDate(new Date());
@@ -3951,6 +3965,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		ship.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
 		ship.setUpdateUser(AuthUtil.getUserId());
 		ship.setUpdateTime(new Date());
+		ship.setVersion(ship.getVersion() + 1);
 		baseMapper.updateById(ship);
 
 		// 保存订单明细
@@ -4090,6 +4105,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			PjShip rwShip = baseMapper.selectById(ship.getTaskId());
 			if (ObjectUtils.isNotNull(rwShip)) {
 				rwShip.setSendTotalNum(rwShip.getSendTotalNum().subtract(number));
+				rwShip.setVersion(ObjectUtils.isNull(rwShip.getVersion()) ? 1 : rwShip.getVersion() + 1);
 				if (rwShip.getSendTotalNum().compareTo(rwShip.getGoodsTotalNum()) == 0) {
 					rwShip.setStatusName("已完成");
 				} else {
@@ -4102,6 +4118,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		}
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
 		if (ObjectUtil.isNotEmpty(order)) {
+			order.setVersion(order.getVersion() + 1);
 			order.setStatus("待出库");
 			order.setXcxStatus("待出库");
 			order.setDeliveryBusinesDate(null);
@@ -4373,11 +4390,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			ship.setCreateUser(AuthUtil.getUserId());
 			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 			ship.setTenantId(AuthUtil.getTenantId());
+			ship.setVersion(1);
 			baseMapper.insert(ship);
 		} else {
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
 			ship.setStorageName(storageDescMapper.selectById(ship.getStorageId()).getCname());
+			ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 			baseMapper.updateById(ship);
 		}
 		BigDecimal number = new BigDecimal("0.00");
@@ -4588,6 +4607,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		//修改任务发货数量
 		PjShip rwShip = baseMapper.selectById(ship.getTaskId());
 		if (ObjectUtils.isNotNull(rwShip)) {
+			rwShip.setVersion(Objects.isNull(rwShip.getVersion()) ? 1 : rwShip.getVersion() + 1);
 			if (ObjectUtils.isNotNull(rwShip.getSendTotalNum())) {
 				rwShip.setSendTotalNum(rwShip.getSendTotalNum().add(number));
 			} else {
@@ -4614,7 +4634,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		BigDecimal sendNum = itemsList.stream().map(PjOrderItems::getSendNum).reduce(BigDecimal.ZERO, BigDecimal::add);
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
 		if (ObjectUtil.isNotEmpty(order)) {
-			if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
+			order.setVersion(order.getVersion() + 1);
+			if (goodsNum.compareTo(sendNum) == 0) {
+				// 数量等于发货数量修改销售订单状态
 				order.setStatus("已完成");
 				order.setXcxStatus("已完成");
 				order.setDeliveryBusinesDate(new Date());
@@ -4905,7 +4927,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		}
 		//生成出库工单历史记录
 		saveHistory(ship.getId(), OrderTypeEnum.TREATWAREHOUSING.getType());
-
+		ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 		ship.setStatusName(OrderTypeEnum.TREATWAREHOUSING.getType());
 		baseMapper.updateById(ship);
 		//修改任务发货数量
@@ -4917,12 +4939,14 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			} else {
 				rwShip.setStatusName("未完成");
 			}
+			rwShip.setVersion(Objects.isNull(rwShip) ? 1 : rwShip.getVersion() + 1);
 			rwShip.setUpdateUser(AuthUtil.getUserId());
 			rwShip.setUpdateTime(new Date());
 			baseMapper.updateById(rwShip);
 		}
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
 		if (ObjectUtil.isNotEmpty(order)) {
+			order.setVersion(order.getVersion() + 1);
 			order.setStatus("待入库");
 			order.setXcxStatus("待入库");
 			order.setDeliveryBusinesDate(null);
@@ -5247,10 +5271,12 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			ship.setCreateUser(AuthUtil.getUserId());
 			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 			ship.setTenantId(AuthUtil.getTenantId());
+			ship.setVersion(1);
 			baseMapper.insert(ship);
 		} else {
 			ship.setUpdateUser(AuthUtil.getUserId());
 			ship.setUpdateTime(new Date());
+			ship.setVersion(Objects.isNull(ship.getVersion()) ? 1 : ship.getVersion() + 1);
 			baseMapper.updateById(ship);
 		}