futian.liu
2023-12-22 3e9a4b3480e6508f3c6f7ac8723509d8b1120d20
consum-base/src/main/java/com/consum/base/service/core/DepUsingFormBackCoreService.java
File was renamed from consum-base/src/main/java/com/consum/base/core/DepUsingFormBackCoreServiceImpl.java
@@ -1,10 +1,23 @@
package com.consum.base.core;
package com.consum.base.service.core;
import cn.hutool.core.convert.Convert;
import com.consum.base.core.service.LWhWarningCoreServiceImpl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import com.consum.base.core.WhBusinessEnum;
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.GoodsBaseService;
import com.consum.base.service.LWarehouseFlowService;
import com.consum.base.service.LWhGoodsRecordService;
import com.consum.base.service.LWhGoodsService;
@@ -16,19 +29,9 @@
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;
import cn.hutool.core.convert.Convert;
import lombok.extern.slf4j.Slf4j;
/**
 * @ClassName DepFormScrappedCoreServiceImpl
@@ -40,9 +43,9 @@
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public class DepUsingFormBackCoreServiceImpl {
public class DepUsingFormBackCoreService {
    @Resource
    private GoodsBaseServiceImpl goodsBaseService;
    private GoodsBaseService goodsBaseService;
    @Resource
    private LWhGoodsService lWhGoodsService;
    @Resource
@@ -50,9 +53,9 @@
    @Resource
    private LWhGoodsRecordService lWhGoodsRecordServiceImpl;
    @Resource
    private LWarehouseFlowService lWarehouseFlowService;
    private LWarehouseFlowService lWarehouseFlowServiceImpl;
    @Resource
    private LWhWarningCoreServiceImpl lWhWarningCoreService;
    private LWhWarningCoreService lWhWarningCoreService;
    /**
     * 根据报废单报废:修改调拨单中可退回数量;仓库中物品状态设置为报废;生成一个保费流水;更新报废型号表中,物品价值
@@ -65,7 +68,7 @@
        // 查询报废单状态
        UsingFormBack depFormScrapped = new UsingFormBack(lWhFormBackId);
        depFormScrapped = goodsBaseService.get(depFormScrapped);
        //状态 1=待报废;2=已报废
        // 状态 1=待报废;2=已报废
        if (depFormScrapped == null || depFormScrapped.getStates() != 1) {
            return ResponseValue.error("请检查报废单");
        }
@@ -74,9 +77,11 @@
        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")));
        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();
@@ -89,15 +94,15 @@
        ArrayList<LWhGoodsRecord> lWhGoodsRecordList = new ArrayList<>();
        //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量
        // 采购、调拨、出库等的物品型号【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;
            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"));
@@ -116,18 +121,19 @@
            whGoodsRecord.setBaseGoodsModelsId(baseGoodsModelsId);
            whGoodsRecord.setBaseGoodsModelsName(modelName);
            whGoodsRecord.setDealTime(dealTime);
            //本次调整类型 1=调增;2=调减
            // 本次调整类型 1=调增;2=调减
            whGoodsRecord.setThisType(2);
            //通过LockManage获得锁
            // 通过LockManage获得锁
            Object warehouseModelLockObj = LockManage.acquireLock(warehouseType, warehouseId, baseGoodsModelsId);
            int goodsModelNum = 0;
            synchronized (warehouseModelLockObj) {
                List<Long> warehouseIds = new ArrayList<>(Arrays.asList(warehouseId));
                goodsModelNum = lWhGoodsService.queryGoodsModelNum(warehouseType, warehouseIds, baseGoodsModelsId, 2, null);
                goodsModelNum =
                    lWhGoodsService.queryGoodsModelNum(warehouseType, warehouseIds, baseGoodsModelsId, 2, null);
                for (Map<String, Object> depFormScrappedModel : eachFfModelList) {
                    // 调拨单信息
                    Long transBusinessId = (Long) depFormScrappedModel.get("TRANS_BUSINESS_ID");
                    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"));
@@ -135,7 +141,8 @@
                    modelTotalNum += counts;
                    // 根据分发单、型号、使用人信息查询物品信息
                    List<Map<String, Object>> scrappedGoodsList = lWhGoodsService.queryScrappedGoods(warehouseType, warehouseId, transBusinessId, nowUserName, baseGoodsModelsId, (short) 2, 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("要退回的物品数量不足!");
                        // 手动回滚
@@ -145,21 +152,24 @@
                    // 放入物品ID等信息
                    depFormScrappedModel.put("scrappedGoodsList", scrappedGoodsList);
                    Long formScrappedModelPrice = scrappedGoodsList.stream().mapToLong(map -> (long) map.get("price")).sum();
                    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);
                    // 采购、调拨、出库等的物品型号【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());
                    List<Long> srappedGoodsIds =
                        scrappedGoodsList.stream().map(map -> (Long)map.get("id")).collect(Collectors.toList());
                    // 设置物品为报废状态
//                    lWhGoodsService.modGoodsTransfering(srappedGoodsIds, null, null, null, 3);
                    // lWhGoodsService.modGoodsTransfering(srappedGoodsIds, null, null, null, 3);
                    // 批量插入 进出库流水明细[L_WH_GOODS_RECORD_DETAILS]
                    lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short) 2);
                    lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short)2);
                }
            }
@@ -167,7 +177,7 @@
            whGoodsRecord.setEndCount(goodsModelNum - modelTotalNum);
            whGoodsRecord.setThisCount(modelTotalNum);
            whGoodsRecord.setTotalPrice(modelTotalPrice);
//            lWhGoodsRecordService.insert(whGoodsRecord);
            // lWhGoodsRecordService.insert(whGoodsRecord);
            lWhGoodsRecordList.add(whGoodsRecord);
        }
@@ -184,7 +194,7 @@
        warehouseFlow.setOperatorName(nickName);
        warehouseFlow.setDealTime(dealTime);
        // 插入流水总表
        int flowInsertFlag = lWarehouseFlowService.insert(warehouseFlow);
        int flowInsertFlag = lWarehouseFlowServiceImpl.insert(warehouseFlow);
        if (flowInsertFlag == 0) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return null;
@@ -209,19 +219,20 @@
        }
        goodsBaseService.execBatchUpdate("update DEP_FORM_SCRAPPED_MODEL set TOTAL_AMOUNT=? where id=?", parameterList);
        //如果是A类物品,则更新 分发物品使用人【L_WH_PROCURE_MODEL_USER】 中 根据id 更新 在用数量(USE_COUNT)
        // 如果是A类物品,则更新 分发物品使用人【L_WH_PROCURE_MODEL_USER】 中 根据id 更新 在用数量(USE_COUNT)
        List<Object[]> procureModelUserIdList = new ArrayList<>();
        for (Map<String, Object> itemMap : bfModelList) {
            Long procureModelUserId = Convert.toLong(itemMap.get("PROCURE_MODEL_USER_ID"));
            if (procureModelUserId==null){
            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());
            // 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;
@@ -230,11 +241,12 @@
            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);
            goodsBaseService.execBatchUpdate(
                "update L_WH_PROCURE_MODEL_USER set USE_COUNT=USE_COUNT- ?  where id= ? and USE_COUNT- ? >=0",
                procureModelUserIdList);
        }
        //采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量
        // 采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量
        List<Object[]> procureModelParameterList = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : procureModelMap.entrySet()) {
            String key = entry.getKey();
@@ -255,13 +267,13 @@
            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);
        // 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")));
        //每个仓库一个流水表
        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<>();
@@ -269,7 +281,7 @@
            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"));
            // 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));
@@ -293,11 +305,11 @@
            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")));
            // 按型号分 每个型号一个 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;
                Long baseGoodsModelsId = (Long)key;
                List<Map<String, Object>> eachFfModelList = eachWareHouseModelMap.get(baseGoodsModelsId);
                Map<String, Object> eachFfModelBase = eachFfModelList.get(0);
@@ -317,50 +329,51 @@
                whGoodsRecord.setBaseGoodsModelsId(baseGoodsModelsId);
                whGoodsRecord.setBaseGoodsModelsName(modelName);
                whGoodsRecord.setDealTime(dealTime);
                //本次调整类型 1=调增;2=调减
                // 本次调整类型 1=调增;2=调减
                whGoodsRecord.setThisType(1);
                //通过LockManage获得锁
                // 通过LockManage获得锁
                Object warehouseModelLockObj = LockManage.acquireLock(0, inWarehouseId, baseGoodsModelsId);
                int goodsModelNum = 0;
                // 存放所有的物品id 价格等信息
                List<Map<String, Object>> scrappedAllGoodsList = new ArrayList<>();
                synchronized (warehouseModelLockObj) {
                    //查询期初数量
                    // 查询期初数量
                    List<Long> warehouseIds = new ArrayList<>(Arrays.asList(inWarehouseId));
                    goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null);
                    for (Map<String, Object> depFormScrappedModel : eachFfModelList) {
                        scrappedAllGoodsList.addAll((List<Map<String, Object>>) depFormScrappedModel.get("scrappedGoodsList"));
                        scrappedAllGoodsList
                            .addAll((List<Map<String, Object>>)depFormScrappedModel.get("scrappedGoodsList"));
                    }
                    // 汇总出需要修改状态的物品id
                    List<Long> srappedGoodsIds = scrappedAllGoodsList.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList());
                    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);
                    lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short)1);
                }
                // 上方物品的价格
                Long formScrappedModelPrice = scrappedAllGoodsList.stream().mapToLong(map -> (long) map.get("price")).sum();
                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);
                // 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);
                .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);
        flowInsertFlag = lWarehouseFlowServiceImpl.insertBatch(flowArrayList);
        if (flowInsertFlag == 0) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return null;