# 代理錢包 SQL INDEX 討論 ## 2022-10-20 會議討論後調整內容: ### 1. 無調整 * ul_agent_payments_info * ul_agent_withdrawal_action_log * ul_agent_commission_audit * ul_agent_wallet ### 2. ul_agent_withdrawal index 建議: ul_agent_id, withdrawal_time index 建議: bank_id create index IF NOT EXISTS idx_ul_agent_withdrawal_ul_agent_id_withdrawal_time on ul_agent_withdrawal (ul_agent_id, withdrawal_time); create index IF NOT EXISTS idx_ul_agent_withdrawal_bank_id on ul_agent_withdrawal (bank_id); create index IF NOT EXISTS idx_ul_agent_withdrawal_audit_time on ul_agent_withdrawal (status, audit_time); create index IF NOT EXISTS idx_ul_agent_withdrawal_status_withdrawal_time on ul_agent_withdrawal (status, withdrawal_time); create index IF NOT EXISTS idx_ul_agent_withdrawal_ul_agent_account on ul_agent_withdrawal (ul_agent_account); ### 3. ul_agent_withdrawal_pending index建議: bank_id -- index建議: withdrawal_time: 預期此表資料量較小,暫不添加 -- index建議: audit_time: 預期此表資料量較小,暫不添加 create index IF NOT EXISTS idx_ul_agent_withdrawal_pending_bank_id on ul_agent_withdrawal_pending (bank_id); ### 4. ul_agent_commission_pending index 建議: (start_time, end_time) index 建議: (settlement_id,settlement_type) index 建議: UNIQUE (settlement_id, ul_agent_id) 改成 UNIQUE INDEX (ul_agent_id,settlement_id) create index IF NOT EXISTS idx_ul_agent_commission_pending_start_time_end_time on ul_agent_commission_pending (start_time, end_time); create index IF NOT EXISTS idx_ul_agent_commission_pending_settlement_id_settlement_type on ul_agent_commission_pending (settlement_id, settlement_type); CREATE UNIQUE INDEX IF NOT EXISTS idx_ul_agent_commission_pending_ul_agent_id_settlement_id ON ul_agent_commission_pending (ul_agent_id, settlement_id); ### 5. ul_agent_commission index 建議: (start_time, end_time) index 建議: settlement_type index 建議: UNIQUE (settlement_id, ul_agent_id) 改成 UNIQUE INDEX (ul_agent_id,settlement_id) create index IF NOT EXISTS idx_ul_agent_commission_start_time_end_time on ul_agent_commission (start_time, end_time); create index IF NOT EXISTS idx_ul_agent_commission_settlement_id_settlement_type on ul_agent_commission (settlement_id, settlement_type); CREATE UNIQUE INDEX IF NOT EXISTS idx_ul_agent_commission_ul_agent_id_settlement_id ON ul_agent_commission (ul_agent_id, settlement_id); ### 6. 其他: * balance 統一限制小數點位數 numeric(23, 6) * create_time timestamp with time zone default now(), 改成我們統一的 default clock_timestamp() * ul_agent_commission_pending, ul_agent_commission => 兩表相關連,因此欄位相同維持一致性 * where 條件優先置入 union all 之中 ## 編輯銀行卡 ul_agent_payments_info * table ```=sql= create table IF NOT EXISTS ul_agent_payments_info ( payments_info_id uuid default public.uuid_generate_v4() not null primary key, ul_agent_id integer not null, bank_id uuid not null, bank_branch varchar, bank_account varchar not null, bank_account_name varchar, status varchar not null, activation_province varchar, activation_city varchar, activation_mobile varchar, activation_id varchar, activation_email varchar, create_time timestamp default clock_timestamp(), creator varchar not null, update_time timestamp default clock_timestamp(), updater varchar, pic_id uuid ); COMMENT ON TABLE ul_agent_payments_info IS '代理取款銀行卡'; comment on column ul_agent_payments_info.payments_info_id is '支付編號'; comment on column ul_agent_payments_info.ul_agent_id is '代理編號'; comment on column ul_agent_payments_info.bank_id is '銀行編號'; comment on column ul_agent_payments_info.bank_branch is '銀行支行名稱'; comment on column ul_agent_payments_info.bank_account is '銀行帳戶'; comment on column ul_agent_payments_info.bank_account_name is '銀行卡姓名'; comment on column ul_agent_payments_info.status is '狀態(Enum:UlAgentPaymentsInfoStatus):激活 ACTIVE、停用BLOCKED'; comment on column ul_agent_payments_info.activation_province is '開戶省份'; comment on column ul_agent_payments_info.activation_city is '開戶城市'; comment on column ul_agent_payments_info.activation_mobile is '银行预留手机号码'; comment on column ul_agent_payments_info.activation_id is '銀行開戶證件號'; comment on column ul_agent_payments_info.activation_email is '付款人Email'; comment on column ul_agent_payments_info.create_time is '建立時間'; comment on column ul_agent_payments_info.creator is '建立人員'; comment on column ul_agent_payments_info.update_time is '更新時間'; comment on column ul_agent_payments_info.updater is '更新人員'; comment on column ul_agent_payments_info.pic_id is '銀行卡圖片'; create index IF NOT EXISTS idx_ul_agent_payments_info_ul_agent_id_status on ul_agent_payments_info (ul_agent_id, status); create index IF NOT EXISTS idx_ul_agent_payments_info_bank_id on ul_agent_payments_info (bank_id); ``` * dml ```=sql= <entry key="ulagent_exist_by_ulagentid"> SELECT count(1) FROM ul_agent WHERE id = :ulagentId </entry> <entry key="ulagentpaymentsinfo_find_count_by_paymentsinfoid_and_bankaccount"> SELECT count(1) FROM ul_agent_payments_info WHERE (:paymentsInfoIdIsNull = true OR payments_info_id != :paymentsInfoId) AND (:bankIdIsNull = true OR bank_id = :bankId) AND ltrim(bank_account, '0') = ltrim(:bankAccount, '0') AND status != :deleteStatus </entry> <entry key="ulagentpaymentsinfo_find_count_by_ulagentid"> SELECT count(1) FROM ul_agent_payments_info p WHERE p.ul_agent_id = :ulagentId AND p.status != :deleteStatus </entry> <entry key="ulagentpaymentsinfo_find_detail_by_ulagentid"> SELECT * FROM ( SELECT p.payments_info_id AS paymentsInfoId, p.ul_agent_id AS ulagentId, p.bank_id AS bankId, p.bank_branch AS bankBranch, p.bank_account AS bankAccount, p.bank_account_name AS bankAccountName, p.status AS status, p.activation_province AS activationProvince, p.activation_city AS activationCity, p.activation_mobile AS activationMobile, p.activation_id AS activationId, p.activation_email AS activationEmail, p.create_time AS createTime, p.creator AS creator, p.update_time AS updateTime, p.updater AS updater, p.pic_id AS picId, b.currency AS currency, CASE WHEN :language = :enLanguage THEN b.banknameen WHEN :language = :scLanguage THEN b.banknamesc ELSE b.banknametc END AS bankName FROM ul_agent_payments_info p INNER JOIN bank b ON p.bank_id = b.bankid WHERE p.ul_agent_id = :ulagentId AND p.status != :deleteStatus ) paymentjoin ORDER BY (case when :sort='DESC' and :sortColumn='BANK_NAME' then bankName end) DESC, (case when :sort='DESC' and :sortColumn='BANK_BRANCH' then bankBranch end) DESC, (case when :sort='DESC' and :sortColumn='BANK_ACCOUNT' then bankAccount end) DESC, (case when :sort='DESC' and :sortColumn='BANK_ACCOUNT_NAME' then bankAccountName end) DESC, (case when :sort='DESC' and :sortColumn='ACTIVATION_PROVINCE' then activationProvince end) DESC, (case when :sort='DESC' and :sortColumn='ACTIVATION_MOBILE' then activationMobile end) DESC, (case when :sort='DESC' and :sortColumn='ACTIVATION_ID' then activationId end) DESC, (case when :sort='DESC' and :sortColumn='CREATE_TIME' then createTime end) DESC, (case when :sort='DESC' and :sortColumn='UPDATE_TIME' then updateTime end) DESC, (case when :sort='DESC' and :sortColumn='UPDATER' then updater end) DESC, (case when :sort='ASC' and :sortColumn='BANK_NAME' then bankName end) ASC, (case when :sort='ASC' and :sortColumn='BANK_BRANCH' then bankBranch end) ASC, (case when :sort='ASC' and :sortColumn='BANK_ACCOUNT' then bankAccount end) ASC, (case when :sort='ASC' and :sortColumn='BANK_ACCOUNT_NAME' then bankAccountName end) ASC, (case when :sort='ASC' and :sortColumn='ACTIVATION_PROVINCE' then activationProvince end) ASC, (case when :sort='ASC' and :sortColumn='ACTIVATION_MOBILE' then activationMobile end) ASC, (case when :sort='ASC' and :sortColumn='ACTIVATION_ID' then activationId end) ASC, (case when :sort='ASC' and :sortColumn='CREATE_TIME' then createTime end) ASC, (case when :sort='ASC' and :sortColumn='UPDATE_TIME' then updateTime end) ASC, (case when :sort='ASC' and :sortColumn='UPDATER' then updater end) ASC, status ASC, updateTime ASC OFFSET :offset LIMIT :limit </entry> <entry key="ulagentpaymentsinfo_find_by_paymentsinfoid"> SELECT payments_info_id AS paymentsInfoId, ul_agent_id AS ulagentId, bank_id AS bankId, bank_branch AS bankBranch, bank_account AS bankAccount, bank_account_name AS bankAccountName, status AS status, activation_province AS activationProvince, activation_city AS activationCity, activation_mobile AS activationMobile, activation_id AS activationId, activation_email AS activationEmail, create_time AS createTime, creator AS creator, update_time AS updateTime, updater AS updater, pic_id AS picId FROM ul_agent_payments_info WHERE payments_info_id = :paymentsInfoId </entry> <entry key="ulagentpaymentsinfo_save"> INSERT INTO ul_agent_payments_info (ul_agent_id, bank_id, bank_branch, bank_account, bank_account_name, status, create_time, creator, update_time, updater, activation_province, activation_city, activation_mobile, activation_email, activation_id, pic_id) VALUES (:ulagentId, :bankId, :bankBranch, :bankAccount, :bankAccountName, :status, clock_timestamp(), :creator, clock_timestamp(), :updater, :activationProvince, :activationCity, :activationMobile, :activationEmail, :activationId, :picId) </entry> <entry key="ulagentpaymentsinfo_update_by_paymentsinfoid"> UPDATE ul_agent_payments_info SET bank_id = :bankId, bank_branch = :bankBranch, bank_account = :bankAccount, bank_account_name = :bankAccountName, activation_province = :activationProvince, activation_city = :activationCity, activation_mobile = :activationMobile, activation_email = :activationEmail, activation_id = :activationId, pic_id = :picId, update_time = clock_timestamp(), updater = :updater WHERE payments_info_id =:paymentsInfoId </entry> <entry key="ulagentpaymentsinfo_update_status_by_paymentsinfoid"> UPDATE ul_agent_payments_info SET status = :status, update_time = clock_timestamp(), updater = :updater WHERE payments_info_id =:paymentsInfoId </entry> <entry key="ul_agent_payments_info_find_one"> SELECT uapi.bank_account AS account,uapi.bank_account_name AS accountName, status AS paymentStatusEnum FROM ul_agent_payments_info uapi WHERE uapi.ul_agent_id =:ulAgentId ORDER BY status,update_time DESC LIMIT 1 </entry> <entry key="ul_agent_payments_info_find_all"> SELECT uapi.bank_account AS account,uapi.bank_account_name AS accountName,status AS paymentStatusEnum FROM ul_agent_payments_info uapi WHERE uapi.ul_agent_id =:ulAgentId ORDER BY status,update_time DESC </entry> ``` ## 提款審核 ul_agent_withdrawal_pending, ul_agent_withdrawal_sequence * table ```=sql= -- VIP-1807 [BE][AGENT][GET] 代理提款記錄 CREATE SEQUENCE if not exists ul_agent_withdrawal_id; -- initializing of withdraw serial id SELECT setval('ul_agent_withdrawal_id', (TO_NUMBER(TO_CHAR(current_date, 'YYMMDD')||'00000000','9999999999999FM'))::bigint); create table IF NOT EXISTS ul_agent_withdrawal_pending ( withdrawal_id VARCHAR NOT NULL DEFAULT CASE WHEN TO_NUMBER(TO_CHAR(current_date + interval '1 d', 'YYMMDD')||'00000000','9999999999999FM') = CURRVAL('ul_agent_withdrawal_id') + 1 -- overflow THEN NULL WHEN TO_NUMBER(TO_CHAR(current_date, 'YYMMDD')||'0000001','9999999999999FM') > CURRVAL('ul_agent_withdrawal_id') -- 跨日更新 THEN SETVAL('ul_agent_withdrawal_id', TO_NUMBER(TO_CHAR(current_date, 'YYMMDD')||'0000001','9999999999999FM')::bigint) ELSE NEXTVAL('ul_agent_withdrawal_id') END primary key, ul_agent_id integer not null, ul_agent_account varchar not null, ul_agent_level integer not null, payments_info_id uuid, withdrawal_amt numeric(23, 6) not null, after_balance numeric(23, 6), withdrawal_time timestamp not null, audit_time timestamp, auditor varchar, remarks varchar, status varchar not null, bank_payment_type integer, paid_amt numeric(23, 6), external_id varchar unique, caccount_id uuid, bank_account_info jsonb, bank_id uuid, agent_remarks varchar, ip varchar not null, location varchar not null, create_time timestamp default clock_timestamp(), update_time timestamp default clock_timestamp() ); COMMENT ON TABLE ul_agent_withdrawal_pending IS '代理提款審核'; COMMENT ON COLUMN ul_agent_withdrawal_pending.withdrawal_id IS '提款訂單號'; COMMENT ON COLUMN ul_agent_withdrawal_pending.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_withdrawal_pending.ul_agent_account IS '代理帳號'; COMMENT ON COLUMN ul_agent_withdrawal_pending.ul_agent_level IS '代理層級'; COMMENT ON COLUMN ul_agent_withdrawal_pending.payments_info_id IS '代理取款銀行卡編號'; COMMENT ON COLUMN ul_agent_withdrawal_pending.withdrawal_amt IS '出款金额'; COMMENT ON COLUMN ul_agent_withdrawal_pending.after_balance IS '帐户余额'; COMMENT ON COLUMN ul_agent_withdrawal_pending.withdrawal_time IS '提款申請時間'; COMMENT ON COLUMN ul_agent_withdrawal_pending.audit_time IS '審核時間'; COMMENT ON COLUMN ul_agent_withdrawal_pending.auditor IS '審核者'; COMMENT ON COLUMN ul_agent_withdrawal_pending.remarks IS '後台備註'; COMMENT ON COLUMN ul_agent_withdrawal_pending.status IS '狀態(UlAgentWithdrawalStatus):PENDING, PROCESSING'; COMMENT ON COLUMN ul_agent_withdrawal_pending.bank_payment_type IS '提款方式(Enum:BankPaymentType):BANK(1)'; COMMENT ON COLUMN ul_agent_withdrawal_pending.paid_amt IS '實際支付'; COMMENT ON COLUMN ul_agent_withdrawal_pending.external_id IS '第三方订单号'; COMMENT ON COLUMN ul_agent_withdrawal_pending.caccount_id IS '公司出款帳戶'; COMMENT ON COLUMN ul_agent_withdrawal_pending.bank_account_info IS '銀行資料(含銀行姓名)'; COMMENT ON COLUMN ul_agent_withdrawal_pending.bank_id IS '銀行代碼'; COMMENT ON COLUMN ul_agent_withdrawal_pending.agent_remarks IS '代理備註'; COMMENT ON COLUMN ul_agent_withdrawal_pending.ip IS 'IP'; COMMENT ON COLUMN ul_agent_withdrawal_pending.location IS '國家/城市'; COMMENT ON COLUMN ul_agent_withdrawal_pending.create_time IS '建立時間'; COMMENT ON COLUMN ul_agent_withdrawal_pending.update_time IS '更新時間'; create table IF NOT EXISTS ul_agent_withdrawal_sequence ( ul_agent_id integer not null primary key, sequence integer not null, create_time timestamp default clock_timestamp(), update_time timestamp default clock_timestamp() ); COMMENT ON TABLE ul_agent_withdrawal_sequence IS '代理提款序列號'; COMMENT ON COLUMN ul_agent_withdrawal_sequence.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_withdrawal_sequence.sequence IS '提款序號'; COMMENT ON COLUMN ul_agent_withdrawal_sequence.create_time IS '建立時間'; COMMENT ON COLUMN ul_agent_withdrawal_sequence.update_time IS '更新時間'; ``` * dml ```=sql= <entry key="ul_agent_withdrawal_pending_data_move_to_ul_agent_withdrawal_by_withdrawal_id"> WITH del AS ( DELETE FROM ul_agent_withdrawal_pending WHERE withdrawal_id = :withdrawalId AND status = :ulAgentWithdrawalProcessingStatus AND auditor = :auditor RETURNING * ) INSERT INTO ul_agent_withdrawal(withdrawal_id, ul_agent_id, ul_agent_account, ul_agent_level, payments_info_id, withdrawal_amt, after_balance, sequence, withdrawal_time, audit_time, auditor, approve_reason, remarks, decline_reason, status, bank_payment_type, paid_amt, external_id, caccount_id, bank_account_info, bank_id, agent_remarks, ip, location, create_time, update_time) SELECT withdrawal_id, ul_agent_id, ul_agent_account, ul_agent_level, payments_info_id, withdrawal_amt, after_balance, :sequence, withdrawal_time, CLOCK_TIMESTAMP(), :auditor, :approveReason, :remarks, :declineReason, :status, bank_payment_type, :paidAmt, external_id, :caccountId, bank_account_info, bank_id, agent_remarks, ip, location, create_time, CLOCK_TIMESTAMP() FROM del </entry> <entry key="ul_agent_withdrawal_pending_status_update_by_withdrawal_id"> UPDATE ul_agent_withdrawal_pending SET status = :status, auditor = :auditor, update_time = CLOCK_TIMESTAMP() WHERE withdrawal_id = :withdrawalId AND status = CASE WHEN :status = :ulAgentWithdrawalPendingStatus THEN :ulAgentWithdrawalProcessingStatus ELSE :ulAgentWithdrawalPendingStatus END AND CASE WHEN :status = :ulAgentWithdrawalPendingStatus THEN auditor = :updateBy ELSE auditor IS NULL END </entry> <entry key="ul_agent_withdrawal_sequence_upsert_by_ul_agent_id"> INSERT INTO ul_agent_withdrawal_sequence as us (ul_agent_id, sequence) VALUES(:ulAgentId, 1) ON CONFLICT (ul_agent_id) DO UPDATE SET sequence = us.sequence + 1, update_time = CLOCK_TIMESTAMP() RETURNING sequence; </entry> <entry key="ul_agent_wallet_query_by_ul_agent_id"> SELECT ul_agent_id as ulAgentId, balance, pending_balance as pendingBalance FROM ul_agent_wallet WHERE ul_agent_id = :ulAgentId; </entry> <entry key="ul_agent_withdrawal_pending_query_by_withdrawal_id"> SELECT withdrawal_id as withdrawalId, ul_agent_id as ulAgentId, ul_agent_account as ulAgentAccount, ul_agent_level as ulAgentLevel, payments_info_id as paymentsInfoId, withdrawal_amt as withdrawalAmt, after_balance as afterBalance, withdrawal_time as withdrawalTime, audit_time as auditTime, auditor, remarks, status, bank_payment_type as bankPaymentType, paid_amt as paidAmt, external_id as externalId, caccount_id as caccountId, bank_account_info as bankAccountInfo, bank_id as bankId, agent_remarks as agentRemarks, ip, location, create_time as createTime, update_time as updateTime FROM ul_agent_withdrawal_pending WHERE withdrawal_id = :withdrawalId; </entry> <entry key="ul_agent_wallet_update_by_approve_by_ul_agent_id"> UPDATE ul_agent_wallet uw SET balance = balance - uw.pending_balance, pending_balance = pending_balance - uw.pending_balance WHERE ul_agent_id = :ulAgentId AND balance = :balance AND pending_balance = :pendingBalance; </entry> <entry key="ul_agent_wallet_update_by_reject_by_ul_agent_id"> UPDATE ul_agent_wallet uw SET pending_balance = pending_balance - uw.pending_balance WHERE ul_agent_id = :ulAgentId AND balance = :balance AND pending_balance = :pendingBalance; </entry> <entry key="ul_agent_withdrawal_pending_agent_remarks_update_by_withdrawal_id"> UPDATE ul_agent_withdrawal_pending SET agent_remarks = :agentRemarks WHERE withdrawal_id = :withdrawalId </entry> <entry key="ul_agent_withdrawal_pending_insert"> INSERT INTO public.ul_agent_withdrawal_pending (ul_agent_id, ul_agent_account, ul_agent_level, payments_info_id, withdrawal_amt, withdrawal_time, status, bank_account_info, bank_id, ip, "location") VALUES(:ulAgentId, :ulAgentAccount, :ulAgentLevel, :paymentsInfoId, :withdrawalAmt, CLOCK_TIMESTAMP(), :status, CAST(:bankAccountInfo AS jsonb), :bankId, :ip, :location); </entry> ``` ```=sql= <entry key="ul_agent_withdrawal_pending_find"> SELECT w.withdrawal_id AS withdrawalId, w.ul_agent_id AS ulAgentId, w.ul_agent_account AS ulAgentAccount, w.ul_agent_level AS ulAgentLevel, w.payments_info_id AS paymentsInfoId, w.withdrawal_amt AS withdrawalAmt, w.after_balance AS afterBalance, w.withdrawal_time AS withdrawalTime, w.audit_time AS auditTime, w.auditor AS auditor, w.remarks AS remarks, w.status AS status, w.bank_payment_type AS bankPaymentType, w.paid_amt AS paidAmt, w.external_id AS externalId, w.caccount_id AS caccountId, w.bank_account_info AS bankAccountInfo, w.bank_account_info->>'bankAccountName' AS bankAccountName, w.bank_id AS bankId, w.agent_remarks AS agentRemarks, w.ip AS ip, w.location AS location, w.create_time AS createTime, w.update_time AS updateTime, CASE WHEN :lang = :sclanguage THEN b.banknamesc WHEN :lang = :tclanguage THEN b.banknametc ELSE b.banknameen END AS bankname FROM ul_agent_withdrawal_pending w LEFT JOIN bank b ON w.bank_id = b.bankid WHERE (CAST(:searchField AS varchar) IS NULL OR CAST(:searchValue AS varchar) IS NULL OR (CASE WHEN :searchField = 'UL_AGENT_ACCOUNT' THEN w.ul_agent_account = :searchValue WHEN :searchField = 'AUDITOR' THEN w.auditor = :searchValue WHEN :searchField = 'BANK_NAME' THEN (CASE WHEN :lang = :sclanguage THEN b.banknamesc WHEN :lang = :tclanguage THEN b.banknametc ELSE b.banknameen END) = :searchValue WHEN :searchField = 'WITHDRAWAL_ID' THEN w.withdrawal_id = :searchValue WHEN :searchField = 'EXTERNAL_ID' THEN w.external_id = :searchValue END)) AND (CASE WHEN :timeFilter = 'WITHDRAWAL_TIME' THEN w.withdrawal_time >= :startTime AND :endTime >= w.withdrawal_time WHEN :timeFilter = 'AUDIT_TIME' THEN w.audit_time >= :startTime AND :endTime >= w.audit_time END) AND (CAST(:status AS varchar) IS NULL OR w.status = :status) ORDER BY (CASE WHEN :sort='DESC' AND :sortColumn='WITHDRAWAL_TIME' THEN w.withdrawal_time END) DESC, (CASE WHEN :sort='ASC' AND :sortColumn='WITHDRAWAL_TIME' THEN w.withdrawal_time END) ASC OFFSET :offset LIMIT :limit </entry> <entry key="ul_agent_withdrawal_pending_count"> SELECT COUNT(1) FROM ul_agent_withdrawal_pending w LEFT JOIN bank b ON w.bank_id = b.bankid WHERE (CAST(:searchField AS varchar) IS NULL OR CAST(:searchValue AS varchar) IS NULL OR (CASE WHEN :searchField = 'UL_AGENT_ACCOUNT' THEN w.ul_agent_account = :searchValue WHEN :searchField = 'AUDITOR' THEN w.auditor = :searchValue WHEN :searchField = 'BANK_NAME' THEN (CASE WHEN :lang = :sclanguage THEN b.banknamesc WHEN :lang = :tclanguage THEN b.banknametc ELSE b.banknameen END) = :searchValue WHEN :searchField = 'WITHDRAWAL_ID' THEN w.withdrawal_id = :searchValue WHEN :searchField = 'EXTERNAL_ID' THEN w.external_id = :searchValue END)) AND (CASE WHEN :timeFilter = 'WITHDRAWAL_TIME' THEN w.withdrawal_time >= :startTime AND :endTime >= w.withdrawal_time WHEN :timeFilter = 'AUDIT_TIME' THEN w.audit_time >= :startTime AND :endTime >= w.audit_time END) AND (CAST(:status AS varchar) IS NULL OR w.status = :status) </entry> ``` ## 提款紀錄 ul_agent_withdrawal * table ```=sql= create table IF NOT EXISTS ul_agent_withdrawal ( withdrawal_id VARCHAR NOT NULL primary key, ul_agent_id integer not null, ul_agent_account varchar not null, ul_agent_level integer not null, payments_info_id uuid, withdrawal_amt numeric(23, 6) not null, after_balance numeric(23, 6), sequence integer, withdrawal_time timestamp not null, audit_time timestamp, auditor varchar, approve_reason varchar, remarks varchar, decline_reason varchar, status varchar not null, bank_payment_type integer, paid_amt numeric(23, 6), external_id varchar unique, caccount_id uuid, bank_account_info jsonb, bank_id uuid, agent_remarks varchar, ip varchar not null, location varchar not null, create_time timestamp default clock_timestamp(), update_time timestamp default clock_timestamp() ); COMMENT ON TABLE ul_agent_withdrawal IS '代理提款記錄'; COMMENT ON COLUMN ul_agent_withdrawal.withdrawal_id IS '提款訂單號'; COMMENT ON COLUMN ul_agent_withdrawal.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_withdrawal.ul_agent_account IS '代理帳號'; COMMENT ON COLUMN ul_agent_withdrawal.ul_agent_level IS '代理層級'; COMMENT ON COLUMN ul_agent_withdrawal.payments_info_id IS '代理取款銀行卡編號'; COMMENT ON COLUMN ul_agent_withdrawal.withdrawal_amt IS '出款金额'; COMMENT ON COLUMN ul_agent_withdrawal.after_balance IS '帐户余额'; COMMENT ON COLUMN ul_agent_withdrawal.sequence IS '代理出款順序,如首次出款/二次出款'; COMMENT ON COLUMN ul_agent_withdrawal.withdrawal_time IS '提款申請時間'; COMMENT ON COLUMN ul_agent_withdrawal.audit_time IS '審核時間'; COMMENT ON COLUMN ul_agent_withdrawal.auditor IS '審核者'; COMMENT ON COLUMN ul_agent_withdrawal.approve_reason IS '批准理由'; COMMENT ON COLUMN ul_agent_withdrawal.remarks IS '後台備註'; COMMENT ON COLUMN ul_agent_withdrawal.decline_reason IS '拒絕理由'; COMMENT ON COLUMN ul_agent_withdrawal.status IS '狀態(UlAgentWithdrawalStatus):REJECTED, APPROVED'; COMMENT ON COLUMN ul_agent_withdrawal.bank_payment_type IS '提款方式(Enum:BankPaymentType):BANK(1)'; COMMENT ON COLUMN ul_agent_withdrawal.paid_amt IS '實際支付'; COMMENT ON COLUMN ul_agent_withdrawal.external_id IS '第三方订单号'; COMMENT ON COLUMN ul_agent_withdrawal.caccount_id IS '公司出款帳戶'; COMMENT ON COLUMN ul_agent_withdrawal.bank_account_info IS '銀行資料(含銀行姓名)'; COMMENT ON COLUMN ul_agent_withdrawal.bank_id IS '銀行代碼'; COMMENT ON COLUMN ul_agent_withdrawal.agent_remarks IS '代理備註'; COMMENT ON COLUMN ul_agent_withdrawal.ip IS 'IP'; COMMENT ON COLUMN ul_agent_withdrawal.location IS '國家/城市'; COMMENT ON COLUMN ul_agent_withdrawal.create_time IS '建立時間'; COMMENT ON COLUMN ul_agent_withdrawal.update_time IS '更新時間'; create index IF NOT EXISTS idx_ul_agent_withdrawal_audit_time on ul_agent_withdrawal (audit_time); create index IF NOT EXISTS idx_ul_agent_withdrawal_status_withdrawal_time on ul_agent_withdrawal (status, withdrawal_time); create index IF NOT EXISTS idx_ul_agent_withdrawal_create_time on ul_agent_withdrawal (create_time); create index IF NOT EXISTS idx_ul_agent_withdrawal_ul_agent_account on ul_agent_withdrawal (ul_agent_account); ``` * dml ```=sql= <entry key="ul_agent_withdrawal_agent_remarks_update_by_withdrawal_id"> UPDATE ul_agent_withdrawal SET agent_remarks = :agentRemarks WHERE withdrawal_id = :withdrawalId </entry> ``` ## 提款紀錄查詢 ```=sql= <entry key="ul_agent_wallet_find"> SELECT balance-pending_balance AS balance,point,pin,pin_update_time AS pinUpdateTime FROM ul_agent_wallet uaw JOIN ul_agent ua ON uaw.ul_agent_id =ua.id WHERE ul_agent_id =:ulAgentId </entry> <entry key="ul_agent_find_agentId_and_pin"> SELECT * FROM ul_agent WHERE id=:ulAgentId AND pin=:pin </entry> <entry key="ul_agent_withdrawal_pending_exist"> SELECT EXISTS(SELECT 1 FROM ul_agent_withdrawal_pending WHERE ul_agent_id=:ulAgentId) </entry> <entry key="ul_agentSite_withdrawal_find"> SELECT * FROM( SELECT w.withdrawal_id AS withdrawalId, w.withdrawal_amt AS withdrawalAmt, w.withdrawal_time AS withdrawalTime, w.audit_time AS auditTime, w.remarks AS remarks, w.status AS status FROM ul_agent_withdrawal w WHERE ul_agent_id = :ulAgentId AND w.withdrawal_time >= :start AND :end > w.withdrawal_time UNION ALL SELECT wp.withdrawal_id AS withdrawalId, wp.withdrawal_amt AS withdrawalAmt, wp.withdrawal_time AS withdrawalTime, wp.audit_time AS auditTime, wp.remarks AS remarks, wp.status AS status FROM ul_agent_withdrawal_pending wp WHERE ul_agent_id = :ulAgentId AND wp.withdrawal_time >= :start AND :end > wp.withdrawal_time ) wwp ORDER BY status = 'PENDING' desc,withdrawalTime DESC OFFSET :offset LIMIT :limit; </entry> <entry key="ul_agentSite_withdrawal_count"> SELECT COUNT(1) FROM ( SELECT w.withdrawal_id AS withdrawalId FROM ul_agent_withdrawal w WHERE ul_agent_id = :ulAgentId AND w.withdrawal_time >= :start AND :end > w.withdrawal_time UNION ALL SELECT wp.withdrawal_id AS withdrawalId FROM ul_agent_withdrawal_pending wp WHERE ul_agent_id = :ulAgentId AND wp.withdrawal_time >= :start AND :end > wp.withdrawal_time ) wwp; </entry> ``` ```=sql= <entry key="ul_agent_withdrawal_find"> SELECT w.withdrawal_id AS withdrawalId, w.ul_agent_id AS ulAgentId, w.ul_agent_account AS ulAgentAccount, w.ul_agent_level AS ulAgentLevel, w.payments_info_id AS paymentsInfoId, w.withdrawal_amt AS withdrawalAmt, w.after_balance AS afterBalance, w.sequence AS sequence, w.withdrawal_time AS withdrawalTime, w.audit_time AS auditTime, w.auditor AS auditor, w.approve_reason AS approveReason, w.remarks AS remarks, w.decline_reason AS declineReason, w.status AS status, w.bank_payment_type AS bankPaymentType, w.paid_amt AS paidAmt, w.external_id AS externalId, w.caccount_id AS caccountId, w.bank_account_info AS bankAccountInfo, w.bank_id AS bankId, w.agent_remarks AS agentRemarks, w.ip AS ip, w.location AS location, w.create_time AS createTime, w.update_time AS updateTime, CASE WHEN :lang = :sclanguage THEN b.banknamesc WHEN :lang = :tclanguage THEN b.banknametc ELSE b.banknameen END AS bankname FROM ul_agent_withdrawal w LEFT JOIN bank b ON w.bank_id = b.bankid WHERE (CAST(:searchField AS varchar) IS NULL OR CAST(:searchValue AS varchar) IS NULL OR (CASE WHEN :searchField = 'UL_AGENT_ACCOUNT' THEN w.ul_agent_account = :searchValue WHEN :searchField = 'AUDITOR' THEN w.auditor = :searchValue WHEN :searchField = 'BANK_NAME' THEN (CASE WHEN :lang = :sclanguage THEN b.banknamesc WHEN :lang = :tclanguage THEN b.banknametc ELSE b.banknameen END) = :searchValue WHEN :searchField = 'WITHDRAWAL_ID' THEN w.withdrawal_id = :searchValue WHEN :searchField = 'EXTERNAL_ID' THEN w.external_id = :searchValue END)) AND (CASE WHEN :timeFilter = 'WITHDRAWAL_TIME' THEN w.withdrawal_time >= :startTime AND :endTime >= w.withdrawal_time WHEN :timeFilter = 'AUDIT_TIME' THEN w.audit_time >= :startTime AND :endTime >= audit_time END) AND (CAST(:status AS varchar) IS NULL OR w.status = :status) AND (:sequence = 0 OR sequence = :sequence) ORDER BY (CASE WHEN :sort='DESC' AND :sortColumn='WITHDRAWAL_TIME' THEN w.withdrawal_time END) DESC, (CASE WHEN :sort='ASC' AND :sortColumn='WITHDRAWAL_TIME' THEN w.withdrawal_time END) ASC OFFSET :offset LIMIT :limit </entry> <entry key="ul_agent_withdrawal_count"> SELECT COUNT(1) FROM ul_agent_withdrawal w LEFT JOIN bank b ON w.bank_id = b.bankid WHERE (CAST(:searchField AS varchar) IS NULL OR CAST(:searchValue AS varchar) IS NULL OR (CASE WHEN :searchField = 'UL_AGENT_ACCOUNT' THEN w.ul_agent_account = :searchValue WHEN :searchField = 'AUDITOR' THEN w.auditor = :searchValue WHEN :searchField = 'BANK_NAME' THEN (CASE WHEN :lang = :sclanguage THEN b.banknamesc WHEN :lang = :tclanguage THEN b.banknametc ELSE b.banknameen END) = :searchValue WHEN :searchField = 'WITHDRAWAL_ID' THEN w.withdrawal_id = :searchValue WHEN :searchField = 'EXTERNAL_ID' THEN w.external_id = :searchValue END)) AND (CASE WHEN :timeFilter = 'WITHDRAWAL_TIME' THEN w.withdrawal_time >= :startTime AND :endTime >= w.withdrawal_time WHEN :timeFilter = 'AUDIT_TIME' THEN w.audit_time >= :startTime AND :endTime >= audit_time END) AND (CAST(:status AS varchar) IS NULL OR w.status = :status) AND (:sequence = 0 OR sequence = :sequence) </entry> ``` ## 提款操作紀錄ul_agent_withdrawal_action_log * table ```=sql= -- VIP-1800 [BE][IMS][GET] 提款操作記錄 create table IF NOT EXISTS ul_agent_withdrawal_action_log ( log_id uuid default uuid_generate_v4() not null primary key, withdrawal_id varchar not null, withdrawal_status varchar not null, withdrawal_action varchar not null, action_detail jsonb, creator varchar not null, creator_ip varchar not null, create_time timestamp default clock_timestamp() ); COMMENT ON TABLE ul_agent_withdrawal_action_log IS '提款操作記錄'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.log_id IS '操作紀錄單號'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.withdrawal_id IS '提款訂單號'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.withdrawal_status IS '狀態(Enum:UlAgentWithdrawalStatus)'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.withdrawal_action IS '行為(Enum:UlAgentWithdrawalActionLogType)'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.action_detail IS '操作細節'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.creator IS '操作人員帳號'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.creator_ip IS '操作人員IP'; COMMENT ON COLUMN ul_agent_withdrawal_action_log.create_time IS '建立時間'; create index IF NOT EXISTS idx_ul_agent_withdrawal_action_log_ul_agent_withdrawal_id on ul_agent_withdrawal_action_log (withdrawal_id); ``` * dml ```=sql= <entry key="ul_agent_withdrawal_action_log_save"> INSERT INTO ul_agent_withdrawal_action_log (withdrawal_id, withdrawal_status, withdrawal_action, action_detail, creator, creator_ip) VALUES (:withdrawalId, :withdrawalStatus, :withdrawalAction, CAST(:actionDetail AS JSONB), :creator, :creatorIp) </entry> <entry key="ul_agent_withdrawal_actionlog_find"> SELECT log_id AS logId, withdrawal_id AS withdrawalId, withdrawal_status AS withdrawalStatus, withdrawal_action AS withdrawalAction, action_detail AS actionDetail, creator AS creator, creator_ip AS creatorIp, create_time AS createTime FROM ul_agent_withdrawal_action_log WHERE withdrawal_id = :withdrawalId ORDER BY (CASE WHEN :sort='DESC' AND :sortColumn='CREATE_TIME' THEN create_time END) DESC, (CASE WHEN :sort='ASC' AND :sortColumn='CREATE_TIME' THEN create_time END) ASC </entry> ``` ## 佣金紀錄 ul_agent_commission, ul_agent_commission_pending * table ```=sql= -- VIP-1803 [BE][AGENT][GET] 佣金纪录 create table IF NOT EXISTS ul_agent_wallet ( ul_agent_id integer not null primary key, balance numeric(23, 6) default 0.000000 not null, pending_balance numeric(23, 6) default 0.000000 not null ); COMMENT ON TABLE ul_agent_wallet IS '代理錢包'; COMMENT ON COLUMN ul_agent_wallet.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_wallet.balance IS '總餘額'; COMMENT ON COLUMN ul_agent_wallet.pending_balance IS '待扣餘額,balance-pending_balance = available_balance'; create table if not exists ul_agent_commission ( commission_id uuid default uuid_generate_v4() not null primary key, settlement_id varchar not null, ul_agent_id integer not null, ul_agent_account varchar not null, ul_agent_level integer not null, start_time timestamp with time zone not null, end_time timestamp with time zone not null, agent_revenue numeric not null, actual_rebate numeric not null, status varchar not null, settlement_type varchar not null, create_time timestamp with time zone default now(), update_time timestamp with time zone, UNIQUE INDEX (settlement_id, ul_agent_id) ); COMMENT ON TABLE ul_agent_commission IS '佣金紀錄'; COMMENT ON COLUMN ul_agent_commission.commission_id IS '佣金編號'; COMMENT ON COLUMN ul_agent_commission.settlement_id IS '返佣結算編號'; COMMENT ON COLUMN ul_agent_commission.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_commission.ul_agent_account IS '代理帳號'; COMMENT ON COLUMN ul_agent_commission.ul_agent_level IS '代理層級'; COMMENT ON COLUMN ul_agent_commission.start_time IS '結算開始時間'; COMMENT ON COLUMN ul_agent_commission.end_time IS '結算結束時間'; COMMENT ON COLUMN ul_agent_commission.agent_revenue IS '毛返佣 會跟前一筆未審核的資料疊加,與舊代理反佣結算一樣'; COMMENT ON COLUMN ul_agent_commission.actual_rebate IS '實際反佣'; COMMENT ON COLUMN ul_agent_commission.status IS '反佣狀態(Enum:UlAgentSettlementStatus):APPROVAL, REJECTED'; COMMENT ON COLUMN ul_agent_commission.settlement_type IS '结算周期(Enum:UlAgentSettlementType):DAILY, WEEKLY, MONTHLY'; COMMENT ON COLUMN ul_agent_commission.create_time IS '建立時間'; COMMENT ON COLUMN ul_agent_commission.update_time IS '更新時間'; create table if not exists ul_agent_commission_pending ( commission_pending_id uuid default uuid_generate_v4() not null primary key, settlement_id varchar not null, ul_agent_id integer not null, ul_agent_account varchar not null, ul_agent_level integer not null, start_time timestamp with time zone not null, end_time timestamp with time zone not null, agent_revenue numeric not null, actual_rebate numeric not null, settlement_type varchar not null, create_time timestamp with time zone default now(), update_time timestamp with time zone, UNIQUE INDEX (settlement_id, ul_agent_id) ); COMMENT ON TABLE ul_agent_commission_pending IS '佣金待審核紀錄'; COMMENT ON COLUMN ul_agent_commission_pending.commission_pending_id IS '返佣待審核編號'; COMMENT ON COLUMN ul_agent_commission_pending.settlement_id IS '返佣結算編號'; COMMENT ON COLUMN ul_agent_commission_pending.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_commission_pending.ul_agent_account IS '代理帳號'; COMMENT ON COLUMN ul_agent_commission_pending.ul_agent_level IS '代理層級'; COMMENT ON COLUMN ul_agent_commission_pending.start_time IS '結算開始時間'; COMMENT ON COLUMN ul_agent_commission_pending.end_time IS '結算結束時間'; COMMENT ON COLUMN ul_agent_commission_pending.agent_revenue IS '毛返佣 會跟前一筆未審核的資料疊加,與舊代理反佣結算一樣'; COMMENT ON COLUMN ul_agent_commission_pending.actual_rebate IS '實際反佣'; COMMENT ON COLUMN ul_agent_commission_pending.settlement_type IS '结算周期(Enum:UlAgentSettlementType):DAILY, WEEKLY, MONTHLY'; COMMENT ON COLUMN ul_agent_commission_pending.create_time IS '建立時間'; COMMENT ON COLUMN ul_agent_commission_pending.update_time IS '更新時間'; create table IF NOT EXISTS ul_agent_commission_audit ( audit_id uuid default public.uuid_generate_v4() not null primary key, settlement_id varchar not null, ul_agent_id integer not null, origin_amt numeric, after_amt numeric, remark varchar, create_time timestamp default clock_timestamp(), creator varchar not null ); COMMENT ON TABLE ul_agent_commission_audit IS '實際返佣編輯歷史'; COMMENT ON COLUMN ul_agent_commission_audit.audit_id IS '編輯歷史編號'; COMMENT ON COLUMN ul_agent_commission_audit.settlement_id IS '返佣結算編號'; COMMENT ON COLUMN ul_agent_commission_audit.ul_agent_id IS '代理編號'; COMMENT ON COLUMN ul_agent_commission_audit.origin_amt IS '原本金額'; COMMENT ON COLUMN ul_agent_commission_audit.after_amt IS '修改後金額'; COMMENT ON COLUMN ul_agent_commission_audit.remark IS '備註'; COMMENT ON COLUMN ul_agent_commission_audit.create_time IS '建立時間'; COMMENT ON COLUMN ul_agent_commission_audit.creator IS '建立人員'; ``` * dml ```=sql= <entry key="ul_agent_commission_pending_delete"> DELETE FROM ul_agent_commission_pending WHERE settlement_id = :settlement_id AND settlement_type = :settlementType </entry> <entry key="ul_agent_commission_pending_insert"> INSERT INTO public.ul_agent_commission_pending (settlement_id, ul_agent_id, ul_agent_account, ul_agent_level, start_time, end_time, agent_revenue, actual_rebate, settlement_type, create_time, update_time) VALUES (:settlementId, :ulAgentId, :ulAgentAccount, :ulAgentLevel, :startTime, :endTime, :agentRevenue, :actualRebate, :settlementType, CLOCK_TIMESTAMP(), CLOCK_TIMESTAMP()); </entry> <entry key="ul_agent_commission_pending_find_by_ul_agent_id"> SELECT commission_pending_id AS commissionPendingId, settlement_id AS settlementId, ul_agent_id AS ulAgentId, ul_agent_account AS ulAgentAccount, ul_agent_level AS ulAgentLevel, start_time AS startTime, end_time AS endTime, agent_revenue AS agentRevenue, actual_rebate AS actualRebate, settlement_type AS settlementType, create_time AS createTime, update_time AS updateTime FROM ul_agent_commission_pending WHERE ul_agent_id = :agentId ORDER BY settlement_id DESC </entry> <entry key="ul_agent_commission_pending_find_by_ul_agent_id_find_one"> SELECT commission_pending_id AS commissionPendingId, settlement_id AS settlementId, ul_agent_id AS ulAgentId, ul_agent_account AS ulAgentAccount, ul_agent_level AS ulAgentLevel, start_time AS startTime, end_time AS endTime, agent_revenue AS agentRevenue, actual_rebate AS actualRebate, settlement_type AS settlementType, create_time AS createTime, update_time AS update_time FROM ul_agent_commission_pending WHERE ul_agent_id = :agentId ORDER BY settlement_id DESC LIMIT 1 </entry> <entry key="ul_agent_commission_find_by_start_time_end_time_settlement_type"> SELECT COUNT(1) from ul_agent_commission WHERE end_time > :startTime AND :endTime > start_time AND settlement_type = :type </entry> <entry key="ul_agent_commission_pending_delete_by_commission_pending_id"> DELETE FROM ul_agent_commission_pending WHERE commission_pending_id = ANY (:commissionPendingId) </entry> <entry key="ul_agent_commission_insert"> INSERT INTO public.ul_agent_commission (commission_id, settlement_id, ul_agent_id, ul_agent_account, ul_agent_level, start_time, end_time, agent_revenue, actual_rebate, status, settlement_type, create_time, update_time) VALUES (:commissionId, :settlementId, :ulAgentId, :ulAgentAccount, :ulAgentLevel, :startTime, :endTime, :agentRevenue, :actualRebate, :status, :settlementType, :createTime, CLOCK_TIMESTAMP()) </entry> <entry key="ul_agent_wallet_upsert_by_ul_agent_id"> INSERT INTO public.ul_agent_wallet (ul_agent_id, balance, pending_balance) VALUES (:ulAgentId, :balance, :pendingBalance) ON CONFLICT (ul_agent_id) DO UPDATE SET balance = ul_agent_wallet.balance + :balance </entry> <entry key="ul_agent_commission_audit_select_by_ul_agent_id_settlement_id"> SELECT audit_id AS auditId, settlement_id AS settlementId, ul_agent_id AS ulAgentId, origin_amt AS originAmt, after_amt AS afterAmt, remark AS remark, create_time AS createTime, creator AS creator FROM ul_agent_commission_audit WHERE ul_agent_id = :ulAgentId AND settlement_id = :settlementId ORDER BY create_time DESC </entry> <entry key="ul_agent_commission_pending_update_by_commission_pending_id"> UPDATE ul_agent_commission_pending SET actual_rebate = :actualRebate, update_time = CLOCK_TIMESTAMP() WHERE commission_pending_id = :commissionPendingId </entry> <entry key="ul_agent_commission_audit_insert"> INSERT INTO public.ul_agent_commission_audit (settlement_id, ul_agent_id, origin_amt, after_amt, remark, create_time, creator) VALUES (:settlementId, :ulAgentId, :originAmt, :afterAmt, :remark, CLOCK_TIMESTAMP(), :creator) </entry> ``` ## 佣金記錄查詢類 ```=sql= <entry key="ul_agent_commission_pending_find_lastest"> SELECT ul_agent_account AS account,ul_agent_level AS level,start_time AS start,end_time AS end,agent_revenue AS revenue,actual_rebate AS rebate,'PENDING' AS status,ul_agent_id AS ulAgentId,settlement_id AS settlementId FROM ul_agent_commission_pending WHERE ul_agent_id=:ulAgentId ORDER BY settlement_id DESC LIMIT 1 </entry> <entry key="ul_agent_commission_find"> SELECT * FROM (SELECT ul_agent_account AS account,ul_agent_level AS level,start_time AS start,end_time AS end, agent_revenue AS revenue,actual_rebate AS rebate,status,ul_agent_id AS ulAgentId,settlement_id AS settlementId, settlement_type as settlementType, ul_agent_level as ulAgentLevel, ul_agent_account as ulAgentAccount FROM ul_agent_commission WHERE end_time > :start AND :end > start_time UNION ALL SELECT ul_agent_account AS account,ul_agent_level AS level,start_time AS start,end_time AS end, agent_revenue AS revenue,actual_rebate AS rebate,'PENDING',ul_agent_id AS ulAgentId,settlement_id AS settlementId, settlement_type as settlementType, ul_agent_level as ulAgentLevel, ul_agent_account as ulAgentAccount FROM ul_agent_commission_pending WHERE end_time > :start AND :end > start_time ) foo WHERE (CAST (:status AS VARCHAR) IS NULL OR status = :status) AND settlementType = :settlementType AND (CAST (:agentLevel AS INTEGER) = 0 OR ulAgentLevel = :agentLevel) AND (CAST (:agentAccount AS VARCHAR) IS NULL OR ulAgentAccount = :agentAccount) ORDER BY ulAgentId,array_position(array['PENDING','APPROVAL','REJECTED'], ''||status),settlementId DESC OFFSET :offset LIMIT :limit </entry> <entry key="ul_agent_commission_find_all"> SELECT * FROM (SELECT ul_agent_account AS account,ul_agent_level AS level,start_time AS start,end_time AS end, agent_revenue AS revenue,actual_rebate AS rebate,status,ul_agent_id AS ulAgentId,settlement_id AS settlementId, settlement_type as settlementType, ul_agent_level as ulAgentLevel, ul_agent_account as ulAgentAccount FROM ul_agent_commission WHERE end_time > :start AND :end > start_time UNION ALL SELECT ul_agent_account AS account,ul_agent_level AS level,start_time AS start,end_time AS end, agent_revenue AS revenue,actual_rebate AS rebate,'PENDING',ul_agent_id AS ulAgentId,settlement_id AS settlementId, settlement_type as settlementType, ul_agent_level as ulAgentLevel, ul_agent_account as ulAgentAccount FROM ul_agent_commission_pending WHERE end_time > :start AND :end > start_time ) foo WHERE (CAST (:status AS VARCHAR) IS NULL OR status = :status) AND settlementType = :settlementType AND (CAST (:agentLevel AS INTEGER) = 0 OR ulAgentLevel = :agentLevel) AND (CAST (:agentAccount AS VARCHAR) IS NULL OR ulAgentAccount = :agentAccount) ORDER BY ulAgentId,array_position(array['PENDING','APPROVAL','REJECTED'], ''||status),settlementId DESC </entry> <entry key="ul_agent_commission_count"> SELECT COUNT(1) FROM (SELECT ul_agent_account,ul_agent_level,start_time,end_time,agent_revenue, actual_rebate,status,ul_agent_id,settlement_id,create_time,settlement_type FROM ul_agent_commission WHERE end_time > :start AND :end > start_time UNION ALL SELECT ul_agent_account,ul_agent_level,start_time,end_time,agent_revenue, actual_rebate,'PENDING',ul_agent_id,settlement_id,create_time,settlement_type FROM ul_agent_commission_pending WHERE end_time > :start AND :end > start_time ) foo WHERE (CAST (:status AS VARCHAR) IS NULL OR status = :status) AND settlement_type = :settlementType AND (CAST (:agentLevel AS INTEGER) = 0 OR ul_agent_level = :agentLevel) AND (CAST (:agentAccount AS VARCHAR) IS NULL OR ul_agent_account = :agentAccount) </entry> <entry key="ul_agent_commission_agentview_find"> SELECT * FROM (SELECT start_time AS start,end_time AS end,actual_rebate AS rebate,status,ul_agent_id AS ulAgentId,settlement_id AS settlementId FROM ul_agent_commission WHERE (end_time > :start AND :end > start_time) AND ul_agent_id=:agentId UNION ALL SELECT start_time AS start,end_time AS end,actual_rebate AS rebate,'PENDING',ul_agent_id AS ulAgentId,settlement_id AS settlementId FROM ul_agent_commission_pending WHERE (end_time > :start AND :end > start_time) AND ul_agent_id=:agentId ) foo ORDER BY array_position(array['PENDING','APPROVAL','REJECTED'], ''||status),settlementId DESC OFFSET :offset LIMIT :limit </entry> <entry key="ul_agent_commission_agentview_count"> SELECT COUNT(1) FROM (SELECT start_time,end_time,actual_rebate AS rebate,status,ul_agent_id AS ulAgentId,settlement_id AS settlementId FROM ul_agent_commission WHERE (end_time > :start AND :end > start_time) AND ul_agent_id=:agentId UNION ALL SELECT start_time,end_time,actual_rebate AS rebate,'PENDING',ul_agent_id AS ulAgentId,settlement_id AS settlementId FROM ul_agent_commission_pending WHERE (end_time > :start AND :end > start_time) AND ul_agent_id=:agentId ) foo </entry> ```