cl
2026-04-21 4c5e705c9ac10827254900305b7b915191005db4
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaCheckOrderServiceImpl.java
@@ -28,13 +28,17 @@
import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl;
import com.vincent.rsf.server.system.service.impl.UserServiceImpl;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import com.vincent.rsf.server.system.utils.SystemAuthUtils;
import org.apache.commons.lang3.StringUtils;
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.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class PdaCheckOrderServiceImpl implements PdaCheckOrderService {
@@ -62,6 +66,15 @@
    private ReportMsgService reportMsgService;
    @Autowired
    private UserService userService;
    @Autowired
    private CheckOrderItemService checkOrderItemService;
    @Autowired
    private CheckOrderService checkOrderService;
    @Autowired
    private CusBarcodeSyncViewQueryService cusBarcodeSyncViewQueryService;
    @Override
@@ -142,7 +155,7 @@
                taskItem.setTaskId(task.getId())
                        .setOrderType(OrderType.ORDER_CHECK.type)
                        .setSourceCode(diffItem.getOrderCode())
                        .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type))
                        .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type)
                        .setAnfme(diffItem.getCheckQty())
                        .setWorkQty(0.0)
                        .setBatch(diffItem.getBatch())
@@ -202,6 +215,43 @@
            throw new CoolException("更新差异单失败");
        }
        // 按盘点单明细汇总实盘数量并回写
        Set<Long> taskItemIds = diffItems.stream().map(CheckDiffItem::getTaskItemId).filter(Objects::nonNull).collect(Collectors.toSet());
        if (!taskItemIds.isEmpty()) {
            List<TaskItem> taskItems = taskItemService.listByIds(taskItemIds);
            Map<Long, BigDecimal> orderItemIdToCheckQty = new HashMap<>();
            for (CheckDiffItem di : diffItems) {
                if (di.getTaskItemId() == null) {
                    continue;
                }
                TaskItem ti = taskItems.stream().filter(t -> t.getId().equals(di.getTaskItemId())).findFirst().orElse(null);
                if (ti == null || ti.getOrderItemId() == null) {
                    continue;
                }
                Double cq = di.getCheckQty() != null ? di.getCheckQty() : 0.0;
                orderItemIdToCheckQty.merge(ti.getOrderItemId(), BigDecimal.valueOf(cq), BigDecimal::add);
            }
            for (Map.Entry<Long, BigDecimal> e : orderItemIdToCheckQty.entrySet()) {
                double workQty = e.getValue().setScale(6, RoundingMode.HALF_UP).doubleValue();
                if (!checkOrderItemService.update(new LambdaUpdateWrapper<WkOrderItem>()
                        .eq(WkOrderItem::getId, e.getKey())
                        .set(WkOrderItem::getWorkQty, workQty))) {
                    throw new CoolException("盘点单明细实盘数量更新失败");
                }
            }
            if (checkDiff.getOrderId() != null) {
                List<WkOrderItem> orderItems = checkOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, checkDiff.getOrderId()));
                BigDecimal orderWorkQty = orderItems.stream()
                        .map(oi -> oi.getWorkQty() != null ? BigDecimal.valueOf(oi.getWorkQty()) : BigDecimal.ZERO)
                        .reduce(BigDecimal.ZERO, BigDecimal::add);
                if (!checkOrderService.update(new LambdaUpdateWrapper<WkOrder>()
                        .eq(WkOrder::getId, checkDiff.getOrderId())
                        .set(WkOrder::getWorkQty, orderWorkQty.setScale(6, RoundingMode.HALF_UP).doubleValue()))) {
                    throw new CoolException("盘点单主表实盘数量更新失败");
                }
            }
        }
        task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
        task.setUpdateBy(loginUserId);
        task.setUpdateTime(new Date());
@@ -217,7 +267,7 @@
        if (Cools.isEmpty(matnrCode)) {
            return R.error("物料码为空");
        }
        Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, matnrCode));
        Matnr matnr = getMatnrByCodePreferView(matnrCode);
        if (null == matnr) {
            return R.error("未找到编码对应的明细");
        }
@@ -229,6 +279,83 @@
        return R.ok(checkDiffItem);
    }
    private Matnr findLocalMatnrByCode(String matnrCode) {
        String t = StringUtils.trimToNull(matnrCode);
        if (t == null) {
            return null;
        }
        return matnrService.getOneByCodeAndBatch(t, "");
    }
    /** 视图 barcode 即物料号,与 man_matnr.code 一致 */
    private Matnr getMatnrByCodePreferView(String matnrCode) {
        String code = StringUtils.trimToNull(matnrCode);
        if (code == null) {
            return null;
        }
        List<Map<String, Object>> viewItems = null;
        try {
            viewItems = cusBarcodeSyncViewQueryService.listByItemNos(Collections.singletonList(code));
        } catch (Exception ignore) {
        }
        Map<String, Object> row = null;
        if (viewItems != null) {
            row = viewItems.stream()
                    .filter(v -> CusBarcodeSyncViewQueryService.rowMatchesOrderMatnr(code, Objects.toString(v.get("barcode"), null)))
                    .findFirst()
                    .orElse(null);
        }
        if (row == null) {
            return findLocalMatnrByCode(code);
        }
        String fullCode = CusBarcodeSyncViewQueryService.matnrCodeFromBarcode(Objects.toString(row.get("barcode"), null));
        String viewSpec = StringUtils.trimToEmpty(Objects.toString(row.get("item_spec"), ""));
        String viewUnit = StringUtils.trimToNull(Objects.toString(row.get("unit_no"), null));
        String viewName = StringUtils.trimToNull(Objects.toString(row.get("item_name"), null));
        Long loginUserId = SystemAuthUtils.getLoginUserId() == null ? 1L : SystemAuthUtils.getLoginUserId();
        Matnr local = findLocalMatnrByCode(fullCode);
        if (local == null) {
            Matnr matnr = new Matnr();
            matnr.setCode(fullCode)
                    .setBatch("")
                    .setName(viewName != null ? viewName : fullCode)
                    .setSpec(viewSpec)
                    .setUnit(viewUnit)
                    .setStockUnit(viewUnit)
                    .setStatus(1)
                    .setCreateBy(loginUserId)
                    .setUpdateBy(loginUserId)
                    .setCreateTime(new Date())
                    .setUpdateTime(new Date());
            if (!matnrService.save(matnr)) {
                throw new CoolException("物料信息保存失败");
            }
            return matnr;
        }
        boolean specDiff = !StringUtils.equals(StringUtils.trimToEmpty(local.getSpec()), viewSpec);
        boolean unitDiff = viewUnit != null
                && (!StringUtils.equals(StringUtils.trimToEmpty(local.getUnit()), viewUnit)
                || !StringUtils.equals(StringUtils.trimToEmpty(local.getStockUnit()), viewUnit));
        if (specDiff || unitDiff) {
            Matnr update = new Matnr();
            update.setId(local.getId());
            if (specDiff) {
                update.setSpec(viewSpec);
                local.setSpec(viewSpec);
            }
            if (unitDiff) {
                update.setUnit(viewUnit).setStockUnit(viewUnit);
                local.setUnit(viewUnit);
                local.setStockUnit(viewUnit);
            }
            update.setUpdateBy(loginUserId).setUpdateTime(new Date());
            if (!matnrService.updateById(update)) {
                throw new CoolException("物料信息更新失败");
            }
        }
        return local;
    }
    @Override
    public R getCheckTaskItemList2(String barcode) {
        LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>();