package com.zy.asrs.wms.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.*; import com.zy.asrs.wms.asrs.entity.enums.*; import com.zy.asrs.wms.asrs.entity.param.FieldParam; import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam; import com.zy.asrs.wms.asrs.entity.param.LocAdjustParam; import com.zy.asrs.wms.asrs.entity.param.LocTransferParam; import com.zy.asrs.wms.asrs.service.*; import com.zy.asrs.wms.utils.LocUtils; import com.zy.asrs.wms.utils.OrderUtils; import com.zy.asrs.wms.utils.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; @Service("workService") public class WorkServiceImpl implements WorkService { @Autowired private TaskService taskService; @Autowired private TaskDetlService taskDetlService; @Autowired private WaitPakinService waitPakinService; @Autowired private TaskTypeService taskTypeService; @Autowired private OrderDetlFieldService orderDetlFieldService; @Autowired private TaskDetlFieldService taskDetlFieldService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private LocService locService; @Autowired private LocDetlService locDetlService; @Autowired private LocDetlFieldService locDetlFieldService; @Autowired private LocStsService locStsService; @Autowired private TaskLogService taskLogService; @Autowired private TaskDetlLogService taskDetlLogService; @Autowired private TaskDetlFieldLogService taskDetlFieldLogService; @Autowired private LocUtils locUtils; @Autowired private ShelvesRuleService shelvesRuleService; @Autowired private LanewayRuleService lanewayRuleService; @Autowired private CircleRuleService circleRuleService; @Autowired private LocTypeBindService locTypeBindService; @Autowired private LocTypeService locTypeService; @Autowired private MatService matService; @Autowired private OrderUtils orderUtils; @Autowired private WaveDetlService waveDetlService; @Autowired private MatFieldService matFieldService; @Override public String generateTaskNo(Long taskType) { Random random = new Random(); int nextInt = random.nextInt(99999); return "R" + nextInt; } @Override public Integer generateIoPri(Long taskType) { return 10; } @Override public Loc generateEmptyLoc(Long taskType, Integer locTypeHeight) { List shelvesRules = shelvesRuleService.list(new LambdaQueryWrapper().eq(ShelvesRule::getStatus, 1).orderByDesc(ShelvesRule::getCreateTime)); if(shelvesRules.isEmpty()) { throw new CoolException("未配置上架规则"); } ShelvesRule shelvesRule = shelvesRules.get(0); //可用巷道 List laneList = shelvesRule.getLaneList(); //可用巷道Row List laneRowList = new ArrayList<>(); if (laneList != null) { //获取巷道 List lanewayRules = lanewayRuleService.listByIds(laneList); for (LanewayRule lanewayRule : lanewayRules) { laneRowList.addAll(lanewayRule.getLaneX$()); laneRowList.addAll(lanewayRule.getLaneY$()); } } Integer currentLev = null; if (shelvesRule.getRuleType().equals(ShelvesRuleType.HIGH.id)) { //优先立体层 currentLev = circleRuleService.getCurrentValueByFlag(CircleRuleType.LEV.flag); } List ruleDetls = shelvesRule.getRuleDetl$(); if(ruleDetls.isEmpty()) { throw new CoolException("未配置上架规则明细"); } Loc defaultLoc = null; for (ShelvesRuleDetl ruleDetl : ruleDetls) { if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.TASK_OR_LOC.id)) { //从库存或任务中匹配相邻库位 defaultLoc = locUtils.getNeighborEmptyLoc(taskType, locTypeHeight); if (defaultLoc != null) { return defaultLoc; } } if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.SUGGEST.id)) { //获取推荐库位 List suggestLoc = locUtils.getSuggestEmptyLoc(taskType, locTypeHeight, laneRowList, currentLev); //获取库位 if (!suggestLoc.isEmpty()) { defaultLoc = locUtils.filterLoc(taskType, suggestLoc); if(defaultLoc != null) { return defaultLoc; } } } if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.COMPLETE.id)) { //从全局库位中获取(完整巷道) List globalLoc = locUtils.getGlobalEmptyLoc(taskType, locTypeHeight, laneRowList, currentLev); //获取库位 if (!globalLoc.isEmpty()) { defaultLoc = locUtils.filterAllLoc(globalLoc); if(defaultLoc != null) { return defaultLoc; } } } } return defaultLoc; } @Override public synchronized Loc generateLoc(Long taskType, String barcode, Integer locTypeHeight) { List waitPakins = waitPakinService.list(new LambdaQueryWrapper().eq(WaitPakin::getBarcode, barcode)); if (taskType != 10 && waitPakins.isEmpty()) { throw new CoolException("托盘未组托"); } WaitPakin waitPakin = waitPakins.get(0); OrderDetl detl = waitPakin.getDetl$(); if (detl == null) { throw new CoolException("订单明细不存在"); } String batch = detl.getBatch(); List uniqueFields = detl.getUniqueField(); Mat mat = detl.getMat$(); if (mat == null) { throw new CoolException("商品不存在"); } return generateLoc(taskType, mat.getId(), batch, uniqueFields, locTypeHeight); } @Override public synchronized Loc generateLoc(Long taskType, Long matId, String batch, List uniqueFields, Integer locTypeHeight) { Mat mat = matService.getById(matId); if (mat == null) { throw new CoolException("商品不存在"); } List shelvesRules = shelvesRuleService.list(new LambdaQueryWrapper().eq(ShelvesRule::getStatus, 1).orderByDesc(ShelvesRule::getCreateTime)); if (shelvesRules.isEmpty()) { throw new CoolException("未配置上架规则"); } ShelvesRule shelvesRule = shelvesRules.get(0); //可用巷道 List laneList = shelvesRule.getLaneList(); //可用巷道Row List laneRowList = new ArrayList<>(); if (laneList != null) { //获取巷道 List lanewayRules = lanewayRuleService.listByIds(laneList); for (LanewayRule lanewayRule : lanewayRules) { laneRowList.addAll(lanewayRule.getLaneX$()); laneRowList.addAll(lanewayRule.getLaneY$()); } } Integer currentLev = null; if (shelvesRule.getRuleType().equals(ShelvesRuleType.HIGH.id)) { //优先立体层 currentLev = circleRuleService.getCurrentValueByFlag(CircleRuleType.LEV.flag); } List ruleDetls = shelvesRule.getRuleDetl$(); if (ruleDetls.isEmpty()) { throw new CoolException("未配置上架规则明细"); } Loc defaultLoc = null; for (ShelvesRuleDetl ruleDetl : ruleDetls) { if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.TASK_OR_LOC.id)) { //从库存或任务中匹配相邻库位 defaultLoc = locUtils.getNeighborLoc(taskType, mat.getId(), batch, uniqueFields, locTypeHeight); if (defaultLoc != null) { return defaultLoc; } } if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.SUGGEST.id)) { //获取推荐库位 List suggestLoc = locUtils.getSuggestLoc(taskType, mat.getId(), batch, locTypeHeight, laneRowList, currentLev); //获取库位 if (!suggestLoc.isEmpty()) { defaultLoc = locUtils.filterLoc(taskType, suggestLoc); if (defaultLoc != null) { return defaultLoc; } } } if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.COMPLETE.id)) { //从全局库位中获取(完整巷道) List globalLoc = locUtils.getGlobalLoc(taskType, locTypeHeight, laneRowList, currentLev); //获取库位 if (!globalLoc.isEmpty()) { defaultLoc = locUtils.filterAllLoc(globalLoc); if (defaultLoc != null) { return defaultLoc; } } } } return defaultLoc; } @Override @Transactional public boolean generatePakIn(GeneratePakInParam param) { List waitPakins = waitPakinService.list(new LambdaQueryWrapper().eq(WaitPakin::getBarcode, param.getBarcode())); if (param.getTaskType() != 10 && waitPakins.isEmpty()) { throw new CoolException("托盘未组托"); } TaskType taskType = taskTypeService.getById(param.getTaskType()); if (taskType == null) { throw new CoolException("任务类型不存在"); } Task one = taskService.getOne(new LambdaQueryWrapper().eq(Task::getBarcode, param.getBarcode())); if (one != null) { throw new CoolException("任务已经创建,请勿重复请求"); } //生成库位 Loc loc = this.generateLoc(param.getTaskType(), param.getBarcode(), param.getLocTypeHeight()); if(loc == null) { throw new CoolException("没有空库位"); } Task task = new Task(); task.setTaskNo(this.generateTaskNo(taskType.getId()));//任务号 task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.生成入库任务 task.setTaskType(taskType.getId());//任务类型 task.setIoPri(this.generateIoPri(taskType.getId()));//优先级 task.setOriginLoc(null); task.setTargetLoc(loc.getLocNo()); task.setOriginSite(param.getOriginSite()); task.setTargetSite(null); task.setBarcode(param.getBarcode());//托盘码 boolean taskSave = taskService.save(task); if (!taskSave) { throw new CoolException("任务生成失败"); } //生成任务明细 for (WaitPakin waitPakin : waitPakins) { TaskDetl taskDetl = new TaskDetl(); taskDetl.setTaskId(task.getId()); taskDetl.setTaskNo(task.getTaskNo()); taskDetl.setAnfme(waitPakin.getAnfme());//数量 taskDetl.setStock(0D);//库存 taskDetl.setBatch(waitPakin.getDetl$().getBatch());//批号 taskDetl.setBarcode(waitPakin.getBarcode()); taskDetl.setOrderId(waitPakin.getOrderId()); taskDetl.setOrderNo(waitPakin.getOrderNo()); taskDetl.setDetlId(waitPakin.getDetlId()); taskDetl.setMatId(waitPakin.getDetl$().getMatId()); taskDetl.setMatnr(waitPakin.getDetl$().getMat$().getMatnr()); boolean taskDetlSave = taskDetlService.save(taskDetl); if(!taskDetlSave){ throw new CoolException("任务明细生成失败"); } //生成明细扩展 List orderDetlFields = orderDetlFieldService.list(new LambdaQueryWrapper().eq(OrderDetlField::getDetlId, waitPakin.getDetlId())); for (OrderDetlField orderDetlField : orderDetlFields) { TaskDetlField taskDetlField = new TaskDetlField(); taskDetlField.setName(orderDetlField.getName()); taskDetlField.setFieldId(orderDetlField.getFieldId()); taskDetlField.setDetlId(taskDetl.getId()); taskDetlField.setValue(orderDetlField.getValue()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); if(!taskDetlFieldSave){ throw new CoolException("明细扩展生成失败"); } } //更新组托通知档 waitPakin.setIoStatus(1); waitPakin.setUpdateTime(new Date()); boolean waitPakinUpdate = waitPakinService.updateById(waitPakin); if(!waitPakinUpdate){ throw new CoolException("组托通知档更新失败"); } //更新订单明细数据 OrderDetl orderDetl = orderDetlService.getById(taskDetl.getDetlId()); if(orderDetl == null){ throw new CoolException("订单明细不存在"); } orderDetl.setWorkQty(orderDetl.getWorkQty() + taskDetl.getAnfme()); orderDetl.setUpdateTime(new Date()); boolean orderDetlUpdate = orderDetlService.updateById(orderDetl); if(!orderDetlUpdate){ throw new CoolException("订单明细更新失败"); } //获取订单 Order order = orderService.getById(taskDetl.getOrderId()); if(order == null){ throw new CoolException("订单不存在"); } //更新订单状态 if (order.getOrderSettle().equals(OrderSettleType.WAIT.val())) { order.setOrderSettle(OrderSettleType.WORKING.val()); order.setUpdateTime(new Date()); if (!orderService.updateById(order)) { throw new CoolException("订单数据更新失败"); } } } //库位O => S loc.setLocStsId(LocStsType.S.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ throw new CoolException("库位状态更新失败"); } return true; } @Override public boolean generateEmptyPakIn(GeneratePakInParam param) { TaskType taskType = taskTypeService.getById(param.getTaskType()); if (taskType == null) { throw new CoolException("任务类型不存在"); } //生成库位 Loc loc = this.generateEmptyLoc(param.getTaskType(), param.getLocTypeHeight()); if(loc == null) { throw new CoolException("没有空库位"); } Task task = new Task(); task.setTaskNo(this.generateTaskNo(taskType.getId()));//任务号 task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.生成入库任务 task.setTaskType(taskType.getId());//任务类型 task.setIoPri(this.generateIoPri(taskType.getId()));//优先级 task.setOriginLoc(null); task.setTargetLoc(loc.getLocNo()); task.setOriginSite(param.getOriginSite()); task.setTargetSite(null); task.setBarcode(null);//托盘码 boolean taskSave = taskService.save(task); if (!taskSave) { throw new CoolException("任务生成失败"); } //库位O => S loc.setLocStsId(LocStsType.S.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ throw new CoolException("库位状态更新失败"); } return true; } @Override public boolean completeTask(Long taskId) { Task task = taskService.getById(taskId); if(task == null){ throw new CoolException("任务不存在"); } List taskDetls = taskDetlService.getTaskDetlByTaskId(taskId); if (taskDetls.isEmpty()) { throw new CoolException("任务明细不存在"); } if (task.getTaskType() < 100) { //入库 task.setTaskSts(TaskStsType.COMPLETE_IN.id);//99.入库完成 }else { //出库 TaskDetl taskDetl = taskDetls.get(0); if (taskDetl.getWaveId() == null) { task.setTaskSts(TaskStsType.COMPLETE_OUT.id);//199.出库完成 }else { task.setTaskSts(TaskStsType.WAVE_SEED.id);//198.播种中 } } task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { throw new CoolException("任务更新失败"); } return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean cancelTask(Long taskId) { Task task = taskService.getById(taskId); if(task == null){ throw new CoolException("任务不存在"); } //更新库位状态 Loc loc = null; switch (task.getTaskType().intValue()) { case 1://入库 case 10://空板 case 53://拣料 case 54://并板 case 57://盘点 loc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, task.getTargetLoc())); if(loc == null){ throw new CoolException("库位不存在"); } if(loc.getLocStsId() != LocStsType.S.val()){ throw new CoolException("库位状态不处于S.入库预约"); } loc.setLocStsId(LocStsType.O.val()); loc.setUpdateTime(new Date()); if(!locService.updateById(loc)){ throw new CoolException("库位状态变更失败"); } break; case 101://出库 case 103://拣料 case 104://并板 case 107://盘点 case 110://空板 loc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, task.getOriginLoc())); if(loc == null){ throw new CoolException("库位不存在"); } if(loc.getLocStsId() != LocStsType.R.val()){ throw new CoolException("库位状态不处于R.出库预约"); } loc.setLocStsId(LocStsType.F.val()); loc.setUpdateTime(new Date()); if(!locService.updateById(loc)){ throw new CoolException("库位状态变更失败"); } List taskDetls = taskDetlService.getTaskDetlByTaskId(taskId); for (TaskDetl taskDetl : taskDetls) { if (taskDetl.getWaveId() == null) { continue; } String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField()); WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, taskDetl.getWaveId())); if(waveDetl == null){ continue; } waveDetl.setWorkQty(waveDetl.getWorkQty() - taskDetl.getAnfme()); waveDetl.setUpdateTime(new Date()); if (!waveDetlService.updateById(waveDetl)) { throw new CoolException("波次明细更新失败"); } } break; case 11://库位移转 Loc originLoc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, task.getOriginLoc())); if(originLoc == null){ throw new CoolException("源库位不存在"); } if (originLoc.getLocStsId() != LocStsType.R.val()) { throw new CoolException("源库位状态不处于R.出库预约"); } loc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, task.getTargetLoc())); if(loc == null){ throw new CoolException("目标库位不存在"); } if(loc.getLocStsId() != LocStsType.S.val()){ throw new CoolException("目标库位状态不处于S.入库预约"); } originLoc.setLocStsId(LocStsType.F.val()); originLoc.setUpdateTime(new Date()); if(!locService.updateById(originLoc)){ throw new CoolException("库位状态变更失败"); } loc.setLocStsId(LocStsType.O.val()); loc.setUpdateTime(new Date()); if(!locService.updateById(loc)){ throw new CoolException("库位状态变更失败"); } break; } //数据保存至历史档 TaskLog taskLog = new TaskLog(); taskLog.sync(task); taskLog.setId(null); if (!taskLogService.save(taskLog)) { throw new CoolException("任务档案转历史档案失败"); } //删除任务 boolean removeTask = taskService.removeById(taskId); if(!removeTask){ throw new CoolException("回滚任务失败"); } if (task.getTaskType() != 10) { List taskDetls = taskDetlService.getTaskDetlByTaskId(taskId); if (taskDetls.isEmpty()) { throw new CoolException("任务明细不存在"); } //回滚订单 for (TaskDetl taskDetl : taskDetls) { if (taskDetl.getDetlId() != null) { orderUtils.updateWorkQty(taskDetl.getDetlId(), taskDetl.getAnfme(), false); } //入库回滚组托通知档 if (task.getTaskType() == 1) { WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper().eq(WaitPakin::getDetlId, taskDetl.getDetlId()).eq(WaitPakin::getBarcode, task.getBarcode())); if(waitPakin == null){ throw new CoolException("组托通知档不存在"); } waitPakin.setIoStatus(0); waitPakin.setUpdateTime(new Date()); boolean updateWaitPakin = waitPakinService.updateById(waitPakin); if(!updateWaitPakin){ throw new CoolException("组托通知档回滚失败"); } } //明细数据保存至历史档 TaskDetlLog taskDetlLog = new TaskDetlLog(); taskDetlLog.sync(taskDetl); taskDetlLog.setId(null); taskDetlLog.setTaskId(taskLog.getId()); if (!taskDetlLogService.save(taskDetlLog)) { throw new CoolException("明细数据转历史档案失败"); } //删除明细 boolean removeDetl = taskDetlService.removeById(taskDetl.getId()); if(!removeDetl){ throw new CoolException("回滚明细失败"); } List detlFields = taskDetlFieldService.list(new LambdaQueryWrapper().eq(TaskDetlField::getDetlId, taskDetl.getId())); for (TaskDetlField detlField : detlFields) { //明细扩展字段数据保存至历史档 TaskDetlFieldLog taskDetlFieldLog = new TaskDetlFieldLog(); taskDetlFieldLog.sync(detlField); taskDetlFieldLog.setId(null); taskDetlFieldLog.setDetlId(taskDetlLog.getId()); if (!taskDetlFieldLogService.save(taskDetlFieldLog)) { throw new CoolException("明细扩展字段转历史档案失败"); } //删除明细扩展 boolean removeField = taskDetlFieldService.removeById(detlField.getId()); if(!removeField){ throw new CoolException("回滚扩展明细失败"); } } } } return true; } @Override public boolean pickTask(Long taskId) { Task task = taskService.getById(taskId); if(task == null){ throw new CoolException("任务不存在"); } if (task.getTaskType() != 103) { throw new CoolException("任务类型不可拣料"); } if (task.getTaskSts() != 200) { throw new CoolException("当前状态不可拣料"); } //获取源库位 Loc originLoc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, task.getOriginLoc())); if(originLoc == null){ throw new CoolException("源库位不存在"); } //获取源库位高度 LocTypeBind locTypeBind = locTypeBindService.getOne(new LambdaQueryWrapper().eq(LocTypeBind::getLocId, originLoc.getId()).in(LocTypeBind::getTypeId, LocBindType.HEIGHT.list())); if(locTypeBind == null){ throw new CoolException("库位类型不存在"); } LocType locType = locTypeService.getById(locTypeBind.getTypeId()); if(locType == null){ throw new CoolException("库位类型不存在"); } LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locType.getFlag()); if(locTypeHeightType == null){ throw new CoolException("高低库位类型不存在"); } Long taskType = task.getTaskType() - 50; List taskDetls = taskDetlService.list(new LambdaQueryWrapper().eq(TaskDetl::getTaskId, taskId).gt(TaskDetl::getAnfme, 0)); if (taskDetls.isEmpty()) { throw new CoolException("任务明细不存在"); } TaskDetl taskDetl = taskDetls.get(0); //生成库位 Loc loc = this.generateLoc(taskType, taskDetl.getMatId(), taskDetl.getBatch(), taskDetl.getUniqueField(), locTypeHeightType.id); if(loc == null) { throw new CoolException("没有空库位"); } task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.生成入库任务 task.setTaskType(taskType); task.setTargetLoc(loc.getLocNo()); task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { throw new CoolException("拣料失败"); } //库位O => S loc.setLocStsId(LocStsType.S.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ throw new CoolException("库位状态更新失败"); } return true; } @Override @Transactional public boolean locAdjust(LocAdjustParam param) { if (param == null) { throw new CoolException("参数不能为空"); } if (Cools.isEmpty(param.getLocNo())) { throw new CoolException("库位号不能为空"); } if (param.getDetls() == null) { throw new CoolException("库存明细不能为空"); } Loc loc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, param.getLocNo())); if (loc == null) { throw new CoolException("库位不存在"); } //删除源库存 locDetlService.removeLocDetl(loc.getId()); List matFields = matFieldService.list(new LambdaQueryWrapper().eq(MatField::getUnique, 1)); for (Map map : param.getDetls()) { LocDetl locDetl = JSON.parseObject(JSON.toJSONString(map), LocDetl.class); HashMap uniqueFields = new HashMap<>(); for (Map.Entry entry : map.entrySet()) { for (MatField field : matFields) { if (entry.getKey().equals(field.getName())) { uniqueFields.put(entry.getKey(), entry.getValue()); } } } locDetl.setAnfme(Double.parseDouble(map.get("qty").toString())); locDetl.syncFieldMap(uniqueFields); if (locDetl.getAnfme() <= 0D) { throw new CoolException("数量不能小于0"); } locDetl.setId(null); locDetl.setLocId(loc.getId()); locDetl.setLocNo(loc.getLocNo()); boolean save = locDetlService.save(locDetl); if (!save) { throw new CoolException("库存调整失败"); } //插入库存明细字段 for (MatField matField : matFields) { LocDetlField locDetlField = new LocDetlField(); locDetlField.setDetlId(locDetl.getId()); locDetlField.setFieldId(matField.getId()); locDetlField.setName(matField.getName()); locDetlField.setValue(Optional.ofNullable(uniqueFields.get(matField.getName()).toString()).orElse("")); locDetlFieldService.save(locDetlField); } } return true; } @Override @Transactional public boolean locTransfer(LocTransferParam param) { if (param == null) { throw new CoolException("参数不能为空"); } if (Cools.isEmpty(param.getSourceLocNo())) { throw new CoolException("源库位不能为空"); } if (Cools.isEmpty(param.getTargetLocNo())) { throw new CoolException("目标库位不能为空"); } Loc sourceLoc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, param.getSourceLocNo())); if (sourceLoc == null) { throw new CoolException("源库位不存在"); } if (sourceLoc.getLocStsId() != LocStsType.F.val()) { throw new CoolException("源库位非在库状态"); } Loc targetLoc = locService.getOne(new LambdaQueryWrapper().eq(Loc::getLocNo, param.getTargetLocNo())); if (targetLoc == null) { throw new CoolException("目标库位不存在"); } if(targetLoc.getLocStsId() != LocStsType.O.val()){ throw new CoolException("目标库位非空状态"); } TaskType taskType = taskTypeService.getById(11); if (taskType == null) { throw new CoolException("任务类型不存在"); } Task task = new Task(); task.setTaskNo(this.generateTaskNo(taskType.getId()));//任务号 task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.生成入库任务 task.setTaskType(taskType.getId());//任务类型 task.setIoPri(this.generateIoPri(taskType.getId()));//优先级 task.setOriginLoc(param.getSourceLocNo()); task.setTargetLoc(param.getTargetLocNo()); task.setOriginSite(null); task.setTargetSite(null); task.setBarcode(sourceLoc.getBarcode());//托盘码 boolean taskSave = taskService.save(task); if (!taskSave) { throw new CoolException("任务生成失败"); } List locDetls = locDetlService.list(new LambdaQueryWrapper().eq(LocDetl::getLocId, sourceLoc.getId())); if(locDetls.isEmpty()){ throw new CoolException("源库位明细不存在"); } //生成任务明细 for (LocDetl locDetl : locDetls) { TaskDetl taskDetl = new TaskDetl(); taskDetl.setTaskId(task.getId()); taskDetl.setTaskNo(task.getTaskNo()); taskDetl.setAnfme(locDetl.getAnfme());//数量 taskDetl.setStock(0D);//库存 taskDetl.setBatch(locDetl.getBatch());//批号 taskDetl.setBarcode(sourceLoc.getBarcode()); taskDetl.setMatId(locDetl.getMatId()); taskDetl.setMatnr(locDetl.getMatnr()); boolean taskDetlSave = taskDetlService.save(taskDetl); if(!taskDetlSave){ throw new CoolException("任务明细生成失败"); } //生成明细扩展 List locDetlFieldList = locDetlFieldService.list(new LambdaQueryWrapper().eq(LocDetlField::getDetlId, locDetl.getId())); for (LocDetlField locDetlField : locDetlFieldList) { TaskDetlField taskDetlField = new TaskDetlField(); taskDetlField.setName(locDetlField.getName()); taskDetlField.setFieldId(locDetlField.getFieldId()); taskDetlField.setDetlId(taskDetl.getId()); taskDetlField.setValue(locDetlField.getValue()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); if(!taskDetlFieldSave){ throw new CoolException("明细扩展生成失败"); } } } //库位F => R sourceLoc.setLocStsId(LocStsType.R.val()); sourceLoc.setUpdateTime(new Date()); boolean sourceLocUpdate = locService.updateById(sourceLoc); if(!sourceLocUpdate){ throw new CoolException("库位状态更新失败"); } //库位O => S targetLoc.setLocStsId(LocStsType.S.val()); targetLoc.setUpdateTime(new Date()); boolean targetLocUpdate = locService.updateById(targetLoc); if(!targetLocUpdate){ throw new CoolException("库位状态更新失败"); } return true; } }