53 lines
4.5 KiB
Java
53 lines
4.5 KiB
Java
package com.baiyue.finance.mapper;
|
|
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
import org.apache.ibatis.annotations.Options;
|
|
import org.apache.ibatis.annotations.Param;
|
|
import org.apache.ibatis.annotations.Select;
|
|
import org.apache.ibatis.annotations.Update;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/** 结算状态变更与重新占用来源的事务锁;锁定读取不得复用会话缓存。 */
|
|
@Mapper
|
|
public interface FinanceSettlementStateMapper {
|
|
/** 锁定待作废或重开的结算,保留客户与来源关联。 */
|
|
@Select("SELECT id,tenant_id,total_amount,paid_amount,outstanding_amount,payment_status,status,version,direction,currency_code,supplier_id,reconciliation_statement_id FROM fin_settlement WHERE id=#{settlementId} FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Map<String, Object>> lockSettlement(@Param("settlementId") long settlementId);
|
|
|
|
/** 直接锁定来源表,不能依赖外连接右侧记录的锁语义。 */
|
|
@Select("SELECT f.id FROM fin_fee_source f WHERE EXISTS (SELECT 1 FROM fin_settlement_line sl WHERE sl.tenant_id=#{customerId} AND sl.settlement_id=#{settlementId} AND sl.fee_source_id=f.id) ORDER BY f.id FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Long> lockSourceRows(@Param("customerId") long customerId, @Param("settlementId") long settlementId);
|
|
|
|
/** 按来源顺序锁定原单全部明细,缺失或跨客户来源仍返回明细供服务拒绝。 */
|
|
@Select("SELECT sl.fee_source_id,sl.amount line_amount,sl.currency_code line_currency,f.id,f.customer_id,f.direction,f.currency_code,f.amount,f.review_status,f.status,f.settlement_mode,f.source_snapshot FROM fin_settlement_line sl LEFT JOIN fin_fee_source f ON f.id=sl.fee_source_id WHERE sl.tenant_id=#{customerId} AND sl.settlement_id=#{settlementId} ORDER BY sl.fee_source_id FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Map<String, Object>> lockSources(@Param("customerId") long customerId, @Param("settlementId") long settlementId);
|
|
|
|
/** 使用当前锁定读检查其他有效结算,避免等待来源锁后读取旧快照。 */
|
|
@Select("SELECT s.id FROM fin_settlement_line sl JOIN fin_settlement s ON s.id=sl.settlement_id AND s.tenant_id=sl.tenant_id WHERE sl.tenant_id=#{customerId} AND sl.fee_source_id=#{sourceId} AND s.id<>#{settlementId} AND s.status<>'VOIDED' FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Map<String, Object>> lockOtherSourceSettlements(@Param("customerId") long customerId, @Param("sourceId") long sourceId, @Param("settlementId") long settlementId);
|
|
|
|
/** 与应收新建共同锁定原对账单,防止检查后被调整或再次生成应收。 */
|
|
@Select("SELECT id,tenant_id,status,currency_code,total_amount,received_amount FROM fin_bill WHERE tenant_id=#{customerId} AND id=#{billId} FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Map<String, Object>> lockBill(@Param("customerId") long customerId, @Param("billId") long billId);
|
|
|
|
/** 读取原账单当前明细,重开不能沿用调账前的行金额。 */
|
|
@Select("SELECT source_id fee_source_id,amount line_amount,currency_code line_currency FROM fin_bill_line WHERE tenant_id=#{customerId} AND bill_id=#{billId} ORDER BY source_id FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Map<String, Object>> lockBillLines(@Param("customerId") long customerId, @Param("billId") long billId);
|
|
|
|
/** 锁定同账单其他有效应收,作废旧单不可绕过唯一占用。 */
|
|
@Select("SELECT id FROM fin_settlement WHERE tenant_id=#{customerId} AND direction='RECEIVABLE' AND reconciliation_statement_id=#{billId} AND id<>#{settlementId} AND status<>'VOIDED' FOR UPDATE")
|
|
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
|
|
List<Map<String, Object>> lockOtherBillSettlements(@Param("customerId") long customerId, @Param("billId") long billId, @Param("settlementId") long settlementId);
|
|
|
|
/** 客户范围内按原版本推进状态。 */
|
|
@Update("UPDATE fin_settlement SET status=#{status},updated_by=#{operatorId},version=version+1 WHERE id=#{settlementId} AND tenant_id=#{customerId} AND version=#{version}")
|
|
int changeStatus(@Param("status") String status, @Param("operatorId") long operatorId, @Param("settlementId") long settlementId, @Param("customerId") long customerId, @Param("version") int version);
|
|
}
|