futian.liu
2023-12-05 8e4000461f3a6bbee34068b78ed60292c0ada611
consum-base/src/main/java/com/consum/base/service/LWhFormInventoryCoreService.java
@@ -1,46 +1,56 @@
package com.consum.base.service;
import com.consum.base.core.CodeGeneratorEnum;
import com.consum.base.core.CodeGeneratorService;
import com.consum.base.core.WhBusinessEnum;
import com.consum.base.core.param.BaseWarehouseParam1;
import com.consum.base.util.IdUtil;
import com.consum.model.po.*;
import com.iplatform.model.po.S_user_core;
import com.walker.infrastructure.utils.NumberGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import com.consum.base.core.CodeGeneratorEnum;
import com.consum.base.core.CodeGeneratorService;
import com.consum.base.core.WhBusinessEnum;
import com.consum.base.core.utils.IdUtil;
import com.consum.model.po.BaseWarehouse;
import com.consum.model.po.FinSysTenantUser;
import com.consum.model.po.LWhFormInventory;
import com.consum.model.po.LWhFormInventoryGoods;
import com.consum.model.po.LWhFormOutput;
import com.consum.model.po.LWhFormProcure;
import com.consum.model.po.LWhFormProcureGoods;
import com.consum.model.po.LWhProcureModel;
import com.iplatform.model.po.S_user_core;
import com.walker.infrastructure.utils.NumberGenerator;
import lombok.extern.slf4j.Slf4j;
/**
 * @ClassName LWhFormInventoryCoreService
 * @Author cy
 * @Date 2023/11/1
 * @Description
 * @Version 1.0
 **/
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class LWhFormInventoryCoreService {
    private LWhFormInventoryGoodsServiceImpl lWhFormInventoryGoods;
    private LWhFormOutputCoreService lWhFormOutputCoreService;
    private CodeGeneratorService codeGeneratorService;
    private LWhFormProcureService lWhFormProcureService;
    private BaseWarehouseServiceImpl baseWarehouseService;
    private LWhFormProcureGoodsService lWhFormProcureGoodsService;
    private LWhFormProcureService lWhFormProcureServiceImpl;
    private BaseWarehouseService baseWarehouseService;
    private LWhFormProcureGoodsService lWhFormProcureGoodsServiceImpl;
    private LWhProcureModelService lWhProcureModelService;
    private BaseGoodsTemplateServiceImpl baseGoodsTemplateService;
    private BaseGoodsTemplateService baseGoodsTemplateService;
    private LWhGoodsService lWhGoodsService;
    private LWhFormInventoryServiceImpl lWhFormInventoryService;
    private LWhFormInventoryService lWhFormInventoryService;
    private LWhFormProcureCoreService lWhFormProcureCoreService;
    private LWhFormOutputServiceImpl lWhFormOutputService;
@@ -48,13 +58,13 @@
    public LWhFormInventoryCoreService(LWhFormInventoryGoodsServiceImpl lWhFormInventoryGoods,
                                       LWhFormOutputCoreService lWhFormOutputCoreService,
                                       CodeGeneratorService codeGeneratorService,
                                       LWhFormProcureService lWhFormProcureService,
                                       BaseWarehouseServiceImpl baseWarehouseService,
                                       LWhFormProcureGoodsService lWhFormProcureGoodsService,
                                       LWhFormProcureService lWhFormProcureServiceImpl,
                                       BaseWarehouseService baseWarehouseService,
                                       LWhFormProcureGoodsService lWhFormProcureGoodsServiceImpl,
                                       LWhProcureModelService lWhProcureModelService,
                                       BaseGoodsTemplateServiceImpl baseGoodsTemplateService,
                                       BaseGoodsTemplateService baseGoodsTemplateService,
                                       LWhGoodsService lWhGoodsService,
                                       LWhFormInventoryServiceImpl lWhFormInventoryService,
                                       LWhFormInventoryService lWhFormInventoryService,
                                       LWhFormProcureCoreService lWhFormProcureCoreService,
                                       LWhFormOutputServiceImpl lWhFormOutputService
@@ -62,9 +72,9 @@
        this.lWhFormInventoryGoods = lWhFormInventoryGoods;
        this.lWhFormOutputCoreService = lWhFormOutputCoreService;
        this.codeGeneratorService = codeGeneratorService;
        this.lWhFormProcureService = lWhFormProcureService;
        this.lWhFormProcureServiceImpl = lWhFormProcureServiceImpl;
        this.baseWarehouseService = baseWarehouseService;
        this.lWhFormProcureGoodsService = lWhFormProcureGoodsService;
        this.lWhFormProcureGoodsServiceImpl = lWhFormProcureGoodsServiceImpl;
        this.lWhProcureModelService = lWhProcureModelService;
        this.baseGoodsTemplateService = baseGoodsTemplateService;
        this.lWhGoodsService = lWhGoodsService;
@@ -74,32 +84,41 @@
    }
    /**
     * 根据 盘点单 生成 出库单 和 入库单
     * 盘点单中 盘盈物品生成入库单,盘亏生成出库单
     * 根据 盘点单 生成 出库单 和 入库单 盘点单中 盘盈物品生成入库单,盘亏生成出库单
     *
     * @param whformInventoryId 盘点单id
     * @return status true/false
     * errMsg 错误消息
     * @return status true/false errMsg 错误消息
     */
    @Transactional(rollbackFor = Exception.class)
    public Map<String, Object> createInOutFormByInventoryId(Long whformInventoryId, S_user_core currentUser, FinSysTenantUser sysInfo) {
        HashMap<String, Object> rtnMap = new HashMap<>();
    public String createInOutFormByInventoryId(Long whformInventoryId, S_user_core currentUser, FinSysTenantUser sysInfo) {
        LWhFormInventory lWhFormInventory = lWhFormInventoryService.get(new LWhFormInventory(whformInventoryId));
        if (lWhFormInventory == null) {
//            rtnMap.put("status", false);
//            rtnMap.put("errMsg", "没有找到盘点单");
            return "没有找到盘点单";
        }
        if (lWhFormInventory.getStates() != 1) {
//            rtnMap.put("status", false);
//            rtnMap.put("errMsg", "请检查盘点单状态");
            return "请检查盘点单状态";
        }
        List<LWhFormInventoryGoods> lWhFormInventoryGoods = this.lWhFormInventoryGoods.getByInventoryId(whformInventoryId);
        if (CollectionUtils.isEmpty(lWhFormInventoryGoods)) {
            rtnMap.put("status", false);
            rtnMap.put("errMsg", "没有找到物品");
            return rtnMap;
//            rtnMap.put("status", false);
//            rtnMap.put("errMsg", "没有找到盘点单结果物品");
            return "没有找到盘点单结果物品";
        }
        Map<Integer, List<LWhFormInventoryGoods>> inventoryGoodsMap = lWhFormInventoryGoods.stream()
                .filter(goods -> goods.getInventoryResult() == 2 || goods.getInventoryResult() == 3)
                .collect(Collectors.groupingBy(LWhFormInventoryGoods::getInventoryResult));
        if (CollectionUtils.isEmpty(lWhFormInventoryGoods)) {
            rtnMap.put("status", true);
            return rtnMap;
//            rtnMap.put("status", true);
            return null;
        }
        LWhFormInventory lWhFormInventory = lWhFormInventoryService.get(new LWhFormInventory(whformInventoryId));
        Long warehouseId = lWhFormInventory.getWarehouseId();
        Long stopTime = lWhFormInventory.getStopTime();
        Map<String, Object> inOutMap = new HashMap<>();
        for (Map.Entry<Integer, List<LWhFormInventoryGoods>> entry : inventoryGoodsMap.entrySet()) {
            //盘点结果(1=正常;2=盘盈;3=盘亏)
@@ -108,50 +127,61 @@
            if (inventoryResult == 2) {
                // 创建入库单并入库
                // 返回入库单号
                Long inFormByInventoryId = createInFormByInventoryId(warehouseId, stopTime, inventoryGoods, currentUser);
                if (inFormByInventoryId == null) {
                Map<String, Object> rkMap = createInFormByInventoryId(warehouseId, stopTime, inventoryGoods, currentUser);
                if (rkMap == null) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                    throw new RuntimeException("创建入库单失败");
                    log.error("创建入库单失败");
                    rtnMap.put("status", false);
                    rtnMap.put("errMsg", "创建入库单失败");
                    return rtnMap;
//                    rtnMap.put("status", false);
//                    rtnMap.put("errMsg", "创建入库单失败");
                    return "创建入库单失败";
                }
                String errMsg = lWhFormProcureCoreService.doProcure(warehouseId, currentUser);
                inOutMap.putAll(rkMap);
                Long inFormByInventoryId = (Long) inOutMap.get("inId");
                String errMsg = lWhFormProcureCoreService.doProcure(inFormByInventoryId, currentUser);
                if (errMsg != null) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                    throw new RuntimeException(errMsg);
                    log.error("创建入库单失败");
                    rtnMap.put("status", false);
                    rtnMap.put("errMsg", "创建入库单失败");
                    return rtnMap;
//                    rtnMap.put("status", false);
//                    rtnMap.put("errMsg", "创建入库单失败");
                    return "创建入库单失败";
                }
            } else {
                // 创建出库单并出库
                Long lWhFormOutputId = this.createOutFormByInventoryId(warehouseId, stopTime, inventoryGoods, currentUser, sysInfo);
                if (lWhFormOutputId == null) {
                Map<String, Object> ckMap = createOutFormByInventoryId(warehouseId, stopTime, inventoryGoods, currentUser, sysInfo);
                if (ckMap == null) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                    throw new RuntimeException("创建出库单失败");
                    log.error("创建入库单失败");
                    rtnMap.put("status", false);
                    rtnMap.put("errMsg", "创建入库单失败");
                    return rtnMap;
//                    rtnMap.put("status", false);
//                    rtnMap.put("errMsg", "创建入库单失败");
                    return "创建入库单失败";
                }
                inOutMap.putAll(ckMap);
                Long lWhFormOutputId = (Long) inOutMap.get("outId");
                //2.根据出库单出库
                Long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(lWhFormOutputId, currentUser, stopTime);
                Long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(lWhFormOutputId, WhBusinessEnum.PANDIAN, currentUser, stopTime,null);
                if (lWarehouseFlowId == null) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                    throw new RuntimeException("创建出库单失败");
                    log.error("创建入库单失败");
                    rtnMap.put("status", false);
                    rtnMap.put("errMsg", "创建入库单失败");
                    return rtnMap;
//                    rtnMap.put("status", false);
//                    rtnMap.put("errMsg", "创建入库单失败");
                    return "创建入库单失败";
                }
            }
        }
        //
        lWhFormInventory = new LWhFormInventory(whformInventoryId);
        lWhFormInventory.setStates(2);
        lWhFormInventory.setInWarehouseFormId((Long) inOutMap.get("inId"));
        lWhFormInventory.setInBusinessFormCode((String) inOutMap.get("inCode"));
        lWhFormInventory.setOutWarehouseFormId((Long) inOutMap.get("outId"));
        lWhFormInventory.setOutBusinessFormCode((String) inOutMap.get("outCode"));
        lWhFormInventoryService.update(lWhFormInventory);
        return rtnMap;
        return null;
    }
    /**
@@ -161,8 +191,8 @@
     * @param procureTime 采购时间
     * @param currentUser
     */
    private Long createInFormByInventoryId(Long warehouseId, Long procureTime, List<LWhFormInventoryGoods> inventoryGoodsList,
                                           S_user_core currentUser) {
    private Map<String, Object> createInFormByInventoryId(Long warehouseId, Long procureTime, List<LWhFormInventoryGoods> inventoryGoodsList,
                                                          S_user_core currentUser) {
        if (CollectionUtils.isEmpty(inventoryGoodsList)) {
            return null;
        }
@@ -170,7 +200,8 @@
        BaseWarehouse baseWarehouse = baseWarehouseService.getById(warehouseId);
        LWhFormProcure lWhFormProcure = new LWhFormProcure();
        lWhFormProcure.setId(whFormProcureId);
        lWhFormProcure.setBusinessFormCode(codeGeneratorService.createCodeByPrefix(CodeGeneratorEnum.Procure_Warehouse.getValue(), 10));
        String inCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Procure_Warehouse);
        lWhFormProcure.setBusinessFormCode(inCode);
        lWhFormProcure.setWarehouseId(warehouseId);
        lWhFormProcure.setWarehouseName(baseWarehouse.getWarehouseName());
        lWhFormProcure.setBuyerId(currentUser.getId());
@@ -181,8 +212,10 @@
        lWhFormProcure.setStates(1);
        lWhFormProcure.setAgencyId(baseWarehouse.getAgencyId());
        lWhFormProcure.setAgencyName(baseWarehouse.getAgencyName());
        int result = lWhFormProcureService.insert(lWhFormProcure);
        if (result == 0) return null;
        int result = lWhFormProcureServiceImpl.insert(lWhFormProcure);
        if (result == 0) {
            return null;
        }
        ArrayList<LWhFormProcureGoods> procureGoodList = new ArrayList<>();
        ArrayList<LWhProcureModel> whProcureModeLlist = new ArrayList<>();
@@ -209,9 +242,9 @@
                continue;
            }
            // 查询型号库存
            int goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseId, baseGoodsModelsId, (short) 1, null);
            int goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseId, baseGoodsModelsId, 1, null);
            LWhProcureModel model = new LWhProcureModel();
            model.setId(NumberGenerator.getLongSequenceNumber());
            model.setId(IdUtil.generateId());
            model.setFromProcureGoodsId(fromProcureGoodsId);
            model.setBusinessType(WhBusinessEnum.CAIGOU.getValue() + 0);
            model.setBusinessId(whFormProcureId);
