New file |
| | |
| | | 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.*; |
| | | import com.consum.model.po.*; |
| | | import com.iplatform.model.po.S_user_core; |
| | | import com.walker.infrastructure.utils.CollectionUtils; |
| | | import com.walker.web.ResponseValue; |
| | | 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 lWhGoodsRecordService; |
| | | @Resource |
| | | private LWarehouseFlowService lWarehouseFlowService; |
| | | @Resource |
| | | private LWhWarningCoreServiceImpl lWhWarningCoreService; |
| | | |
| | | /** |
| | | * 根据报废单报废:修改调拨单中可退回数量;仓库中物品状态设置为报废;生成一个保费流水;更新报废型号表中,物品价值 |
| | | * <p> |
| | | * 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<Map<String, Object>> 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<Object, List<Map<String, Object>>> 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<Long, Long> modelTotalPriceMap = new HashMap<>(); |
| | | |
| | | ArrayList<LWhGoodsRecord> lWhGoodsRecordList = new ArrayList<>(); |
| | | |
| | | //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量 |
| | | Map<String, Integer> procureModelMap = new HashMap<>(); |
| | | |
| | | for (Object key : groupByModelIdMap.keySet()) { |
| | | Long modelTotalPrice = 0l; |
| | | //要报废的总数量 |
| | | int modelTotalNum = 0; |
| | | |
| | | Long baseGoodsModelsId = (Long) key; |
| | | List<Map<String, Object>> eachFfModelList = groupByModelIdMap.get(key); |
| | | Map<String, Object> 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) { |
| | | goodsModelNum = lWhGoodsService.queryGoodsModelNum(warehouseType, warehouseId, baseGoodsModelsId, 2, null); |
| | | for (Map<String, Object> 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<Map<String, Object>> 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<Long> 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.BAOFEI.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】 |
| | | lWhGoodsRecordService.insertBatch(lWhGoodsRecordList); |
| | | |
| | | // 更新报废单 |
| | | depFormScrapped = new UsingFormBack(lWhFormBackId); |
| | | depFormScrapped.setStates(2); |
| | | goodsBaseService.update(depFormScrapped); |
| | | |
| | | // 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中价格的list |
| | | List<Object[]> parameterList = new ArrayList<>(); |
| | | for (Map.Entry<Long, Long> 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); |
| | | |
| | | //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量 |
| | | List<Object[]> procureModelParameterList = new ArrayList<>(); |
| | | for (Map.Entry<String, Integer> 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<String, List<Map<String, Object>>> groupByOutWarehouseIdMap = bfModelList.stream() |
| | | .collect(Collectors.groupingBy(map -> map.get("TRANS_OUT_WAREHOUSE_TYPE") + "_" + map.get("TRANS_OUT_WAREHOUSE_ID"))); |
| | | //每个仓库一个流水表 |
| | | ArrayList<LWarehouseFlow> flowArrayList = new ArrayList<>(); |
| | | ArrayList<LWhGoodsRecord> flowRecordArrayList = new ArrayList<>(); |
| | | |
| | | for (String outWarehouseTypeAndId : groupByOutWarehouseIdMap.keySet()) { |
| | | List<Map<String, Object>> eachWareHouseList = groupByOutWarehouseIdMap.get(outWarehouseTypeAndId); |
| | | Map<String, Object> 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.BAOFEI.getValue() + 0); |
| | | inWarehouseFlow.setBusinessFormId(lWhFormBackId); |
| | | inWarehouseFlow.setOperatorId(userId); |
| | | inWarehouseFlow.setOperatorName(nickName); |
| | | inWarehouseFlow.setDealTime(dealTime); |
| | | flowArrayList.add(inWarehouseFlow); |
| | | |
| | | //按型号分 每个型号一个 L_WH_GOODS_RECORD |
| | | Map<Object, List<Map<String, Object>>> eachWareHouseModelMap = eachWareHouseList.stream() |
| | | .collect(Collectors.groupingBy(map -> map.get("BASE_GOODS_MODELS_ID"))); |
| | | for (Object key : eachWareHouseModelMap.keySet()) { |
| | | Long baseGoodsModelsId = (Long) key; |
| | | |
| | | List<Map<String, Object>> eachFfModelList = eachWareHouseModelMap.get(baseGoodsModelsId); |
| | | Map<String, Object> 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<Map<String, Object>> scrappedAllGoodsList = new ArrayList<>(); |
| | | synchronized (warehouseModelLockObj) { |
| | | //查询期初数量 |
| | | goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, inWarehouseId, baseGoodsModelsId, 1, null); |
| | | for (Map<String, Object> depFormScrappedModel : eachFfModelList) { |
| | | scrappedAllGoodsList.addAll((List<Map<String, Object>>) depFormScrappedModel.get("scrappedGoodsList")); |
| | | } |
| | | // 汇总出需要修改状态的物品id |
| | | List<Long> 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<Long> 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】 |
| | | lWhGoodsRecordService.insertBatch(flowRecordArrayList); |
| | | |
| | | return null; |
| | | } |
| | | } |