diff --git a/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java b/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java index e846ab261..26d6d9232 100644 --- a/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java +++ b/src/main/java/com/glxp/api/annotation/CusRedissonAnnotation.java @@ -29,4 +29,13 @@ public @interface CusRedissonAnnotation { */ @Min(value = 0, message = "等待时间最小值为0") int waitTime() default 1; + + /** + * 锁的过期时间,默认30秒,小于0时默认为30 + * 超过这个时间锁会自动释放,防止死锁 + * + * @return + */ + @Min(value = 0, message = "锁的过期时间最小值为0") + int leaseTime() default 1; } diff --git a/src/main/java/com/glxp/api/aspect/RedissonAspect.java b/src/main/java/com/glxp/api/aspect/RedissonAspect.java index d1594125a..a06a64821 100644 --- a/src/main/java/com/glxp/api/aspect/RedissonAspect.java +++ b/src/main/java/com/glxp/api/aspect/RedissonAspect.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.glxp.api.annotation.CusRedissonAnnotation; import com.glxp.api.exception.JsonException; +import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; @@ -25,7 +26,9 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +@Slf4j @Aspect @Component public class RedissonAspect { @@ -39,56 +42,75 @@ public class RedissonAspect { @Before("@annotation(annotation)") public void before(JoinPoint joinPoint, CusRedissonAnnotation annotation) throws InterruptedException { - if (StrUtil.isBlank(parseKey(joinPoint, annotation))) { + + String key = parseKey(joinPoint, annotation); + + if (StrUtil.isBlank(key)) { throw new RuntimeException("redisson使用的key不能为空"); } if (StrUtil.isBlank(annotation.timeOutMsg())) { throw new RuntimeException("redisson的超时信息不能为空"); } - RLock lock = redissonClient.getLock(parseKey(joinPoint, annotation)); + RLock lock = redissonClient.getLock(key); int waitTime = annotation.waitTime(); - boolean tryLock = lock.tryLock(waitTime, TimeUnit.SECONDS); + int leaseTime = annotation.leaseTime(); + + boolean tryLock = lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS); if (!tryLock) { throw new JsonException(500, annotation.timeOutMsg()); } - } @After("@annotation(cusRedissonAnnotation)") public void after(JoinPoint joinPoint, CusRedissonAnnotation cusRedissonAnnotation) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); CusRedissonAnnotation annotation = signature.getMethod().getAnnotation(CusRedissonAnnotation.class); - RLock lock = redissonClient.getLock(parseKey(joinPoint, annotation)); + String key = parseKey(joinPoint, annotation); + RLock lock = redissonClient.getLock(key); try { - lock.unlock(); + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } else { + } } catch (Exception e) { e.printStackTrace(); } - - } private String parseKey(JoinPoint joinPoint, CusRedissonAnnotation annotation) { - MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); String[] paramNames = nameDiscoverer.getParameterNames(method); + List keyValue = new ArrayList<>(annotation.key().length); for (String s : annotation.key()) { - Expression expression = expressionParser.parseExpression(s); - EvaluationContext context = new StandardEvaluationContext(); - Object[] args = joinPoint.getArgs(); - for (int i = 0; i < args.length; i++) { - context.setVariable(paramNames[i], args[i]); - } if (s.contains("#")) { - keyValue.add(expression.getValue(context, String.class)); + Expression expression = expressionParser.parseExpression(s); + EvaluationContext context = new StandardEvaluationContext(); + Object[] args = joinPoint.getArgs(); + + for (int i = 0; i < args.length; i++) { + context.setVariable(paramNames[i], args[i]); + } + + Object value = expression.getValue(context); + if (value instanceof List) { + // 如果是List类型,将List中的元素用下划线连接 + List list = (List) value; + keyValue.add(String.join("_", list.stream() + .map(Object::toString) + .collect(Collectors.toList()))); + } else { + keyValue.add(value != null ? value.toString() : ""); + } } else { keyValue.add(s); } } - return String.format("%s:%s", annotation.cacheName(), ArrayUtil.join(keyValue.toArray(), "_")); - } + String finalKey = String.format("%s:%s", annotation.cacheName(), ArrayUtil.join(keyValue.toArray(), "_")); + log.info("redisson分布式锁的key为:{}", finalKey); + return finalKey; + } } diff --git a/src/main/java/com/glxp/api/constant/RedissonCacheKey.java b/src/main/java/com/glxp/api/constant/RedissonCacheKey.java index 1737dfeca..9fc9afbc8 100644 --- a/src/main/java/com/glxp/api/constant/RedissonCacheKey.java +++ b/src/main/java/com/glxp/api/constant/RedissonCacheKey.java @@ -64,9 +64,26 @@ public interface RedissonCacheKey { */ String RM_WORK_BUS_TYPE = "rmWorkBusType"; - String XML_UPLOAD="xml_upload"; + String XML_UPLOAD = "xml_upload"; - String XLSX_UPLOAD="xlsx_upload"; + String XLSX_UPLOAD = "xlsx_upload"; + + /** + * 处方批量添加扫码 + */ + String PRESCRIBE_BATCH_CODE = "prescribe_batch_code"; + + + /** + * 处理单据扫码 + */ + String PRESCRIBE_ADD_CODE = "prescribe_add_code"; + + + /** + * 校验扫码 + */ + String ENTER_CODE_VAIL = "enter_code_vail"; } diff --git a/src/main/java/com/glxp/api/controller/collect/IoCollectOrderCodeManController.java b/src/main/java/com/glxp/api/controller/collect/IoCollectOrderCodeManController.java index 6324c6239..4fdf21b2c 100644 --- a/src/main/java/com/glxp/api/controller/collect/IoCollectOrderCodeManController.java +++ b/src/main/java/com/glxp/api/controller/collect/IoCollectOrderCodeManController.java @@ -3,9 +3,11 @@ package com.glxp.api.controller.collect; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.github.pagehelper.PageInfo; +import com.glxp.api.annotation.CusRedissonAnnotation; import com.glxp.api.common.enums.ResultEnum; import com.glxp.api.common.res.BaseResponse; import com.glxp.api.common.util.ResultVOUtils; +import com.glxp.api.constant.RedissonCacheKey; import com.glxp.api.controller.BaseController; import com.glxp.api.entity.collect.IoCollectOrder; import com.glxp.api.entity.collect.IoCollectOrderBiz; @@ -74,6 +76,7 @@ public class IoCollectOrderCodeManController extends BaseController { * @return */ @PostMapping("/udiwms/ioSplit/collect/order/tagCode") + @CusRedissonAnnotation(cacheName = RedissonCacheKey.PRESCRIBE_ADD_CODE, key = {"#addTagCodeReqeust.billNo", "#addTagCodeReqeust.code"},waitTime = 1,leaseTime = 5, timeOutMsg = "扫码重复提交") public BaseResponse prescribeTagCode(@RequestBody @Valid AddTagCodeReqeust addTagCodeReqeust, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -130,6 +133,7 @@ public class IoCollectOrderCodeManController extends BaseController { * @return */ @PostMapping("/udiwms/ioSplit/collect/order/batchAddCode") + @CusRedissonAnnotation(cacheName = RedissonCacheKey.PRESCRIBE_BATCH_CODE, key = {"#addTagCodeReqeust.prescribeNum", "#addTagCodeReqeust.codeList", "#addTagCodeReqeust.code"}, timeOutMsg = "重复扫码") public BaseResponse batchAddCode(@RequestBody @Valid AddTagCodeReqeust addTagCodeReqeust, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -182,8 +186,6 @@ public class IoCollectOrderCodeManController extends BaseController { addTagCodeReqeust.setCode(code); collectOrderCodeManService.prescribeTagCode(addTagCodeReqeust); } - - } return ResultVOUtils.success(vailTagResultResponse); } diff --git a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java index 9f7b205c3..4027dc776 100644 --- a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java +++ b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java @@ -59,6 +59,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -191,6 +192,9 @@ public class IoCodeTempController extends BaseController { return ResultVOUtils.error(500, "单据号不能为空!"); } String code = addEnterCodeRequest.getCode(); + if (code.endsWith(";")) { + code = code.replace(";", ""); + } //先判断是否已完成 IoCollectOrderBackup byBillNo = ioCollectOrderBackupService.getByBillNo(code); @@ -363,10 +367,10 @@ public class IoCodeTempController extends BaseController { return addEnterCodeResponse; } - @AuthRuleAnnotation("") + @CusRedissonAnnotation(cacheName = RedissonCacheKey.ENTER_CODE_VAIL, key = { "#addEnterCodeRequest.codeList"}, timeOutMsg = "重复扫码") @PostMapping("warehouse/inout/batchVailCode") - public BaseResponse batchVailCode(@RequestBody AddEnterCodeRequest addEnterCodeRequest) { + public BaseResponse batchVailCode(@RequestBody @Valid AddEnterCodeRequest addEnterCodeRequest) { List codeList = addEnterCodeRequest.getCodeList(); if (CollUtil.isEmpty(codeList)) return ResultVOUtils.error(500, "追溯码不能为空"); codeList = codeList.stream().distinct().collect(Collectors.toList()); @@ -448,8 +452,7 @@ public class IoCodeTempController extends BaseController { @RepeatSubmit() @AuthRuleAnnotation("") @PostMapping("warehouse/inout/batchAddCode") -// @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderCodeRequest.corpOrderId", "#addOrderCodeRequest.codeList", "#addOrderCodeRequest.code"}, timeOutMsg = "重复扫码") - @Log(title = "单据管理", businessType = BusinessType.INSERT) + @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderCodeRequest.corpOrderId", "#addOrderCodeRequest.codeList", "#addOrderCodeRequest.code"}, timeOutMsg = "重复扫码11111") public BaseResponse batchAddCode(@RequestBody AddOrderCodeRequest addOrderCodeRequest, BindingResult bindingResult) { if (bindingResult.hasErrors()) { diff --git a/src/main/java/com/glxp/api/service/basic/UdiProductService.java b/src/main/java/com/glxp/api/service/basic/UdiProductService.java index 6d99c19ef..6499f3e1e 100644 --- a/src/main/java/com/glxp/api/service/basic/UdiProductService.java +++ b/src/main/java/com/glxp/api/service/basic/UdiProductService.java @@ -529,10 +529,6 @@ public class UdiProductService extends ServiceImpl BILL_LOCKS = new ConcurrentHashMap<>(); + public void importPrescribe(List basicSkPrescribeEntities) { //下载处方 if (CollUtil.isEmpty(basicSkPrescribeEntities)) basicSkPrescribeEntities = basicSkPrescribeService.list(); List allWorksList = new ArrayList<>(); for (BasicSkPrescribeEntity basicSkPrescribeEntity : basicSkPrescribeEntities) { - if (collectOrderMapper.exists(new LambdaQueryWrapper().eq(IoCollectOrder::getBillNo, basicSkPrescribeEntity.getCode()))) { - continue; - } - SysWorkplaceDocumentEntity sysWorkplaceDocumentEntity = sysWorkplaceDocumentService.findByBusType(basicSkPrescribeEntity.getAddr()); - if (sysWorkplaceDocumentEntity == null) continue; - //自动分配工位 - final Long[] defaultWorkplace = {null}; - List sysWorkplaces = sysWorkplaceService.getAllByBusType(basicSkPrescribeEntity.getAddr()); - if (CollUtil.isNotEmpty(sysWorkplaces)) { - if (sysWorkplaces.size() == 1) { - defaultWorkplace[0] = sysWorkplaces.get(0).getWorkplaceId(); - } else { - List addWorkplace = new ArrayList<>(); - for (SysWorkplaceResponse sysWorkplace : sysWorkplaces) { - //获取是否有正在处理的工位 - List collectOrderList1 = collectOrderMapper.selectList(new LambdaQueryWrapper().eq(IoCollectOrder::getWorkPlaceCode, sysWorkplace.getWorkplaceId()).in(IoCollectOrder::getTagStatus, -1, 1, 2)); - sysWorkplace.setOrderCount(collectOrderList1.size()); - if (IntUtil.value(sysWorkplace.getOrderCount()) > 0) { - addWorkplace.add(sysWorkplace); + // 获取单号 + String billNo = basicSkPrescribeEntity.getCode(); + // 为每个单号创建一个锁对象,如果已存在则使用现有的 + Object billLock = BILL_LOCKS.computeIfAbsent(billNo, k -> new Object()); + // 使用同步块确保同一单号的处理是同步的 + synchronized (billLock) { + try { + if (collectOrderMapper.exists(new LambdaQueryWrapper().eq(IoCollectOrder::getBillNo, billNo))) { + continue; + } + SysWorkplaceDocumentEntity sysWorkplaceDocumentEntity = sysWorkplaceDocumentService.findByBusType(basicSkPrescribeEntity.getAddr()); + if (sysWorkplaceDocumentEntity == null) continue; + //自动分配工位 + final Long[] defaultWorkplace = {null}; + List sysWorkplaces = sysWorkplaceService.getAllByBusType(basicSkPrescribeEntity.getAddr()); + if (CollUtil.isNotEmpty(sysWorkplaces)) { + if (sysWorkplaces.size() == 1) { + defaultWorkplace[0] = sysWorkplaces.get(0).getWorkplaceId(); + } else { + List addWorkplace = new ArrayList<>(); + for (SysWorkplaceResponse sysWorkplace : sysWorkplaces) { + //获取是否有正在处理的工位 + List collectOrderList1 = collectOrderMapper.selectList(new LambdaQueryWrapper().eq(IoCollectOrder::getWorkPlaceCode, sysWorkplace.getWorkplaceId()).in(IoCollectOrder::getTagStatus, -1, 1, 2)); + sysWorkplace.setOrderCount(collectOrderList1.size()); + if (IntUtil.value(sysWorkplace.getOrderCount()) > 0) { + addWorkplace.add(sysWorkplace); + } + } + if (addWorkplace.size() > 0) { + Optional minCountObject = addWorkplace.stream().min((o1, o2) -> Integer.compare(o1.getOrderCount(), o2.getOrderCount())); + minCountObject.ifPresent(sysWorkplace -> defaultWorkplace[0] = sysWorkplace.getWorkplaceId()); + } else { + defaultWorkplace[0] = sysWorkplaces.get(0).getWorkplaceId(); + } } } - if (addWorkplace.size() > 0) { - Optional minCountObject = addWorkplace.stream().min((o1, o2) -> Integer.compare(o1.getOrderCount(), o2.getOrderCount())); - minCountObject.ifPresent(sysWorkplace -> defaultWorkplace[0] = sysWorkplace.getWorkplaceId()); - } else { - defaultWorkplace[0] = sysWorkplaces.get(0).getWorkplaceId(); + IoCollectOrder collectOrder = IoCollectOrder.builder().billNo(billNo).busType(sysWorkplaceDocumentEntity.getDocumentTypeCode()).fromType("HIS系统").fromCorp(basicSkPrescribeEntity.getSickerCode()).workPlaceCode(defaultWorkplace[0]).billTime(MsDateUtil.localToDate(basicSkPrescribeEntity.getPrescribeDate())).createTime(new Date()).createUser(basicSkPrescribeEntity.getCreateUser()).backupOrderRemark1(basicSkPrescribeEntity.getStooutNo()).updateTime(new Date()).orderCirType(sysWorkplaceDocumentEntity.getOrderCirType()).splitStatus(0).tagStatus(0).remark(basicSkPrescribeEntity.getRemark()).build(); + if (collectOrder.getWorkPlaceCode() != null) { + collectOrder.setTagStatus(1); } + save(collectOrder); + List basicSkPrescribeItemEntities = basicSkPrescirbeDetailService.findByPrescribeNum(billNo); + List collectOrderBizs = new ArrayList<>(); + for (BasicSkPrescribeItemEntity bizEntity : basicSkPrescribeItemEntities) { + UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(bizEntity.getRelId() + ""); + double doubleValue = Double.parseDouble(bizEntity.getMeasureCount()); + IoCollectOrderBiz collectOrderBiz = IoCollectOrderBiz.builder().orderIdFk(collectOrder.getBillNo()).relId(bizEntity.getRelId()).thrCode(bizEntity.getItemCode()).ybbm(udiRelevanceResponse.getYbbm()).payFeeCode(udiRelevanceResponse.getPayFeeCode()).cpmctymc(bizEntity.getItemName()).nameCode(udiRelevanceResponse.getNameCode()).batchNo(bizEntity.getBatchNo()).count((int) doubleValue).measureUnit(bizEntity.getMeasureUnit()).tagStatus(1).unTagCount(bizEntity.getCount()).build(); + + if (IntUtil.value(udiRelevanceResponse.getProductsType()) == 2) { + collectOrderBiz.setMeasureUnit(udiRelevanceResponse.getPrepnUnit()); + } + collectOrderBizs.add(collectOrderBiz); + } + if (CollUtil.isNotEmpty(collectOrderBizs)) collectOrderBizService.saveBatch(collectOrderBizs); + allWorksList.addAll(sysWorkplaces); + if (IntUtil.value(sysWorkplaceDocumentEntity.getAutoTag()) == 1 && IntUtil.value(collectOrder.getTagStatus()) == 1) { + splitFifoCodeService.lockInventoryByOrder(billNo, 1); + } + } finally { + // 处理完成后,移除锁对象,释放内存 + BILL_LOCKS.remove(billNo); } } - - - IoCollectOrder collectOrder = IoCollectOrder.builder().billNo(basicSkPrescribeEntity.getCode()).busType(sysWorkplaceDocumentEntity.getDocumentTypeCode()).fromType("HIS系统").fromCorp(basicSkPrescribeEntity.getSickerCode()).workPlaceCode(defaultWorkplace[0]).billTime(MsDateUtil.localToDate(basicSkPrescribeEntity.getPrescribeDate())).createTime(new Date()).createUser(basicSkPrescribeEntity.getCreateUser()).backupOrderRemark1(basicSkPrescribeEntity.getStooutNo()).updateTime(new Date()).orderCirType(sysWorkplaceDocumentEntity.getOrderCirType()).splitStatus(0).tagStatus(0).remark(basicSkPrescribeEntity.getRemark()).build(); - if (collectOrder.getWorkPlaceCode() != null) { - collectOrder.setTagStatus(1); - } - save(collectOrder); - List basicSkPrescribeItemEntities = basicSkPrescirbeDetailService.findByPrescribeNum(basicSkPrescribeEntity.getCode()); - List collectOrderBizs = new ArrayList<>(); - for (BasicSkPrescribeItemEntity bizEntity : basicSkPrescribeItemEntities) { - UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(bizEntity.getRelId() + ""); - double doubleValue = Double.parseDouble(bizEntity.getMeasureCount()); - IoCollectOrderBiz collectOrderBiz = IoCollectOrderBiz.builder().orderIdFk(collectOrder.getBillNo()).relId(bizEntity.getRelId()).thrCode(bizEntity.getItemCode()).ybbm(udiRelevanceResponse.getYbbm()).payFeeCode(udiRelevanceResponse.getPayFeeCode()).cpmctymc(bizEntity.getItemName()).nameCode(udiRelevanceResponse.getNameCode()).batchNo(bizEntity.getBatchNo()).count((int) doubleValue).measureUnit(bizEntity.getMeasureUnit()).tagStatus(1).unTagCount(bizEntity.getCount()).build(); - - if (IntUtil.value(udiRelevanceResponse.getProductsType()) == 2) { - collectOrderBiz.setMeasureUnit(udiRelevanceResponse.getPrepnUnit()); - } - collectOrderBizs.add(collectOrderBiz); - } - if (CollUtil.isNotEmpty(collectOrderBizs)) collectOrderBizService.saveBatch(collectOrderBizs); - - allWorksList.addAll(sysWorkplaces); - if (IntUtil.value(sysWorkplaceDocumentEntity.getAutoTag()) == 1 && IntUtil.value(collectOrder.getTagStatus()) == 1) { - splitFifoCodeService.lockInventoryByOrder(collectOrder.getBillNo(), 1); - } - } } @@ -540,53 +552,62 @@ public class IoCollectOrderService extends ServiceImpl ioCollectOrderList, CollectOrderRequest collectOrderRequest) { String addr = collectOrderRequest.getBusType(); if (CollUtil.isNotEmpty(ioCollectOrderList)) { - //是否自动转成待处理单据 IoCollectSet collectSet = collectSetService.getSet(); for (IoCollectOrder collectOrder : ioCollectOrderList) { - IoCollectOrderOrigin ioCollectOrderOrigin = new IoCollectOrderOrigin(); - if (collectOrderMapper.exists(new LambdaQueryWrapper().eq(IoCollectOrder::getBillNo, collectOrder.getBillNo()))) { - continue; - } - SysWorkplaceDocumentEntity sysWorkplaceDocumentEntity = sysWorkplaceDocumentService.findByBusType(addr); - if (sysWorkplaceDocumentEntity == null) { - continue; - } + // 获取单号 + String billNo = collectOrder.getBillNo(); + // 为每个单号创建一个锁对象,如果已存在则使用现有的 + Object billLock = BILL_LOCKS.computeIfAbsent(billNo, k -> new Object()); + // 使用同步块确保同一单号的处理是同步的 + synchronized (billLock) { + try { + IoCollectOrderOrigin ioCollectOrderOrigin = new IoCollectOrderOrigin(); + if (collectOrderMapper.exists(new LambdaQueryWrapper().eq(IoCollectOrder::getBillNo, collectOrder.getBillNo()))) { + continue; + } + SysWorkplaceDocumentEntity sysWorkplaceDocumentEntity = sysWorkplaceDocumentService.findByBusType(addr); + if (sysWorkplaceDocumentEntity == null) { + continue; + } - collectOrder.setOrderCirType(sysWorkplaceDocumentEntity.getOrderCirType()); - BeanUtils.copyProperties(collectOrder, ioCollectOrderOrigin); - collectOrderOriginService.remove(new LambdaUpdateWrapper().eq(IoCollectOrderOrigin::getBillNo, ioCollectOrderOrigin.getBillNo())); - collectOrderOriginService.save(ioCollectOrderOrigin); - List bizList = collectOrder.getBizList(); - if (CollUtil.isNotEmpty(bizList)) { - //先清空 原来的biz - String billNo = collectOrder.getBillNo(); - collectOrderBizOriginService.remove(new LambdaUpdateWrapper().eq(IoCollectOrderBizOrigin::getOrderIdFk, billNo)); - - for (IoCollectOrderBiz collectOrderBiz : bizList) { - if (collectOrderBiz.getRelId() != null) { - UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(collectOrderBiz.getRelId() + ""); - if (udiRelevanceResponse != null) { - collectOrderBiz.setYbbm(udiRelevanceResponse.getYbbm()); - collectOrderBiz.setPayFeeCode(udiRelevanceResponse.getPayFeeCode()); - collectOrderBiz.setNameCode(udiRelevanceResponse.getNameCode()); - if (IntUtil.value(udiRelevanceResponse.getProductsType()) == 2) { - collectOrderBiz.setMeasureUnit(udiRelevanceResponse.getPrepnUnit()); + collectOrder.setOrderCirType(sysWorkplaceDocumentEntity.getOrderCirType()); + BeanUtils.copyProperties(collectOrder, ioCollectOrderOrigin); + collectOrderOriginService.remove(new LambdaUpdateWrapper().eq(IoCollectOrderOrigin::getBillNo, ioCollectOrderOrigin.getBillNo())); + collectOrderOriginService.save(ioCollectOrderOrigin); + List bizList = collectOrder.getBizList(); + if (CollUtil.isNotEmpty(bizList)) { + //先清空 原来的biz + for (IoCollectOrderBiz collectOrderBiz : bizList) { + if (collectOrderBiz.getRelId() != null) { + UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(collectOrderBiz.getRelId() + ""); + if (udiRelevanceResponse != null) { + collectOrderBiz.setYbbm(udiRelevanceResponse.getYbbm()); + collectOrderBiz.setPayFeeCode(udiRelevanceResponse.getPayFeeCode()); + collectOrderBiz.setNameCode(udiRelevanceResponse.getNameCode()); + if (IntUtil.value(udiRelevanceResponse.getProductsType()) == 2) { + collectOrderBiz.setMeasureUnit(udiRelevanceResponse.getPrepnUnit()); + } + } } } + List ioCollectOrderBizOrigins = BeanCopyUtils.copyList(bizList, IoCollectOrderBizOrigin.class); + collectOrderBizOriginService.remove(new LambdaUpdateWrapper().eq(IoCollectOrderBizOrigin::getOrderIdFk, billNo)); + collectOrderBizOriginService.saveBatch(ioCollectOrderBizOrigins); } - } - List ioCollectOrderBizOrigins = BeanCopyUtils.copyList(bizList, IoCollectOrderBizOrigin.class); - collectOrderBizOriginService.saveBatch(ioCollectOrderBizOrigins); - } - if (!collectOrder.getTagStatus().equals(4) && (IntUtil.value(collectSet.getAutoDealOrder()) || IntUtil.value(collectOrderRequest.getForceAllot()))) {//没出现耗材不匹配 且 开启了自动转成待处理单据 - collectOrder.setTagStatus(1); - boolean isExit = collectOrderMapper.exists(new LambdaQueryWrapper().eq(IoCollectOrder::getBillNo, collectOrder.getBillNo()).eq(IoCollectOrder::getBusType, collectOrder.getBusType())); - if (!isExit) { - collectOrderMapper.insert(collectOrder); - collectOrderBizService.saveBatch(bizList); + if (!collectOrder.getTagStatus().equals(4) && (IntUtil.value(collectSet.getAutoDealOrder()) || IntUtil.value(collectOrderRequest.getForceAllot()))) {//没出现耗材不匹配 且 开启了自动转成待处理单据 + collectOrder.setTagStatus(1); + boolean isExit = collectOrderMapper.exists(new LambdaQueryWrapper().eq(IoCollectOrder::getBillNo, collectOrder.getBillNo()).eq(IoCollectOrder::getBusType, collectOrder.getBusType())); + if (!isExit) { + collectOrderMapper.insert(collectOrder); + collectOrderBizService.saveBatch(bizList); + } + } + } finally { + // 处理完成后,移除锁对象,释放内存 + BILL_LOCKS.remove(billNo); } } } @@ -820,7 +841,7 @@ public class IoCollectOrderService extends ServiceImpl