package com.consum.base.service; import cn.hutool.core.convert.Convert; import com.consum.base.core.WhBusinessEnum; import com.consum.base.core.service.LWhWarningCoreServiceImpl; import com.consum.base.core.utils.IdUtil; import com.consum.base.core.utils.LockManage; import com.consum.model.po.LWarehouseFlow; import com.consum.model.po.LWhFormScrapped; import com.consum.model.po.LWhFormScrappedGoods; import com.consum.model.po.LWhGoodsRecord; import com.iplatform.model.po.S_user_core; import com.walker.infrastructure.utils.CollectionUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; 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; /** * @ClassName LWhFormScrappedCoreService * @Date 2023/10/30 * @Description * @Version 1.0 **/ @Service @Slf4j @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public class LWhFormScrappedCoreService { private GoodsBaseServiceImpl goodsBaseService; private LWhFormScrappedGoodsService lWhFormScrappedGoodsService; private BaseGoodsTemplateService baseGoodsTemplateService; private LWhGoodsService lWhGoodsService; private LWhGoodsRecordDetailsService lWhGoodsRecordDetailsService; private LWhGoodsRecordService lWhGoodsRecordService; private LWarehouseFlowService lWarehouseFlowService; private LWhWarningCoreServiceImpl lWhWarningCoreService; @Autowired public LWhFormScrappedCoreService(GoodsBaseServiceImpl goodsBaseService, LWhFormScrappedGoodsService lWhFormScrappedGoodsService, BaseGoodsTemplateService baseGoodsTemplateService, LWhGoodsService lWhGoodsService, LWhGoodsRecordDetailsService lWhGoodsRecordDetailsService, LWhGoodsRecordService lWhGoodsRecordService, LWarehouseFlowService lWarehouseFlowService, LWhWarningCoreServiceImpl lWhWarningCoreService) { // this.lWhFormScrappedService = lWhFormScrappedService; this.lWhFormScrappedGoodsService = lWhFormScrappedGoodsService; this.baseGoodsTemplateService = baseGoodsTemplateService; this.lWhGoodsService = lWhGoodsService; this.lWhGoodsRecordDetailsService = lWhGoodsRecordDetailsService; this.lWhGoodsRecordService = lWhGoodsRecordService; this.lWarehouseFlowService = lWarehouseFlowService; this.goodsBaseService = goodsBaseService; this.lWhWarningCoreService = lWhWarningCoreService; } /** * 根据 报废单【L_WH_FORM_SCRAPPED】 报废物品 * * @param formScrappedId 报废单Id * @return 流水记录总表ID */ @Transactional(rollbackFor = Exception.class) public Long outFormByTransId(Long formScrappedId, S_user_core currentUser, Long dealTime) { if (formScrappedId == null) { return null; } LWhFormScrapped lWhFormScrapped = new LWhFormScrapped(formScrappedId); lWhFormScrapped = goodsBaseService.get(lWhFormScrapped); if (lWhFormScrapped != null && lWhFormScrapped.getStates() != 0) { log.error("报废失败!请检查报废单状态"); return null; } Long userId = currentUser.getId(); String nickName = currentUser.getNick_name(); Integer warehouseType = lWhFormScrapped.getWarehouseType(); Long warehouseId = lWhFormScrapped.getWarehouseId(); String warehouseName = lWhFormScrapped.getWarehouseName(); // 流水记录总表ID long lWarehouseFlowId = IdUtil.generateId(); //要报废的物品 LWhFormScrappedGoods goods = new LWhFormScrappedGoods(); goods.setFormScrappedId(formScrappedId); List formScrappedGoods = lWhFormScrappedGoodsService.select(goods); if (CollectionUtils.isEmpty(formScrappedGoods)) { log.error("没有要报废的物品"); return null; } // 按型号分组 ArrayList allChangModelList = new ArrayList<>(); Map> modelGroup = formScrappedGoods.stream() .collect(Collectors.groupingBy(LWhFormScrappedGoods::getBaseGoodsModelsId)); for (Map.Entry> entry : modelGroup.entrySet()) { //规格型号编号 Long baseGoodsModelsId = entry.getKey(); allChangModelList.add(baseGoodsModelsId); //对每组中要报废的数量求和 List modelGoodsList = entry.getValue(); //查询型号信息 Map tempGoodsInfo = baseGoodsTemplateService.queryGoodsInfoByModelId(baseGoodsModelsId); //要报废的总数量 int modelTotalNum = modelGoodsList.stream().mapToInt(LWhFormScrappedGoods::getCounts).sum(); Long tempGoodsId = (Long) tempGoodsInfo.get("goodsid"); String goodsName = (String) tempGoodsInfo.get("goodsname"); String modelName = (String) tempGoodsInfo.get("modelname"); // 插入 各规格物品的进出库记录 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); whGoodsRecord.setThisCount(modelTotalNum); //通过LockManage获得锁 Object warehouseModelLockObj = LockManage.acquireLock(warehouseType, warehouseId, baseGoodsModelsId); synchronized (warehouseModelLockObj) { for (LWhFormScrappedGoods formScrappedGood : modelGoodsList) { //报废数量 Integer counts = formScrappedGood.getCounts(); //报废单编号 Long transBusinessId = formScrappedGood.getTransBusinessId(); int goodsModelNum = 0; List srappedGoodsIds = null; if (warehouseType == null || warehouseType == 0) { srappedGoodsIds = lWhGoodsService.queryScrappedGoodsIds(warehouseType, warehouseId, null, null, baseGoodsModelsId, (short) 1, counts); } else { //使用人员名称 String userName = formScrappedGood.getUserName(); // 根据分发单、规格型号编号、使用人员名称,进行报废 srappedGoodsIds = lWhGoodsService.queryScrappedGoodsIds(warehouseType, warehouseId, transBusinessId, userName, baseGoodsModelsId, (short) 2, counts); } if (CollectionUtils.isEmpty(srappedGoodsIds) || srappedGoodsIds.size() < counts) { log.error("要报废的物品数量不足!"); // 手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new RuntimeException("报废失败!型号数量不足"); } whGoodsRecord.setInitialCount(goodsModelNum); whGoodsRecord.setEndCount(goodsModelNum - counts); // 设置物品为报废状态 lWhGoodsService.modGoodsTransfering(srappedGoodsIds, null, null, null, 3); // 批量插入 进出库流水明细[L_WH_GOODS_RECORD_DETAILS] lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short) 2); } lWhGoodsRecordService.insert(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(formScrappedId); warehouseFlow.setOperatorId(userId); warehouseFlow.setOperatorName(nickName); warehouseFlow.setDealTime(dealTime); // 插入流水总表 int flowInsertFlag = lWarehouseFlowService.insert(warehouseFlow); if (flowInsertFlag == 0) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return null; } // 更新报废单 lWhFormScrapped = new LWhFormScrapped(formScrappedId); lWhFormScrapped.setLWarehouseFlowId(lWarehouseFlowId); lWhFormScrapped.setStates(1); lWhFormScrapped.setOperatorId(userId); lWhFormScrapped.setOperatorName(nickName); lWhFormScrapped.setDealTime(dealTime); goodsBaseService.update(lWhFormScrapped); //当库存变动时调用该方法 lWhWarningCoreService.updateKuCun(Convert.toShort(warehouseType,(short) 0), warehouseId, allChangModelList, null, dealTime); return lWarehouseFlowId; } }