package com.consum.base.service; import com.consum.base.core.util.LockManage; import com.consum.model.po.LWarehouseFlow; import com.consum.model.po.LWhFormTransfer; import com.consum.model.po.LWhGoodsRecord; import com.consum.model.po.LWhGoodsRecordDetails; import com.iplatform.model.po.S_user_core; import com.walker.infrastructure.utils.CollectionUtils; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.NumberGenerator; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @ClassName LWhFormTransferCoreService * @Date 2023/10/26 * @Description * @Version 1.0 **/ @Service @Slf4j @Transactional(rollbackFor = Exception.class) public class LWhFormTransferCoreService { @Resource private LWhFormTransferServiceImpl lWhFormTransferService; @Resource private LWhFormOutputCoreService lWhFormOutputCoreService; @Resource private GoodsBaseServiceImpl goodsBaseService; @Resource private LWhGoodsRecordService lWhGoodsRecordService; @Resource private LWhGoodsService lWhGoodsService; @Resource private LGoodsWhRecordServiceImpl lGoodsWhRecordService; @Resource private LWarehouseFlowService lWarehouseFlowService; @Resource private LWarehouseFlowService LWhGoodsRecordDetailsService; /** * 执行调拨出库操作 * * @param whFormTransferId 调拨单id */ public void doTransferOutPut(Long whFormTransferId, S_user_core currentUser) { LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(whFormTransferId); lWhFormTransfer = lWhFormTransferService.get(lWhFormTransfer); if (lWhFormTransfer == null || lWhFormTransfer.getStates() != 0) { log.error("调拨失败!请检查调拨单状态"); return; } Long userId = currentUser.getId(); String nickName = currentUser.getNick_name(); long dealTime = DateUtils.getDateTimeNumber(System.currentTimeMillis()); // 出库单ID Long outWarehouseFormId = null; try { // 根据调拨单 生成 出库单 outWarehouseFormId = lWhFormOutputCoreService.createOutFormByTransId(whFormTransferId, currentUser, dealTime); } catch (Exception e) { log.error(e.getMessage()); return; } // 出库单 出库,返回 出库单流水Id Long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(outWarehouseFormId, currentUser, dealTime); // 更新调拨单 lWhFormTransfer = new LWhFormTransfer(whFormTransferId); lWhFormTransfer.setOutWarehouseFormId(outWarehouseFormId); lWhFormTransfer.setStates(1); lWhFormTransfer.setOutOperatorId(userId); lWhFormTransfer.setOutOperatorName(nickName); lWhFormTransfer.setOutputTime(dealTime); lWhFormTransfer.setOutWarehouseFlowId(lWarehouseFlowId); lWhFormTransferService.update(lWhFormTransfer); log.info("调拨单:{} 出库完成", whFormTransferId); return; } /** * 调拨单入库 * * @param whFormTransferId * @param currentUser */ public void doTransferInPut(Long whFormTransferId, S_user_core currentUser) { LWhFormTransfer lWhFormTransfer = new LWhFormTransfer(whFormTransferId); lWhFormTransfer = lWhFormTransferService.get(lWhFormTransfer); if (lWhFormTransfer == null || lWhFormTransfer.getStates() != 1) { log.error("调拨失败!请检查调拨单状态"); return; } Long userId = currentUser.getId(); String nickName = currentUser.getNick_name(); // 出库单流水id Long outWarehouseFlowId = lWhFormTransfer.getOutWarehouseFlowId(); // 入库仓库类型 0机构1部门 Integer inWarehouseType = lWhFormTransfer.getInWarehouseType(); Long inWarehouseId = lWhFormTransfer.getInWarehouseId(); String inWarehouseName = lWhFormTransfer.getInWarehouseName(); long dealTime = DateUtils.getDateTimeNumber(System.currentTimeMillis()); // 流水记录总表ID long inWarehouseFlowId = NumberGenerator.getLongSequenceNumber(); // 根据出库流水ID 查询 出库的物品ID List outGoodsIds = getGoodsidByFlowId(outWarehouseFlowId); // 插入 进出库流水总表[L_WAREHOUSE_FLOW] LWarehouseFlow inwarehouseFlow = new LWarehouseFlow(); inwarehouseFlow.setId(inWarehouseFlowId); inwarehouseFlow.setWarehouseType(inWarehouseType); inwarehouseFlow.setWarehouseId(inWarehouseId); inwarehouseFlow.setWarehouseName(inWarehouseName); inwarehouseFlow.setThisType(1); inwarehouseFlow.setBusinessType(2); inwarehouseFlow.setBusinessFormId(whFormTransferId); inwarehouseFlow.setOperatorId(userId); inwarehouseFlow.setOperatorName(nickName); inwarehouseFlow.setDealTime(dealTime); lWarehouseFlowService.insert(inwarehouseFlow); LWhGoodsRecord lWhGoodsRecord = new LWhGoodsRecord(); lWhGoodsRecord.setWarehouseFlowId(outWarehouseFlowId); List whGoodsRecordList = lWhGoodsRecordService.select(lWhGoodsRecord); for (LWhGoodsRecord whGoodsRecord : whGoodsRecordList) { Long oldRecordId = whGoodsRecord.getId(); Long baseGoodsModelsId = whGoodsRecord.getBaseGoodsModelsId(); whGoodsRecord.setId(NumberGenerator.getLongSequenceNumber()); whGoodsRecord.setWarehouseType(inWarehouseType); whGoodsRecord.setWarehouseId(inWarehouseId); whGoodsRecord.setDealTime(dealTime); //通过LockManage获得锁 Object warehouseModelLockObj = LockManage.acquireLock(inWarehouseType, inWarehouseId, baseGoodsModelsId); synchronized (warehouseModelLockObj) { // 获得锁后查询该型号的期初数量 int goodsModelNum = lWhGoodsService.queryGoodsModelNum(inWarehouseType, inWarehouseId, baseGoodsModelsId, (short) 1, null); whGoodsRecord.setInitialCount(goodsModelNum); whGoodsRecord.setEndCount(goodsModelNum + whGoodsRecord.getThisCount()); } LWhGoodsRecordDetails lWhGoodsRecordDetails = new LWhGoodsRecordDetails(); lWhGoodsRecordDetails.setWhGoodsRecordId(oldRecordId); List goodsRecordDetailsList = LWhGoodsRecordDetailsService.select(lWhGoodsRecordDetails); for (LWhGoodsRecordDetails whGoodsRecordDetails : goodsRecordDetailsList) { whGoodsRecordDetails.setId(NumberGenerator.getLongSequenceNumber()); whGoodsRecordDetails.setThisType(1); } LWhGoodsRecordDetailsService.insertBatch(goodsRecordDetailsList); } lWhGoodsRecordService.insertBatch(whGoodsRecordList); // 库存物品详情(L_WH_GOODS)中 状态设置为1 lWhGoodsService.modGoodsTransfering(outGoodsIds, inWarehouseType, inWarehouseId, inWarehouseName, (short) 1); //将保管仓库信息更新到 物品仓库保管记录【L_GOODS_WH_RECORD】 lGoodsWhRecordService.insertNewRecord(outGoodsIds, inWarehouseFlowId, dealTime); // 更新调拨单 lWhFormTransfer = new LWhFormTransfer(whFormTransferId); lWhFormTransfer.setInWarehouseFormId(inWarehouseFlowId); lWhFormTransfer.setStates(2); lWhFormTransfer.setInOperatorId(userId); lWhFormTransfer.setInOperatorName(nickName); lWhFormTransfer.setInTime(dealTime); lWhFormTransferService.update(lWhFormTransfer); log.info("调拨单:{} 入库完成", whFormTransferId); return; } private static String GET_GOODSID_BY_FLOWID = "SELECT goods.id FROM L_WH_GOODS_RECORD gr LEFT JOIN L_WH_GOODS_RECORD_DETAILS grd ON gr.id=grd.WH_GOODS_RECORD_ID LEFT JOIN L_WH_GOODS goods ON goods.id=grd.WH_GOODS_ID WHERE 1=1"; /** * 根据出库流水ID 查询 出库的物品ID * * @param lWarehouseFlowId */ private List getGoodsidByFlowId(long lWarehouseFlowId) { StringBuilder sql = new StringBuilder(GET_GOODSID_BY_FLOWID); Map paramts = new HashMap<>(); sql.append(" and gr.WAREHOUSE_FLOW_ID =:lWarehouseFlowId"); paramts.put("lWarehouseFlowId", lWarehouseFlowId); List> outGoods = goodsBaseService.select(sql.toString(), paramts); if (CollectionUtils.isEmpty(outGoods)) { return null; } List whGoodsIds = outGoods.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList()); return whGoodsIds; } }