新增自动触发中文公式编辑/测试、查价运输方式 Tab 分组选择,并完善销售产品字段预览与菜单展示。 Co-authored-by: Cursor <cursoragent@cursor.com>
314 lines
18 KiB
TypeScript
314 lines
18 KiB
TypeScript
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}`
|
||
}
|