|  |  |  | 
|---|
|  |  |  | package com.vincent.rsf.server.manager.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.JSONArray; | 
|---|
|  |  |  | import com.alibaba.fastjson.JSONObject; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 
|---|
|  |  |  | import com.vincent.rsf.framework.common.R; | 
|---|
|  |  |  | import com.vincent.rsf.framework.exception.CoolException; | 
|---|
|  |  |  | import com.vincent.rsf.server.api.entity.enums.TaskStsType; | 
|---|
|  |  |  | import com.vincent.rsf.server.api.entity.enums.TaskType; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.entity.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.AsnExceStatus; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.WaveExceStatus; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.mapper.WaveMapper; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.service.*; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.utils.OptimalAlgorithmUtil; | 
|---|
|  |  |  | import com.vincent.rsf.server.system.constant.SerialRuleCode; | 
|---|
|  |  |  | import com.vincent.rsf.server.system.utils.SerialRuleUtils; | 
|---|
|  |  |  | import lombok.Synchronized; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.apache.commons.lang3.StringUtils; | 
|---|
|  |  |  | import org.springframework.beans.BeanUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | if (Objects.isNull(waves)) { | 
|---|
|  |  |  | throw new CoolException("波次数据不存在!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //        List<Long> list = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList()); | 
|---|
|  |  |  | List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().eq(WaveItem::getWaveId, waves.getId())); | 
|---|
|  |  |  | if (waveItems.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("波次明细不存在!!"); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 3. 修改主单、波次执行数量 | 
|---|
|  |  |  | // 4. 判断全仓出库或拣料出库 | 
|---|
|  |  |  | List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList()); | 
|---|
|  |  |  | //        List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds)); | 
|---|
|  |  |  | /**修改出库单状态*/ | 
|---|
|  |  |  | if (!asnOrderService.update(new LambdaUpdateWrapper<AsnOrder>() | 
|---|
|  |  |  | .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val) | 
|---|
|  |  |  | .in(AsnOrder::getId, orderIds))) { | 
|---|
|  |  |  | throw new CoolException("出库单据状态修改失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //        /**修改波次单据执行状态*/ | 
|---|
|  |  |  | //        if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).eq(Wave::getId, waves.getId()))) { | 
|---|
|  |  |  | //            throw new CoolException("波次状态修改失败!!"); | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | return R.ok(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * @description 生成出库任务 | 
|---|
|  |  |  | * @time 2025/4/28 14:01 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Synchronized | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | private synchronized void generateOutTask(List<WaveItem> itemParams, Long loginUserId, Wave wave) throws Exception { | 
|---|
|  |  |  | public void generateOutTask(List<WaveItem> itemParams, Long loginUserId, Wave wave) throws Exception { | 
|---|
|  |  |  | List<LocItem> locItemList = new ArrayList<>(); | 
|---|
|  |  |  | for (WaveItem param : itemParams) { | 
|---|
|  |  |  | String locs = param.getStockLocs(); | 
|---|
|  |  |  | 
|---|
|  |  |  | /***将有货有的明细信息存放到库位信息中*/ | 
|---|
|  |  |  | for (int i = 0; i < items.size(); i++) { | 
|---|
|  |  |  | items.get(i) | 
|---|
|  |  |  | .setWaveId(param.getWaveId()) | 
|---|
|  |  |  | .setWaveCode(param.getWaveCode()) | 
|---|
|  |  |  | .setWaveItemId(param.getId()); | 
|---|
|  |  |  | .setSourceId(param.getWaveId()) | 
|---|
|  |  |  | .setSourceCode(param.getWaveCode()) | 
|---|
|  |  |  | .setSource(param.getId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | locItemList.addAll(items); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | listMap.keySet().forEach(key -> { | 
|---|
|  |  |  | List<LocItem> locItems = listMap.get(key); | 
|---|
|  |  |  | LocItem item1 = locItems.stream().findFirst().get(); | 
|---|
|  |  |  | WaveItem waveItem = waveItemService.getById(item1.getWaveItemId()); | 
|---|
|  |  |  | WaveItem waveItem = waveItemService.getById(item1.getSource()); | 
|---|
|  |  |  | if (null == waveItem || Objects.isNull(waveItem)) { | 
|---|
|  |  |  | throw new CoolException("数据错误:波次明细不存在!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | if (Objects.isNull(loc)) { | 
|---|
|  |  |  | throw new CoolException("库位不存在!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getSourceId, wave.getId())); | 
|---|
|  |  |  | if (items.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("波次任务已生成,不能重复生成!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | task.setTaskCode(ruleCode) | 
|---|
|  |  |  | .setTaskType(TaskType.TASK_TYPE_OUT.type) | 
|---|
|  |  |  | .setTaskStatus(TaskStsType.GENERATE_OUT.id) | 
|---|
|  |  |  | .setResource(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val) | 
|---|
|  |  |  | .setBarcode(loc.getBarcode()) | 
|---|
|  |  |  | .setOrgLoc(loc.getCode()) | 
|---|
|  |  |  | .setCreateBy(loginUserId) | 
|---|
|  |  |  | 
|---|
|  |  |  | TaskItem taskItem = new TaskItem(); | 
|---|
|  |  |  | BeanUtils.copyProperties(item, taskItem); | 
|---|
|  |  |  | taskItem.setTaskId(task.getId()) | 
|---|
|  |  |  | .setAnfme(waveItem.getAnfme()) | 
|---|
|  |  |  | .setId(null) | 
|---|
|  |  |  | .setSource(item.getWaveItemId()); | 
|---|
|  |  |  | .setSourceCode(wave.getCode()) | 
|---|
|  |  |  | .setSourceId(wave.getId()) | 
|---|
|  |  |  | .setSource(item.getSource()); | 
|---|
|  |  |  | taskItems.add(taskItem); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!taskItemService.saveBatch(taskItems)) { | 
|---|
|  |  |  | 
|---|
|  |  |  | * @description 根据物料编码,批次,动态字段 查询符合的库位,再根据库位中物料的数量选择最适合的库位 | 
|---|
|  |  |  | * @time 2025/4/27 09:26 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private synchronized List<WaveItem> getLocs(List<WaveItem> waveItems) throws Exception { | 
|---|
|  |  |  | @Synchronized | 
|---|
|  |  |  | private  List<WaveItem> getLocs(List<WaveItem> waveItems) throws Exception { | 
|---|
|  |  |  | //TODO  根据物料编码,批次,动态字段 查询符合的库位,再根据库位中物料的数量选择最适合的库位 | 
|---|
|  |  |  | waveItems.forEach(waveItem -> { | 
|---|
|  |  |  | List<LocItem> locItems = locItemService.list(new QueryWrapper<LocItem>() | 
|---|