yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
@@ -20,6 +20,11 @@
@Mapper
public interface MesProWorkOrderMapper extends BaseMapperX<MesProWorkOrderDO> {
    default List<MesProWorkOrderDO> lockScheduleOrders(List<Long> ids) {
        return selectList(new LambdaQueryWrapperX<MesProWorkOrderDO>()
                .in(MesProWorkOrderDO::getId, ids).orderByAsc(MesProWorkOrderDO::getId).last("FOR UPDATE"));
    }
    default PageResult<MesProWorkOrderDO> selectPage(MesProWorkOrderPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MesProWorkOrderDO>()
                .likeIfPresent(MesProWorkOrderDO::getCode, reqVO.getCode())
@@ -29,7 +34,10 @@
                .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                .notIn(CollUtil.isNotEmpty(reqVO.getExcludeStatuses()),
                        MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses())
                .orderByDesc(MesProWorkOrderDO::getId));
    }
@@ -45,8 +53,12 @@
                .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                .orderByDesc(MesProWorkOrderDO::getId);
        if (CollUtil.isNotEmpty(reqVO.getExcludeStatuses())) {
            wrapper.notIn(MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses());
        }
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
@@ -57,6 +69,20 @@
        }
        return selectPage(reqVO, wrapper);
    }
    /**
     * 分页查询(带客户权限过滤且支持调度状态查询)
     */
    default PageResult<MesProWorkOrderDO> selectSchedulePage(MesProWorkOrderPageReqVO pageReqVO, List<Long> permittedClientIds) {
        com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> mpPage = cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils.buildPage(pageReqVO);
        com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> result = selectSchedulePage(mpPage, pageReqVO, permittedClientIds);
        return new PageResult<>(result.getRecords(), result.getTotal());
    }
    com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> selectSchedulePage(
            com.baomidou.mybatisplus.core.metadata.IPage<MesProWorkOrderDO> page,
            @org.apache.ibatis.annotations.Param("pageReqVO") MesProWorkOrderPageReqVO pageReqVO,
            @org.apache.ibatis.annotations.Param("permittedClientIds") List<Long> permittedClientIds);
    default MesProWorkOrderDO selectByCode(String code) {
        return selectOne(MesProWorkOrderDO::getCode, code);
@@ -84,4 +110,24 @@
        return selectCount(MesProWorkOrderDO::getVendorId, vendorId);
    }
    /**
     * 累加工单的已装箱数量与已装箱箱数
     */
    default void updatePackedQuantity(Long id, BigDecimal incrQuantity, Integer incrBoxCount) {
        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
                .eq(MesProWorkOrderDO::getId, id)
                .setSql("packed_quantity = IFNULL(packed_quantity, 0) + " + incrQuantity.toPlainString())
                .setSql("packed_box_count = IFNULL(packed_box_count, 0) + " + incrBoxCount));
    }
    /**
     * 根据已装箱数量重算装箱状态:已装 >= 工单数量为完成(2),部分为 1,否则 0
     */
    default void updatePackingStatus(Long id) {
        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
                .eq(MesProWorkOrderDO::getId, id)
                .setSql("packing_status = CASE WHEN IFNULL(packed_quantity, 0) >= IFNULL(quantity, 0) THEN 2 "
                        + "WHEN IFNULL(packed_quantity, 0) > 0 THEN 1 ELSE 0 END"));
    }
}