gongchunyi
4 天以前 9f281fb21c139b96cd2be8809e1c704782868c95
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
package com.ruoyi.sales;
 
import com.ruoyi.RuoYiApplication;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIf;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
 
import javax.sql.DataSource;
import java.util.Collections;
import java.util.List;
 
/**
 * 数据修复:当销售订单主表发货状态为「已发货」时,将下属销售产品行的<b>产品出库审批状态</b>
 * {@code sales_ledger_product.approve_status} 统一为<b>已出库</b>。
 * <p>
 * 与 {@code product-inventory-management-hbtmblc.sql} 中字段注释一致:
 * {@code sales_ledger.delivery_status} {@code tinyint(1) NOT NULL DEFAULT '0'}:
 * 发货状态:1-未发货,2-审批中,3-审批不通过,4-审批通过,5-已发货。本任务仅在 {@code 5-已发货} 时同步产品行。
 * {@code sales_ledger_product.approve_status}:0-未出库,1-已出库,2-待审核,3-审核完成,4-审核失败。
 * <p>
 * 仅处理 {@code type = 1} 的销售产品行;仅更新当前 {@code approve_status} 不是 {@code 1}(已出库)的行,避免无意义写库。
 * <p>
 * <b>执行前必须</b>:{@code -Druoyi.salesProductApproveStatus.sync.commit=true} 或环境变量
 * {@code RUOYI_SALES_PRODUCT_APPROVE_STATUS_SYNC_COMMIT=true}。未开启时本用例跳过。
 */
@SpringBootTest(classes = RuoYiApplication.class)
class SalesProductApproveStatusSyncTest {
 
    private static final Logger log = LoggerFactory.getLogger(SalesProductApproveStatusSyncTest.class);
 
    /**
     * 与库注释一致:1 = 已出库
     */
    private static final int APPROVE_STATUS_SHIPPED_OUT = 1;
 
    /**
     * 视为「订单已发货、需同步产品状态」的主表 {@code delivery_status};默认仅 {@code 5}(已发货)。
     */
    private static final List<Integer> DELIVERY_STATUS_TRIGGER_SYNC = Collections.singletonList(5);
 
    /**
     * 仅同步这些销售台账主键;空表示全部符合条件的订单。
     */
    private static final List<Long> ONLY_SALES_LEDGER_IDS = Collections.emptyList();
 
    @SuppressWarnings("unused")
    static boolean syncCommitEnabled() {
        String p = System.getProperty("ruoyi.salesProductApproveStatus.sync.commit");
        if (p != null && "true".equalsIgnoreCase(p.trim())) {
            return true;
        }
        String e = System.getenv("RUOYI_SALES_PRODUCT_APPROVE_STATUS_SYNC_COMMIT");
        return e != null && "true".equalsIgnoreCase(e.trim());
    }
 
    @Autowired
    private DataSource dataSource;
 
    @Test
    @EnabledIf("com.ruoyi.sales.SalesProductApproveStatusSyncTest#syncCommitEnabled")
    @Transactional
    @Rollback(false)
    void syncSalesProductApproveStatusWhenOrderShipped() {
        NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(dataSource);
 
        MapSqlParameterSource p = new MapSqlParameterSource();
        p.addValue("outStatus", APPROVE_STATUS_SHIPPED_OUT);
        p.addValue("dstats", DELIVERY_STATUS_TRIGGER_SYNC);
        p.addValue("ptype", 1);
 
        StringBuilder sql = new StringBuilder(
                "UPDATE sales_ledger_product slp "
                        + "INNER JOIN sales_ledger sl ON slp.sales_ledger_id = sl.id "
                        + "SET slp.approve_status = :outStatus "
                        + "WHERE sl.delivery_status IN (:dstats) "
                        + "AND slp.type = :ptype "
                        + "AND (slp.approve_status IS NULL OR slp.approve_status <> :outStatus) ");
        if (!ONLY_SALES_LEDGER_IDS.isEmpty()) {
            sql.append("AND sl.id IN (:slids) ");
            p.addValue("slids", ONLY_SALES_LEDGER_IDS);
        }
 
        int updated = named.update(sql.toString(), p);
        log.warn(
                "[销售产品 approve_status 同步] 已发货订单 delivery_status in {},将销售产品 approve_status 置为 {}(已出库),更新行数={}",
                DELIVERY_STATUS_TRIGGER_SYNC, APPROVE_STATUS_SHIPPED_OUT, updated);
    }
}