@@ -223,9 +256,13 @@
            whProcureModeLlist.add(model);
            procureGoodList.add(procureGood);
        }
        lWhFormProcureGoodsService.insertBatch(procureGoodList);
        lWhFormProcureGoodsServiceImpl.insertBatch(procureGoodList);
        lWhProcureModelService.insertBatch(whProcureModeLlist);
        return whFormProcureId;
        HashMap<String, Object> rtnMap = new HashMap<>();
        rtnMap.put("inId", whFormProcureId);
        rtnMap.put("inCode", inCode);
        return rtnMap;
    }
    /**
@@ -235,8 +272,8 @@
     * @param procureTime 出库时间
     * @param currentUser
     */
    private Long createOutFormByInventoryId(Long warehouseId, Long procureTime, List<LWhFormInventoryGoods> inventoryGoodsList,
                                            S_user_core currentUser, FinSysTenantUser sysInfo) {
    private Map<String, Object> createOutFormByInventoryId(Long warehouseId, Long procureTime, List<LWhFormInventoryGoods> inventoryGoodsList,
                                                           S_user_core currentUser, FinSysTenantUser sysInfo) {
        if (CollectionUtils.isEmpty(inventoryGoodsList)) {
            return null;
        }
@@ -245,6 +282,7 @@
        //出入库id
        long lWhFormOutputId = IdUtil.generateId();
        lWhFormOutput.setId(lWhFormOutputId);
        lWhFormOutput.setOutWarehouseType(0);
        lWhFormOutput.setWarehouseId(warehouseId);
        //根据仓库id查询仓库
        BaseWarehouse warehouse = this.baseWarehouseService.getById(warehouseId);
@@ -253,10 +291,13 @@
            return null;
        }
        lWhFormOutput.setWarehouseName(warehouse.getWarehouseName());
        lWhFormOutput.setOutputCode(BaseWarehouseParam1.In_OutPutTypeEnum.Inventory_Output.getValue() + "");
        String outCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.OutPut_Warehouse);
        lWhFormOutput.setOutputCode(outCode);
        lWhFormOutput.setOutputName("盘点出库");
        lWhFormOutput.setAgencyId(Long.valueOf(sysInfo.getTenantId()));
        lWhFormOutput.setAgencyName(sysInfo.getTenantName());
