package com.consum.base.service.core; 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 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.base.service.BaseGoodsTemplateService; import com.consum.base.service.BaseWarehouseService; import com.consum.base.service.LWhFormInventoryGoodsService; import com.consum.base.service.LWhFormInventoryService; import com.consum.base.service.LWhFormOutputService; import com.consum.base.service.LWhFormProcureGoodsService; import com.consum.base.service.LWhFormProcureService; import com.consum.base.service.LWhGoodsService; import com.consum.base.service.LWhProcureModelService; 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 * @Date 2023/11/1 * @Description * @Version 1.0 **/ @Slf4j @Service @Transactional(propagation = Propagation.REQUIRED) public class LWhFormInventoryCoreService { private LWhFormInventoryGoodsService lWhFormInventoryGoods; private LWhFormOutputCoreService lWhFormOutputCoreService; private CodeGeneratorService codeGeneratorService; private LWhFormProcureService lWhFormProcureServiceImpl; private BaseWarehouseService baseWarehouseService; private LWhFormProcureGoodsService lWhFormProcureGoodsServiceImpl; private LWhProcureModelService lWhProcureModelService; private BaseGoodsTemplateService baseGoodsTemplateService; private LWhGoodsService lWhGoodsService; private LWhFormInventoryService lWhFormInventoryService; private LWhFormProcureCoreService lWhFormProcureCoreService; private LWhFormOutputService lWhFormOutputService; @Autowired public LWhFormInventoryCoreService(LWhFormInventoryGoodsService lWhFormInventoryGoods, LWhFormOutputCoreService lWhFormOutputCoreService, CodeGeneratorService codeGeneratorService, LWhFormProcureService lWhFormProcureServiceImpl, BaseWarehouseService baseWarehouseService, LWhFormProcureGoodsService lWhFormProcureGoodsServiceImpl, LWhProcureModelService lWhProcureModelService, BaseGoodsTemplateService baseGoodsTemplateService, LWhGoodsService lWhGoodsService, LWhFormInventoryService lWhFormInventoryService, LWhFormProcureCoreService lWhFormProcureCoreService, LWhFormOutputService lWhFormOutputService ) { this.lWhFormInventoryGoods = lWhFormInventoryGoods; this.lWhFormOutputCoreService = lWhFormOutputCoreService; this.codeGeneratorService = codeGeneratorService; this.lWhFormProcureServiceImpl = lWhFormProcureServiceImpl; this.baseWarehouseService = baseWarehouseService; this.lWhFormProcureGoodsServiceImpl = lWhFormProcureGoodsServiceImpl; this.lWhProcureModelService = lWhProcureModelService; this.baseGoodsTemplateService = baseGoodsTemplateService; this.lWhGoodsService = lWhGoodsService; this.lWhFormInventoryService = lWhFormInventoryService; this.lWhFormProcureCoreService = lWhFormProcureCoreService; this.lWhFormOutputService = lWhFormOutputService; } /** * 根据 盘点单 生成 出库单 和 入库单 盘点单中 盘盈物品生成入库单,盘亏生成出库单 * * @param whformInventoryId 盘点单id * @return status true/false errMsg 错误消息 */ @Transactional(rollbackFor = Exception.class) 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 = this.lWhFormInventoryGoods.getByInventoryId(whformInventoryId); if (CollectionUtils.isEmpty(lWhFormInventoryGoods)) { // rtnMap.put("status", false); // rtnMap.put("errMsg", "没有找到盘点单结果物品"); return "没有找到盘点单结果物品"; } Map> 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 null; } Long warehouseId = lWhFormInventory.getWarehouseId(); Long stopTime = lWhFormInventory.getStopTime(); Map inOutMap = new HashMap<>(); for (Map.Entry> entry : inventoryGoodsMap.entrySet()) { //盘点结果(1=正常;2=盘盈;3=盘亏) Integer inventoryResult = entry.getKey(); List inventoryGoods = entry.getValue(); if (inventoryResult == 2) { // 创建入库单并入库 // 返回入库单号 Map 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 "创建入库单失败"; } 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 "创建入库单失败"; } } else { // 创建出库单并出库 Map 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 "创建入库单失败"; } inOutMap.putAll(ckMap); Long lWhFormOutputId = (Long) inOutMap.get("outId"); //2.根据出库单出库 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 "创建入库单失败"; } } } // 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 null; } /** * 根据信息创建入库单 * * @param warehouseId 仓库ID * @param procureTime 采购时间 * @param currentUser */ private Map createInFormByInventoryId(Long warehouseId, Long procureTime, List inventoryGoodsList, S_user_core currentUser) { if (CollectionUtils.isEmpty(inventoryGoodsList)) { return null; } Long whFormProcureId = NumberGenerator.getLongSequenceNumber(); BaseWarehouse baseWarehouse = baseWarehouseService.getById(warehouseId); LWhFormProcure lWhFormProcure = new LWhFormProcure(); lWhFormProcure.setId(whFormProcureId); String inCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Procure_Warehouse); lWhFormProcure.setBusinessFormCode(inCode); lWhFormProcure.setWarehouseId(warehouseId); lWhFormProcure.setWarehouseName(baseWarehouse.getWarehouseName()); lWhFormProcure.setBuyerId(currentUser.getId()); lWhFormProcure.setBuyerName(currentUser.getNick_name()); lWhFormProcure.setProcureTime(procureTime); lWhFormProcure.setProcureDoc(null); lWhFormProcure.setBuyType(2); lWhFormProcure.setStates(1); lWhFormProcure.setAgencyId(baseWarehouse.getAgencyId()); lWhFormProcure.setAgencyName(baseWarehouse.getAgencyName()); int result = lWhFormProcureServiceImpl.insert(lWhFormProcure); if (result == 0) { return null; } ArrayList procureGoodList = new ArrayList<>(); ArrayList whProcureModeLlist = new ArrayList<>(); for (LWhFormInventoryGoods inventoryGoods : inventoryGoodsList) { Long baseGoodsModelsId = inventoryGoods.getBaseGoodsModelsId(); Long baseGoodsTemplateId = inventoryGoods.getBaseGoodsTemplateId(); //查询型号信息 Map tempGoodsInfo = baseGoodsTemplateService.queryGoodsInfoByModelId(baseGoodsModelsId); Long baseCategoryId = Long.valueOf(tempGoodsInfo.get("categoryid") + ""); LWhFormProcureGoods procureGood = new LWhFormProcureGoods(); long fromProcureGoodsId = NumberGenerator.getLongSequenceNumber(); procureGood.setId(fromProcureGoodsId); procureGood.setWhFormProcureId(whFormProcureId); procureGood.setBaseCategoryId(baseCategoryId); procureGood.setBaseGoodsTemplateId(baseGoodsTemplateId); procureGood.setGoodsTemplateName(null); procureGood.setSupplier(null); procureGood.setSort(null); Integer counts = inventoryGoods.getErrorCounts(); if (counts == null || counts <= 0) { continue; } // 查询型号库存 List warehouseIds = new ArrayList<>(Arrays.asList(warehouseId)); int goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null); LWhProcureModel model = new LWhProcureModel(); model.setId(IdUtil.generateId()); model.setFromProcureGoodsId(fromProcureGoodsId); model.setBusinessType(WhBusinessEnum.CAIGOU.getValue() + 0); model.setBusinessId(whFormProcureId); model.setBaseGoodsModelsId(baseGoodsModelsId); model.setPrice(0L); model.setCounts(counts); model.setWorehouseCount(goodsModelNum); model.setSupplier(null); model.setBaseGoodsModelsId(inventoryGoods.getBaseGoodsModelsId()); model.setBaseGoodsModelsName(inventoryGoods.getBaseGoodsModelsName()); whProcureModeLlist.add(model); procureGoodList.add(procureGood); } lWhFormProcureGoodsServiceImpl.insertBatch(procureGoodList); lWhProcureModelService.insertBatch(whProcureModeLlist); HashMap rtnMap = new HashMap<>(); rtnMap.put("inId", whFormProcureId); rtnMap.put("inCode", inCode); return rtnMap; } /** * 根据信息创建出库单 * * @param warehouseId 仓库ID * @param procureTime 出库时间 * @param currentUser */ private Map createOutFormByInventoryId(Long warehouseId, Long procureTime, List inventoryGoodsList, S_user_core currentUser, FinSysTenantUser sysInfo) { if (CollectionUtils.isEmpty(inventoryGoodsList)) { return null; } //1.新增出库单记录 LWhFormOutput lWhFormOutput = new LWhFormOutput(); //出入库id long lWhFormOutputId = IdUtil.generateId(); lWhFormOutput.setId(lWhFormOutputId); lWhFormOutput.setOutWarehouseType(0); lWhFormOutput.setWarehouseId(warehouseId); //根据仓库id查询仓库 BaseWarehouse warehouse = this.baseWarehouseService.getById(warehouseId); if (warehouse == null) { log.error("仓库id不存在"); return null; } lWhFormOutput.setWarehouseName(warehouse.getWarehouseName()); String outCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.OutPut_Warehouse); lWhFormOutput.setOutputCode(outCode); lWhFormOutput.setOutputName("盘点出库"); // lWhFormOutput.setAgencyId(Long.valueOf(sysInfo.getTenantId())); lWhFormOutput.setAgencyId(null); // lWhFormOutput.setAgencyName(sysInfo.getTenantName()); lWhFormOutput.setAgencyName(null); lWhFormOutput.setOperatorId(sysInfo.getId()); lWhFormOutput.setOperatorName(sysInfo.getUserName()); lWhFormOutput.setDealTime(procureTime); lWhFormOutput.setStates(1); int flag1 = lWhFormOutputService.insert(lWhFormOutput); if (flag1 != 1) { return null; } ArrayList lWhProcureModels = new ArrayList<>(); for (LWhFormInventoryGoods inventoryGoods : inventoryGoodsList) { Long baseGoodsModelsId = inventoryGoods.getBaseGoodsModelsId(); Integer counts = inventoryGoods.getErrorCounts(); if (counts == null || counts <= 0) { continue; } //根据物品型号查询物品库存 List warehouseIds = new ArrayList<>(Arrays.asList(warehouseId)); int goodsNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null); //新增L_WH_PROCURE_MODEL记录 LWhProcureModel lWhProcureModel = new LWhProcureModel(); lWhProcureModel.setId(IdUtil.generateId()); lWhProcureModel.setBusinessType(WhBusinessEnum.CHUKU.getValue()); lWhProcureModel.setBusinessId(lWhFormOutputId); lWhProcureModel.setBaseGoodsModelsId(baseGoodsModelsId); lWhProcureModel.setCounts(counts); lWhProcureModel.setWorehouseCount(goodsNum); // lWhProcureModelService.insert(lWhProcureModel); lWhProcureModels.add(lWhProcureModel); } if (!CollectionUtils.isEmpty(lWhProcureModels)) { lWhProcureModelService.insertBatch(lWhProcureModels); } HashMap rtnMap = new HashMap<>(); rtnMap.put("outId", lWhFormOutputId); rtnMap.put("outCode", outCode); return rtnMap; } }