| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- // 元规则(Meta Rule)字典
- // 每个元规则定义编号、名称、配置字段,并提供 buildDescription / buildParams
- // 用于在规则列表中自动渲染"规则描述"和"规则参数"
- // 规则组类型选项
- export const GROUP_TYPES = [
- { value: 'debitCard', label: '借记卡圈客规则' },
- { value: 'creditCard', label: '信用卡圈客规则' }
- ]
- // 规则逻辑
- export const LOGIC_OPTIONS = [
- { value: 'AND', label: '且(AND)' },
- { value: 'OR', label: '或(OR)' }
- ]
- // 状态
- export const STATUS_OPTIONS = [
- { value: 'draft', label: '新建' },
- { value: 'online', label: '已上线' }
- ]
- // 常用比较运算符(用于 TRB / 余额 / 年龄等数值字段)
- const NUMERIC_OPS = [
- { value: '>', label: '大于 >' },
- { value: '<', label: '小于 <' },
- { value: '=', label: '等于 =' },
- { value: '>=', label: '大于等于 >=' },
- { value: '<=', label: '小于等于 <=' },
- { value: '!=', label: '不等于 !=' }
- ]
- // 日期比较运算符
- const DATE_OPS = [
- { value: '<', label: '在...前' },
- { value: '>', label: '在...后' },
- { value: '=', label: '在...当日' }
- ]
- // 集合运算符
- const SET_OPS = [
- { value: 'in', label: '属于' },
- { value: 'not_in', label: '不属于' },
- { value: '=', label: '等于' },
- { value: '!=', label: '不等于' }
- ]
- // =============================================
- // 工具函数
- // =============================================
- function formatMonthCN(yyyymm) {
- if (!yyyymm) return ''
- const [y, m] = yyyymm.split('-')
- return `${y}年${parseInt(m, 10)}月`
- }
- function formatMonthCompact(yyyymm) {
- return yyyymm ? yyyymm.replace('-', '') : ''
- }
- function formatDateSlash(yyyymmdd) {
- if (!yyyymmdd) return ''
- const [y, m, d] = yyyymmdd.split('-')
- return `${y}/${parseInt(m, 10)}/${parseInt(d, 10)}`
- }
- function formatAmount(num) {
- if (num === '' || num === null || num === undefined) return ''
- const n = Number(num)
- if (Number.isNaN(n)) return String(num)
- if (n >= 10000) return `${n / 10000}万`
- return String(n)
- }
- function dateOpSuffix(op) {
- return { '<': '前', '>': '后', '=': '当日' }[op] || op || ''
- }
- // =============================================
- // 元规则列表
- // =============================================
- export const META_RULES = [
- {
- code: '001',
- name: '开户时间(open_date)',
- paramKey: 'open_date',
- fields: [
- {
- key: 'accountType', label: '账户类型', type: 'select', required: true,
- options: [
- { value: 'I', label: 'I类账户' },
- { value: 'II', label: 'II类账户' },
- { value: 'III', label: 'III类账户' }
- ]
- },
- { key: 'operator', label: '比较方式', type: 'select', required: true, options: DATE_OPS },
- { key: 'date', label: '开户时间', type: 'datePicker', required: true }
- ],
- buildDescription(c) {
- if (!c.accountType || !c.date) return ''
- return `开户时间(${c.accountType}类账户)在${formatDateSlash(c.date)}${dateOpSuffix(c.operator)}`
- },
- buildParams(c) {
- if (!c.operator || !c.date) return ''
- return `{open_date,${c.operator},(${c.date})}`
- }
- },
- {
- code: '010',
- name: 'MSC',
- paramKey: 'MSC',
- fields: [
- { key: 'operator', label: 'MSC表达式', type: 'select', required: true, options: SET_OPS },
- {
- key: 'values', label: 'MSC值', type: 'multiSelect', required: true,
- options: [
- { value: 'premier', label: 'premier(卓越理财)' },
- { value: 'advance', label: 'advance(运筹理财)' },
- { value: 'excellence', label: 'excellence(卓越理财·尊尚)' },
- { value: 'global', label: 'global(环球私人银行)' }
- ]
- }
- ],
- buildDescription(c) {
- const vals = (c.values || []).join('/')
- if (!vals) return ''
- const opText = c.operator === 'not_in' || c.operator === '!=' ? '≠' : '='
- return `MSC${opText}${vals}`
- },
- buildParams(c) {
- const vals = (c.values || []).join('/')
- if (!c.operator || !vals) return ''
- return `{MSC,${c.operator},(${vals})}`
- }
- },
- {
- code: '050',
- name: 'TRB值-Avg TRB口径(不含家庭账户余额)',
- paramKey: 'Avg_TRB',
- fields: [
- { key: 'month', label: '开始月份', type: 'monthPicker', required: true },
- { key: 'nm', label: '连续达标月数/时间范围(月)', type: 'nm', required: false, defaultValue: { n: 3, m: 6 } },
- { key: 'operator', label: 'Avg TRB表达式', type: 'select', required: true, options: NUMERIC_OPS },
- { key: 'amount', label: 'Avg TRB值', type: 'number', required: true, min: 0 }
- ],
- buildDescription(c) {
- if (!c.month || !c.operator || c.amount === '' || c.amount == null) return ''
- const n = c.nm && c.nm.n ? `(连续${c.nm.n}个月达标)` : ''
- return `${formatMonthCN(c.month)}月末 TRB值-Avg TRB口径(不含家庭账户余额)${c.operator}${formatAmount(c.amount)}${n}`
- },
- buildParams(c) {
- if (!c.month || !c.operator) return ''
- const month = formatMonthCompact(c.month)
- const nm = c.nm && c.nm.n ? `;{${c.nm.n}/${c.nm.m || ''}}` : ''
- return `{month,=,${month}};{Avg_TRB,${c.operator},${c.amount}}${nm}`
- }
- },
- {
- code: '051',
- name: '月末余额(End of day balance)',
- paramKey: 'balance',
- fields: [
- { key: 'month', label: '开始月份', type: 'monthPicker', required: true },
- { key: 'nm', label: '连续达标月数/时间范围(月)', type: 'nm', required: false, defaultValue: { n: 3, m: 6 } },
- { key: 'operator', label: '余额表达式', type: 'select', required: true, options: NUMERIC_OPS },
- { key: 'amount', label: '余额值', type: 'number', required: true, min: 0 }
- ],
- buildDescription(c) {
- if (!c.month || !c.operator || c.amount === '' || c.amount == null) return ''
- const n = c.nm && c.nm.n ? `(连续${c.nm.n}个月达标)` : ''
- return `${formatMonthCN(c.month)}月末 End of day balance (所有资金含产品)${c.operator}${formatAmount(c.amount)}${n}`
- },
- buildParams(c) {
- if (!c.month || !c.operator) return ''
- const month = formatMonthCompact(c.month)
- const nm = c.nm && c.nm.n ? `;{${c.nm.n}/${c.nm.m || ''}}` : ''
- return `{month,=,${month}};{balance,${c.operator},${c.amount}}${nm}`
- }
- }
- ]
- // 元规则下拉显示文本:编号-名称
- export function metaRuleLabel(meta) {
- return `${meta.code}-${meta.name}`
- }
- // 根据 code 查询元规则
- export function getMetaRule(code) {
- return META_RULES.find((m) => m.code === code)
- }
- // 计算一条规则的描述
- export function buildRuleDescription(metaCode, config) {
- const meta = getMetaRule(metaCode)
- if (!meta || !meta.buildDescription) return ''
- return meta.buildDescription(config || {})
- }
- // 计算一条规则的参数
- export function buildRuleParams(metaCode, config) {
- const meta = getMetaRule(metaCode)
- if (!meta || !meta.buildParams) return ''
- return meta.buildParams(config || {})
- }
|