package com.talentcard.server.business.order;
import java.util.List;
import java.util.Map;
import com.talentcard.server.common.BusinessException;
import com.talentcard.server.common.ErrorCode;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* 订单资金边界。
*
*
一个订单的核销、退款和提现锁定都会先锁定 {@code benefit_order} 的同一行,因此它们按订单串行化:
* 不会出现「退了款又核销」「核销后被退款」「已经进了提现记录又撤销核销」。
*
*
{@code refund_status} 由本服务的退款三个方法维护。出款已改由斗拱按结算周期自动完成,
* 平台不再生成提现记录,因此订单上不再有「已进入提现记录」这一状态。
* 核销、退款、提现锁定与解锁的业务规则都收敛在这里,调用方只负责在拿到 {@link LockedOrder} 后调用
* 对应断言。
*
*
{@link #lock(long)} 要求已经存在数据库事务:行锁只在事务内有效,脱离事务调用会直接失败,
* 而不是静默地失去串行化能力。其它方法都是单条条件更新,本身就是原子的。
*/
@Service
public class OrderFundBoundaryService {
/** 订单退款状态:没有生效中的退款。 */
public static final long REFUND_NONE = 0;
/** 订单退款状态:退款已受理、结果未定。 */
public static final long REFUND_IN_PROGRESS = 1;
/** 订单退款状态:退款成功(部分退款也算整单退出结算)。 */
public static final long REFUNDED = 2;
private final JdbcTemplate jdbc;
public OrderFundBoundaryService(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
/**
* 锁定订单行并返回它的资金状态。拿到的状态在整个事务内不会被子资金状态变更改动,
* 因此所有判断都必须基于本方法的返回值。
*/
@Transactional(propagation = Propagation.MANDATORY)
public LockedOrder lock(long orderId) {
List