front/src/views/channel/autoTrigger/formulaMeta.ts
zzh 67cf30b6e8 feat: 自动触发公式引擎、查价分组运输方式与销售产品预览
新增自动触发中文公式编辑/测试、查价运输方式 Tab 分组选择,并完善销售产品字段预览与菜单展示。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 18:36:15 +08:00

314 lines
18 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export type FieldValueType = 'string' | 'number' | 'boolean' | 'datetime'
/** 表分类:key 为库表名,label 为中文 */
export const ORDER_TABLE_CATEGORIES: { key: string; label: string }[] = [
{ key: 't_order', label: '订单' },
{ key: 't_order_recipient', label: '收件人' },
{ key: 't_order_sender', label: '发件人' },
{ key: 't_order_declaration', label: '申报' },
{ key: 't_order_weight', label: '件重尺' },
{ key: 't_order_fee', label: '费用' },
{ key: 't_customer', label: '客户' },
{ key: '_virtual', label: '常用' },
]
export type OrderTableFieldDef = {
table: string
field: string
/** 公式与按钮上使用的中文名称(唯一) */
label: string
valueType: FieldValueType
}
export type FormulaFieldRef = {
table: string
field: string
/** 非库表字段(如单件最大长度) */
virtual?: boolean
}
/** 中文名称 → 库表字段映射(后端解析公式时使用) */
export const FORMULA_LABEL_TO_REF: Record<string, FormulaFieldRef> = {}
function registerRef(label: string, ref: FormulaFieldRef) {
FORMULA_LABEL_TO_REF[label] = ref
}
function fieldRef(table: string, field: string): FormulaFieldRef {
return { table, field }
}
function virtualRef(field: string): FormulaFieldRef {
return { table: '_virtual', field, virtual: true }
}
/**
* 订单及关联表字段中文映射(label 唯一)。
* 不含 IsDeleted / CreateUserId / CreateTime / UpdateUserId / UpdateTime。
*/
export const ORDER_TABLE_FIELDS: OrderTableFieldDef[] = [
// —— t_order ——
{ table: 't_order', field: 'RequestId', label: '请求标识', valueType: 'string' },
{ table: 't_order', field: 'ServiceNo', label: '运单号', valueType: 'string' },
{ table: 't_order', field: 'ClientNo', label: '客户单号', valueType: 'string' },
{ table: 't_order', field: 'TrackNo', label: '跟踪号', valueType: 'string' },
{ table: 't_order', field: 'ProductCode', label: '销售产品', valueType: 'string' },
{ table: 't_order', field: 'ChannelCode', label: '收货渠道', valueType: 'string' },
{ table: 't_order', field: 'DownstreamSupplierCode', label: '下游服务商', valueType: 'string' },
{ table: 't_order', field: 'DownstreamAppKey', label: '下游AppKey', valueType: 'string' },
{ table: 't_order', field: 'DownstreamAppId', label: '下游AppId', valueType: 'number' },
{ table: 't_order', field: 'ChannelForecastCode', label: '渠道预报编码', valueType: 'string' },
{ table: 't_order', field: 'ConsigneeCountry', label: '国家', valueType: 'string' },
{ table: 't_order', field: 'ConsigneeCountryName', label: '收件国家名称', valueType: 'string' },
{ table: 't_order', field: 'CargoAttribute', label: '货物属性', valueType: 'string' },
{ table: 't_order', field: 'ExportCustomsMode', label: '出口报关方式', valueType: 'string' },
{ table: 't_order', field: 'PredeclareFailReason', label: '预报失败原因', valueType: 'string' },
{ table: 't_order', field: 'SalesProductRulesVersion', label: '规则版本号', valueType: 'string' },
{ table: 't_order', field: 'SalesProductPriceVersion', label: '价格版本号', valueType: 'string' },
{ table: 't_order', field: 'OrderStatus', label: '订单状态', valueType: 'string' },
{ table: 't_order', field: 'HandleStatus', label: '处理子状态', valueType: 'string' },
{ table: 't_order', field: 'IssueType', label: '问题类型', valueType: 'string' },
{ table: 't_order', field: 'IssueTitle', label: '问题标题', valueType: 'string' },
{ table: 't_order', field: 'IssueContent', label: '问题内容', valueType: 'string' },
{ table: 't_order', field: 'IssueTemplateId', label: '问题模板', valueType: 'number' },
{ table: 't_order', field: 'IssueRemark', label: '问题备注', valueType: 'string' },
{ table: 't_order', field: 'IssueTime', label: '问题件时间', valueType: 'datetime' },
{ table: 't_order', field: 'ClaimType', label: '理赔类型', valueType: 'string' },
{ table: 't_order', field: 'ClaimAmount', label: '索赔金额', valueType: 'number' },
{ table: 't_order', field: 'ClaimCurrency', label: '索赔币种', valueType: 'string' },
{ table: 't_order', field: 'ClaimReason', label: '理赔原因', valueType: 'string' },
{ table: 't_order', field: 'ClaimTime', label: '理赔时间', valueType: 'datetime' },
{ table: 't_order', field: 'PreviousOrderStatus', label: '异常前状态', valueType: 'string' },
{ table: 't_order', field: 'WarehouseId', label: '仓库', valueType: 'number' },
{ table: 't_order', field: 'CustomerId', label: '订单客户', valueType: 'number' },
{ table: 't_order', field: 'OrganizationId', label: '组织', valueType: 'string' },
{ table: 't_order', field: 'SecretLevel', label: '密级', valueType: 'number' },
{ table: 't_order', field: 'SenderId', label: '发件人关联', valueType: 'number' },
{ table: 't_order', field: 'RecipientId', label: '收件人关联', valueType: 'number' },
{ table: 't_order', field: 'DeclarationId', label: '申报关联', valueType: 'number' },
{ table: 't_order', field: 'ReceiveTime', label: '收货时间', valueType: 'datetime' },
{ table: 't_order', field: 'ShipTime', label: '发货时间', valueType: 'datetime' },
{ table: 't_order', field: 'PayTime', label: '支付时间', valueType: 'datetime' },
{ table: 't_order', field: 'IsPaid', label: '是否已支付', valueType: 'boolean' },
{ table: 't_order', field: 'SignTime', label: '签收时间', valueType: 'datetime' },
{ table: 't_order', field: 'IsCod', label: '是否COD', valueType: 'boolean' },
{ table: 't_order', field: 'CodCurrency', label: 'COD币种', valueType: 'string' },
{ table: 't_order', field: 'CodSum', label: 'COD金额', valueType: 'number' },
{ table: 't_order', field: 'DeclaredCurrency', label: '申报币种', valueType: 'string' },
{ table: 't_order', field: 'DeclaredSum', label: '申报总金额', valueType: 'number' },
{ table: 't_order', field: 'Quantity', label: '订单件数', valueType: 'number' },
{ table: 't_order', field: 'IsIntercept', label: '是否拦截', valueType: 'boolean' },
{ table: 't_order', field: 'IsRemote', label: '是否偏远', valueType: 'boolean' },
// —— t_order_recipient ——
{ table: 't_order_recipient', field: 'RecipientsName', label: '收件人姓名', valueType: 'string' },
{ table: 't_order_recipient', field: 'CompanyName', label: '收件人公司', valueType: 'string' },
{ table: 't_order_recipient', field: 'Country', label: '收件人国家', valueType: 'number' },
{ table: 't_order_recipient', field: 'Phone', label: '收件人手机', valueType: 'string' },
{ table: 't_order_recipient', field: 'TelePhone', label: '收件人电话', valueType: 'string' },
{ table: 't_order_recipient', field: 'ZipCode', label: '收件人邮编', valueType: 'string' },
{ table: 't_order_recipient', field: 'Province', label: '收件人省州', valueType: 'string' },
{ table: 't_order_recipient', field: 'City', label: '收件人城市', valueType: 'string' },
{ table: 't_order_recipient', field: 'StreetNumber', label: '收件人门牌号', valueType: 'string' },
{ table: 't_order_recipient', field: 'StreetAddress1', label: '收件人地址1', valueType: 'string' },
{ table: 't_order_recipient', field: 'StreetAddress2', label: '收件人地址2', valueType: 'string' },
{ table: 't_order_recipient', field: 'StreetAddress3', label: '收件人地址3', valueType: 'string' },
{ table: 't_order_recipient', field: 'Email', label: '收件人邮箱', valueType: 'string' },
{ table: 't_order_recipient', field: 'TaxType', label: '收件人税号类型', valueType: 'number' },
{ table: 't_order_recipient', field: 'TaxNo', label: '收件人税号', valueType: 'string' },
{ table: 't_order_recipient', field: 'CertificateType', label: '收件人证件类型', valueType: 'number' },
{ table: 't_order_recipient', field: 'CertificateNo', label: '收件人证件号', valueType: 'string' },
{ table: 't_order_recipient', field: 'Eori', label: '收件人EORI', valueType: 'string' },
{ table: 't_order_recipient', field: 'Vat', label: '收件人VAT', valueType: 'string' },
// —— t_order_sender ——
{ table: 't_order_sender', field: 'SenderName', label: '发件人姓名', valueType: 'string' },
{ table: 't_order_sender', field: 'Company', label: '发件人公司', valueType: 'string' },
{ table: 't_order_sender', field: 'Country', label: '发件人国家', valueType: 'number' },
{ table: 't_order_sender', field: 'Province', label: '发件人省州', valueType: 'string' },
{ table: 't_order_sender', field: 'City', label: '发件人城市', valueType: 'string' },
{ table: 't_order_sender', field: 'ZipCode', label: '发件人邮编', valueType: 'string' },
{ table: 't_order_sender', field: 'StreetAddress1', label: '发件人地址1', valueType: 'string' },
{ table: 't_order_sender', field: 'StreetAddress2', label: '发件人地址2', valueType: 'string' },
{ table: 't_order_sender', field: 'StreetAddress3', label: '发件人地址3', valueType: 'string' },
{ table: 't_order_sender', field: 'HouseNumber', label: '发件人门牌号', valueType: 'string' },
{ table: 't_order_sender', field: 'Phone', label: '发件人手机', valueType: 'string' },
{ table: 't_order_sender', field: 'TelePhone', label: '发件人电话', valueType: 'string' },
{ table: 't_order_sender', field: 'Email', label: '发件人邮箱', valueType: 'string' },
{ table: 't_order_sender', field: 'IsDefault', label: '发件人是否默认', valueType: 'boolean' },
// —— t_order_declaration ——
{ table: 't_order_declaration', field: 'CnName', label: '中文品名', valueType: 'string' },
{ table: 't_order_declaration', field: 'EnName', label: '英文品名', valueType: 'string' },
{ table: 't_order_declaration', field: 'Sku', label: 'SKU', valueType: 'string' },
{ table: 't_order_declaration', field: 'Unit', label: '申报单位', valueType: 'string' },
{ table: 't_order_declaration', field: 'UnitPrice', label: '申报单价', valueType: 'number' },
{ table: 't_order_declaration', field: 'UnitWeight', label: '申报单重', valueType: 'number' },
{ table: 't_order_declaration', field: 'Quantity', label: '申报数量', valueType: 'number' },
{ table: 't_order_declaration', field: 'Amount', label: '申报金额', valueType: 'number' },
{ table: 't_order_declaration', field: 'Weight', label: '申报总重', valueType: 'number' },
{ table: 't_order_declaration', field: 'HsCode', label: 'HS编码', valueType: 'string' },
{ table: 't_order_declaration', field: 'ImHsCode', label: '进口HS编码', valueType: 'string' },
{ table: 't_order_declaration', field: 'ExHsCode', label: '出口HS编码', valueType: 'string' },
{ table: 't_order_declaration', field: 'Category', label: '申报类别', valueType: 'string' },
{ table: 't_order_declaration', field: 'Brand', label: '品牌', valueType: 'string' },
{ table: 't_order_declaration', field: 'BrandType', label: '品牌类型', valueType: 'string' },
{ table: 't_order_declaration', field: 'IsMagnetic', label: '是否带磁带电', valueType: 'boolean' },
{ table: 't_order_declaration', field: 'Distribution', label: '配货信息', valueType: 'string' },
{ table: 't_order_declaration', field: 'Material', label: '材质', valueType: 'string' },
{ table: 't_order_declaration', field: 'EnMaterial', label: '英文材质', valueType: 'string' },
{ table: 't_order_declaration', field: 'Purpose', label: '用途', valueType: 'string' },
{ table: 't_order_declaration', field: 'Attributes', label: '申报属性', valueType: 'string' },
{ table: 't_order_declaration', field: 'OriginCountry', label: '原产国', valueType: 'string' },
{ table: 't_order_declaration', field: 'SalesLink', label: '销售链接', valueType: 'string' },
{ table: 't_order_declaration', field: 'Model', label: '型号', valueType: 'string' },
{ table: 't_order_declaration', field: 'Specifications', label: '规格', valueType: 'string' },
{ table: 't_order_declaration', field: 'Comment', label: '申报备注', valueType: 'string' },
// —— t_order_weight ——
{ table: 't_order_weight', field: 'Type', label: '件重尺类型', valueType: 'string' },
{ table: 't_order_weight', field: 'Length', label: '长度', valueType: 'number' },
{ table: 't_order_weight', field: 'Width', label: '宽度', valueType: 'number' },
{ table: 't_order_weight', field: 'Height', label: '高度', valueType: 'number' },
{ table: 't_order_weight', field: 'ActualWeight', label: '实重', valueType: 'number' },
{ table: 't_order_weight', field: 'VolumetricWeight', label: '体积重', valueType: 'number' },
{ table: 't_order_weight', field: 'ChargeableWeight', label: '计费重', valueType: 'number' },
{ table: 't_order_weight', field: 'Cubic', label: '体积', valueType: 'number' },
// —— t_order_fee ——
{ table: 't_order_fee', field: 'Type', label: '费用类型', valueType: 'string' },
{ table: 't_order_fee', field: 'CostItem', label: '费用项', valueType: 'string' },
{ table: 't_order_fee', field: 'Amount', label: '费用金额', valueType: 'number' },
{ table: 't_order_fee', field: 'Currency', label: '费用币种', valueType: 'string' },
{ table: 't_order_fee', field: 'DownstreamProvider', label: '费用下游服务商', valueType: 'string' },
{ table: 't_order_fee', field: 'PriceNo', label: '价格编号', valueType: 'string' },
{ table: 't_order_fee', field: 'PriceEffectiveTime', label: '价格生效时间', valueType: 'datetime' },
{ table: 't_order_fee', field: 'ChargingStage', label: '计费阶段', valueType: 'string' },
// —— t_customer ——
{ table: 't_customer', field: 'CustomerCode', label: '客户编码', valueType: 'string' },
{ table: 't_customer', field: 'CustomerName', label: '客户', valueType: 'string' },
{ table: 't_customer', field: 'Email', label: '客户邮箱', valueType: 'string' },
{ table: 't_customer', field: 'Phone', label: '客户手机', valueType: 'string' },
{ table: 't_customer', field: 'Balance', label: '客户余额', valueType: 'number' },
{ table: 't_customer', field: 'TotalQuota', label: '客户总额度', valueType: 'number' },
{ table: 't_customer', field: 'UsedQuota', label: '客户已用额度', valueType: 'number' },
{ table: 't_customer', field: 'Status', label: '客户状态', valueType: 'string' },
{ table: 't_customer', field: 'Remark', label: '客户备注', valueType: 'string' },
{ table: 't_customer', field: 'Salesman', label: '销售', valueType: 'string' },
{ table: 't_customer', field: 'CustomerService', label: '客服', valueType: 'string' },
{ table: 't_customer', field: 'CustomerGroup', label: '客户组', valueType: 'string' },
]
/** 虚拟/聚合字段(无直接库表列,后端按中文名解析) */
export const VIRTUAL_FORMULA_FIELDS: OrderTableFieldDef[] = [
{ table: '_virtual', field: 'PieceMaxLength', label: '单件最大长度', valueType: 'number' },
{ table: '_virtual', field: 'PieceMaxWidth', label: '单件最大宽度', valueType: 'number' },
{ table: '_virtual', field: 'PieceMaxHeight', label: '单件最大高度', valueType: 'number' },
{ table: '_virtual', field: 'PieceSumLwh', label: '单件长宽高之和', valueType: 'number' },
]
export type FormulaChip = {
table: string
/** 按钮展示中文名 */
label: string
/** 插入公式片段(中文) */
insert: string
/** 悬停提示:映射库表字段 */
refHint: string
}
function buildInsert(def: OrderTableFieldDef): string {
if (def.valueType === 'string' || def.valueType === 'datetime') {
return `${def.label}包含('')`
}
if (def.valueType === 'boolean') {
return `${def.label}()==1`
}
return `${def.label}()`
}
function buildRefHint(def: OrderTableFieldDef): string {
if (def.table === '_virtual') {
return `虚拟字段 · ${def.field}`
}
return `${def.table}.${def.field}`
}
function buildChipsFromFields(fields: OrderTableFieldDef[]): FormulaChip[] {
return fields.map((def) => {
registerRef(
def.label,
def.table === '_virtual' ? virtualRef(def.field) : fieldRef(def.table, def.field)
)
return {
table: def.table,
label: def.label,
insert: buildInsert(def),
refHint: buildRefHint(def),
}
})
}
export const FORMULA_CHIPS: FormulaChip[] = buildChipsFromFields([
...ORDER_TABLE_FIELDS,
...VIRTUAL_FORMULA_FIELDS,
])
export type FormulaOperator = {
label: string
insert: string
}
export const FORMULA_OPERATORS: FormulaOperator[] = [
{ label: '+', insert: '+' },
{ label: '-', insert: '-' },
{ label: '×', insert: '*' },
{ label: '÷', insert: '/' },
{ label: '=', insert: '==' },
{ label: '≠', insert: '!=' },
{ label: '≥', insert: '>=' },
{ label: '>', insert: '>' },
{ label: '≤', insert: '<=' },
{ label: '<', insert: '<' },
{ label: '(', insert: '(' },
{ label: ')', insert: ')' },
{ label: '非', insert: '!' },
{ label: '与', insert: '&&' },
{ label: '或', insert: '||' },
]
/** 超尺寸示例(中文字段名,与运营习惯一致) */
export const OVERSIZE_EXAMPLE_FORMULA =
"(单件最大长度()>60||单件最大宽度()>46||((单件最大长度()+单件最大宽度()+单件最大高度())>150))&&国家包含('GB')&&客户包含('阿里国际站/深圳一达通')&&!销售产品包含('EX_ASP_HKDHL_YD')"
export const FORMULA_MAX_LENGTH = 10000
export const TIMING_SAVE_LABEL: Record<string, string> = {
forecast: '预报',
order_create: '下单',
inbound: '入库',
outbound: '出库',
}
export const OPERATION_SAVE_LABEL: Record<string, string> = {
intercept: '拦截',
warn: '警告',
problem: '问题件',
}
export function chipsByTable(table: string): FormulaChip[] {
return FORMULA_CHIPS.filter((c) => c.table === table)
}
export function resolveFormulaLabel(label: string): FormulaFieldRef | undefined {
return FORMULA_LABEL_TO_REF[label]
}
export function getDbFieldPath(label: string): string {
const ref = resolveFormulaLabel(label)
if (!ref) return label
if (ref.virtual) return ref.field
return `${ref.table}.${ref.field}`
}