From f600f38c6c23a282b61ed4db1b2da094d695276f Mon Sep 17 00:00:00 2001
From: zhangfeng <1603559716@qq.com>
Date: Fri, 25 Nov 2022 16:43:52 +0800
Subject: [PATCH] 安全物资和设备管理调整
---
equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java | 304 ++++++++++++++++++++++++++++++++++----------------
1 files changed, 205 insertions(+), 99 deletions(-)
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
index ff396c5..09a01fe 100644
--- a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
@@ -5,6 +5,7 @@
import com.gkhy.safePlatform.account.rpc.apimodel.AccountUserService;
import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.UserInfoRPCRespDTO;
import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.commons.exception.BusinessException;
import com.gkhy.safePlatform.commons.query.PageQuery;
import com.gkhy.safePlatform.commons.utils.StringUtils;
import com.gkhy.safePlatform.commons.vo.ResultVO;
@@ -24,6 +25,8 @@
import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -35,6 +38,7 @@
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service("SafeMaterialDetailService")
@@ -56,6 +60,8 @@
@Autowired
private RocketMQTemplateHelper rocketMQTemplateHelper;
+ @Autowired
+ private RedissonClient redissonClient;
@Override
public ResultVO save(SafeMaterialDetailAddReq req) {
//判断物资是否存在
@@ -131,18 +137,36 @@
}
}
- //批量入库
- safeMaterialDetailInfoService.saveBatch(list);
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_SAVE");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ //批量入库
+ safeMaterialDetailInfoService.saveBatch(list);
- //发送消息
- if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
- for(SafeMaterialDetailInfo materialDetailInfo:list){
- SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
- safeMaterialMsg.setId(materialDetailInfo.getId());
- safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
- rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+ //发送消息
+ if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+ for(SafeMaterialDetailInfo materialDetailInfo:list){
+ SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+ safeMaterialMsg.setId(materialDetailInfo.getId());
+ safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
+ rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+ }
+ }
+ //创建成功,释放锁
+ lock.unlock();
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
}
}
+
return new ResultVO<>(ResultCodes.OK);
}
@@ -187,16 +211,31 @@
materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i));
list.add(materialDetailInfo);
}
- //批量入库
- safeMaterialDetailInfoService.saveBatch(list);
- //发送消息
- if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
- for(SafeMaterialDetailInfo materialDetailInfo:list){
- //发送消息
- SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
- safeMaterialMsg.setId(materialInfo.getId());
- safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
- rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_SAVEBATCH");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ //批量入库
+ safeMaterialDetailInfoService.saveBatch(list);
+ //发送消息
+ if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+ for(SafeMaterialDetailInfo materialDetailInfo:list){
+ //发送消息
+ SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+ safeMaterialMsg.setId(materialInfo.getId());
+ safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
+ rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+ }
+ }
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
}
}
return new ResultVO<>(ResultCodes.OK);
@@ -232,15 +271,30 @@
safeMaterialDetailInfo.setSmId(req.getSmId());
safeMaterialDetailInfo.setValidType(req.getValidType());
safeMaterialDetailInfo.setValidTime(req.getValidTime());
- //修改
- safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo);
- //如果是非常期
- if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
- //发送消息
- SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
- safeMaterialMsg.setId(req.getId());
- safeMaterialMsg.setValidTime(conversionTimeType(req.getValidTime()));
- rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_UPDATE");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ //修改
+ safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo);
+ //如果是非常期
+ if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+ //发送消息
+ SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+ safeMaterialMsg.setId(req.getId());
+ safeMaterialMsg.setValidTime(conversionTimeType(req.getValidTime()));
+ rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+ }
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
+ }
}
return new ResultVO(ResultCodes.OK);
}
@@ -251,23 +305,33 @@
* @return
*/
@Override
- public ResultVO receiptBatch(Long[] ids) {
- if (ids.length == 0) {
- throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+ public ResultVO receiptBatch(ParamForm paramForm) {
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_RECEIPTBATCH");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ //验证
+ List<SafeMaterialDetailInfo> list = safeMaterialDetailInfoService.getListByIds(paramForm.getIds());
+ List<SafeMaterialDetailInfo> selectList = list
+ .stream()
+ .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()) && item.getConsumable().equals(ConsumableEnum.YES.getCode()))
+ .collect(Collectors.toList());
+ if(selectList.size() != paramForm.getIds().size()){
+ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已入库或耗材物资不可重复入库!");
+ }
+ //修改为入库状态
+ safeMaterialDetailInfoService.updateReceiptStatusByIds(paramForm.getIds(),IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
+ }
}
- List<Long> idList = new ArrayList<>();
- Collections.addAll(idList,ids);
- //验证
- List<SafeMaterialDetailInfo> list = safeMaterialDetailInfoService.getListByIds(idList);
- List<SafeMaterialDetailInfo> selectList = list
- .stream()
- .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()) && item.getConsumable().equals(ConsumableEnum.YES.getCode()))
- .collect(Collectors.toList());
- if(selectList.size() != ids.length){
- throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已入库或耗材物资不可重复入库!");
- }
- //修改为入库状态
- safeMaterialDetailInfoService.updateReceiptStatusByIds(idList,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
return new ResultVO(ResultCodes.OK);
}
@@ -277,11 +341,8 @@
* @return
*/
@Override
- public ResultVO deleteBatch(Long[] ids) {
- if (ids.length == 0) {
- throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
- }
- safeMaterialDetailInfoService.deleteBatch(ids);
+ public ResultVO deleteBatch(ParamForm paramForm) {
+ safeMaterialDetailInfoService.deleteBatch(paramForm.getIds());
return new ResultVO(ResultCodes.OK);
}
@@ -315,26 +376,41 @@
public ResultVO deliveryBatchRandom(MterialRandomDeliveryReq req) {
UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
List<Long> idList = new ArrayList<>();
- if(StringUtils.isNotBlank(req.getRfid())){
- idList = safeMaterialDetailInfoService.getIdListByRfid(req.getCount(),req.getSmId(),req.getRfid());
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_DELIVERYBATCHRANDOM");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ if(StringUtils.isNotBlank(req.getRfid())){
+ idList = safeMaterialDetailInfoService.getIdListByRfid(req.getCount(),req.getSmId(),req.getRfid());
- }else{
- idList = safeMaterialDetailInfoService.getRfidNullList(req.getCount(), req.getSmId());
+ }else{
+ idList = safeMaterialDetailInfoService.getRfidNullList(req.getCount(), req.getSmId());
+ }
+ if(idList.size()< req.getCount()){
+ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效库存数量不足!");
+ }
+ //获取有效数量
+ Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(req.getSmId());
+ if(req.getCount() > validStockCount){
+ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可大于有效库存数量!");
+ }
+ SafeMaterialDetailBO detailBO = new SafeMaterialDetailBO();
+ detailBO.setClaimantName(userInfo.getUsername());
+ detailBO.setClaimantId(req.getClaimantId());
+ detailBO.setIds(idList);
+ safeMaterialDetailInfoService.updateDeliveryStatusByIds(detailBO);
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
+ }
}
- if(idList.size()< req.getCount()){
- throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效库存数量不足!");
- }
- //获取有效数量
- Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(req.getSmId());
- if(req.getCount() > validStockCount){
- throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可大于有效库存数量!");
- }
- SafeMaterialDetailBO detailBO = new SafeMaterialDetailBO();
- detailBO.setClaimantName(userInfo.getUsername());
- detailBO.setClaimantId(req.getClaimantId());
- detailBO.setIds(idList);
- safeMaterialDetailInfoService.updateDeliveryStatusByIds(detailBO);
return new ResultVO(ResultCodes.OK);
}
@@ -501,27 +577,42 @@
*/
@Override
public ResultVO singleDelivery(SafeMaterialDetailReq req) {
- //获取该条数据
- SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId());
- if(null == vo){
- throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_SINGLEDELIVERY");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ //获取该条数据
+ SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId());
+ if(null == vo){
+ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+ }
+ if(vo.getValidStatus().equals(ValidStatusEnum.NO.getCode())){
+ throw new EquipmentException(EquipmentResultCodes.MATERIAL_INVALID,"无效物资不可出库");
+ }
+ if(vo.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode())){
+ throw new EquipmentException(EquipmentResultCodes.MATERIAL_OUT_OF_LIBRARY);
+ }
+ //检查认领人
+ UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
+ SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+ materialDetailInfo.setId(req.getId());
+ materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
+ materialDetailInfo.setClaimantId(req.getClaimantId());
+ materialDetailInfo.setClaimantName(userInfo.getUsername());
+ materialDetailInfo.setDeliveryTime(LocalDateTime.now());
+ //修改出入库状态为出库
+ safeMaterialDetailInfoService.updateById(materialDetailInfo);
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
+ }
}
- if(vo.getValidStatus().equals(ValidStatusEnum.NO.getCode())){
- throw new EquipmentException(EquipmentResultCodes.MATERIAL_INVALID,"无效物资不可出库");
- }
- if(vo.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode())){
- throw new EquipmentException(EquipmentResultCodes.MATERIAL_OUT_OF_LIBRARY);
- }
- //检查认领人
- UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
- SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
- materialDetailInfo.setId(req.getId());
- materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
- materialDetailInfo.setClaimantId(req.getClaimantId());
- materialDetailInfo.setClaimantName(userInfo.getUsername());
- materialDetailInfo.setDeliveryTime(LocalDateTime.now());
- //修改出入库状态为出库
- safeMaterialDetailInfoService.updateById(materialDetailInfo);
return new ResultVO<>(ResultCodes.OK);
}
@@ -536,20 +627,35 @@
if(null == id){
throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
}
- //获取该条数据
- SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id);
- if(null == vo){
- throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+ //加分布式锁,防止重复创建规则
+ RLock lock = redissonClient.getLock("LOCK_SMD_SINGLERECEIPT");
+ try {
+ lock.lock(10, TimeUnit.SECONDS);
+ //获取该条数据
+ SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id);
+ if(null == vo){
+ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+ }
+ //如果是耗材不可重新入库
+ if(vo.getConsumable().equals(ConsumableEnum.YES.getCode())){
+ throw new EquipmentException(EquipmentResultCodes.MATERIAL_CONSUMABLE);
+ }
+ if(vo.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode())){
+ throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY);
+ }
+ //修改出入库状态为入库
+ safeMaterialDetailInfoService.updateReceiptStatus(id,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+ }catch (EquipmentException e) {
+ e.printStackTrace();
+ throw new EquipmentException(e.getCode(), e.getMessage());
+ }catch (Exception e) {
+ e.printStackTrace();
+ throw new BusinessException(ResultCodes.SERVER_ERROR);
+ }finally {
+ if(lock.isLocked()){
+ lock.unlock();
+ }
}
- //如果是耗材不可重新入库
- if(vo.getConsumable().equals(ConsumableEnum.YES.getCode())){
- throw new EquipmentException(EquipmentResultCodes.MATERIAL_CONSUMABLE);
- }
- if(vo.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode())){
- throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY);
- }
- //修改出入库状态为入库
- safeMaterialDetailInfoService.updateReceiptStatus(id,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
return new ResultVO<>(ResultCodes.OK);
}
--
Gitblit v1.9.2