cl
4 天以前 a8a10ec2a3fe7d8db166413a92a34926fb178533
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
@@ -24,7 +24,6 @@
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.manager.service.impl.MatnrServiceImpl;
import com.vincent.rsf.server.system.constant.DictTypeCode;
import com.vincent.rsf.server.system.constant.GlobalConfigCode;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
@@ -69,7 +68,7 @@
    @Autowired
    private MatnrGroupService matnrGroupService;
    @Autowired
    private MatnrServiceImpl matnrService;
    private MatnrService matnrService;
    @Autowired
    private AsnOrderService asnOrderService;
    @Autowired
@@ -122,6 +121,8 @@
    private TaskItemService taskItemService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private CusBarcodeSyncMatnrService cusBarcodeSyncMatnrService;
    /**
     * 云仓改单/取消前:任务明细已关联该单据且主任务未逻辑删除则不允许
@@ -165,6 +166,10 @@
            return;
        }
        assertWkOrderExceStatusUnexecuted(order, "取消");
    }
    private void syncMatnrFromCusItemSyncViewByConfig(List<SyncOrdersItem> orderItems, Long loginUserId) {
        cusBarcodeSyncMatnrService.syncFromOrderItems(orderItems, loginUserId);
    }
    /**
@@ -260,16 +265,18 @@
    public void syncMatnrs(List<BaseMatParms> matnrs) {
        List<Matnr> syncMatnrs = new ArrayList<>();
        if (!matnrs.isEmpty()) {
            assertUniqueMatnrInSyncList(matnrs);
            matnrs.forEach(matnr -> {
                Matnr mat = new Matnr();
                if (Objects.isNull(matnr.getMatnr())) {
                    throw new RuntimeException("物料编码不能为空!!");
                }
                BeanUtils.copyProperties(matnr, mat);
                mat.setCode(matnr.getMatnr()).setName(matnr.getMaktx());
                mat.setCode(matnr.getMatnr()).setName(matnr.getMaktx())
                        .setBatch(matnrService.normalizeMatnrBatchValue(matnr.getBatch()));
                if (!Objects.isNull(matnr.getGroupName())) {
                    MatnrGroup matnrGroup = matnrGroupService.getOne(new LambdaQueryWrapper<MatnrGroup>().eq(MatnrGroup::getName, matnr.getGroupName()), false);
                    if (Objects.isNull(matnrGroup)) {
                    if (!Objects.isNull(matnrGroup)) {
                        mat.setGroupCode(matnrGroup.getCode()).setGroupId(matnrGroup.getId());
                    }
                }
@@ -278,6 +285,21 @@
            if (!matnrService.saveOrUpdateBatch(syncMatnrs)) {
                throw new CoolException("物料信息保存成功!!");
            }
        }
    }
    private void assertUniqueMatnrInSyncList(List<BaseMatParms> matnrs) {
        Set<String> keys = new HashSet<>();
        for (BaseMatParms p : matnrs) {
            if (StringUtils.isBlank(p.getMatnr())) {
                continue;
            }
            String key = p.getMatnr().trim() + "\u0000" + matnrService.normalizeMatnrBatchValue(p.getBatch());
            if (!keys.add(key)) {
                throw new CoolException("同步列表中物料编码与批次重复:" + p.getMatnr().trim()
                        + (StringUtils.isNotBlank(matnrService.normalizeMatnrBatchValue(p.getBatch()))
                        ? " / " + matnrService.normalizeMatnrBatchValue(p.getBatch()) : ""));
            }
        }
    }
@@ -323,7 +345,9 @@
    public R syncLocsDetl(PageParam<Loc, BaseParam> pageParam, QueryWrapper<Loc> wrapper) {
        Page<Object> page = new Page<>();
        page.setCurrent(pageParam.getCurrent()).setSize(pageParam.getSize());
        IPage<LocStockDto> locStocks = locService.getLocDetls(page);
        BaseParam bp = pageParam.getWhere();
        Map<String, Object> conds = bp != null && bp.getMap() != null ? bp.getMap() : Collections.emptyMap();
        IPage<LocStockDto> locStocks = locService.getLocDetls(page, conds);
        return R.ok().add(locStocks);
    }
@@ -499,6 +523,8 @@
                }
            }
        }
        // 按配置同步物料主数据(none 时不影响通知档写入主流程)
        syncMatnrFromCusItemSyncViewByConfig(syncOrder.getOrderItems(), loginUserId);
        WkOrder wkOrder = new WkOrder();
        String wkTypeInput = syncOrder.getWkType();
        String typeCode = StringUtils.isBlank(wkTypeInput) ? null : orderWorkTypeService.getTypeByLabel(wkTypeInput);
@@ -525,10 +551,11 @@
                .eq(WkOrder::getPoCode, syncOrder.getOrderInternalCode()));
        if (!Objects.isNull(order)) {
            assertWkOrderNoLinkedTask(order.getId());
            assertWkOrderExceStatusUnexecuted(order, "修改");
            long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
                    .eq(WaitPakinItem::getAsnId, order.getId()).eq(WaitPakinItem::getDeleted, 0));
            if (pakinCount > 0) {
                // 已组托时仍按原规则限制:仅未执行状态可改单
                assertWkOrderExceStatusUnexecuted(order, "修改");
                String changeSummary = computeWkOrderModifyChangeSummaryOrNull(order, syncOrder, resolvedOrderType, typeCode, true);
                if (changeSummary == null) {
                    return "修改无变化";
@@ -543,7 +570,9 @@
            if (changeSummary == null) {
                return "修改无变化";
            }
            updateOrderNoPakin(order, syncOrder, loginUserId);
            // 未组托时允许已收货改单;自动收货场景下同步让完成数量跟计划数量一致
            boolean alignQtyWithPlan = Objects.equals(order.getExceStatus(), AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val);
            updateOrderNoPakin(order, syncOrder, loginUserId, alignQtyWithPlan);
            if (isDirectWaitPakin()) {
                syncReceiptAreaByOrder(order.getId());
            }
@@ -857,7 +886,7 @@
    /**
     * 未组托单据的修改:在原单上更新主单+明细(按 lineId 匹配),保留 exceStatus、qty、workQty,避免删单重建导致定时任务再次执行。
     */
    private void updateOrderNoPakin(WkOrder order, SyncOrderParams syncOrder, Long loginUserId) {
    private void updateOrderNoPakin(WkOrder order, SyncOrderParams syncOrder, Long loginUserId, boolean alignQtyWithPlan) {
        if (syncOrder.getOrderItems() == null || syncOrder.getOrderItems().isEmpty()) {
            throw new CoolException("修改时明细不能为空!!");
        }
@@ -897,7 +926,9 @@
            SyncOrdersItem inc = incomingByLineId.get(lineId);
            Double newAnfme = QuantityUtils.roundToScale(inc.getAnfme() != null ? inc.getAnfme() : existing.getAnfme());
            existing.setAnfme(newAnfme);
            if (inc.getQty() != null) {
            if (alignQtyWithPlan) {
                existing.setQty(newAnfme);
            } else if (inc.getQty() != null) {
                existing.setQty(QuantityUtils.roundToScale(inc.getQty()));
            } else {
                Double curQty = existing.getQty() != null ? existing.getQty() : 0.0;
@@ -928,6 +959,9 @@
            map.put("order_code", order.getCode());
            map.put("matnrCode", e.getValue().getMatnr());
            map.put("platItemId", e.getKey());
            if (alignQtyWithPlan) {
                map.put("qty", e.getValue().getAnfme());
            }
            if (!asnOrderItemService.fieldsSave(map, loginUserId)) {
                throw new CoolException("明细保存失败!!");
            }
@@ -936,9 +970,13 @@
        Double sum = QuantityUtils.roundToScale(asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()))
                .stream().mapToDouble(WkOrderItem::getAnfme).sum());
        order.setAnfme(sum);
        List<WkOrderItem> afterItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()));
        double qtySum = afterItems.stream().mapToDouble(oi -> oi.getQty() != null ? oi.getQty() : 0.0).sum();
        order.setQty(QuantityUtils.roundToScale(qtySum));
        if (alignQtyWithPlan) {
            order.setQty(sum);
        } else {
            List<WkOrderItem> afterItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()));
            double qtySum = afterItems.stream().mapToDouble(oi -> oi.getQty() != null ? oi.getQty() : 0.0).sum();
            order.setQty(QuantityUtils.roundToScale(qtySum));
        }
        asnOrderService.updateById(order);
    }
