From 209d9c6f60d96fc29fad0bd2f9dad8fe8424f91f Mon Sep 17 00:00:00 2001 From: futian.liu <liufutianyoo@163.com> Date: 星期五, 17 十一月 2023 18:10:47 +0800 Subject: [PATCH] 调拨管理 --- consum-base/src/main/java/com/consum/base/service/LWhFormTransferCoreService.java | 256 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 238 insertions(+), 18 deletions(-) diff --git a/consum-base/src/main/java/com/consum/base/service/LWhFormTransferCoreService.java b/consum-base/src/main/java/com/consum/base/service/LWhFormTransferCoreService.java index 70c38b4..7c0bff1 100644 --- a/consum-base/src/main/java/com/consum/base/service/LWhFormTransferCoreService.java +++ b/consum-base/src/main/java/com/consum/base/service/LWhFormTransferCoreService.java @@ -1,40 +1,61 @@ package com.consum.base.service; +import com.consum.base.core.WhBusinessEnum; +import com.consum.base.core.utils.LockManage; +import com.consum.model.po.LGoodsUserRecord; +import com.consum.model.po.LWarehouseFlow; import com.consum.model.po.LWhFormTransfer; +import com.consum.model.po.LWhGoodsRecord; +import com.consum.model.po.LWhGoodsRecordDetails; +import com.consum.model.po.LWhProcureModelUser; import com.iplatform.model.po.S_user_core; +import com.walker.infrastructure.utils.CollectionUtils; import com.walker.infrastructure.utils.DateUtils; +import com.walker.infrastructure.utils.NumberGenerator; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; - -import javax.annotation.Resource; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; /** * @ClassName LWhFormTransferCoreService - * @Author cy * @Date 2023/10/26 * @Description * @Version 1.0 **/ @Service @Slf4j +@Transactional(rollbackFor = Exception.class) public class LWhFormTransferCoreService { + @Resource - private LWhProcureModelService lWhProcureModelService; - @Resource - private LWhFormTransferService lWhFormTransferService; - @Resource - private LWarehouseFlowCoreService lWarehouseFlowService; + private LWhFormTransferServiceImpl lWhFormTransferService; @Resource private LWhFormOutputCoreService lWhFormOutputCoreService; + @Resource + private GoodsBaseServiceImpl goodsBaseService; + @Resource + private LWhGoodsRecordService lWhGoodsRecordService; + @Resource + private LWhGoodsService lWhGoodsService; + @Resource + private LGoodsWhRecordServiceImpl lGoodsWhRecordService; + @Resource + private LWarehouseFlowService lWarehouseFlowService; + @Resource + private LWhGoodsRecordDetailsService lWhGoodsRecordDetailsService; + @Resource + private LGoodsUserRecordServiceImpl lGoodsUserRecordService; /** * 鎵ц璋冩嫧鍑哄簱鎿嶄綔 - * 1. 閫氳繃璋冩嫧鍗曘�怶H_FORM_TRANSFER銆� 纭畾璋冩嫧鍗曠墿鍝併�怢_WH_PROCURE_MODEL銆� - * 2. 鏍¢獙搴撳瓨 - * 3. 鏇存柊杩涘嚭搴撴祦姘存�昏〃[L_WAREHOUSE_FLOW]銆佸悇瑙勬牸鐗╁搧鐨勮繘鍑哄簱銆怢_WH_GOODS_RECORD銆戙�佽繘鍑哄簱娴佹按鏄庣粏[L_WH_GOODS_RECORD_DETAILS]銆� - * 搴撳瓨鐗╁搧璇︽儏锛圠_WH_GOODS锛� - * 4. 鏇存柊璋冩嫧鍗曘�怶H_FORM_TRANSFER銆戜负寰呮帴鏀讹紝鏇存柊璋冩嫧鍗曠墿鍝併�怶H_FORM_TRANSFER_MODEL銆戝嚭搴撴祦姘碔D * * @param whFormTransferId 璋冩嫧鍗昳d */ @@ -53,18 +74,217 @@ // 鍑哄簱鍗旾D Long outWarehouseFormId = null; try { - // 鏍规嵁璋冩嫧鍗� 鐢熸垚 鍑哄簱鍗� - outWarehouseFormId = lWhFormOutputCoreService.createOutFormByTransId(whFormTransferId, currentUser); + // 鏍规嵁璋冩嫧鍗� 鐢熸垚 鍑哄簱鍗� 杩欐牱灏辫兘鍏敤鍑哄簱 + outWarehouseFormId = lWhFormOutputCoreService.createOutFormByTransId(whFormTransferId, currentUser, dealTime); } catch (Exception e) { log.error(e.getMessage()); return; } - // 鍑哄簱鍗� 鍑哄簱 - Long aLong = lWhFormOutputCoreService.outFormByTransId(whFormTransferId, currentUser); + //鍗曟嵁绫诲瀷銆�0浠撳簱璋冩嫧锛�1閮ㄩ棬鍒嗗彂锛�2閮ㄩ棬鐗╁搧鍥為�� + Integer businessType = lWhFormTransfer.getBusinessType(); + businessType = businessType == null ? 0 : businessType; + WhBusinessEnum businessEnum = WhBusinessEnum.DIAOBO; + if (businessType == 0) { + businessEnum = WhBusinessEnum.DIAOBO; + } else if (businessType == 1) { + businessEnum = WhBusinessEnum.BUMENFENFA; + } else if (businessType == 2) { + businessEnum = WhBusinessEnum.BUMENTUIHUI; + } + // 鍑哄簱鍗� 鍑哄簱锛岃繑鍥� 鍑哄簱鍗曟祦姘碔d + Long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(outWarehouseFormId, businessEnum, currentUser, dealTime); - + // 鏇存柊璋冩嫧鍗� + lWhFormTransfer = new LWhFormTransfer(whFormTransferId); + lWhFormTransfer.setOutWarehouseFormId(outWarehouseFormId); + lWhFormTransfer.setStates(1); + lWhFormTransfer.setOutOperatorId(userId); + lWhFormTransfer.setOutOperatorName(nickName); + lWhFormTransfer.setOutputTime(dealTime); + lWhFormTransfer.setOutWarehouseFlowId(lWarehouseFlowId); + lWhFormTransferService.update(lWhFormTransfer); log.info("璋冩嫧鍗曪細{} 鍑哄簱瀹屾垚", whFormTransferId); return; } + + /** + * 璋冩嫧鍗曞叆搴� + * + * @param whFormTransferId + * @param currentUser + */ + public void doTransferInPut(Long whFormTransferId, S_user_core currentUser) { + LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(whFormTransferId); + lWhFormTransfer = lWhFormTransferService.get(lWhFormTransfer); + if (lWhFormTransfer == null || lWhFormTransfer.getStates() != 1) { + log.error("璋冩嫧澶辫触锛佽妫�鏌ヨ皟鎷ㄥ崟鐘舵��"); + return; + } + Long userId = currentUser.getId(); + String nickName = currentUser.getNick_name(); + // 鍑哄簱鍗曟祦姘磇d + Long outWarehouseFlowId = lWhFormTransfer.getOutWarehouseFlowId(); + // 鍏ュ簱浠撳簱绫诲瀷 0鏈烘瀯1閮ㄩ棬 + Integer inWarehouseType = lWhFormTransfer.getInWarehouseType(); + Long inWarehouseId = lWhFormTransfer.getInWarehouseId(); + String inWarehouseName = lWhFormTransfer.getInWarehouseName(); + + long dealTime = DateUtils.getDateTimeNumber(System.currentTimeMillis()); + + // 娴佹按璁板綍鎬昏〃ID + long inWarehouseFlowId = NumberGenerator.getLongSequenceNumber(); + //鍗曟嵁绫诲瀷銆�0浠撳簱璋冩嫧锛�1閮ㄩ棬鍒嗗彂锛�2閮ㄩ棬鐗╁搧鍥為�� + Integer businessType = lWhFormTransfer.getBusinessType(); + //鐘舵�侊紙0=鍦ㄩ�旇皟鎷紱1=鍏ュ簱鏈垎鍙戯紱2=宸蹭笅鍙戯紱3=鎶ュ簾 4 闆舵槦鍑哄簱锛� + Integer goodsStatus = 1; + //绫诲瀷0鍒嗗彂浣跨敤1 鍙嶅簱 + Integer recordType = null; + if (businessType == 1) { + goodsStatus = 2; + recordType = 0; + + } else if (businessType == 2) { + goodsStatus = 1; + recordType = 1; + } + + // 鎻掑叆 杩涘嚭搴撴祦姘存�昏〃[L_WAREHOUSE_FLOW] + LWarehouseFlow inwarehouseFlow = new LWarehouseFlow(); + inwarehouseFlow.setId(inWarehouseFlowId); + inwarehouseFlow.setWarehouseType(inWarehouseType); + inwarehouseFlow.setWarehouseId(inWarehouseId); + inwarehouseFlow.setWarehouseName(inWarehouseName); + inwarehouseFlow.setThisType(1); + inwarehouseFlow.setBusinessType(2); + inwarehouseFlow.setBusinessFormId(whFormTransferId); + inwarehouseFlow.setOperatorId(userId); + inwarehouseFlow.setOperatorName(nickName); + inwarehouseFlow.setDealTime(dealTime); + lWarehouseFlowService.insert(inwarehouseFlow); + + LWhGoodsRecord lWhGoodsRecord = new LWhGoodsRecord(); + lWhGoodsRecord.setWarehouseFlowId(outWarehouseFlowId); + List<LWhGoodsRecord> whGoodsRecordList = lWhGoodsRecordService.select(lWhGoodsRecord); + for (LWhGoodsRecord whGoodsRecord : whGoodsRecordList) { + Long oldRecordId = whGoodsRecord.getId(); + Long baseGoodsModelsId = whGoodsRecord.getBaseGoodsModelsId(); + whGoodsRecord.setId(NumberGenerator.getLongSequenceNumber()); + whGoodsRecord.setWarehouseType(inWarehouseType); + whGoodsRecord.setWarehouseId(inWarehouseId); + whGoodsRecord.setDealTime(dealTime); + //閫氳繃LockManage鑾峰緱閿� + Object warehouseModelLockObj = LockManage.acquireLock(inWarehouseType, inWarehouseId, baseGoodsModelsId); + synchronized (warehouseModelLockObj) { + // 鏍规嵁鍑哄簱娴佹按ID 鏌ヨ 鍑哄簱鐨勭墿鍝両D + List<Long> outGoodsIds = getGoodsidByFlowId(outWarehouseFlowId, oldRecordId); + // 搴撳瓨鐗╁搧璇︽儏锛圠_WH_GOODS锛変腑 鐘舵�佽缃负1 + lWhGoodsService.modGoodsTransfering(outGoodsIds, inWarehouseType, inWarehouseId, inWarehouseName, goodsStatus); + if (businessType == 1){ + // 1閮ㄩ棬鍒嗗彂 姝ゆ椂瑕佸線 鐗╁搧浣跨敤璁板綍銆怢_GOODS_USER_RECORD銆戞坊鍔犳暟鎹� + //鏌ヨ閮ㄩ棬鍒嗗彂浣跨敤浜� + LWhProcureModelUser lWhProcureModelUser = new LWhProcureModelUser(); + lWhProcureModelUser.setTransBusinessId(whFormTransferId); + lWhProcureModelUser.setBaseGoodsModelsId(baseGoodsModelsId); + List<LWhProcureModelUser> goodsUserInfo = goodsBaseService.select(lWhProcureModelUser); + int totalGoodsNum = goodsUserInfo.stream().mapToInt(LWhProcureModelUser::getGoodsNum).sum(); + if (totalGoodsNum != outGoodsIds.size()) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new RuntimeException("鍏ュ簱鍗曞け璐ワ紝浣跨敤浜轰娇鐢ㄦ暟閲忎笌鐗╁搧鏁伴噺涓嶄竴鑷�"); +// log.error("鍒涘缓鍏ュ簱鍗曞け璐�"); + } + //灏嗙墿鍝佸瀷鍙蜂互鍓嶇殑浣跨敤璁板綍璁剧疆涓洪潪鏈�鏂� + lGoodsUserRecordService.updSetNotLast(outGoodsIds); + ArrayList<LGoodsUserRecord> goodsUserRecordList = new ArrayList<>(); + int startIndex = 0; + for (LWhProcureModelUser whProcureModelUser : goodsUserInfo) { + Integer goodsNum = whProcureModelUser.getGoodsNum(); + String nowUserName = whProcureModelUser.getNowUserName(); + Long nowUserPhone = whProcureModelUser.getNowUserPhone(); + Long procureModelUserRecordId = whProcureModelUser.getProcureModelUserRecordId(); + List<Long> goodsIds = outGoodsIds.subList(startIndex, startIndex + goodsNum); + for (Long goodsId : goodsIds) { + LGoodsUserRecord tmp = new LGoodsUserRecord(); + tmp.setWhGoodsId(goodsId); + tmp.setRecordType(recordType); + tmp.setTransBusinessId(whFormTransferId); + if (businessType == 1) { + tmp.setNowUserName(nowUserName); + tmp.setNowUserPhone(nowUserPhone); + } else if (businessType == 2) { + tmp.setNowUserName(null); + tmp.setNowUserPhone(null); + } + tmp.setProcureModelUserRecordId(procureModelUserRecordId); + tmp.setOperatorId(userId); + tmp.setOperatorName(nickName); + tmp.setDealTime(dealTime); + tmp.setLastRecord(1); + goodsUserRecordList.add(tmp); + } + // 鏇存柊涓嬫爣浣嶇疆 + startIndex += goodsNum; + } + //鎵归噺鎻掑叆浣跨敤浜鸿褰� + lGoodsUserRecordService.insertBatch(goodsUserRecordList); + } + //灏嗕繚绠′粨搴撲俊鎭洿鏂板埌 鐗╁搧浠撳簱淇濈璁板綍銆怢_GOODS_WH_RECORD銆� + lGoodsWhRecordService.insertNewRecord(outGoodsIds, inWarehouseFlowId, dealTime); + + // 鑾峰緱閿佸悗鏌ヨ璇ュ瀷鍙风殑鏈熷垵鏁伴噺 + int goodsModelNum = lWhGoodsService.queryGoodsModelNum(inWarehouseType, inWarehouseId, baseGoodsModelsId, 1, null); + whGoodsRecord.setInitialCount(goodsModelNum); + whGoodsRecord.setEndCount(goodsModelNum + whGoodsRecord.getThisCount()); + } + LWhGoodsRecordDetails lWhGoodsRecordDetails = new LWhGoodsRecordDetails(); + lWhGoodsRecordDetails.setWhGoodsRecordId(oldRecordId); + List<LWhGoodsRecordDetails> goodsRecordDetailsList = lWhGoodsRecordDetailsService.select(lWhGoodsRecordDetails); + for (LWhGoodsRecordDetails whGoodsRecordDetails : goodsRecordDetailsList) { + whGoodsRecordDetails.setId(null); + whGoodsRecordDetails.setWhGoodsRecordId(whGoodsRecord.getId()); + whGoodsRecordDetails.setThisType(1); + } + lWhGoodsRecordDetailsService.insertBatch(goodsRecordDetailsList); + } + lWhGoodsRecordService.insertBatch(whGoodsRecordList); + + // 鏇存柊璋冩嫧鍗� + lWhFormTransfer = new LWhFormTransfer(whFormTransferId); + lWhFormTransfer.setInWarehouseFlowId(inWarehouseFlowId); + lWhFormTransfer.setInWarehouseFormId(null); + lWhFormTransfer.setStates(2); + lWhFormTransfer.setInOperatorId(userId); + lWhFormTransfer.setInOperatorName(nickName); + lWhFormTransfer.setInTime(dealTime); + lWhFormTransferService.update(lWhFormTransfer); + log.info("璋冩嫧鍗曪細{} 鍏ュ簱瀹屾垚", whFormTransferId); + return; + } + + + private static String GET_GOODSID_BY_FLOWID = "SELECT goods.id FROM L_WH_GOODS_RECORD gr LEFT JOIN L_WH_GOODS_RECORD_DETAILS grd ON gr.id=grd.WH_GOODS_RECORD_ID LEFT JOIN L_WH_GOODS goods ON goods.id=grd.WH_GOODS_ID WHERE 1=1"; + + /** + * 鏍规嵁鍑哄簱娴佹按ID 鏌ヨ 鍑哄簱鐨勭墿鍝両D + * + * @param lWarehouseFlowId + */ + private List<Long> getGoodsidByFlowId(Long lWarehouseFlowId, Long whGoodsRecordId) { + StringBuilder sql = new StringBuilder(GET_GOODSID_BY_FLOWID); + Map<String, Object> paramts = new HashMap<>(); + if (lWarehouseFlowId != null) { + sql.append(" and gr.WAREHOUSE_FLOW_ID =:lWarehouseFlowId"); + paramts.put("lWarehouseFlowId", lWarehouseFlowId); + } + if (whGoodsRecordId != null) { + sql.append(" and gr.id =:whGoodsRecordId"); + paramts.put("whGoodsRecordId", whGoodsRecordId); + } + List<Map<String, Object>> outGoods = goodsBaseService.select(sql.toString(), paramts); + if (CollectionUtils.isEmpty(outGoods)) { + return null; + } + List<Long> whGoodsIds = outGoods.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList()); + return whGoodsIds; + } } -- Gitblit v1.9.1