import { buildTamRequestPayload, tamRequest, type TamRequestPayload, type TamResponse, } from '@/api/tam' import { useAppStore } from '@/stores/app' export type RmbForecastRecord = { /** 业务类型,用于映射列表中的业务名称。 */ busiType?: string /** 客户名称,客户类型为空时作为展示兜底。 */ clientName?: string /** 客户类型,用于映射列表中的客户类型文案。 */ clientType?: string /** 交易对手名称,客户名称为空时作为展示兜底。 */ competName?: string /** 落地机构,列表主标题展示字段。 */ groundBranch?: string /** 预报金额,接口按元返回,页面转换为亿元展示。 */ predAmt?: string /** 预报流水号,点击列表进入详情的主键。 */ predRefNo?: string /** 预报状态,用于判断列表状态标签。 */ predStatus?: string /** 交易日期,列表日期展示字段。 */ tranDate?: string /** 核销状态,用于判断列表状态标签。 */ verifyStatus?: string } export type RmbForecastQueryForm = { /** 交易时间,当前视图必填筛选项。 */ tranDate: string /** 落地机构,当前视图按关键字查询。 */ groundBranch?: string /** 起始金额,由金额组件换算为元。 */ startTranAmt?: string /** 截止金额,由金额组件换算为元。 */ endTranAmt?: string } export type RmbForecastCreateBody = { /** 出票日,接口格式为 YYYYMMDD。 */ billDate: string /** 票号。 */ billNo: string /** 业务类型。 */ busiType: string /** 客户名称。 */ clientName: string /** 客户类型。 */ clientType: string /** 交易对手账号。 */ competAcct: string /** 交易对手名称。 */ competName: string /** 客户信息流水号。 */ custInfoSeq: string /** 落地机构,页面提交机构编号。 */ groundBranch: string /** 落地机构名称。 */ groundBranchName: string /** 联系人。 */ linkMan: string /** 支付渠道。 */ payChannel: string /** 收支方向。 */ payDirec: string /** 联系电话。 */ phoneNo: string /** 预报金额,单位为元。 */ predAmt: string /** 预报日期,接口格式为 YYYYMMDD。 */ predDate: string /** 预报人员姓名。 */ predName: string /** 预报机构名称。 */ predOrgName: string /** 用途。 */ purpose: string /** 备注。 */ remark: string /** 交易日期,接口格式为 YYYYMMDD。 */ tranDate: string } export type RmbForecastCreatePayload = { appHead: TamRequestPayload['appHead'] body: RmbForecastCreateBody head: TamRequestPayload['head'] } export type RmbForecastCreateResult = { body: Record head: TamResponse>['head'] } export type RmbForecastUpdateBody = { /** 出票日,接口格式为 YYYYMMDD。 */ billDate: string /** 票号。 */ billNo: string /** 业务类型。 */ busiType: string /** 客户名称。 */ clientName: string /** 客户类型。 */ clientType: string /** 交易对手账号。 */ competAcct: string /** 交易对手名称。 */ competName: string /** 客户信息流水号。 */ custRefSeq: string /** 落地机构。 */ groundBranch: string /** 落地机构名称。 */ groundBranchName: string /** 联系人。 */ linkMan: string /** 支付渠道。 */ payChannel: string /** 收支方向。 */ payDirec: string /** 联系电话。 */ phoneNo: string /** 预报金额,单位为元。 */ predAmt: string /** 预报日期,接口格式为 YYYYMMDD。 */ predDate: string /** 预报流水号。 */ predRefSeq: string /** 用途。 */ purpose: string /** 备注。 */ remark: string /** 交易日期,接口格式为 YYYYMMDD。 */ tranDate: string } export type RmbForecastUpdatePayload = { appHead: TamRequestPayload['appHead'] body: RmbForecastUpdateBody head: TamRequestPayload['head'] } export type RmbForecastUpdateResult = { body: Record head: TamResponse>['head'] } type RmbForecastDeleteBody = { /** 待删除的预报流水号。 */ predRefSeqs: string[] } export type RmbForecastDeletePayload = { appHead: TamRequestPayload['appHead'] body: RmbForecastDeleteBody head: TamRequestPayload['head'] } export type RmbForecastDeleteResult = { body: Record head: TamResponse>['head'] } export type RmbForecastQueryPayload = { appHead: TamRequestPayload['appHead'] body: RmbForecastQueryBody head: TamRequestPayload['head'] } export type RmbForecastQueryResult = { body: RmbForecastQueryResultBody head: TamResponse['head'] } export type RmbForecastDetailPayload = { appHead: TamRequestPayload['appHead'] body: RmbForecastDetailBody head: TamRequestPayload['head'] } export type RmbForecastDetailResult = { body: RmbForecastDetailRecord head: TamResponse['head'] } type RmbForecastQueryBody = { /** 业务类型,当前视图未开放筛选,固定传空。 */ busiType: string /** 客户名称,当前视图未开放筛选,固定传空。 */ clientName: string /** 交易对手名称,当前视图未开放筛选,固定传空。 */ competName: string /** 截止金额,金额组件已转换为元,接口传元级整数字符串。 */ endTransAmt: string /** 落地机构,来自当前视图输入框。 */ groundBranch: string /** 支付渠道,当前视图未开放筛选,固定传空。 */ payChannel: string /** 收支方向,当前视图未开放筛选,固定传空。 */ payDirec: string /** 预报状态,当前视图未开放筛选,固定传空。 */ predStatus: string /** 排序规则,当前视图未开放筛选,固定传空。 */ sortRule: string /** 起始金额,金额组件已转换为元,接口传元级整数字符串。 */ startTransAmt: string /** 交易时间,接口格式为 YYYYMMDD。 */ tranDate: string /** 核销状态,当前视图未开放筛选,固定传空。 */ verifyStatus: string } type RmbForecastQueryResultBody = { resultList: RmbForecastRecord[] totalCount: string } type RmbForecastDetailBody = { /** 预报流水号,详情查询主键。 */ predRefNo: string } export type RmbForecastDetailRecord = { /** 出票日 */ billDate?: string /** 票号 */ billNo?: string /** 业务类型 */ busiType?: string /** 客户名称 */ clientName?: string /** 客户类型 */ clientType?: string /** 客户信息流水号,兼容详情接口实际返回字段。 */ custInfoSeq?: string /** 客户信息流水号,兼容修改接口字段名。 */ custRefSeq?: string /** 交易对手账号 */ competAcct?: string /** 交易对手名称 */ competName?: string /** 额度标志 */ eduFlag?: string /** 落地机构名称 */ groundBranch?: string /** 落地机构代码 */ groundBranchCode?: string /** 联系人 */ linkMan?: string /** 支付渠道 */ payChannel?: string /** 收支方向 */ payDirec?: string /** 联系电话 */ phoneNo?: string /** 预报金额 */ predAmt?: string /** 预报机构 */ predBranch?: string /** 预报机构 */ predBranchName?: string /** 预报人员编号 */ predCode?: string /** 预报日期 */ predDate?: string /** 预报人员姓名 */ predName?: string /** 预报流水号 */ predRefNo?: string /** 预报状态 */ predStatus?: string /** 用途 */ purpose?: string /** 备注 */ remark?: string /** 标准名称 */ standardName?: string /** 交易日期 */ tranDate?: string /** 已核销金额 */ verifyAmt?: string /** 核销状态 */ verifyStatus?: string } type QueryOptions = { form: RmbForecastQueryForm pageIndex: number pageSize: number } const QUERY_TRAN_CODE = '/TAM/0001/140101001' const DETAIL_TRAN_CODE = '/TAM/0001/140101002' const CREATE_TRAN_CODE = '/TAM/0001/120101001' const UPDATE_TRAN_CODE = '/TAM/0001/120101002' const DELETE_TRAN_CODE = '/TAM/0001/120101003' export function buildRmbForecastCreatePayload( form: RmbForecastCreateBody, ): RmbForecastCreatePayload { return buildTamRequestPayload({ tranCode: CREATE_TRAN_CODE, body: { billDate: normalizeDate(form.billDate), billNo: form.billNo.trim(), busiType: form.busiType.trim(), clientName: form.clientName.trim(), clientType: form.clientType.trim(), competAcct: form.competAcct.trim(), competName: form.competName.trim(), custInfoSeq: form.custInfoSeq.trim(), groundBranch: form.groundBranch.trim(), groundBranchName: form.groundBranchName.trim(), linkMan: form.linkMan.trim(), payChannel: form.payChannel.trim(), payDirec: form.payDirec.trim(), phoneNo: form.phoneNo.trim(), predAmt: normalizeCreateAmount(form.predAmt), predDate: normalizeDate(form.predDate), predName: form.predName.trim(), predOrgName: form.predOrgName.trim(), purpose: form.purpose.trim(), remark: form.remark.trim(), tranDate: normalizeDate(form.tranDate), }, }) } export async function createRmbForecast( payload: RmbForecastCreatePayload, ): Promise { return tamRequest>(payload) } export function buildRmbForecastUpdatePayload( predRefSeq: string, form: RmbForecastCreateBody, ): RmbForecastUpdatePayload { return buildTamRequestPayload({ tranCode: UPDATE_TRAN_CODE, body: { billDate: normalizeDate(form.billDate), billNo: form.billNo.trim(), busiType: form.busiType.trim(), clientName: form.clientName.trim(), clientType: form.clientType.trim(), competAcct: form.competAcct.trim(), competName: form.competName.trim(), custRefSeq: form.custInfoSeq.trim(), groundBranch: form.groundBranch.trim(), groundBranchName: form.groundBranchName.trim(), linkMan: form.linkMan.trim(), payChannel: form.payChannel.trim(), payDirec: form.payDirec.trim(), phoneNo: form.phoneNo.trim(), predAmt: normalizeCreateAmount(form.predAmt), predDate: normalizeDate(form.predDate), predRefSeq: predRefSeq.trim(), purpose: form.purpose.trim(), remark: form.remark.trim(), tranDate: normalizeDate(form.tranDate), }, }) } export async function updateRmbForecast( payload: RmbForecastUpdatePayload, ): Promise { return tamRequest>(payload) } export function buildRmbForecastDeletePayload(predRefSeq: string): RmbForecastDeletePayload { return buildTamRequestPayload({ tranCode: DELETE_TRAN_CODE, body: { predRefSeqs: [predRefSeq.trim()], }, }) } export async function deleteRmbForecast( payload: RmbForecastDeletePayload, ): Promise { return tamRequest>(payload) } export function buildRmbForecastQueryPayload({ form, pageIndex, pageSize, }: QueryOptions): RmbForecastQueryPayload { const tranDate = normalizeDate(form.tranDate || useAppStore().systemWorkDate) // 当前视图只提供交易日期、落地机构、起始金额、截止金额,其余查询字段按接口约定传空。 return buildTamRequestPayload({ tranCode: QUERY_TRAN_CODE, pageIndex, pageSize, body: { busiType: '', clientName: '', competName: '', endTransAmt: toRequestAmount(form.endTranAmt), groundBranch: form.groundBranch || '', payChannel: '', payDirec: '', predStatus: '', sortRule: '', // 后端字段名为 TransAmt,保持与交易入参一致。 startTransAmt: toRequestAmount(form.startTranAmt), tranDate, verifyStatus: '', }, }) } export async function queryRmbForecastPage( payload: RmbForecastQueryPayload, ): Promise { return tamRequest(payload) } export function buildRmbForecastDetailPayload(predRefNo: string): RmbForecastDetailPayload { return buildTamRequestPayload({ tranCode: DETAIL_TRAN_CODE, body: { predRefNo, }, }) } export async function queryRmbForecastDetail( payload: RmbForecastDetailPayload, ): Promise { return tamRequest(payload) } function normalizeDate(value: string) { // 日期选择器产出 YYYY-MM-DD;接口需要 YYYYMMDD。 if (/^\d{8}$/.test(value)) return value return value.replaceAll('-', '') } function toRequestAmount(value?: string) { if (!value?.trim()) return '' // MoneyInput 已将页面录入的“万元”换算为元,此处仅规整为接口需要的整数字符串。 const amount = Number(value) return Number.isFinite(amount) ? String(Math.round(amount)) : '' } function normalizeCreateAmount(value: string) { const amount = value.trim().replaceAll(',', '') return /^\d+(?:\.\d+)?$/.test(amount) ? amount : '' }