//        lWhFormOutput.setAgencyId(Long.valueOf(sysInfo.getTenantId()));
        lWhFormOutput.setAgencyId(null);
//        lWhFormOutput.setAgencyName(sysInfo.getTenantName());
        lWhFormOutput.setAgencyName(null);
        lWhFormOutput.setOperatorId(sysInfo.getId());
        lWhFormOutput.setOperatorName(sysInfo.getUserName());
@@ -266,6 +307,7 @@
        if (flag1 != 1) {
            return null;
        }
        ArrayList<LWhProcureModel> lWhProcureModels = new ArrayList<>();
        for (LWhFormInventoryGoods inventoryGoods : inventoryGoodsList) {
            Long baseGoodsModelsId = inventoryGoods.getBaseGoodsModelsId();
            Integer counts = inventoryGoods.getErrorCounts();
@@ -273,19 +315,25 @@
                continue;
            }
            //根据物品型号查询物品库存
            int goodsNum = lWhGoodsService.queryGoodsModelNum(0, warehouseId, baseGoodsModelsId, (short) 1, null);
            int goodsNum = lWhGoodsService.queryGoodsModelNum(0, warehouseId, baseGoodsModelsId, 1, null);
            //新增L_WH_PROCURE_MODEL记录
            LWhProcureModel lWhProcureModel = new LWhProcureModel();
            lWhProcureModel.setId(IdUtil.generateId());
            lWhProcureModel.setBusinessType(3);
            lWhProcureModel.setBusinessType(WhBusinessEnum.CHUKU.getValue() + 0);
            lWhProcureModel.setBusinessId(lWhFormOutputId);
            lWhProcureModel.setBaseGoodsModelsId(baseGoodsModelsId);
            lWhProcureModel.setCounts(counts);
            lWhProcureModel.setWorehouseCount(goodsNum);
            lWhProcureModelService.insert(lWhProcureModel);
//            lWhProcureModelService.insert(lWhProcureModel);
            lWhProcureModels.add(lWhProcureModel);
        }
        return lWhFormOutputId;
        if (!CollectionUtils.isEmpty(lWhProcureModels)) {
            lWhProcureModelService.insertBatch(lWhProcureModels);
        }
        HashMap<String, Object> rtnMap = new HashMap<>();
        rtnMap.put("outId", lWhFormOutputId);
        rtnMap.put("outCode", outCode);
        return rtnMap;
    }
}