package com.consum.base.core; import cn.hutool.core.convert.Convert; import com.consum.base.core.service.LWhWarningCoreServiceImpl; import com.consum.base.core.utils.IdUtil; import com.consum.base.core.utils.LockManage; import com.consum.base.service.GoodsBaseServiceImpl; import com.consum.base.service.LWarehouseFlowService; import com.consum.base.service.LWhGoodsRecordService; import com.consum.base.service.LWhGoodsService; import com.consum.base.service.impl.LWhGoodsRecordDetailsService; import com.consum.model.po.BaseWarehouse; import com.consum.model.po.LWarehouseFlow; import com.consum.model.po.LWhGoodsRecord; import com.consum.model.po.UsingFormBack; import com.iplatform.model.po.S_user_core; import com.walker.infrastructure.utils.CollectionUtils; import com.walker.web.ResponseValue; import java.util.Arrays; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @ClassName DepFormScrappedCoreServiceImpl * @Author cy * @Date 2023/12/2 * @Description * @Version 1.0 **/ @Service @Slf4j @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public class DepUsingFormBackCoreServiceImpl { @Resource private GoodsBaseServiceImpl goodsBaseService; @Resource private LWhGoodsService lWhGoodsService; @Resource private LWhGoodsRecordDetailsService lWhGoodsRecordDetailsService; @Resource private LWhGoodsRecordService lWhGoodsRecordServiceImpl; @Resource private LWarehouseFlowService lWarehouseFlowService; @Resource private LWhWarningCoreServiceImpl lWhWarningCoreService; /** * 根据报废单报废:修改调拨单中可退回数量;仓库中物品状态设置为报废;生成一个保费流水;更新报废型号表中,物品价值 *

* 1.找到需要退回的型号, 按同一个 * * @param lWhFormBackId */ public ResponseValue updateBack(Long lWhFormBackId, S_user_core currentUser, Long dealTime) { // 查询报废单状态 UsingFormBack depFormScrapped = new UsingFormBack(lWhFormBackId); depFormScrapped = goodsBaseService.get(depFormScrapped); //状态 1=待报废;2=已报废 if (depFormScrapped == null || depFormScrapped.getStates() != 1) { return ResponseValue.error("请检查报废单"); } Long userId = currentUser.getId(); String nickName = currentUser.getNick_name(); // 根据报废单 查询需要报废的型号数量 List> bfModelList = goodsBaseService.select("SELECT scrGoods.TRANS_OUT_WAREHOUSE_TYPE,scrGoods.TRANS_OUT_WAREHOUSE_ID,scrGoods.TRANS_BUSINESS_ID,scrGoods.BUSINESS_FORM_CODE,scrGoods.TRANS_OUT_WAREHOUSE_TYPE,scrGoods.TRANS_OUT_WAREHOUSE_ID,scrGoods.BASE_GOODS_TEMPLATE_ID,scrGoods.BASE_GOODS_TEMPLATE_NAME,goodsModel.id formScrappedModelId,goodsModel.BASE_GOODS_TEMPLATE_ID,goodsModel.BASE_GOODS_MODELS_ID,goodsModel.COUNTS,goodsModel.PROCURE_MODEL_USER_ID,goodsModel.GOODS_USER_NAME,goodsModel.BASE_GOODS_MODELS_NAME FROM USING_FORM_BACK_GOODS scrGoods LEFT JOIN USING_FORM_BACK_MODEL goodsModel ON scrgoods.id=goodsModel.USING_FORM_BACK_GOODS_ID WHERE scrGoods.USING_FORM_BACK_ID=?", new Object[]{lWhFormBackId}); Map>> groupByModelIdMap = bfModelList.stream() .collect(Collectors.groupingBy(map -> map.get("BASE_GOODS_MODELS_ID"))); Integer warehouseType = depFormScrapped.getOutWarehouseType(); Long warehouseId = depFormScrapped.getOutWarehouseId(); String warehouseName = depFormScrapped.getOutWarehouseName(); // 流水记录总表ID long lWarehouseFlowId = IdUtil.generateId(); // 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中价格的list Map modelTotalPriceMap = new HashMap<>(); ArrayList lWhGoodsRecordList = new ArrayList<>(); //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量 Map procureModelMap = new HashMap<>(); for (Object key : groupByModelIdMap.keySet()) { Long modelTotalPrice = 0L; //要报废的总数量 int modelTotalNum = 0; Long baseGoodsModelsId = (Long) key; List> eachFfModelList = groupByModelIdMap.get(key); Map eachFfModelBase = eachFfModelList.get(0); Long tempGoodsId = Convert.toLong(eachFfModelBase.get("BASE_GOODS_TEMPLATE_ID")); String goodsName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_TEMPLATE_NAME")); String modelName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_MODELS_NAME")); // 插入 各规格物品的进出库记录 L_WH_GOODS_RECORD long whGoodsRecordId = IdUtil.generateId(); LWhGoodsRecord whGoodsRecord = new LWhGoodsRecord(); whGoodsRecord.setId(whGoodsRecordId); whGoodsRecord.setWarehouseType(warehouseType); whGoodsRecord.setWarehouseId(warehouseId); whGoodsRecord.setWarehouseFlowId(lWarehouseFlowId); whGoodsRecord.setBaseGoodsTemplateId(tempGoodsId); whGoodsRecord.setGoodsTemplateName(goodsName); whGoodsRecord.setBaseGoodsModelsId(baseGoodsModelsId); whGoodsRecord.setBaseGoodsModelsName(modelName); whGoodsRecord.setDealTime(dealTime); //本次调整类型 1=调增;2=调减 whGoodsRecord.setThisType(2); //通过LockManage获得锁 Object warehouseModelLockObj = LockManage.acquireLock(warehouseType, warehouseId, baseGoodsModelsId); int goodsModelNum = 0; synchronized (warehouseModelLockObj) { List warehouseIds = new ArrayList<>(Arrays.asList(warehouseId)); goodsModelNum = lWhGoodsService.queryGoodsModelNum(warehouseType, warehouseIds, baseGoodsModelsId, 2, null); for (Map depFormScrappedModel : eachFfModelList) { // 调拨单信息 Long transBusinessId = (Long) depFormScrappedModel.get("TRANS_BUSINESS_ID"); String nowUserName = Convert.toStr(depFormScrappedModel.get("GOODS_USER_NAME")); Integer counts = Convert.toInt(depFormScrappedModel.get("COUNTS")); Long formScrappedModelId = Convert.toLong(depFormScrappedModel.get("formScrappedModelId")); modelTotalNum += counts; // 根据分发单、型号、使用人信息查询物品信息 List> scrappedGoodsList = lWhGoodsService.queryScrappedGoods(warehouseType, warehouseId, transBusinessId, nowUserName, baseGoodsModelsId, (short) 2, counts); if (CollectionUtils.isEmpty(scrappedGoodsList) || scrappedGoodsList.size() < counts) { log.error("要退回的物品数量不足!"); // 手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new RuntimeException("报废失败!型号数量不足"); } // 放入物品ID等信息 depFormScrappedModel.put("scrappedGoodsList", scrappedGoodsList); Long formScrappedModelPrice = scrappedGoodsList.stream().mapToLong(map -> (long) map.get("price")).sum(); modelTotalPrice += formScrappedModelPrice; // 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中 价格 modelTotalPriceMap.put(formScrappedModelId, formScrappedModelPrice); //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 在用数量 Integer procureModelNum = Convert.toInt(procureModelMap.get(transBusinessId + "_" + baseGoodsModelsId), 0); procureModelMap.put(transBusinessId + "_" + baseGoodsModelsId, counts + procureModelNum); // 汇总出需要修改状态的物品id List srappedGoodsIds = scrappedGoodsList.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList()); // 设置物品为报废状态 // lWhGoodsService.modGoodsTransfering(srappedGoodsIds, null, null, null, 3); // 批量插入 进出库流水明细[L_WH_GOODS_RECORD_DETAILS] lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short) 2); } } whGoodsRecord.setInitialCount(goodsModelNum); whGoodsRecord.setEndCount(goodsModelNum - modelTotalNum); whGoodsRecord.setThisCount(modelTotalNum); whGoodsRecord.setTotalPrice(modelTotalPrice); // lWhGoodsRecordService.insert(whGoodsRecord); lWhGoodsRecordList.add(whGoodsRecord); } // 插入总流水 LWarehouseFlow warehouseFlow = new LWarehouseFlow(); warehouseFlow.setId(lWarehouseFlowId); warehouseFlow.setWarehouseType(warehouseType); warehouseFlow.setWarehouseId(warehouseId); warehouseFlow.setWarehouseName(warehouseName); warehouseFlow.setThisType(2); warehouseFlow.setBusinessType(WhBusinessEnum.BUMENTUIHUI.getValue() + 0); warehouseFlow.setBusinessFormId(lWhFormBackId); warehouseFlow.setOperatorId(userId); warehouseFlow.setOperatorName(nickName); warehouseFlow.setDealTime(dealTime); // 插入流水总表 int flowInsertFlag = lWarehouseFlowService.insert(warehouseFlow); if (flowInsertFlag == 0) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return null; } // 批量插入 各规格物品的进出库【L_WH_GOODS_RECORD】 lWhGoodsRecordServiceImpl.insertBatch(lWhGoodsRecordList); // 更新报废单 depFormScrapped = new UsingFormBack(lWhFormBackId); depFormScrapped.setStates(2); goodsBaseService.update(depFormScrapped); // 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中价格的list List parameterList = new ArrayList<>(); for (Map.Entry entry : modelTotalPriceMap.entrySet()) { Long key = entry.getKey(); Long value = entry.getValue(); Object[] one = new Object[2]; one[0] = value; one[1] = key; parameterList.add(one); } goodsBaseService.execBatchUpdate("update DEP_FORM_SCRAPPED_MODEL set TOTAL_AMOUNT=? where id=?", parameterList); //如果是A类物品,则更新 分发物品使用人【L_WH_PROCURE_MODEL_USER】 中 根据id 更新 在用数量(USE_COUNT) List procureModelUserIdList = new ArrayList<>(); for (Map itemMap : bfModelList) { Long procureModelUserId = Convert.toLong(itemMap.get("PROCURE_MODEL_USER_ID")); if (procureModelUserId==null){ continue; } Integer counts = Convert.toInt(itemMap.get("COUNTS")); // StringBuilder sb = new StringBuilder("update L_WH_PROCURE_MODEL_USER set USE_COUNT=USE_COUNT-").append(counts); // sb.append(" where id=").append(procureModelUserId); // sb.append(" and USE_COUNT-").append(counts).append(" >=0"); // goodsBaseService.update(sb.toString()); Object[] one = new Object[3]; one[0] = counts; one[1] = procureModelUserId; one[2] = counts; procureModelUserIdList.add(one); } if (!CollectionUtils.isEmpty(procureModelUserIdList)) { goodsBaseService.execBatchUpdate("update L_WH_PROCURE_MODEL_USER set USE_COUNT=USE_COUNT- ? where id= ? and USE_COUNT- ? >=0", procureModelUserIdList); } //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量 List procureModelParameterList = new ArrayList<>(); for (Map.Entry entry : procureModelMap.entrySet()) { String key = entry.getKey(); Integer modelUseingNum = entry.getValue(); String[] strings = key.split("_"); String transBusinessId = strings[0]; String baseGoodsModelsId = strings[1]; Object[] one = new Object[4]; one[0] = modelUseingNum; one[1] = transBusinessId; one[2] = baseGoodsModelsId; one[3] = modelUseingNum; procureModelParameterList.add(one); StringBuilder sb = new StringBuilder("update L_WH_PROCURE_MODEL set USE_COUNT=USE_COUNT-"); sb.append(modelUseingNum).append(" where BUSINESS_TYPE=4 and BUSINESS_ID="); sb.append(transBusinessId).append(" and BASE_GOODS_MODELS_ID="); sb.append(baseGoodsModelsId).append(" and USE_COUNT-"); sb.append(modelUseingNum).append(" >=0"); goodsBaseService.update(sb.toString()); } // goodsBaseService.execBatchUpdate("update L_WH_PROCURE_MODEL set USE_COUNT=USE_COUNT-? where BUSINESS_TYPE=4 and BUSINESS_ID=? and BASE_GOODS_MODELS_ID=? and USE_COUNT=USE_COUNT-? >0", parameterList); // 操作入库,此时要按物品所属仓库 生成不同仓库入库的流水 Map>> groupByOutWarehouseIdMap = bfModelList.stream() .collect(Collectors.groupingBy(map -> map.get("TRANS_OUT_WAREHOUSE_TYPE") + "_" + map.get("TRANS_OUT_WAREHOUSE_ID"))); //每个仓库一个流水表 ArrayList flowArrayList = new ArrayList<>(); ArrayList flowRecordArrayList = new ArrayList<>(); for (String outWarehouseTypeAndId : groupByOutWarehouseIdMap.keySet()) { List> eachWareHouseList = groupByOutWarehouseIdMap.get(outWarehouseTypeAndId); Map eachWarehouseModelMap = eachWareHouseList.get(0); // Integer inWareHouseType = Convert.toInt(eachWarehouseModelMap.get("TRANS_OUT_WAREHOUSE_TYPE")); Long inWarehouseId = Convert.toLong(eachWarehouseModelMap.get("TRANS_OUT_WAREHOUSE_ID")); String inWarehouseName = null; BaseWarehouse baseWarehouse = goodsBaseService.get(new BaseWarehouse(inWarehouseId)); if (baseWarehouse != null) { inWarehouseName = baseWarehouse.getWarehouseName(); } // 每个仓库一个流水表 LWarehouseFlow inWarehouseFlow = new LWarehouseFlow(); // 流水记录总表ID long inWarehouseFlowId = IdUtil.generateId(); inWarehouseFlow.setId(inWarehouseFlowId); inWarehouseFlow.setWarehouseType(0); inWarehouseFlow.setWarehouseId(inWarehouseId); inWarehouseFlow.setWarehouseName(inWarehouseName); inWarehouseFlow.setThisType(1); inWarehouseFlow.setBusinessType(WhBusinessEnum.BUMENTUIHUI.getValue() + 0); inWarehouseFlow.setBusinessFormId(lWhFormBackId); inWarehouseFlow.setOperatorId(userId); inWarehouseFlow.setOperatorName(nickName); inWarehouseFlow.setDealTime(dealTime); flowArrayList.add(inWarehouseFlow); //按型号分 每个型号一个 L_WH_GOODS_RECORD Map>> eachWareHouseModelMap = eachWareHouseList.stream() .collect(Collectors.groupingBy(map -> map.get("BASE_GOODS_MODELS_ID"))); for (Object key : eachWareHouseModelMap.keySet()) { Long baseGoodsModelsId = (Long) key; List> eachFfModelList = eachWareHouseModelMap.get(baseGoodsModelsId); Map eachFfModelBase = eachFfModelList.get(0); Long tempGoodsId = Convert.toLong(eachFfModelBase.get("BASE_GOODS_TEMPLATE_ID")); String goodsName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_TEMPLATE_NAME")); String modelName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_MODELS_NAME")); // 插入 各规格物品的进出库记录 L_WH_GOODS_RECORD long whGoodsRecordId = IdUtil.generateId(); LWhGoodsRecord whGoodsRecord = new LWhGoodsRecord(); whGoodsRecord.setId(whGoodsRecordId); whGoodsRecord.setWarehouseType(0); whGoodsRecord.setWarehouseId(inWarehouseId); whGoodsRecord.setWarehouseFlowId(inWarehouseFlowId); whGoodsRecord.setBaseGoodsTemplateId(tempGoodsId); whGoodsRecord.setGoodsTemplateName(goodsName); whGoodsRecord.setBaseGoodsModelsId(baseGoodsModelsId); whGoodsRecord.setBaseGoodsModelsName(modelName); whGoodsRecord.setDealTime(dealTime); //本次调整类型 1=调增;2=调减 whGoodsRecord.setThisType(1); //通过LockManage获得锁 Object warehouseModelLockObj = LockManage.acquireLock(0, inWarehouseId, baseGoodsModelsId); int goodsModelNum = 0; // 存放所有的物品id 价格等信息 List> scrappedAllGoodsList = new ArrayList<>(); synchronized (warehouseModelLockObj) { //查询期初数量 List warehouseIds = new ArrayList<>(Arrays.asList(inWarehouseId)); goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null); for (Map depFormScrappedModel : eachFfModelList) { scrappedAllGoodsList.addAll((List>) depFormScrappedModel.get("scrappedGoodsList")); } // 汇总出需要修改状态的物品id List srappedGoodsIds = scrappedAllGoodsList.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList()); // 设置物品为入库未分发, 并设置所属仓库 lWhGoodsService.modGoodsTransfering(srappedGoodsIds, 0, inWarehouseId, warehouseName, 1); // 使用人信息 // 批量插入 进出库流水明细[L_WH_GOODS_RECORD_DETAILS] lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short) 1); } // 上方物品的价格 Long formScrappedModelPrice = scrappedAllGoodsList.stream().mapToLong(map -> (long) map.get("price")).sum(); whGoodsRecord.setInitialCount(goodsModelNum); whGoodsRecord.setEndCount(goodsModelNum + scrappedAllGoodsList.size()); whGoodsRecord.setThisCount(scrappedAllGoodsList.size()); whGoodsRecord.setTotalPrice(formScrappedModelPrice); //lWhGoodsRecordService.insert(whGoodsRecord); flowRecordArrayList.add(whGoodsRecord); } // 提取baseGoodsModelsId并放入新的List中 List allChangModelList = eachWareHouseList.stream() .map(map -> Convert.toLong(map.get("BASE_GOODS_MODELS_ID"))) .distinct() .collect(Collectors.toList()); //当库存变动时调用该方法 lWhWarningCoreService.updateKuCun((short) 0, inWarehouseId, allChangModelList, null, dealTime); } // 插入流水总表 flowInsertFlag = lWarehouseFlowService.insertBatch(flowArrayList); if (flowInsertFlag == 0) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return null; } // 批量插入 各规格物品的进出库【L_WH_GOODS_RECORD】 lWhGoodsRecordServiceImpl.insertBatch(flowRecordArrayList); return null; } }