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);
|
}
|
}
|