云
2026-10-25 d54fbc9d4f8981fa0f7f613b33a28a8cd4f764ea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package cn.iocoder.yudao.module.erp.dal.mysql.purchase;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
 
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
 
/**
 * ERP 采购订单 Mapper
 *
 * @author 超级管理员
 */
@Mapper
public interface ErpPurchaseOrderMapper extends BaseMapperX<ErpPurchaseOrderDO> {
 
    default PageResult<ErpPurchaseOrderDO> selectPage(ErpPurchaseOrderPageReqVO reqVO) {
        MPJLambdaWrapperX<ErpPurchaseOrderDO> query = new MPJLambdaWrapperX<ErpPurchaseOrderDO>()
                .likeIfPresent(ErpPurchaseOrderDO::getNo, reqVO.getNo())
                .eqIfPresent(ErpPurchaseOrderDO::getSupplierId, reqVO.getSupplierId())
                .betweenIfPresent(ErpPurchaseOrderDO::getOrderTime, reqVO.getOrderTime())
                .eqIfPresent(ErpPurchaseOrderDO::getStatus, reqVO.getStatus())
                .likeIfPresent(ErpPurchaseOrderDO::getRemark, reqVO.getRemark())
                .eqIfPresent(ErpPurchaseOrderDO::getCreator, reqVO.getCreator())
                .orderByDesc(ErpPurchaseOrderDO::getId);
        // 入库状态。为什么需要 t. 的原因,是因为联表查询时,需要指定表名,不然会报 in_count 错误
        if (Objects.equals(reqVO.getInStatus(), ErpPurchaseOrderPageReqVO.IN_STATUS_NONE)) {
            query.eq(ErpPurchaseOrderDO::getInCount, 0);
        } else if (Objects.equals(reqVO.getInStatus(), ErpPurchaseOrderPageReqVO.IN_STATUS_PART)) {
            query.gt(ErpPurchaseOrderDO::getInCount, 0).apply("t.in_count < t.total_count");
        } else if (Objects.equals(reqVO.getInStatus(), ErpPurchaseOrderPageReqVO.IN_STATUS_ALL)) {
            query.apply("t.in_count = t.total_count");
        }
        // 退货状态
        if (Objects.equals(reqVO.getReturnStatus(), ErpPurchaseOrderPageReqVO.RETURN_STATUS_NONE)) {
            query.eq(ErpPurchaseOrderDO::getReturnCount, 0);
        } else if (Objects.equals(reqVO.getReturnStatus(), ErpPurchaseOrderPageReqVO.RETURN_STATUS_PART)) {
            query.gt(ErpPurchaseOrderDO::getReturnCount, 0).apply("t.return_count < t.total_count");
        } else if (Objects.equals(reqVO.getReturnStatus(), ErpPurchaseOrderPageReqVO.RETURN_STATUS_ALL)) {
            query.apply("t.return_count = t.total_count");
        }
        // 可采购入库
        if (Boolean.TRUE.equals(reqVO.getInEnable())) {
            query.eq(ErpPurchaseOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus())
                    .apply("t.in_count < t.total_count");
        }
        // 可采购退货
        if (Boolean.TRUE.equals(reqVO.getReturnEnable())) {
            query.eq(ErpPurchaseOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus())
                    .apply("t.return_count < t.in_count");
        }
        if (reqVO.getProductId() != null) {
            query.leftJoin(ErpPurchaseOrderItemDO.class, ErpPurchaseOrderItemDO::getOrderId, ErpPurchaseOrderDO::getId)
                    .eq(reqVO.getProductId() != null, ErpPurchaseOrderItemDO::getProductId, reqVO.getProductId())
                    .groupBy(ErpPurchaseOrderDO::getId); // 避免 1 对多查询,产生相同的 1
        }
        return selectJoinPage(reqVO, ErpPurchaseOrderDO.class, query);
    }
 
    default int updateByIdAndStatus(Long id, Integer status, ErpPurchaseOrderDO updateObj) {
        return update(updateObj, new LambdaUpdateWrapper<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getId, id).eq(ErpPurchaseOrderDO::getStatus, status));
    }
 
    /**
     * 提交审批:更新状态并清空上一轮的审核信息
     *
     * 说明:必须使用 LambdaUpdateWrapper 显式 set null,
     * 否则 MyBatis-Plus 的 updateById 会忽略 null 字段,导致驳回原因残留。
     */
    default int submitAndResetAuditInfo(Long id, Integer status) {
        return update(null, new LambdaUpdateWrapper<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getId, id)
                .in(ErpPurchaseOrderDO::getStatus,
                        ErpPurchaseOrderStatusEnum.DRAFT.getStatus(), ErpPurchaseOrderStatusEnum.REJECT.getStatus())
                .set(ErpPurchaseOrderDO::getStatus, status)
                .set(ErpPurchaseOrderDO::getReviewerId, null)
                .set(ErpPurchaseOrderDO::getReviewerName, null)
                .set(ErpPurchaseOrderDO::getReviewTime, null)
                .set(ErpPurchaseOrderDO::getReviewRemark, null));
    }
 
    /**
     * 审核(通过 / 不通过):写入审核人与审核意见
     */
    default int auditPurchaseOrder(Long id, Integer status, Long reviewerId, String reviewerName, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getId, id)
                .eq(ErpPurchaseOrderDO::getStatus, ErpPurchaseOrderStatusEnum.PROCESS.getStatus())
                .set(ErpPurchaseOrderDO::getStatus, status)
                .set(ErpPurchaseOrderDO::getReviewerId, reviewerId)
                .set(ErpPurchaseOrderDO::getReviewerName, reviewerName)
                .set(ErpPurchaseOrderDO::getReviewTime, LocalDateTime.now())
                .set(ErpPurchaseOrderDO::getReviewRemark, reviewRemark));
    }
 
    /**
     * BPM 审批结束后回写采购订单状态
     *
     * 仅当采购订单仍处于「审批中」时更新,避免与旧审批路径重复覆盖。
     *
     * @param id           编号
     * @param status       目标状态(审核通过 / 审核不通过 / 已取消)
     * @param reviewRemark 审核意见
     * @return 影响行数
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getId, id)
                .eq(ErpPurchaseOrderDO::getStatus, ErpPurchaseOrderStatusEnum.PROCESS.getStatus())
                .set(ErpPurchaseOrderDO::getStatus, status)
                .set(ErpPurchaseOrderDO::getReviewTime, LocalDateTime.now())
                .set(ErpPurchaseOrderDO::getReviewRemark, reviewRemark));
    }
 
    default ErpPurchaseOrderDO selectByNo(String no) {
        return selectOne(ErpPurchaseOrderDO::getNo, no);
    }
 
    default List<ErpPurchaseOrderDO> selectList(Long supplierId, Integer status) {
        return selectList(new LambdaQueryWrapperX<ErpPurchaseOrderDO>()
                .eqIfPresent(ErpPurchaseOrderDO::getSupplierId, supplierId)
                .eqIfPresent(ErpPurchaseOrderDO::getStatus, status)
                .orderByDesc(ErpPurchaseOrderDO::getId));
    }
 
    /**
     * 按来源查询采购订单(用于追溯来源工单对应的采购订单)
     */
    default List<ErpPurchaseOrderDO> selectListBySource(Integer sourceType, Long sourceId) {
        return selectList(new LambdaQueryWrapperX<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getSourceType, sourceType)
                .eq(ErpPurchaseOrderDO::getSourceId, sourceId));
    }
 
}