@@ -1310,7 +1348,7 @@
        Integer operateType = baseMatParms.getOperateType();
        // 3 禁用 / 4 启用:仅更新状态(status 1 正常 0 冻结)
        if (Integer.valueOf(3).equals(operateType) || Integer.valueOf(4).equals(operateType)) {
            Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, baseMatParms.getMatnr()));
            Matnr matnr = matnrService.getOneByCodeAndBatch(baseMatParms.getMatnr(), baseMatParms.getBatch());
            if (matnr == null) {
                throw new CoolException("物料不存在,无法执行禁用/启用!!");
            }
@@ -1322,12 +1360,13 @@
            return R.ok();
        }
        // 1 新增 / 2 修改 / 不传:有则更新、无则新增
        Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, baseMatParms.getMatnr()));
        Matnr matnr = matnrService.getOneByCodeAndBatch(baseMatParms.getMatnr(), baseMatParms.getBatch());
        if (Objects.isNull(matnr)) {
            Matnr matnr1 = new Matnr();
            BeanUtils.copyProperties(baseMatParms, matnr1);
            matnr1.setCode(baseMatParms.getMatnr());
            matnr1.setName(baseMatParms.getMaktx());
            matnr1.setBatch(matnrService.normalizeMatnrBatchValue(baseMatParms.getBatch()));
            if (!Objects.isNull(baseMatParms.getGroupName())) {
                MatnrGroup matnrGroup = matnrGroupService.getOne(new LambdaQueryWrapper<MatnrGroup>()
                        .eq(MatnrGroup::getName, baseMatParms.getGroupName()));
@@ -1349,7 +1388,8 @@
            matnr.setName(baseMatParms.getMaktx())
                    .setColor(baseMatParms.getColor())
                    .setModel(baseMatParms.getModel())
                    .setSpec(baseMatParms.getSpec());
                    .setSpec(baseMatParms.getSpec())
                    .setBatch(matnrService.normalizeMatnrBatchValue(baseMatParms.getBatch()));
            if (!matnrService.updateById(matnr)) {
                throw new CoolException("物料更新失败!!");
@@ -1378,18 +1418,32 @@
        if (!Cools.isEmpty(param.getPlanNo())) {
            wrapper.eq(LocItem::getPlatWorkCode, param.getPlanNo());
        }
        // 仓库、料箱码按库位 id 交集过滤
        List<Long> allowedLocIds = null;
        if (!Cools.isEmpty(param.getWareHouseId())) {
            Warehouse wh = warehouseService.getOne(new LambdaQueryWrapper<Warehouse>().eq(Warehouse::getCode, param.getWareHouseId()));
            if (wh != null) {
                List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getWarehouseId, wh.getId()));
                if (!locs.isEmpty()) {
                    wrapper.in(LocItem::getLocId, locs.stream().map(Loc::getId).collect(Collectors.toList()));
                } else {
                    return R.ok().add(Collections.emptyList());
                }
            } else {
            if (wh == null) {
                return R.ok().add(Collections.emptyList());
            }
            List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getWarehouseId, wh.getId()));
            if (locs.isEmpty()) {
                return R.ok().add(Collections.emptyList());
            }
            allowedLocIds = locs.stream().map(Loc::getId).collect(Collectors.toList());
        }
        if (!Cools.isEmpty(param.getBarcode())) {
            LambdaQueryWrapper<Loc> lw = new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode());
            if (allowedLocIds != null) {
                lw.in(Loc::getId, allowedLocIds);
            }
            List<Loc> locs = locService.list(lw);
            if (locs.isEmpty()) {
                return R.ok().add(Collections.emptyList());
            }
            allowedLocIds = locs.stream().map(Loc::getId).collect(Collectors.toList());
        }
        if (allowedLocIds != null) {
            wrapper.in(LocItem::getLocId, allowedLocIds);
        }
        List<LocItem> list = locItemService.list(wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
@@ -1405,6 +1459,7 @@
                row.put("wareHouseId", null);
                row.put("wareHouseName", null);
            }
            row.put("barcode", loc != null ? loc.getBarcode() : null);
            row.put("palletId", item.getTrackCode());
            row.put("matNr", item.getMatnrCode());
            row.put("makTx", item.getMaktx());