61 lines
4.2 KiB
Java
61 lines
4.2 KiB
Java
package com.baiyue.finance.mapper;
|
|
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
import org.apache.ibatis.annotations.Param;
|
|
import org.apache.ibatis.annotations.Select;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/** 费用池按稳定来源读取当前版本,历史快照保留在同一费用的操作记录中。 */
|
|
@Mapper
|
|
public interface FinanceFeeSourceReadMapper {
|
|
String GENERATED = "(EXISTS(SELECT 1 FROM fin_bill_line bl WHERE bl.source_id=f.id AND bl.source_version=f.source_fee_version))";
|
|
String STATUS = "CASE WHEN f.status='AVAILABLE' AND " + GENERATED + " THEN 'BILLED' ELSE f.status END";
|
|
String BUSINESS_DATE = "CAST(JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.businessDate')) AS DATE)";
|
|
String FILTER = " FROM fin_fee_source f WHERE 1=1 " +
|
|
"<if test=\"status == null or status != 'SUPERSEDED'\">" +
|
|
" AND f.status<>'SUPERSEDED' AND NOT EXISTS(SELECT 1 FROM fin_fee_source newer" +
|
|
" WHERE newer.source_system=f.source_system AND newer.source_type=f.source_type" +
|
|
" AND newer.source_fee_id=f.source_fee_id AND newer.source_fee_version>f.source_fee_version)" +
|
|
"</if>" +
|
|
"<if test='customerId != null'> AND f.customer_id=#{customerId}</if>" +
|
|
"<if test='direction != null'> AND f.direction=#{direction}</if>" +
|
|
"<if test='reviewStatus != null'> AND f.review_status=#{reviewStatus}</if>" +
|
|
"<if test='status != null'> AND " + STATUS + "=#{status}</if>" +
|
|
"<if test='statementGenerated != null'> AND " + GENERATED + "=#{statementGenerated}</if>" +
|
|
"<if test='dateFrom != null'> AND " + BUSINESS_DATE + ">=#{dateFrom}</if>" +
|
|
"<if test='dateTo != null'> AND " + BUSINESS_DATE + "<=#{dateTo}</if>" +
|
|
"<if test='keyword != null'> AND (f.source_no LIKE CONCAT('%',#{keyword},'%')" +
|
|
" OR f.fee_item_name LIKE CONCAT('%',#{keyword},'%')" +
|
|
" OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.customerName')) LIKE CONCAT('%',#{keyword},'%')" +
|
|
" OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.inboundCode')) LIKE CONCAT('%',#{keyword},'%')" +
|
|
" OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.containerNo')) LIKE CONCAT('%',#{keyword},'%')" +
|
|
" OR JSON_UNQUOTE(JSON_EXTRACT(f.source_snapshot,'$.supplierName')) LIKE CONCAT('%',#{keyword},'%'))</if>";
|
|
|
|
/** 筛选和计数共用当前版本条件,不能先分页再去重。 */
|
|
@Select("<script>SELECT COUNT(*)" + FILTER + "</script>")
|
|
long count(Map<String, Object> filters);
|
|
|
|
/** 应收、应付分别展示当前快照;同名但来源费用号不同的费用不合并。 */
|
|
@Select("<script>SELECT f.*," + GENERATED + " statement_generated," + STATUS + " effective_status" + FILTER +
|
|
" ORDER BY " + BUSINESS_DATE + " DESC,f.id DESC LIMIT #{limit} OFFSET #{offset}</script>")
|
|
List<Map<String, Object>> list(Map<String, Object> filters);
|
|
|
|
String LINEAGE = " FROM fin_fee_source anchor JOIN fin_fee_source f ON f.source_system=anchor.source_system" +
|
|
" AND f.source_type=anchor.source_type AND f.source_fee_id=anchor.source_fee_id" +
|
|
" AND f.customer_id=anchor.customer_id AND f.direction=anchor.direction" +
|
|
" AND f.source_fee_version<=anchor.source_fee_version";
|
|
|
|
/** 旧版本链接只读取当时及此前快照,不把后续调整倒灌到历史单据。 */
|
|
@Select("<script>SELECT f.id,f.source_fee_version,f.amount,f.currency_code,f.created_at" + LINEAGE +
|
|
" WHERE anchor.id=#{id} AND anchor.customer_id=#{customerId}" +
|
|
" AND f.source_system IN ('FIRSTLEG','LASTLEG') ORDER BY f.source_fee_version,f.id</script>")
|
|
List<Map<String, Object>> versions(@Param("customerId") long customerId, @Param("id") long id);
|
|
|
|
/** 按来源身份串起历次审核和操作,客户与方向边界不能被同名费用跨越。 */
|
|
@Select("<script>SELECT a.id,a.created_at,a.action,a.operator_name_snapshot,a.reason,a.before_data,a.after_data" + LINEAGE +
|
|
" JOIN fin_audit_log a ON a.tenant_id=f.customer_id AND a.resource_type='FIN_FEE_SOURCE' AND a.resource_id=f.id" +
|
|
" WHERE anchor.id=#{id} AND anchor.customer_id=#{customerId} ORDER BY a.created_at DESC,a.id DESC</script>")
|
|
List<Map<String, Object>> audits(@Param("customerId") long customerId, @Param("id") long id);
|
|
}
|