skyouc
1 天以前 42f887929f3003026f33ba6822703b1a89a13489
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java
@@ -9,11 +9,10 @@
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderItemParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderParams;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.entity.DeviceSite;
import com.vincent.rsf.server.manager.entity.WkOrder;
import com.vincent.rsf.server.manager.entity.WkOrderItem;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.manager.mapper.CheckOrderMapper;
@@ -41,6 +40,16 @@
    private AsnOrderItemService asnOrderItemService;
    @Autowired
    private DeviceSiteService deviceSiteService;
    @Autowired
    private LocItemService locItemService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private LocServiceImpl locService;
    @Autowired
    private TaskItemServiceImpl taskItemService;
    @Autowired
    private CheckOrderService checkOrderService;
    /**
     * @author Ryan
@@ -216,7 +225,155 @@
     */
    @Override
    public R genCheckPreview(OrderOutTaskParam param) {
        return null;
        List<WkOrderItem> orderItems = checkOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, param.getOrderId()));
        if (orderItems.isEmpty()) {
            throw new CoolException("数据错误:盘点单明细不存在!!");
        }
        return R.ok().add(orderItems);
    }
    /**
     * @author Ryan
     * @date 2025/7/16
     * @description: 根据物料码获取所有在库明细
     * @version 1.0
     */
    @Override
    public R getAllLocByMatnr(List<String> matnrs) {
        List<LocItem> locItems = locItemService.listByMatnr(matnrs);
        if (!locItems.isEmpty()) {
            List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_CHECK_IN.type);
            DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                    .in(DeviceSite::getType, list)
                    .groupBy(DeviceSite::getSite)
                    .last("limit 1"));
            if (Objects.isNull(deviceSite)) {
                throw new CoolException("库口不为空!!");
            }
            locItems.forEach(locItem -> {
                locItem.setSiteNo(deviceSite.getSite());
            });
        }
        return R.ok().add(locItems);
    }
    /**
     * @author Ryan
     * @date 2025/7/17
     * @description: 生成盘点任务
     * @version 1.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R genCheckOutTask(List<CheckOrderParams> checkParams, Long loginUserId) {
        if (checkParams.isEmpty()) {
            throw new CoolException("参数不能为空!!");
        }
        for (CheckOrderParams checkParam : checkParams) {
            if (checkParam.getItems().isEmpty()) {
                continue;
            }
            Map<String, List<CheckOrderItemParams>> listMap = checkParam.getItems().stream()
                    .collect(Collectors.groupingBy(CheckOrderItemParams::getBarcode));
            listMap.keySet().forEach(key -> {
                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, key));
                if (Objects.isNull(loc)) {
                    throw new CoolException("当前库位不存在!!");
                }
                Task task1 = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, key));
                if (!Objects.isNull(task1)) {
                    throw new CoolException("托盘任务已存在!!");
                }
                List<CheckOrderItemParams> itemParams = listMap.get(key);
                CheckOrderItemParams checkItem = itemParams.stream().findFirst().get();
                Task task = new Task();
                String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
                if (StringUtils.isBlank(ruleCode)) {
                    throw new CoolException("任务号不能为空!!");
                }
                task.setOrgLoc(loc.getCode())
                        .setTaskCode(ruleCode)
                        .setTargSite(checkItem.getSiteNo())
                        .setResource(TaskResouceType.TASK_RESOUCE_CHECK_TYPE.val)
                        .setTaskType(TaskType.TASK_TYPE_CHECK_OUT.type)
                        .setTaskStatus(TaskStsType.GENERATE_OUT.id)
                        .setCreateTime(new Date())
                        .setUpdateBy(loginUserId)
                        .setUpdateTime(new Date())
                        .setCreateBy(loginUserId)
                        .setBarcode(key);
                if (!taskService.save(task)) {
                    throw new CoolException("盘点任务生成失败!!");
                }
                List<TaskItem> items = new ArrayList<>();
                itemParams.forEach(item -> {
                    TaskItem taskItem = new TaskItem();
                    taskItem.setTaskId(task.getId())
                            .setOrderId(checkParam.getOrderId())
                            .setOrderType(OrderType.ORDER_CHECK.type)
                            .setAnfme(item.getAnfme())
                            .setWorkQty(0.0)
                            .setBatch(checkParam.getBatch())
                            .setMaktx(checkParam.getMaktx())
                            .setMatnrCode(checkParam.getMatnrCode())
                            .setPlatOrderCode(checkParam.getPlatOrderCode())
                            .setPlatWorkCode(checkParam.getPlatWorkCode())
                            .setSpec(checkParam.getSpec())
                            .setModel(checkParam.getModel())
                            .setFieldsIndex(checkParam.getFieldsIndex())
                            .setMatnrId(checkParam.getMatnrId())
                            .setCreateBy(loginUserId)
                            .setCreateTime(new Date())
                            .setUpdateBy(loginUserId)
                            .setUpdateTime(new Date())
                            .setOrderItemId(checkItem.getId())
                            .setOrderId(checkParam.getOrderId())
                            .setPlatItemId(checkParam.getPlatItemId());
                    items.add(taskItem);
                    if (!checkOrderItemService.update(new LambdaUpdateWrapper<WkOrderItem>()
                            .eq(WkOrderItem::getId, checkParam.getId())
                            .setSql("work_qty = work_qty + " + item.getAnfme())
                            .set(WkOrderItem::getWorkQty, checkItem.getAnfme()))) {
                        throw new CoolException("盘点明细修改失败!!");
                    }
                });
                if (!taskItemService.saveBatch(items)) {
                    throw new CoolException("任务明细保存失败!!");
                }
                loc.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
                if (!locService.updateById(loc)) {
                    throw new CoolException("库位预约出库失败!!");
                }
            });
            Set<Long> checkItemIds = checkParams.stream().map(CheckOrderParams::getOrderId).collect(Collectors.toSet());
            checkItemIds.forEach(orderId -> {
                WkOrder order = this.getById(orderId);
                if (Objects.isNull(order)) {
                    throw new CoolException("数据错误:单据不存在!!");
                }
                List<WkOrderItem> orderItems = checkOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, orderId));
                if (orderItems.isEmpty()) {
                    throw new CoolException("数据错误:单据明细不存在!!");
                }
                Double sum = orderItems.stream().mapToDouble(WkOrderItem::getWorkQty).sum();
                if (order.getAnfme().compareTo(sum) <= 0) {
                    order.setWorkQty(sum).setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_EXCE_DONE.val);
                } else {
                    order.setWorkQty(sum).setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_EXCE_ING.val);
                }
                if (!this.updateById(order)) {
                    throw new CoolException("盘点单信息修改失败!!");
                }
            });
        }
        return R.ok();
    }
    /**