From 1de6b39bfe3967916dcab8122be0d69fbaba8cca Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期五, 30 五月 2025 17:29:06 +0800 Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 1084 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 1,004 insertions(+), 80 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java index 1e096e9..2b3e618 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java @@ -3,36 +3,41 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.Cools; -import com.vincent.rsf.server.manager.enums.OrderType; -import com.vincent.rsf.server.manager.enums.TaskStsType; +import com.vincent.rsf.server.api.controller.params.TaskInParam; +import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; +import com.vincent.rsf.server.api.service.WcsService; +import com.vincent.rsf.server.common.constant.Constants; +import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; +import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; -import com.vincent.rsf.server.manager.enums.TaskType; import com.vincent.rsf.server.api.utils.LocUtils; import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams; import com.vincent.rsf.server.manager.entity.*; -import com.vincent.rsf.server.manager.enums.PakinIOStatus; import com.vincent.rsf.server.manager.mapper.TaskMapper; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.utils.LocManageUtil; import com.vincent.rsf.server.system.constant.SerialRuleCode; -import com.vincent.rsf.server.system.enums.LocStsType; +import com.vincent.rsf.server.manager.enums.LocStsType; import com.vincent.rsf.server.system.utils.SerialRuleUtils; +import com.vincent.rsf.server.system.utils.SystemAuthUtils; +import lombok.Synchronized; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @Service("taskService") public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService { + + public static final Logger logger = LoggerFactory.getLogger(TaskServiceImpl.class); @Autowired private WaitPakinService waitPakinService; @@ -60,9 +65,193 @@ private DeviceBindService deviceBindService; @Autowired private WarehouseAreasService warehouseAreasService; - @Autowired private WarehouseAreasItemService warehouseAreasItemService; + @Autowired + private WaveItemService waveItemService; + @Autowired + private WaveService waveService; + @Autowired + private BasStationService basStationService; + @Autowired + private TaskService taskService; + @Autowired + private LocItemWorkingService locItemWorkingService; + @Autowired + private WcsService wcsService; + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized R generateAGVTasks(WaitPakin pakins, String locCode, String orgSta, Long loginUserId) { + if (Cools.isEmpty(pakins) || Cools.isEmpty(locCode)) { + throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + /**鑾峰彇缁勬嫋*/ + List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>() + .in(WaitPakin::getId, pakins.getId()) + .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); + if (waitPakins.isEmpty()) { + throw new CoolException("璇锋鏌ョ粍鎵樼姸鎬佹槸鍚﹀畬鎴愶紒锛�"); + } + waitPakins.forEach(pakin -> { + /**鑾峰彇搴撲綅*/ + String targetLoc = locCode; + if (Cools.isEmpty(targetLoc)) { + throw new CoolException("璇ョ珯鐐瑰搴斿簱鍖烘湭鎵惧埌搴撲綅"); + } + + List<TaskItem> taskItems = new ArrayList<>(); + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); + if (StringUtils.isBlank(ruleCode)) { + throw new CoolException("缂栫爜閿欒锛氳纭缂栫爜銆孲YS_TASK_CODE銆嶆槸鍚﹀凡鐢熸垚!!"); + } + Task task = new Task(); + task.setTaskCode(ruleCode) + .setTaskStatus(TaskStsType.GENERATE_IN.id) + .setTaskType(TaskType.TASK_TYPE_IN.type) + .setWarehType(WarehType.WAREHOUSE_TYPE_AGV.val) + .setTargLoc(targetLoc) + .setOrgSite(orgSta) + .setBarcode(pakin.getBarcode()) + .setCreateBy(loginUserId) + .setUpdateBy(loginUserId); + + if (!this.save(task)) { + throw new CoolException("浠诲姟淇濆瓨澶辫触锛侊紒"); + } + if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, pakin.getBarcode()))) { + throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒"); + } + /**鑾峰彇缁勬嫋鏄庣粏**/ + List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakin.getId())); + if (waitPakinItems.isEmpty()) { + throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪"); + } + waitPakinItems.forEach(item -> { + TaskItem taskItem = new TaskItem(); + BeanUtils.copyProperties(item, taskItem); + taskItem.setTaskId(task.getId()) + .setOrderType(OrderType.ORDER_IN.type) + .setSource(item.getId()) + .setTrackCode(item.getTrackCode()) + .setCreateBy(loginUserId) + .setUpdateBy(loginUserId) + .setExtendFields(item.getExtendFields()) + .setOrderId(item.getAsnId()) + .setOrderItemId(item.getAsnItemId()); + taskItems.add(taskItem); + }); + if (!taskItemService.saveBatch(taskItems)) { + throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); + } + waitPakinItems.forEach(item -> { + if (!waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>() + .set(WaitPakinItem::getWorkQty, item.getAnfme()) + .eq(WaitPakinItem::getId, item.getId()))) { + throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�"); + } + }); + }); + + if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>() + .in(WaitPakin::getId, pakins.getId()) + .set(WaitPakin::getUpdateBy, loginUserId) + .set(WaitPakin::getCreateBy, loginUserId) + .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val))) { + throw new CoolException("缁勬墭鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + return R.ok("浠诲姟鐢熸垚瀹屾瘯锛�"); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized R generateFlatWarehouseTasks(WaitPakin pakins, String locCode, Long loginUserId) { + if (Cools.isEmpty(pakins) || Cools.isEmpty(locCode)) { + throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + /**鑾峰彇缁勬嫋*/ + List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>() + .in(WaitPakin::getId, pakins.getId()) + .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); + if (waitPakins.isEmpty()) { + throw new CoolException("璇锋鏌ョ粍鎵樼姸鎬佹槸鍚﹀畬鎴愶紒锛�"); + } + waitPakins.forEach(pakin -> { + /**鑾峰彇搴撲綅*/ + String targetLoc = locCode; + if (Cools.isEmpty(targetLoc)) { + throw new CoolException("璇ョ珯鐐瑰搴斿簱鍖烘湭鎵惧埌搴撲綅"); + } + + List<TaskItem> taskItems = new ArrayList<>(); + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); + if (StringUtils.isBlank(ruleCode)) { + throw new CoolException("缂栫爜閿欒锛氳纭缂栫爜銆孲YS_TASK_CODE銆嶆槸鍚﹀凡鐢熸垚!!"); + } + Task task = new Task(); + task.setTaskCode(ruleCode) + .setTaskStatus(TaskStsType.COMPLETE_IN.id) + .setTaskType(TaskType.TASK_TYPE_IN.type) + .setWarehType(WarehType.WAREHOUSE_TYPE_PLAT.val) + .setTargLoc(targetLoc) + .setBarcode(pakin.getBarcode()) + .setCreateBy(loginUserId) + .setUpdateTime(new Date()) + .setUpdateBy(loginUserId); + + if (!this.save(task)) { + throw new CoolException("浠诲姟淇濆瓨澶辫触锛侊紒"); + } + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .eq(Loc::getCode, task.getTargLoc()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type) + .set(Loc::getUpdateBy, loginUserId) + .set(Loc::getUpdateTime, new Date()) + .set(Loc::getBarcode, pakin.getBarcode()))) { + throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒"); + } + /**鑾峰彇缁勬嫋鏄庣粏**/ + List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakin.getId())); + if (waitPakinItems.isEmpty()) { + throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪"); + } + waitPakinItems.forEach(item -> { + TaskItem taskItem = new TaskItem(); + BeanUtils.copyProperties(item, taskItem); + taskItem.setTaskId(task.getId()) + .setOrderType(OrderType.ORDER_IN.type) + .setSource(item.getId()) + .setTrackCode(item.getTrackCode()) + .setCreateBy(loginUserId) + .setUpdateBy(loginUserId) + .setExtendFields(item.getExtendFields()) + .setOrderId(item.getAsnId()) + .setOrderItemId(item.getAsnItemId()); + taskItems.add(taskItem); + }); + if (!taskItemService.saveBatch(taskItems)) { + throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); + } + waitPakinItems.forEach(item -> { + if (!waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>() + .set(WaitPakinItem::getWorkQty, item.getAnfme()) + .eq(WaitPakinItem::getId, item.getId()))) { + throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�"); + } + }); + }); + + if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>() + .in(WaitPakin::getId, pakins.getId()) + .set(WaitPakin::getUpdateBy, loginUserId) + .set(WaitPakin::getCreateBy, loginUserId) + .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val))) { + throw new CoolException("缁勬嫋鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + return R.ok("浠诲姟鐢熸垚瀹屾瘯锛�"); + } /** @@ -97,7 +286,7 @@ List<Long> ids = waitPakin.getWaitPakins().stream().map(WaitPakin::getId).collect(Collectors.toList()); List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>() .in(WaitPakin::getId, ids) - .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val))); + .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); if (waitPakins.isEmpty()) { throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�"); } @@ -115,8 +304,8 @@ } Task task = new Task(); task.setTaskCode(ruleCode) - .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue()) - .setTaskType(TaskType.TASK_TYPE_IN.type.shortValue()) + .setTaskStatus(TaskStsType.GENERATE_IN.id) + .setTaskType(TaskType.TASK_TYPE_IN.type) .setTargLoc(targetLoc) .setBarcode(pakin.getBarcode()) .setOrgSite(deviceSite.getSite()) @@ -160,11 +349,16 @@ // throw new CoolException("鏁版嵁閿欒: 鍗曟嵁涓嶅瓨鍦紒锛�"); // } taskItem.setTaskId(task.getId()) - .setOrderType(OrderType.ORDER_RECEIPT.type) + .setOrderType(OrderType.ORDER_IN.type) .setSource(item.getId()) .setTrackCode(item.getTrackCode()) + .setPlatItemId(item.getPlatItemId()) + .setPlatOrderCode(item.getPlatOrderCode()) + .setPlatWorkCode(item.getPlatWorkCode()) + .setProjectCode(item.getProjectCode()) .setCreateBy(loginUserId) .setUpdateBy(loginUserId) + .setExtendFields(item.getExtendFields()) .setOrderId(item.getAsnId()) .setOrderItemId(item.getAsnItemId()); taskItems.add(taskItem); @@ -173,11 +367,11 @@ throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); } waitPakinItems.forEach(item -> { - if (! waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>() - .set(WaitPakinItem::getWorkQty, item.getAnfme()) - .eq(WaitPakinItem::getId, item.getId()))) { - throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�"); - } + if (!waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>() + .set(WaitPakinItem::getWorkQty, item.getAnfme()) + .eq(WaitPakinItem::getId, item.getId()))) { + throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�"); + } }); }); @@ -192,84 +386,804 @@ } /** - * 瀹屾垚浠诲姟 鏇存柊搴撲綅鏄庣粏淇℃伅锛屽皢鍗曟嵁搴撳瓨鏇存柊鍒板崟鎹簱瀛樿〃 + * 鍏ュ簱浠诲姟 + * * @param tasks * @throws Exception */ + @Synchronized @Override @Transactional(rollbackFor = Exception.class) - public void completeTask(List<Task> tasks) throws Exception { - if (tasks.isEmpty()) { + public void complateInTask(List<Task> tasks) throws Exception { + Long loginUserId = SystemAuthUtils.getLoginUserId(); + for (Task task : tasks) { + if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) { + //1.鍏ュ簱 + complateInstock(task, loginUserId); + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { + //53.鎷f枡鍐嶅叆搴� + //57.鐩樼偣鍐嶅叆搴� + pickComplateInStock(task, loginUserId); + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { + //绉诲簱 + moveInStock(task, loginUserId); + } + } + } + + /** + * 浠诲姟缃《 + * + * @param id + * @param loginUserId + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Task taskToTop(Long id, Long loginUserId) throws Exception { + List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); + Task tasks = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs)); + if (Objects.isNull(tasks)) { + throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙竴閿疆椤讹紒锛�"); + } + //鍒ゆ柇娴呭簱浣嶄换鍔★紝淇敼浠诲姟浼樺厛绾� + modiftyTaskSort(tasks, loginUserId); + + if (!taskService.updateById(tasks)) { + throw new CoolException("缃《澶辫触锛侊紒"); + } + return null; + } + + /** + * 鎵嬪姩瀹屾垚浠诲姟 + * + * @param id + * @param loginUserId + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Task operateComplete(Long id, Long loginUserId) { + List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); + Task task = taskService.getOne(new LambdaQueryWrapper<Task>() + .eq(Task::getId, id) + .in(Task::getTaskStatus, longs)); + + if (Objects.isNull(task)) { + throw new CoolException("褰撳墠浠诲姟姝e湪鎵ц涓紝涓嶅彲鍙栨秷锛侊紒"); + } + + modiftyTaskSort(task, loginUserId); + + // + + task.setTaskStatus(task.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.COMPLETE_OUT.id); + if (!this.updateById(task)) { + throw new CoolException("瀹屾垚浠诲姟澶辫触"); + } + return task; + } + + /** + * 淇敼浠诲姟浼樺厛绾� + * + * @param task + * @param loginUserId + */ + private Task modiftyTaskSort(Task task, Long loginUserId) { + String curLoc; + if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) { + curLoc = task.getTargLoc(); + } else { + curLoc = task.getOrgLoc(); + } + //娣卞簱浣嶅厛鍑烘儏鍐� + if (!LocUtils.isShallowLoc(curLoc)) { + //娣卞簱浣� + String shallowLoc = LocUtils.getShallowLoc(curLoc); + if (StringUtils.isBlank(shallowLoc)) { + throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛橈紒"); + } + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); + if (Objects.isNull(loc)) { + throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄笉瀛樺湪锛侊紒"); + } + if (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type) || loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type)) { + Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>() + .eq(Task::getOrgLoc, loc.getCode()) + .or() + .eq(Task::getTargLoc, loc.getCode())); + if (Objects.isNull(serviceOne)) { + task.setSort(Constants.TASK_SORT_MAX_VALUE); + } else { + int i = serviceOne.getSort() - 1; + task.setSort(i); + } + } +// else if (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { +// //濡傛灉涓哄湪搴撶姸鎬侊紝鐢熸垚绉诲簱浠诲姟 +// LocToTaskParams params = new LocToTaskParams(); +// params.setOrgLoc(curLoc); +// //鐢熸垚绉绘繁搴撲綅浠诲姟 +// Task moveTask = locItemService.genMoveTask(params, loginUserId); +// moveTask.setTaskType(task.getSort() + 1); +// +// return moveTask; +// } + } else { + //娴呭簱浣嶏紝鍒ゆ柇娣卞搴旀繁搴撲綅鏄惁涓虹┖锛屽鏋滀负绌虹敓鎴愪竴涓Щ搴撲换鍔★紝灏嗘墭鐩橀�佸叆娣卞簱浣� + String deepLoc = LocUtils.getDeepLoc(curLoc); + if (StringUtils.isBlank(deepLoc)) { + throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛橈紒"); + } + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, deepLoc)); + if (Objects.isNull(loc)) { + throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄笉瀛樺湪锛侊紒"); + } + //鍒ゆ柇娣卞簱浣嶆槸鍚︿负绌� + if (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { + LocToTaskParams params = new LocToTaskParams(); + params.setOrgLoc(curLoc).setTarLoc(deepLoc); + //鐢熸垚绉绘繁搴撲綅浠诲姟 + locItemService.genMoveTask(params, loginUserId); + } + } + + return task; + } + + @Transactional(rollbackFor = Exception.class) + public void moveInStock(Task task, Long loginUserId) { + if (Objects.isNull(task)) { return; } - List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList()); - List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, list)); - if (taskItems.isEmpty()) { - throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�"); + + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())); + if (Objects.isNull(loc)) { + throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦紒"); } - List<String> locCodes = tasks.stream().map(Task::getTargLoc).collect(Collectors.toList()); - Map<Long, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getTaskId)); - /**瀵逛换鍔℃槑缁嗘寜浠诲姟涓诲崟杩涜鍒嗙粍*/ - listMap.keySet().forEach(key -> { - List<TaskItem> items = listMap.get(key); + + Loc orgLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc())); + if (Objects.isNull(orgLoc)) { + throw new CoolException("婧愬簱浣嶄笉瀛樺湪锛�"); + } + + if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) { + throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒"); + } + + if (!orgLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type)) { + throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬R.鍑哄簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒"); + } + + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + + if (!taskItems.isEmpty()) { + //绉诲簱鏈夊彲鑳芥槸绌烘澘 try { //鏇存柊搴撲綅鏄庣粏 - saveLocItem(items, key); + saveLocItem(taskItems, task.getId(), loginUserId); } catch (Exception e) { throw new CoolException("搴撲綅鏄庣粏鏇存柊澶辫触锛侊紒"); } - }); - /**瀵逛换鍔℃槑缁嗘寜璁㈠崟杩涜鍒嗙粍*/ - Map<Long, List<TaskItem>> orderMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getSource)); - orderMap.keySet().forEach(key -> { - WaitPakinItem pakinItem = waitPakinItemService.getById(key); -// AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>() -// .eq(AsnOrder::getId, key) -// .select(AsnOrder::getId, AsnOrder::getPoCode, AsnOrder::getCode)); - if (null == pakinItem) { - throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨暟鎹笉瀛樺湪锛岃鑱旂郴绠$悊鍛橈紒锛�"); + if (!locItemService.remove(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, task.getOrgLoc()))) { + throw new CoolException("婧愬簱浣嶆槑缁嗗垹闄ゅけ璐ワ紒"); } - List<TaskItem> items = orderMap.get(key); - try { - //淇濆瓨搴撳瓨鏄庣粏 - saveStockItems(items, pakinItem); - //绉诲嚭鏀惰揣鍖哄簱瀛橈紝 淇敼缁勬墭鐘舵�� - removeReceiptStock(pakinItem); - } catch (Exception e) { - throw new CoolException("搴撳瓨绠$悊淇濆瓨鏇存柊澶辫触锛侊紒"); - } - }); + } + /**淇敼搴撲綅鐘舵�佷负F.鍦ㄥ簱*/ - if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) { + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .set(Loc::getBarcode, task.getBarcode()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type) + .set(Loc::getUpdateBy, loginUserId) + .set(Loc::getUpdateTime, new Date()) + .eq(Loc::getCode, task.getTargLoc()))) { throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); } - if (!this.update(new LambdaUpdateWrapper<Task>().in(Task::getId, list).set(Task::getTaskStatus, TaskStsType.UPDATED_IN.id))) { + + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .set(Loc::getBarcode, null) + .set(Loc::getUpdateBy, loginUserId) + .set(Loc::getUpdateTime, new Date()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getCode, task.getOrgLoc()))) { + throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + + if (!this.update(new LambdaUpdateWrapper<Task>().eq(Task::getId, task.getId()) + .set(Task::getUpdateBy, loginUserId) + .set(Task::getUpdateTime, new Date()) + .set(Task::getTaskStatus, TaskStsType.UPDATED_IN.id))) { throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + + } + + + /** + * 瀹屾垚浠诲姟 鏇存柊搴撲綅鏄庣粏淇℃伅锛屽皢鍗曟嵁搴撳瓨鏇存柊鍒板崟鎹簱瀛樿〃 + * + * @param tasks + * @throws Exception + */ + @Synchronized + @Override + @Transactional(rollbackFor = Exception.class) + public void completeTask(List<Task> tasks) throws Exception { + Long loginUserId = SystemAuthUtils.getLoginUserId(); + for (Task task : tasks) { + //鍑哄簱浠诲姟 + if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) { + //鍏ㄦ墭鍑哄簱 + complateOutStock(task, loginUserId); + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) { + //鎷f枡鍑哄簱 + complateOutStock(task, loginUserId); + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) { + //鐩樼偣鍑哄簱 + complateOutStock(task, loginUserId); + } + } + } + + /** + * 鎷f枡鍐嶅叆搴� + * + * @param task + * @param loginUserId + */ + @Transactional(rollbackFor = Exception.class) + public void pickComplateInStock(Task task, Long loginUserId) throws Exception { + if (Objects.isNull(task)) { + return; + } + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())); + if (Objects.isNull(loc)) { + throw new CoolException("搴撳瓨涓嶅瓨鍦紒锛�"); + } + if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) { + throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒"); + } + + loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type) + .setBarcode(task.getBarcode()) + .setUpdateBy(loginUserId).setUpdateTime(new Date()); + + if (!locService.updateById(loc)) { + throw new CoolException("搴撲綅淇℃伅鏇存柊澶辫触锛侊紒"); + } + + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + if (taskItems.isEmpty()) { + throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�"); + } + List<LocItem> items = new ArrayList<>(); + for (TaskItem taskItem : taskItems) { + LocItem locItem = new LocItem(); + LocItemWorking locWorking = locItemWorkingService.getOne(new LambdaQueryWrapper<LocItemWorking>() + .eq(LocItemWorking::getTaskId, taskItem.getTaskId()) + .eq(StringUtils.isNotBlank(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch()) + .eq(StringUtils.isNotBlank(taskItem.getFieldsIndex()), LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex()) + .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId())); + if (Objects.isNull(locWorking)) { + throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒"); + } + if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { + locWorking.setAnfme(taskItem.getAnfme()); + } + BeanUtils.copyProperties(locWorking, locItem); + locItem.setWorkQty(0.0).setLocCode(loc.getCode()).setLocId(loc.getId()).setId(null).setUpdateBy(loginUserId).setUpdateTime(new Date()); + items.add(locItem); + } + + if (!locItemService.saveBatch(items)) { + throw new CoolException("浣滀笟搴撳瓨鍥炲啓澶辫触锛侊紒"); + } + + TaskItem taskItem = taskItems.stream().findFirst().get(); + //淇濆瓨鍏ュ嚭搴撴祦姘� + saveStockItems(taskItems, task, null, null, taskItem.getWkType(), taskItem.getOrderType(), loginUserId); + + if (!locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()))) { + throw new CoolException("浣滀笟涓簱瀛樺垹闄ゅけ璐ワ紒锛�"); + } + + task.setTaskStatus(TaskStsType.UPDATED_IN.id).setUpdateTime(new Date()).setUpdateBy(loginUserId); + if (!taskService.updateById(task)) { + throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + + } + + /** + * 浠诲姟鍙栨秷 + * + * @param ids + * @param loginUserId + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R removeTask(Long[] ids, Long loginUserId) { + List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); + List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type,TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, + TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_EMPITY_IN.type, TaskType.TASK_TYPE_LOC_MOVE.type, + TaskType.TASK_TYPE_EMPITY_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type); + List<Task> tasks = this.list(new LambdaQueryWrapper<Task>() + .in(Task::getTaskType, list) + .in(Task::getId, ids).in(Task::getTaskStatus, longs)); + if (tasks.isEmpty()) { + throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙彇娑堬紒锛�"); + } + for (Task task : tasks) { + //鍙栨秷绉诲簱浠诲姟 + if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type) && task.getTaskStatus().equals(TaskStsType.GENERATE_OUT.id)) { + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .eq(Loc::getCode, task.getOrgLoc()) + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type))) { + throw new CoolException("婧愬簱浣嶇姸鎬佷慨鏀瑰け璐ワ紒锛�"); + } + if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()).set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type))) { + throw new CoolException("绉诲簱鐩爣搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + + Task outTask = taskService.getById(task.getParentId()); + if (!Objects.isNull(outTask)) { + LocToTaskParams params = new LocToTaskParams(); + params.setOrgLoc(task.getOrgLoc()).setSiteNo(task.getOrgSite()); + //鐢熸垚绉绘繁搴撲綅浠诲姟 + Task moveTask = locItemService.genMoveTask(params, loginUserId); + moveTask.setSort(task.getSort() + 1).setParentId(outTask.getId()); + if (!this.updateById(moveTask)) { + throw new CoolException("浠诲姟淇℃伅淇敼澶辫触锛侊紒"); + } + outTask.setParentId(moveTask.getId()); + if (!this.updateById(outTask)) { + throw new CoolException("浠诲姟淇℃伅淇敼澶辫触锛侊紒"); + + } + + } else { + throw new CoolException("鏃犳硶鐢熸垚鏂扮殑绉诲簱浠诲姟锛屽彇娑堝け璐ワ紒锛�"); + } + } + + if (!Objects.isNull(task.getWarehType()) && task.getWarehType().equals(WarehType.WAREHOUSE_TYPE_AGV.val)) { + BasStation basStation = null; + if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) { + basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>() + .eq(BasStation::getStationName, task.getOrgSite()) + .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_R.type) + ); + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type)) { + basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>() + .eq(BasStation::getStationName, task.getTargLoc()) + .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_R.type)); + } + if (null == basStation) { + throw new CoolException("绔欑偣鐘舵�侀敊璇紒锛�"); + } + basStation.setUseStatus(LocStsType.LOC_STS_TYPE_F.type); + if (!basStationService.updateById(basStation)) { + throw new CoolException("鏇存柊绔欑偣鐘舵�佸け璐ワ紒锛�"); + } + } + + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + if (!taskItems.isEmpty()) { + for (TaskItem item : taskItems) { + if (item.getOrderType().equals(OrderType.ORDER_OUT.type)) { + //鍑哄簱 + if (item.getWkType().equals(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type))) { + //搴撳瓨鍑哄簱 + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, item.getSourceId())); + if (Objects.isNull(loc)) { + throw new CoolException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉瀛樺湪锛侊紒"); + } + + loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type).setBarcode(task.getBarcode()).setUpdateBy(loginUserId).setUpdateTime(new Date()); + if (!locService.updateById(loc)) { + throw new CoolException("搴撲綅淇℃伅淇敼澶辫触锛侊紒"); + } + } + } else { + //鍏ュ簱 + //鎭㈠缁勬墭鐘舵�� + WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() + .eq(WaitPakin::getBarcode, task.getBarcode())); + if (null != waitPakin) { + waitPakin.setIoStatus(PakinIOStatus.PAKIN_IO_STATUS_DONE.val); + if (!waitPakinService.updateById(waitPakin)) { + throw new CoolException("鏇存柊缁勬墭鐘舵�佸け璐ワ紒锛�"); + } + } + + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTaskType() < TaskStsType.UPDATED_IN.id ? task.getTargLoc() : task.getOrgLoc())); + if (null != loc && (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type) || loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type))) { + loc.setUseStatus(LocStsType.LOC_STS_TYPE_O.type); + if (!locService.updateById(loc)) { + throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紒锛�"); + } + } + } + } + if (!taskItemService.remove(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()))) { + throw new CoolException("浠诲姟鏄庣粏鍒犻櫎澶辫触锛侊紒"); + } + } + } + if (!this.removeByIds(Arrays.asList(ids))) { + throw new CoolException("Delete Fail"); + } + + return R.ok("鍙栨秷瀹屾垚"); + } + + /** + * 鎷f枡鍑哄簱 + * + * @param id + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Task pickOrCheckTask(Long id, String oType) throws Exception { + Task task = this.getById(id); + if (Objects.isNull(task)) { + throw new CoolException("褰撳墠浠诲姟涓嶅瓨鍦紒锛�"); + } + Integer type; + if (oType.equals(Constants.TASK_TYPE_OUT_CHECK)) { + //鐩樼偣鍏ュ簱 + type = TaskType.TASK_TYPE_CHECK_IN.type; + if (!task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) { + throw new CoolException("闈炵洏鐐瑰嚭搴� 锛屼笉鍙墽琛屾鎿嶄綔锛侊紒"); + } + } else { + //鎷f枡鍏ュ簱 + type = TaskType.TASK_TYPE_PICK_IN.type; + if (!task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) { + throw new CoolException("闈炴嫞鏂欏嚭搴� 锛屼笉鍙墽琛屾鎿嶄綔锛侊紒"); + } + } + + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, task.getOrgLoc())); + if (Objects.isNull(loc)) { + throw new CoolException("娌℃湁绌哄簱浣嶏紒锛�"); + } + + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, task); + //鏇存柊浠诲姟涓诲崟 + task.setTaskCode(ruleCode) + .setTaskType(type) + .setBarcode(task.getBarcode()) + .setTaskStatus(TaskStsType.GENERATE_IN.id); + + TaskInParam param = new TaskInParam(); + param.setSourceStaNo(Integer.parseInt(task.getTargSite())) + .setIoType(type) + .setLocType1(Integer.parseInt(loc.getType())); + //鑾峰彇鏂板簱浣� + InTaskMsgDto locInfo = wcsService.getLocNo(param); + + if (Objects.isNull(locInfo)) { + throw new CoolException("鑾峰彇搴撲綅澶辫触锛侊紒"); + } + task.setTargLoc(locInfo.getLocNo()); + + if (!this.updateById(task)) { + throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐ワ紒锛�"); + } + + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + for (int i = 0; i < taskItems.size(); i++) { + TaskItem taskItem = taskItems.get(i); + LocItemWorking locWorking = locItemWorkingService.getOne(new LambdaQueryWrapper<LocItemWorking>() + .eq(LocItemWorking::getTaskId, taskItem.getTaskId()) + .eq(StringUtils.isNotBlank(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch()) + .eq(StringUtils.isNotBlank(taskItem.getFieldsIndex()), LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex()) + .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId())); + if (Objects.isNull(locWorking)) { + throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒"); + } + if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { + locWorking.setWorkQty(0.0); + locWorking.setAnfme(taskItem.getAnfme()); + } else { + if (locWorking.getAnfme().compareTo(taskItem.getAnfme()) >= 0) { + locWorking.setWorkQty(0.0); + locWorking.setAnfme(Math.round((locWorking.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0); + } else { + continue; + } + } + if (!locItemWorkingService.updateById(locWorking)) { + throw new CoolException("涓存椂搴撳瓨鏇存柊澶辫触锛侊紒"); + } + taskItems.get(i).setAnfme(locWorking.getAnfme()); + } + + if (!taskItemService.updateBatchById(taskItems)) { + throw new CoolException("浠诲姟鏄庣粏鏇存柊澶辫触锛侊紒"); + } + + Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())); + if (Objects.isNull(one)) { + throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦紒锛�"); + } + one.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); + + if (!locService.updateById(one)) { + throw new CoolException("搴撲綅棰勭害鍏ュ簱澶辫触锛侊紒"); + } + return task; + } + + /** + * @author Ryan + * @date 2025/5/20 + * @description: 瀹屾垚鍑哄簱浠诲姟锛屾洿鏂板嚭搴撳簱瀛樹俊鎭� + * @version 1.0 + */ + @Synchronized + @Transactional(rollbackFor = Exception.class) + public void complateOutStock(Task task, Long loginUserId) throws Exception { + if (Objects.isNull(task)) { + throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc())); + if (Objects.isNull(loc)) { + throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�"); + } + if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type)) { + throw new CoolException("搴撲綅鐘舵�佷笉澶勭悊浜嶳.鍑哄簱棰勭害锛侊紒"); + } + + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + if (taskItems.isEmpty()) { + throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�"); + } + + List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId())); + if (locItems.isEmpty()) { + throw new CoolException("搴撲綅鏄庣粏涓嶅瓨鍦紒锛�"); + } + + List<LocItemWorking> workings = new ArrayList<>(); + for (LocItem item : locItems) { + LocItemWorking working = new LocItemWorking(); + BeanUtils.copyProperties(item, working); + working.setId(null) + .setTaskId(task.getId()) + .setLocItemId(item.getId()) + .setUpdateBy(loginUserId) + .setUpdateTime(new Date()); + workings.add(working); + } + + if (!locItemWorkingService.saveBatch(workings)) { + throw new CoolException("涓存椂搴撳瓨淇濆瓨澶辫触锛侊紒"); + } + + try { + //鏇存柊搴撲綅鏄庣粏 + subtractLocItem(loc); + } catch (Exception e) { + logger.error("<UNK>", e); + throw new CoolException(e.getMessage()); + } + + //娣诲姞鍑哄叆搴撹褰曚俊鎭� + Map<Short, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getWkType)); + /***鑾峰彇搴撳瓨鍑哄簱鍊硷紝濡傛灉涓虹┖琛ㄧず姝e父鍗曟嵁鍑哄簱锛岄潪绌鸿〃鏄庢槸搴撳瓨鍑哄簱 + * 1. 搴撳瓨鍑哄簱娌℃湁鍗曟嵁淇℃伅锛屽崟鎹俊鎭粯璁や负绌� + * 2. 鍗曟嵁搴撳瓨闇�閫氳繃娉㈡鏌ヨ鍘熷鍗曟嵁淇℃伅锛屽皢鍗曟嵁淇℃伅濉叆stock涓� + * */ + List<TaskItem> list = listMap.get(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)); + if (Objects.isNull(list) || list.isEmpty()) { + Map<Long, List<TaskItem>> maps = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getSource)); + maps.keySet().forEach(key -> { + WaveItem waveItem = waveItemService.getById(key); + if (Objects.isNull(waveItem)) { + throw new CoolException("娉㈡鏄庣粏涓嶅瓨鍦紒锛�"); + } + try { + saveOutStockItem(maps.get(key), waveItem, loginUserId); + } catch (Exception e) { + throw new CoolException(e.getMessage()); + } + }); + } else { + try { + saveOutStockItem(taskItems, null, loginUserId); + } catch (Exception e) { + throw new CoolException(e.getMessage()); + } + } + + /**淇敼涓哄簱浣嶇姸鎬佷负O.绌哄簱*/ + if (!locService.update(new LambdaUpdateWrapper<Loc>() + .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .set(Loc::getBarcode, null) + .set(Loc::getUpdateBy, loginUserId) + .set(Loc::getUpdateTime, new Date()) + .eq(Loc::getId, loc.getId()))) { + throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + + if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) { + if (!this.update(new LambdaUpdateWrapper<Task>() + .eq(Task::getId, task.getId()) + .set(Task::getUpdateBy, loginUserId) + .set(Task::getUpdateTime, new Date()) + .set(Task::getTaskStatus, TaskStsType.WAVE_SEED.id))) { + throw new CoolException("搴撳瓨鐘舵�佹洿鏂板け璐ワ紒锛�"); + } + } else { + if (!this.update(new LambdaUpdateWrapper<Task>() + .eq(Task::getId, task.getId()) + .set(Task::getUpdateBy, loginUserId) + .set(Task::getUpdateTime, new Date()) + .set(Task::getTaskStatus, TaskStsType.UPDATED_OUT.id))) { + throw new CoolException("搴撳瓨鐘舵�佹洿鏂板け璐ワ紒锛�"); + } + //鍏ㄦ澘鍑哄簱锛屽垹闄や复鏃跺簱瀛� + if (!locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()))) { + throw new CoolException("涓存椂搴撳瓨娓呴櫎澶辫触锛侊紒"); + } + } + + } + + /** + * @author Ryan + * @date 2025/5/20 + * @description: 鍑哄簱淇℃伅淇濆瓨鑷冲簱瀛樻槑缁嗚〃 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void saveOutStockItem(List<TaskItem> taskItems, WaveItem waveItem, Long loginUserId) throws Exception { + Stock stock = new Stock(); + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); + if (StringUtils.isBlank(ruleCode)) { + throw new CoolException("褰撳墠涓氬姟锛�" + SerialRuleCode.SYS_STOCK_CODE + "锛岀紪鐮佽鍒欎笉瀛樺湪锛侊紒"); + } + Double sum = taskItems.stream().mapToDouble(TaskItem::getAnfme).sum(); + stock.setCode(ruleCode) + .setUpdateBy(loginUserId) + .setUpdateTime(new Date()) + .setAnfme(sum); + if (Objects.isNull(waveItem)) { + stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type)) + .setMemo("鍑哄簱鍗曞嚭搴擄紝鏃犲崟鎹俊鎭紒锛�") + .setType(OrderType.ORDER_OUT.type); + } else { + //TODO 鐢熸垚娉㈡鏃堕渶瑕佸皢娉㈡鍙峰啓鍏ュ崟鎹紝閫氳繃鐗╂枡锛屾壒娆★紝鍔ㄦ�佸瓧娈电瓑鍞竴鍊煎弽鏌ュ崟鎹俊鎭� + stock.setSourceId(waveItem.getId()).setType(OrderType.ORDER_OUT.type); + } + if (!stockService.save(stock)) { + throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒"); + } + List<StockItem> stockItems = new ArrayList<>(); + for (TaskItem item : taskItems) { + /**閫氳繃浠诲姟鏄庣粏涓殑taskId鏌ヨ,鑾峰彇TASK鐨勭洰鏍囧簱浣嶄俊鎭�*/ + StockItem stockItem = new StockItem(); + BeanUtils.copyProperties(item, stockItem); + stockItem.setSourceItemId(item.getOrderItemId()) + .setUpdateBy(loginUserId) + .setUpdateTime(new Date()) + .setStockCode(stock.getCode()) + .setId(null) + .setStockId(stock.getId()); + stockItems.add(stockItem); + } + if (!stockItemService.saveBatch(stockItems)) { + throw new CoolException("搴撳瓨淇敼鏋跺け璐ワ紒锛�"); + } + + } + + /** + * @author Ryan + * @date 2025/5/20 + * @description: 鎵e噺搴撳瓨鏄庣粏 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void subtractLocItem(Loc loc) throws Exception { + if (!locItemService.remove(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()))) { + throw new CoolException("搴撳瓨鏄庣粏鍒犻櫎澶辫触锛侊紒"); } } /** * @author Ryan - * @description 绉婚櫎鏀惰揣鍖哄簱瀛� + * @date 2025/5/20 + * @description: 瀹屾垚鍏ュ簱浠诲姟 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void complateInstock(Task task, Long loginUserId) { + if (Objects.isNull(task)) { + return; + } + + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())); + if (Objects.isNull(loc)) { + throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦紒"); + } + + if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) { + throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒"); + } + + List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); + if (taskItems.isEmpty()) { + throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�"); + } + try { + //鏇存柊搴撲綅鏄庣粏 + saveLocItem(taskItems, task.getId(), loginUserId); + } catch (Exception e) { + throw new CoolException("搴撲綅鏄庣粏鏇存柊澶辫触锛侊紒"); + } + + /**瀵逛换鍔℃槑缁嗘寜缁勬嫋鏄庣粏杩涜鍒嗙粍*/ + Map<Long, List<TaskItem>> orderMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getSource)); + orderMap.keySet().forEach(key -> { + WaitPakinItem pakinItem = waitPakinItemService.getById(key); + if (Objects.isNull(pakinItem)) { + throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨暟鎹笉瀛樺湪锛岃鑱旂郴绠$悊鍛橈紒锛�"); + } + List<TaskItem> items = orderMap.get(key); + try { + //淇濆瓨搴撳瓨鏄庣粏 + saveStockItems(items, task, pakinItem.getId(), pakinItem.getAsnCode(), pakinItem.getWkType(), pakinItem.getType(), loginUserId); + //绉诲嚭鏀惰揣鍖哄簱瀛橈紝 淇敼缁勬墭鐘舵�� + removeReceiptStock(pakinItem, loginUserId); + } catch (Exception e) { + logger.error("<UNK>", e); + throw new CoolException(e.getMessage()); + } + }); + /**淇敼搴撲綅鐘舵�佷负F.鍦ㄥ簱*/ + if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).eq(Loc::getCode, task.getTargLoc()))) { + throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + if (!this.update(new LambdaUpdateWrapper<Task>().eq(Task::getId, task.getId()).set(Task::getTaskStatus, TaskStsType.UPDATED_IN.id))) { + throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + } + + /** * @param + * @param loginUserId * @return + * @author Ryan + * @description 绉婚櫎鏀惰揣鍖哄簱瀛� * @time 2025/4/30 16:32 */ @Transactional(rollbackFor = Exception.class) - public void removeReceiptStock(WaitPakinItem pakinItem) { + public void removeReceiptStock(WaitPakinItem pakinItem, Long loginUserId) { WarehouseAreasItem itemServiceOne = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>() - .eq(WarehouseAreasItem::getTrackCode, pakinItem.getTrackCode()) - .eq(WarehouseAreasItem::getSplrBatch, pakinItem.getBatch())); + .eq(WarehouseAreasItem::getId, pakinItem.getSource())); if (Objects.isNull(itemServiceOne)) { - throw new CoolException("鏁版嵁閿欒锛岃鏌ョ湅璇疯揣鍖哄簱瀛樻槸鍚﹀瓨鍦紒锛�"); + throw new CoolException("鏁版嵁閿欒锛氳鏌ョ湅璇疯揣鍖哄簱瀛樻槸鍚﹀瓨鍦紒锛�"); } - Double workQty = itemServiceOne.getWorkQty() - pakinItem.getAnfme(); - Double qty = itemServiceOne.getQty() + pakinItem.getAnfme(); + Double workQty = Math.round((itemServiceOne.getWorkQty() - pakinItem.getAnfme()) * 10000) / 10000.0; + Double qty = Math.round((itemServiceOne.getQty() + pakinItem.getAnfme()) * 10000) / 10000.0; itemServiceOne.setWorkQty(workQty).setQty(qty); if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>() .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_DONE.val) + .set(WaitPakin::getUpdateBy, loginUserId) .eq(WaitPakin::getId, pakinItem.getPakinId()))) { throw new CoolException("缁勬嫋鐘舵�佷慨鏀瑰け璐ワ紒锛�"); } @@ -279,6 +1193,7 @@ throw new CoolException("鏀惰揣鍖虹墿鏂欏垹闄ゅけ璐ワ紒锛�"); } } else { + itemServiceOne.setUpdateBy(loginUserId).setUpdateTime(null); if (!warehouseAreasItemService.updateById(itemServiceOne)) { throw new CoolException("鏀惰揣鍖哄簱瀹屾垚鏁伴噺淇敼澶辫触锛侊紒"); } @@ -286,18 +1201,20 @@ } /** + * @param + * @param loginUserId + * @return * @author Ryan * @description 鏇存柊搴撲綅鏄庣粏 - * @param - * @return * @time 2025/4/15 15:28 */ @Transactional(rollbackFor = Exception.class) - public void saveLocItem(List<TaskItem> items, Long taskId) throws Exception { + public void saveLocItem(List<TaskItem> items, Long taskId, Long loginUserId) throws Exception { Task task = this.getById(taskId); if (Objects.isNull(task)) { throw new CoolException("浠诲姟涓嶅瓨鍦�!!"); } + List<LocItem> locItems = new ArrayList<>(); items.forEach(taskItem -> { Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()), false); @@ -305,6 +1222,7 @@ BeanUtils.copyProperties(taskItem, item); item.setLocCode(loc.getCode()).setId(null) .setLocId(loc.getId()) + .setUpdateBy(loginUserId) .setWkType(taskItem.getWkType()) .setType(taskItem.getOrderType()); locItems.add(item); @@ -315,30 +1233,38 @@ } /** - * 鐢熸垚搴撳瓨鏄庣粏 + * 鐢熸垚鍏ュ簱搴撳瓨鏄庣粏 + * * @param items + * @param loginUserId * @return */ @Transactional(rollbackFor = Exception.class) - public void saveStockItems(List<TaskItem> items, WaitPakinItem order) throws Exception { + public void saveStockItems(List<TaskItem> items, Task task, Long id, String code, Short wkType, String type, Long loginUserId) throws + Exception { Stock stock = new Stock(); -// if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) { -// Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode())); -// if (!Objects.isNull(purchase)) { -// stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId()); -// } -// } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("褰撳墠涓氬姟锛�" + SerialRuleCode.SYS_STOCK_CODE + "锛岀紪鐮佽鍒欎笉瀛樺湪锛侊紒"); } double sum = items.stream().mapToDouble(TaskItem::getAnfme).sum(); - stock.setSourceId(order.getId()) + stock.setSourceId(id) .setCode(ruleCode) - .setSourceCode(order.getAsnCode()) + .setSourceCode(code) .setAnfme(sum) - .setWkType(order.getWkType()) - .setType(order.getType()); + .setWkType(wkType) + .setBarcode(task.getBarcode()) + .setUpdateBy(loginUserId) + .setType(type); + if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) || + task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) || + task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type) || + task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) || + task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { + stock.setLocCode(task.getTargLoc()); + } else { + stock.setLocCode(task.getOrgLoc()); + } if (!stockService.save(stock)) { throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒"); } @@ -346,15 +1272,13 @@ List<StockItem> stockItems = new ArrayList<>(); for (TaskItem item : items) { /**閫氳繃浠诲姟鏄庣粏涓殑taskId鏌ヨ,鑾峰彇TASK鐨勭洰鏍囧簱浣嶄俊鎭�*/ -// AsnOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getId, item.getOrderItemId())); -// if (Objects.isNull(orderItem)) { -// throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�"); -// } StockItem stockItem = new StockItem(); BeanUtils.copyProperties(item, stockItem); stockItem.setSourceItemId(item.getOrderItemId()) .setStockCode(stock.getCode()) + .setBarcode(task.getBarcode()) .setSourceItemId(item.getOrderItemId()) + .setUpdateBy(loginUserId) .setId(null) .setStockId(stock.getId()); stockItems.add(stockItem); -- Gitblit v1.9.1