refactor(exporter, schema): 优化SQL构建逻辑以支持最新数据行的关联
- 更新BuildSQL和BuildJoins函数,移除ROW_NUMBER()函数,改为使用子查询确保每个订单只保留最新记录,避免1:N重复 - 增强JOIN逻辑,确保在YMT和其他数据源中正确关联最新的订单现金、代金券和批次信息 - 提升代码可读性,确保SQL构建逻辑清晰明了
This commit is contained in:
parent
70680061e2
commit
5bb83e1875
|
|
@ -97,10 +97,7 @@ func BuildSQL(req BuildRequest, whitelist map[string]bool) (string, []interface{
|
|||
cols = append(cols, constants.BuildCaseWhen("order", "pay_status", constants.MarketingPayStatus, "order.pay_status"))
|
||||
continue
|
||||
}
|
||||
if req.Datasource == "marketing" && f == "card_code" {
|
||||
cols = append(cols, "CASE WHEN LENGTH(`order`.card_code) > 10 THEN CONCAT(SUBSTRING(`order`.card_code,1,6),'****',SUBSTRING(`order`.card_code, LENGTH(`order`.card_code)-3, 4)) ELSE `order`.card_code END AS `order.card_code`")
|
||||
continue
|
||||
}
|
||||
// card_code: export raw value (no masking) per business requirement
|
||||
}
|
||||
if req.Datasource == "ymt" && t == "order" {
|
||||
if f == "type" {
|
||||
|
|
@ -568,6 +565,21 @@ func BuildCountSQL(req BuildRequest, whitelist map[string]bool) (string, []inter
|
|||
need[tbl] = true
|
||||
}
|
||||
}
|
||||
//补齐链式关联过滤所需的 JOIN(只用于 COUNT)
|
||||
if _, ok := req.Filters["order_cash_cash_activity_id_eq"]; ok {
|
||||
need["order_cash"] = true
|
||||
}
|
||||
if _, ok := req.Filters["order_voucher_channel_activity_id_eq"]; ok {
|
||||
need["order_voucher"] = true
|
||||
}
|
||||
if _, ok := req.Filters["voucher_batch_channel_activity_id_eq"]; ok {
|
||||
need["voucher_batch"] = true
|
||||
need["voucher"] = true
|
||||
need["order_voucher"] = true
|
||||
}
|
||||
if _, ok := req.Filters["merchant_out_biz_no_eq"]; ok {
|
||||
need["merchant_key_send"] = true
|
||||
}
|
||||
// normalize merchant_id_eq / reseller_id_eq for YMT: skip 0/空, 非零转为 merchant_id_in 以便与 creator_in 做 OR
|
||||
if v, ok := req.Filters["merchant_id_eq"]; ok {
|
||||
if isZeroID(v) {
|
||||
|
|
|
|||
|
|
@ -2,158 +2,158 @@ package schema
|
|||
|
||||
func AllWhitelist() map[string]bool {
|
||||
m := map[string]bool{
|
||||
"order.order_number": true,
|
||||
"order.key": true,
|
||||
"order.creator": true,
|
||||
"order.out_trade_no": true,
|
||||
"order.type": true,
|
||||
"order.status": true,
|
||||
"order.account": true,
|
||||
"order.product_id": true,
|
||||
"order.reseller_id": true,
|
||||
"order.plan_id": true,
|
||||
"order.key_batch_id": true,
|
||||
"order.code_batch_id": true,
|
||||
"order.pay_type": true,
|
||||
"order.pay_status": true,
|
||||
"order.use_coupon": true,
|
||||
"order.deliver_status": true,
|
||||
"order.expire_time": true,
|
||||
"order.recharge_time": true,
|
||||
"order.contract_price": true,
|
||||
"order.num": true,
|
||||
"order.total": true,
|
||||
"order.pay_amount": true,
|
||||
"order.create_time": true,
|
||||
"order.update_time": true,
|
||||
"order.card_code": true,
|
||||
"order.official_price": true,
|
||||
"order.merchant_name": true,
|
||||
"order.activity_name": true,
|
||||
"order.goods_name": true,
|
||||
"order.pay_time": true,
|
||||
"order.coupon_id": true,
|
||||
"order.discount_amount": true,
|
||||
"order.supplier_product_name": true,
|
||||
"order.supplier_name": true,
|
||||
"order.is_inner": true,
|
||||
"order.icon": true,
|
||||
"order.cost_price": true,
|
||||
"order.is_retry": true,
|
||||
"order.channel": true,
|
||||
"order.is_store": true,
|
||||
"order.trace_id": true,
|
||||
"order.out_order_no": true,
|
||||
"order.next_retry_time": true,
|
||||
"order.recharge_suc_time": true,
|
||||
"order.supplier_id": true,
|
||||
"order.supplier_product_id": true,
|
||||
"order.merchant_id": true,
|
||||
"order.goods_id": true,
|
||||
"order.activity_id": true,
|
||||
"order.key_batch_name": true,
|
||||
"order_detail.plan_title": true,
|
||||
"order_detail.order_number": true,
|
||||
"order_detail.reseller_name": true,
|
||||
"order_detail.product_name": true,
|
||||
"order_detail.show_url": true,
|
||||
"order_detail.official_price": true,
|
||||
"order_detail.cost_price": true,
|
||||
"order_detail.create_time": true,
|
||||
"order_detail.update_time": true,
|
||||
"order_cash.order_no": true,
|
||||
"order_cash.trade_no": true,
|
||||
"order_cash.wechat_detail_id": true,
|
||||
"order_cash.channel": true,
|
||||
"order_cash.denomination": true,
|
||||
"order_cash.account": true,
|
||||
"order_cash.receive_name": true,
|
||||
"order_cash.app_id": true,
|
||||
"order_cash.cash_activity_id": true,
|
||||
"order_cash.receive_status": true,
|
||||
"order_cash.receive_time": true,
|
||||
"order_cash.success_time": true,
|
||||
"order_cash.cash_packet_id": true,
|
||||
"order_cash.channel_order_id": true,
|
||||
"order_cash.pay_fund_order_id": true,
|
||||
"order_cash.cash_id": true,
|
||||
"order_cash.amount": true,
|
||||
"order_cash.activity_id": true,
|
||||
"order_cash.goods_id": true,
|
||||
"order_cash.merchant_id": true,
|
||||
"order_cash.supplier_id": true,
|
||||
"order_cash.user_id": true,
|
||||
"order_cash.status": true,
|
||||
"order_cash.expire_time": true,
|
||||
"order_cash.create_time": true,
|
||||
"order_cash.update_time": true,
|
||||
"order_cash.version": true,
|
||||
"order_cash.is_confirm": true,
|
||||
"order_voucher.channel": true,
|
||||
"order_voucher.channel_activity_id": true,
|
||||
"order_voucher.channel_voucher_id": true,
|
||||
"order_voucher.status": true,
|
||||
"order_voucher.receive_mode": true,
|
||||
"order_voucher.grant_time": true,
|
||||
"order_voucher.usage_time": true,
|
||||
"order_voucher.refund_time": true,
|
||||
"order_voucher.status_modify_time": true,
|
||||
"order_voucher.overdue_time": true,
|
||||
"order_voucher.refund_amount": true,
|
||||
"order_voucher.official_price": true,
|
||||
"order_voucher.out_biz_no": true,
|
||||
"order_voucher.account_no": true,
|
||||
"plan.id": true,
|
||||
"plan.title": true,
|
||||
"plan.status": true,
|
||||
"plan.begin_time": true,
|
||||
"plan.end_time": true,
|
||||
"key_batch.id": true,
|
||||
"key_batch.batch_name": true,
|
||||
"key_batch.bind_object": true,
|
||||
"key_batch.quantity": true,
|
||||
"key_batch.stock": true,
|
||||
"key_batch.begin_time": true,
|
||||
"key_batch.end_time": true,
|
||||
"code_batch.id": true,
|
||||
"code_batch.title": true,
|
||||
"code_batch.status": true,
|
||||
"code_batch.begin_time": true,
|
||||
"code_batch.end_time": true,
|
||||
"code_batch.quantity": true,
|
||||
"code_batch.usage": true,
|
||||
"code_batch.stock": true,
|
||||
"voucher.channel": true,
|
||||
"voucher.channel_activity_id": true,
|
||||
"voucher.price": true,
|
||||
"voucher.balance": true,
|
||||
"voucher.used_amount": true,
|
||||
"voucher.denomination": true,
|
||||
"voucher_batch.channel_activity_id": true,
|
||||
"voucher_batch.temp_no": true,
|
||||
"voucher_batch.provider": true,
|
||||
"voucher_batch.weight": true,
|
||||
"merchant_key_send.merchant_id": true,
|
||||
"merchant_key_send.out_biz_no": true,
|
||||
"merchant_key_send.key": true,
|
||||
"merchant_key_send.status": true,
|
||||
"merchant_key_send.usage_time": true,
|
||||
"merchant_key_send.create_time": true,
|
||||
"order_digit.order_no": true,
|
||||
"order_digit.card_no": true,
|
||||
"order_digit.account": true,
|
||||
"order_digit.goods_id": true,
|
||||
"order_digit.merchant_id": true,
|
||||
"order_digit.supplier_id": true,
|
||||
"order_digit.activity_id": true,
|
||||
"order_digit.user_id": true,
|
||||
"order_digit.success_time": true,
|
||||
"order_digit.supplier_product_no": true,
|
||||
"order_digit.order_type": true,
|
||||
"order_digit.end_time": true,
|
||||
"order_digit.create_time": true,
|
||||
"order_digit.update_time": true,
|
||||
"order_digit.code": true,
|
||||
"order.order_number": true,
|
||||
"order.key": true,
|
||||
"order.creator": true,
|
||||
"order.out_trade_no": true,
|
||||
"order.type": true,
|
||||
"order.status": true,
|
||||
"order.account": true,
|
||||
"order.product_id": true,
|
||||
"order.reseller_id": true,
|
||||
"order.plan_id": true,
|
||||
"order.key_batch_id": true,
|
||||
"order.code_batch_id": true,
|
||||
"order.pay_type": true,
|
||||
"order.pay_status": true,
|
||||
"order.use_coupon": true,
|
||||
"order.deliver_status": true,
|
||||
"order.expire_time": true,
|
||||
"order.recharge_time": true,
|
||||
"order.contract_price": true,
|
||||
"order.num": true,
|
||||
"order.total": true,
|
||||
"order.pay_amount": true,
|
||||
"order.create_time": true,
|
||||
"order.update_time": true,
|
||||
"order.card_code": true,
|
||||
"order.official_price": true,
|
||||
"order.merchant_name": true,
|
||||
"order.activity_name": true,
|
||||
"order.goods_name": true,
|
||||
"order.pay_time": true,
|
||||
"order.coupon_id": true,
|
||||
"order.discount_amount": true,
|
||||
"order.supplier_product_name": true,
|
||||
"order.supplier_name": true,
|
||||
"order.is_inner": true,
|
||||
"order.icon": true,
|
||||
"order.cost_price": true,
|
||||
"order.is_retry": true,
|
||||
"order.channel": true,
|
||||
"order.is_store": true,
|
||||
"order.trace_id": true,
|
||||
"order.out_order_no": true,
|
||||
"order.next_retry_time": true,
|
||||
"order.recharge_suc_time": true,
|
||||
"order.supplier_id": true,
|
||||
"order.supplier_product_id": true,
|
||||
"order.merchant_id": true,
|
||||
"order.goods_id": true,
|
||||
"order.activity_id": true,
|
||||
"order.key_batch_name": true,
|
||||
"order_detail.plan_title": true,
|
||||
"order_detail.order_number": true,
|
||||
"order_detail.reseller_name": true,
|
||||
"order_detail.product_name": true,
|
||||
"order_detail.show_url": true,
|
||||
"order_detail.official_price": true,
|
||||
"order_detail.cost_price": true,
|
||||
"order_detail.create_time": true,
|
||||
"order_detail.update_time": true,
|
||||
"order_cash.order_no": true,
|
||||
"order_cash.trade_no": true,
|
||||
"order_cash.wechat_detail_id": true,
|
||||
"order_cash.channel": true,
|
||||
"order_cash.denomination": true,
|
||||
"order_cash.account": true,
|
||||
"order_cash.receive_name": true,
|
||||
"order_cash.app_id": true,
|
||||
"order_cash.cash_activity_id": true,
|
||||
"order_cash.receive_status": true,
|
||||
"order_cash.receive_time": true,
|
||||
"order_cash.success_time": true,
|
||||
"order_cash.cash_packet_id": true,
|
||||
"order_cash.channel_order_id": true,
|
||||
"order_cash.pay_fund_order_id": true,
|
||||
"order_cash.cash_id": true,
|
||||
"order_cash.amount": true,
|
||||
"order_cash.activity_id": true,
|
||||
"order_cash.goods_id": true,
|
||||
"order_cash.merchant_id": true,
|
||||
"order_cash.supplier_id": true,
|
||||
"order_cash.user_id": true,
|
||||
"order_cash.status": true,
|
||||
"order_cash.expire_time": true,
|
||||
"order_cash.create_time": true,
|
||||
"order_cash.update_time": true,
|
||||
"order_cash.version": true,
|
||||
"order_cash.is_confirm": true,
|
||||
"order_voucher.channel": true,
|
||||
"order_voucher.channel_activity_id": true,
|
||||
"order_voucher.channel_voucher_id": true,
|
||||
"order_voucher.status": true,
|
||||
"order_voucher.receive_mode": true,
|
||||
"order_voucher.grant_time": true,
|
||||
"order_voucher.usage_time": true,
|
||||
"order_voucher.refund_time": true,
|
||||
"order_voucher.status_modify_time": true,
|
||||
"order_voucher.overdue_time": true,
|
||||
"order_voucher.refund_amount": true,
|
||||
"order_voucher.official_price": true,
|
||||
"order_voucher.out_biz_no": true,
|
||||
"order_voucher.account_no": true,
|
||||
"plan.id": true,
|
||||
"plan.title": true,
|
||||
"plan.status": true,
|
||||
"plan.begin_time": true,
|
||||
"plan.end_time": true,
|
||||
"key_batch.id": true,
|
||||
"key_batch.batch_name": true,
|
||||
"key_batch.bind_object": true,
|
||||
"key_batch.quantity": true,
|
||||
"key_batch.stock": true,
|
||||
"key_batch.begin_time": true,
|
||||
"key_batch.end_time": true,
|
||||
"code_batch.id": true,
|
||||
"code_batch.title": true,
|
||||
"code_batch.status": true,
|
||||
"code_batch.begin_time": true,
|
||||
"code_batch.end_time": true,
|
||||
"code_batch.quantity": true,
|
||||
"code_batch.usage": true,
|
||||
"code_batch.stock": true,
|
||||
"voucher.channel": true,
|
||||
"voucher.channel_activity_id": true,
|
||||
"voucher.price": true,
|
||||
"voucher.balance": true,
|
||||
"voucher.used_amount": true,
|
||||
"voucher.denomination": true,
|
||||
"voucher_batch.channel_activity_id": true,
|
||||
"voucher_batch.temp_no": true,
|
||||
"voucher_batch.provider": true,
|
||||
"voucher_batch.weight": true,
|
||||
"merchant_key_send.merchant_id": true,
|
||||
"merchant_key_send.out_biz_no": true,
|
||||
"merchant_key_send.key": true,
|
||||
"merchant_key_send.status": true,
|
||||
"merchant_key_send.usage_time": true,
|
||||
"merchant_key_send.create_time": true,
|
||||
"order_digit.order_no": true,
|
||||
"order_digit.card_no": true,
|
||||
"order_digit.account": true,
|
||||
"order_digit.goods_id": true,
|
||||
"order_digit.merchant_id": true,
|
||||
"order_digit.supplier_id": true,
|
||||
"order_digit.activity_id": true,
|
||||
"order_digit.user_id": true,
|
||||
"order_digit.success_time": true,
|
||||
"order_digit.supplier_product_no": true,
|
||||
"order_digit.order_type": true,
|
||||
"order_digit.end_time": true,
|
||||
"order_digit.create_time": true,
|
||||
"order_digit.update_time": true,
|
||||
"order_digit.code": true,
|
||||
// "order_digit.sms_channel" 不再允许导出,出于业务脱敏需求从白名单移除
|
||||
"goods_voucher_batch.channel_batch_no": true,
|
||||
"goods_voucher_batch.voucher_subject_id": true,
|
||||
|
|
@ -168,213 +168,213 @@ func AllWhitelist() map[string]bool {
|
|||
"goods_voucher_subject_config.name": true,
|
||||
"goods_voucher_subject_config.type": true,
|
||||
"goods_voucher_subject_config.create_time": true,
|
||||
"merchant.id": true,
|
||||
"merchant.name": true,
|
||||
"merchant.user_id": true,
|
||||
"merchant.merchant_no": true,
|
||||
"merchant.subject": true,
|
||||
"merchant.third_party": true,
|
||||
"merchant.status": true,
|
||||
"merchant.balance": true,
|
||||
"merchant.total_consumption": true,
|
||||
"merchant.contact_name": true,
|
||||
"merchant.contact_phone": true,
|
||||
"merchant.contact_email": true,
|
||||
"merchant.create_time": true,
|
||||
"merchant.update_time": true,
|
||||
"activity.id": true,
|
||||
"activity.name": true,
|
||||
"activity.user_id": true,
|
||||
"activity.merchant_id": true,
|
||||
"activity.user_name": true,
|
||||
"activity.activity_no": true,
|
||||
"activity.status": true,
|
||||
"activity.key_total_num": true,
|
||||
"activity.key_generate_num": true,
|
||||
"activity.key_usable_num": true,
|
||||
"activity.domain_url": true,
|
||||
"activity.theme_login_id": true,
|
||||
"activity.theme_list_id": true,
|
||||
"activity.theme_verify_id": true,
|
||||
"activity.settlement_type": true,
|
||||
"activity.key_style": true,
|
||||
"activity.begin_time": true,
|
||||
"activity.end_time": true,
|
||||
"activity.is_retry": true,
|
||||
"activity.create_time": true,
|
||||
"activity.update_time": true,
|
||||
"activity.discard_time": true,
|
||||
"activity.delete_time": true,
|
||||
"activity.auto_charge": true,
|
||||
"activity.stock": true,
|
||||
"activity.approval_trade_no": true,
|
||||
"activity.amount": true,
|
||||
"activity.channels": true,
|
||||
"activity.key_begin": true,
|
||||
"activity.key_end": true,
|
||||
"activity.key_unit": true,
|
||||
"activity.key_pay_button_text": true,
|
||||
"activity.goods_pay_button_text": true,
|
||||
"activity.is_open_db_transaction": true,
|
||||
"merchant.id": true,
|
||||
"merchant.name": true,
|
||||
"merchant.user_id": true,
|
||||
"merchant.merchant_no": true,
|
||||
"merchant.subject": true,
|
||||
"merchant.third_party": true,
|
||||
"merchant.status": true,
|
||||
"merchant.balance": true,
|
||||
"merchant.total_consumption": true,
|
||||
"merchant.contact_name": true,
|
||||
"merchant.contact_phone": true,
|
||||
"merchant.contact_email": true,
|
||||
"merchant.create_time": true,
|
||||
"merchant.update_time": true,
|
||||
"activity.id": true,
|
||||
"activity.name": true,
|
||||
"activity.user_id": true,
|
||||
"activity.merchant_id": true,
|
||||
"activity.user_name": true,
|
||||
"activity.activity_no": true,
|
||||
"activity.status": true,
|
||||
"activity.key_total_num": true,
|
||||
"activity.key_generate_num": true,
|
||||
"activity.key_usable_num": true,
|
||||
"activity.domain_url": true,
|
||||
"activity.theme_login_id": true,
|
||||
"activity.theme_list_id": true,
|
||||
"activity.theme_verify_id": true,
|
||||
"activity.settlement_type": true,
|
||||
"activity.key_style": true,
|
||||
"activity.begin_time": true,
|
||||
"activity.end_time": true,
|
||||
"activity.is_retry": true,
|
||||
"activity.create_time": true,
|
||||
"activity.update_time": true,
|
||||
"activity.discard_time": true,
|
||||
"activity.delete_time": true,
|
||||
"activity.auto_charge": true,
|
||||
"activity.stock": true,
|
||||
"activity.approval_trade_no": true,
|
||||
"activity.amount": true,
|
||||
"activity.channels": true,
|
||||
"activity.key_begin": true,
|
||||
"activity.key_end": true,
|
||||
"activity.key_unit": true,
|
||||
"activity.key_pay_button_text": true,
|
||||
"activity.goods_pay_button_text": true,
|
||||
"activity.is_open_db_transaction": true,
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func AllLabels() map[string]string {
|
||||
return map[string]string{
|
||||
"order.order_number": "订单编号",
|
||||
"order.key": "KEY",
|
||||
"order.creator": "创建者ID",
|
||||
"order.out_trade_no": "支付流水号",
|
||||
"order.type": "订单类型",
|
||||
"order.status": "订单状态",
|
||||
"order.account": "账号",
|
||||
"order.product_id": "商品ID",
|
||||
"order.reseller_id": "分销商ID",
|
||||
"order.plan_id": "计划ID",
|
||||
"order.key_batch_id": "KEY批次ID",
|
||||
"order.code_batch_id": "兑换批次ID",
|
||||
"order.pay_type": "支付方式",
|
||||
"order.pay_status": "支付状态",
|
||||
"order.use_coupon": "是否使用优惠券",
|
||||
"order.deliver_status": "投递状态",
|
||||
"order.expire_time": "过期处理时间",
|
||||
"order.recharge_time": "充值时间",
|
||||
"order.contract_price": "合同单价",
|
||||
"order.num": "数量",
|
||||
"order.total": "总金额",
|
||||
"order.pay_amount": "支付金额",
|
||||
"order.create_time": "创建时间",
|
||||
"order.update_time": "更新时间",
|
||||
"order.official_price": "官方价",
|
||||
"order.merchant_name": "客户名称",
|
||||
"order.activity_name": "活动名称",
|
||||
"order.goods_name": "商品名称",
|
||||
"order.pay_time": "支付时间",
|
||||
"order.coupon_id": "优惠券ID",
|
||||
"order.discount_amount": "优惠金额",
|
||||
"order.card_code": "卡密(脱敏)",
|
||||
"order.supplier_product_name": "供应商产品名称",
|
||||
"order.supplier_name": "供应商名称",
|
||||
"order.is_inner": "供应商类型",
|
||||
"order.icon": "订单图片",
|
||||
"order.cost_price": "成本价",
|
||||
"order.is_reset": "是否重置",
|
||||
"order.is_retry": "是否重试",
|
||||
"order.channel": "支付渠道",
|
||||
"order.is_store": "是否退还库存",
|
||||
"order.trace_id": "TraceID",
|
||||
"order.out_order_no": "外部订单号",
|
||||
"order.next_retry_time": "下次重试时间",
|
||||
"order.recharge_suc_time": "充值成功时间",
|
||||
"order.supplier_id": "供应商ID",
|
||||
"order.supplier_product_id": "供应商产品ID",
|
||||
"order.merchant_id": "分销商ID",
|
||||
"order.goods_id": "商品ID",
|
||||
"order.activity_id": "活动ID",
|
||||
"order.key_batch_name": "key批次名称",
|
||||
"order_detail.plan_title": "计划标题",
|
||||
"order_detail.order_number": "订单编号",
|
||||
"order_detail.reseller_name": "分销商名称",
|
||||
"order_detail.product_name": "商品名称",
|
||||
"order_detail.show_url": "商品图片URL",
|
||||
"order_detail.official_price": "官方价",
|
||||
"order_detail.cost_price": "成本价",
|
||||
"order_detail.create_time": "创建时间",
|
||||
"order_detail.update_time": "更新时间",
|
||||
"order_cash.order_no": "订单号",
|
||||
"order_cash.trade_no": "交易号",
|
||||
"order_cash.wechat_detail_id": "微信明细单号",
|
||||
"order_cash.channel": "渠道",
|
||||
"order_cash.denomination": "红包面额",
|
||||
"order_cash.account": "领取账号",
|
||||
"order_cash.receive_name": "真实姓名",
|
||||
"order_cash.app_id": "转账AppID",
|
||||
"order_cash.cash_activity_id": "红包批次号",
|
||||
"order_cash.receive_status": "领取状态",
|
||||
"order_cash.receive_time": "拆红包时间",
|
||||
"order_cash.success_time": "成功时间",
|
||||
"order_cash.cash_packet_id": "红包ID",
|
||||
"order_cash.channel_order_id": "渠道订单号",
|
||||
"order_cash.pay_fund_order_id": "资金订单号",
|
||||
"order_cash.cash_id": "红包规则ID",
|
||||
"order_cash.amount": "红包额度",
|
||||
"order_cash.activity_id": "活动ID",
|
||||
"order_cash.goods_id": "商品ID",
|
||||
"order_cash.merchant_id": "分销商ID",
|
||||
"order_cash.supplier_id": "供应商ID",
|
||||
"order_cash.user_id": "创建者ID",
|
||||
"order_cash.status": "状态",
|
||||
"order_cash.expire_time": "过期时间",
|
||||
"order_cash.create_time": "创建时间",
|
||||
"order_cash.update_time": "更新时间",
|
||||
"order_cash.version": "版本",
|
||||
"order_cash.is_confirm": "是否确认",
|
||||
"order_voucher.channel": "渠道",
|
||||
"order_voucher.channel_activity_id": "渠道立减金批次",
|
||||
"order_voucher.channel_voucher_id": "渠道立减金ID",
|
||||
"order_voucher.status": "状态",
|
||||
"order_voucher.receive_mode": "领取方式",
|
||||
"order_voucher.grant_time": "领取时间",
|
||||
"order_voucher.usage_time": "核销时间",
|
||||
"order_voucher.refund_time": "退款时间",
|
||||
"order_voucher.status_modify_time": "状态更新时间",
|
||||
"order_voucher.overdue_time": "过期时间",
|
||||
"order_voucher.refund_amount": "退款金额",
|
||||
"order_voucher.official_price": "官方价",
|
||||
"order_voucher.out_biz_no": "外部业务号",
|
||||
"order_voucher.account_no": "账户号",
|
||||
"plan.id": "计划ID",
|
||||
"plan.title": "计划标题",
|
||||
"plan.status": "状态",
|
||||
"plan.begin_time": "开始时间",
|
||||
"plan.end_time": "结束时间",
|
||||
"key_batch.id": "批次ID",
|
||||
"key_batch.batch_name": "批次名称",
|
||||
"key_batch.bind_object": "绑定对象",
|
||||
"key_batch.quantity": "发放数量",
|
||||
"key_batch.stock": "剩余库存",
|
||||
"key_batch.begin_time": "开始时间",
|
||||
"key_batch.end_time": "结束时间",
|
||||
"code_batch.id": "兑换批次ID",
|
||||
"code_batch.title": "标题",
|
||||
"code_batch.status": "状态",
|
||||
"code_batch.begin_time": "开始时间",
|
||||
"code_batch.end_time": "结束时间",
|
||||
"code_batch.quantity": "数量",
|
||||
"code_batch.usage": "使用数",
|
||||
"code_batch.stock": "库存",
|
||||
"voucher.channel": "渠道",
|
||||
"voucher.channel_activity_id": "渠道批次号",
|
||||
"voucher.price": "合同单价",
|
||||
"voucher.balance": "剩余额度",
|
||||
"voucher.used_amount": "已用额度",
|
||||
"voucher.denomination": "面额",
|
||||
"voucher_batch.channel_activity_id": "渠道批次号",
|
||||
"voucher_batch.temp_no": "模板编号",
|
||||
"voucher_batch.provider": "服务商",
|
||||
"voucher_batch.weight": "权重",
|
||||
"merchant_key_send.merchant_id": "商户ID",
|
||||
"merchant_key_send.out_biz_no": "商户业务号",
|
||||
"merchant_key_send.key": "券码",
|
||||
"merchant_key_send.status": "状态",
|
||||
"merchant_key_send.usage_time": "核销时间",
|
||||
"merchant_key_send.create_time": "创建时间",
|
||||
"order_digit.order_no": "订单号",
|
||||
"order_digit.card_no": "卡号",
|
||||
"order_digit.account": "充值账号",
|
||||
"order_digit.goods_id": "商品ID",
|
||||
"order_digit.merchant_id": "分销商ID",
|
||||
"order_digit.supplier_id": "供应商ID",
|
||||
"order_digit.activity_id": "活动ID",
|
||||
"order_digit.user_id": "创建者ID",
|
||||
"order_digit.success_time": "到账时间",
|
||||
"order_digit.supplier_product_no": "供应商产品编码",
|
||||
"order_digit.order_type": "商品类型",
|
||||
"order_digit.end_time": "卡密有效期",
|
||||
"order_digit.create_time": "创建时间",
|
||||
"order_digit.update_time": "更新时间",
|
||||
"order_digit.code": "验证码",
|
||||
"order.order_number": "订单编号",
|
||||
"order.key": "KEY",
|
||||
"order.creator": "创建者ID",
|
||||
"order.out_trade_no": "支付流水号",
|
||||
"order.type": "订单类型",
|
||||
"order.status": "订单状态",
|
||||
"order.account": "账号",
|
||||
"order.product_id": "商品ID",
|
||||
"order.reseller_id": "分销商ID",
|
||||
"order.plan_id": "计划ID",
|
||||
"order.key_batch_id": "KEY批次ID",
|
||||
"order.code_batch_id": "兑换批次ID",
|
||||
"order.pay_type": "支付方式",
|
||||
"order.pay_status": "支付状态",
|
||||
"order.use_coupon": "是否使用优惠券",
|
||||
"order.deliver_status": "投递状态",
|
||||
"order.expire_time": "过期处理时间",
|
||||
"order.recharge_time": "充值时间",
|
||||
"order.contract_price": "合同单价",
|
||||
"order.num": "数量",
|
||||
"order.total": "总金额",
|
||||
"order.pay_amount": "支付金额",
|
||||
"order.create_time": "创建时间",
|
||||
"order.update_time": "更新时间",
|
||||
"order.official_price": "官方价",
|
||||
"order.merchant_name": "客户名称",
|
||||
"order.activity_name": "活动名称",
|
||||
"order.goods_name": "商品名称",
|
||||
"order.pay_time": "支付时间",
|
||||
"order.coupon_id": "优惠券ID",
|
||||
"order.discount_amount": "优惠金额",
|
||||
"order.card_code": "卡密(脱敏)",
|
||||
"order.supplier_product_name": "供应商产品名称",
|
||||
"order.supplier_name": "供应商名称",
|
||||
"order.is_inner": "供应商类型",
|
||||
"order.icon": "订单图片",
|
||||
"order.cost_price": "成本价",
|
||||
"order.is_reset": "是否重置",
|
||||
"order.is_retry": "是否重试",
|
||||
"order.channel": "支付渠道",
|
||||
"order.is_store": "是否退还库存",
|
||||
"order.trace_id": "TraceID",
|
||||
"order.out_order_no": "外部订单号",
|
||||
"order.next_retry_time": "下次重试时间",
|
||||
"order.recharge_suc_time": "充值成功时间",
|
||||
"order.supplier_id": "供应商ID",
|
||||
"order.supplier_product_id": "供应商产品ID",
|
||||
"order.merchant_id": "分销商ID",
|
||||
"order.goods_id": "商品ID",
|
||||
"order.activity_id": "活动ID",
|
||||
"order.key_batch_name": "key批次名称",
|
||||
"order_detail.plan_title": "计划标题",
|
||||
"order_detail.order_number": "订单编号",
|
||||
"order_detail.reseller_name": "分销商名称",
|
||||
"order_detail.product_name": "商品名称",
|
||||
"order_detail.show_url": "商品图片URL",
|
||||
"order_detail.official_price": "官方价",
|
||||
"order_detail.cost_price": "成本价",
|
||||
"order_detail.create_time": "创建时间",
|
||||
"order_detail.update_time": "更新时间",
|
||||
"order_cash.order_no": "订单号",
|
||||
"order_cash.trade_no": "交易号",
|
||||
"order_cash.wechat_detail_id": "微信明细单号",
|
||||
"order_cash.channel": "渠道",
|
||||
"order_cash.denomination": "红包面额",
|
||||
"order_cash.account": "领取账号",
|
||||
"order_cash.receive_name": "真实姓名",
|
||||
"order_cash.app_id": "转账AppID",
|
||||
"order_cash.cash_activity_id": "红包批次号",
|
||||
"order_cash.receive_status": "领取状态",
|
||||
"order_cash.receive_time": "拆红包时间",
|
||||
"order_cash.success_time": "成功时间",
|
||||
"order_cash.cash_packet_id": "红包ID",
|
||||
"order_cash.channel_order_id": "渠道订单号",
|
||||
"order_cash.pay_fund_order_id": "资金订单号",
|
||||
"order_cash.cash_id": "红包规则ID",
|
||||
"order_cash.amount": "红包额度",
|
||||
"order_cash.activity_id": "活动ID",
|
||||
"order_cash.goods_id": "商品ID",
|
||||
"order_cash.merchant_id": "分销商ID",
|
||||
"order_cash.supplier_id": "供应商ID",
|
||||
"order_cash.user_id": "创建者ID",
|
||||
"order_cash.status": "状态",
|
||||
"order_cash.expire_time": "过期时间",
|
||||
"order_cash.create_time": "创建时间",
|
||||
"order_cash.update_time": "更新时间",
|
||||
"order_cash.version": "版本",
|
||||
"order_cash.is_confirm": "是否确认",
|
||||
"order_voucher.channel": "渠道",
|
||||
"order_voucher.channel_activity_id": "渠道立减金批次",
|
||||
"order_voucher.channel_voucher_id": "渠道立减金ID",
|
||||
"order_voucher.status": "状态",
|
||||
"order_voucher.receive_mode": "领取方式",
|
||||
"order_voucher.grant_time": "领取时间",
|
||||
"order_voucher.usage_time": "核销时间",
|
||||
"order_voucher.refund_time": "退款时间",
|
||||
"order_voucher.status_modify_time": "状态更新时间",
|
||||
"order_voucher.overdue_time": "过期时间",
|
||||
"order_voucher.refund_amount": "退款金额",
|
||||
"order_voucher.official_price": "官方价",
|
||||
"order_voucher.out_biz_no": "外部业务号",
|
||||
"order_voucher.account_no": "账户号",
|
||||
"plan.id": "计划ID",
|
||||
"plan.title": "计划标题",
|
||||
"plan.status": "状态",
|
||||
"plan.begin_time": "开始时间",
|
||||
"plan.end_time": "结束时间",
|
||||
"key_batch.id": "批次ID",
|
||||
"key_batch.batch_name": "批次名称",
|
||||
"key_batch.bind_object": "绑定对象",
|
||||
"key_batch.quantity": "发放数量",
|
||||
"key_batch.stock": "剩余库存",
|
||||
"key_batch.begin_time": "开始时间",
|
||||
"key_batch.end_time": "结束时间",
|
||||
"code_batch.id": "兑换批次ID",
|
||||
"code_batch.title": "标题",
|
||||
"code_batch.status": "状态",
|
||||
"code_batch.begin_time": "开始时间",
|
||||
"code_batch.end_time": "结束时间",
|
||||
"code_batch.quantity": "数量",
|
||||
"code_batch.usage": "使用数",
|
||||
"code_batch.stock": "库存",
|
||||
"voucher.channel": "渠道",
|
||||
"voucher.channel_activity_id": "渠道批次号",
|
||||
"voucher.price": "合同单价",
|
||||
"voucher.balance": "剩余额度",
|
||||
"voucher.used_amount": "已用额度",
|
||||
"voucher.denomination": "面额",
|
||||
"voucher_batch.channel_activity_id": "渠道批次号",
|
||||
"voucher_batch.temp_no": "模板编号",
|
||||
"voucher_batch.provider": "服务商",
|
||||
"voucher_batch.weight": "权重",
|
||||
"merchant_key_send.merchant_id": "商户ID",
|
||||
"merchant_key_send.out_biz_no": "商户业务号",
|
||||
"merchant_key_send.key": "券码",
|
||||
"merchant_key_send.status": "状态",
|
||||
"merchant_key_send.usage_time": "核销时间",
|
||||
"merchant_key_send.create_time": "创建时间",
|
||||
"order_digit.order_no": "订单号",
|
||||
"order_digit.card_no": "卡号",
|
||||
"order_digit.account": "充值账号",
|
||||
"order_digit.goods_id": "商品ID",
|
||||
"order_digit.merchant_id": "分销商ID",
|
||||
"order_digit.supplier_id": "供应商ID",
|
||||
"order_digit.activity_id": "活动ID",
|
||||
"order_digit.user_id": "创建者ID",
|
||||
"order_digit.success_time": "到账时间",
|
||||
"order_digit.supplier_product_no": "供应商产品编码",
|
||||
"order_digit.order_type": "商品类型",
|
||||
"order_digit.end_time": "卡密有效期",
|
||||
"order_digit.create_time": "创建时间",
|
||||
"order_digit.update_time": "更新时间",
|
||||
"order_digit.code": "验证码",
|
||||
// "order_digit.sms_channel": "短信渠道", // 字段不再对外展示和导出
|
||||
"goods_voucher_batch.channel_batch_no": "渠道批次号",
|
||||
"goods_voucher_batch.voucher_subject_id": "主体配置ID",
|
||||
|
|
@ -389,54 +389,54 @@ func AllLabels() map[string]string {
|
|||
"goods_voucher_subject_config.name": "主体名称",
|
||||
"goods_voucher_subject_config.type": "主体类型",
|
||||
"goods_voucher_subject_config.create_time": "创建时间",
|
||||
"merchant.id": "客户ID",
|
||||
"merchant.name": "客户名称",
|
||||
"merchant.user_id": "用户中心ID",
|
||||
"merchant.merchant_no": "商户编码",
|
||||
"merchant.subject": "客户主体",
|
||||
"merchant.third_party": "供应商类型",
|
||||
"merchant.status": "状态",
|
||||
"merchant.balance": "客户余额",
|
||||
"merchant.total_consumption": "累计消费",
|
||||
"merchant.contact_name": "联系人名称",
|
||||
"merchant.contact_phone": "联系人电话",
|
||||
"merchant.contact_email": "联系人Email",
|
||||
"merchant.create_time": "创建时间",
|
||||
"merchant.update_time": "编辑时间",
|
||||
"activity.id": "活动ID",
|
||||
"activity.name": "活动名称",
|
||||
"activity.user_id": "创建者ID",
|
||||
"activity.merchant_id": "客户ID",
|
||||
"activity.user_name": "创建者名称",
|
||||
"activity.activity_no": "活动编号",
|
||||
"activity.status": "状态",
|
||||
"activity.key_total_num": "Key码总量",
|
||||
"activity.key_generate_num": "Key码已生成数量",
|
||||
"activity.key_usable_num": "Key可使用次数",
|
||||
"activity.domain_url": "域名",
|
||||
"activity.theme_login_id": "登录模版ID",
|
||||
"activity.theme_list_id": "列表模版ID",
|
||||
"activity.theme_verify_id": "验证模版ID",
|
||||
"activity.settlement_type": "结算方式",
|
||||
"activity.key_style": "Key样式",
|
||||
"activity.begin_time": "开始时间",
|
||||
"activity.end_time": "结束时间",
|
||||
"activity.is_retry": "是否自动重试",
|
||||
"activity.create_time": "创建时间",
|
||||
"activity.update_time": "修改时间",
|
||||
"activity.discard_time": "作废时间",
|
||||
"activity.delete_time": "删除时间",
|
||||
"activity.auto_charge": "是否充值到账",
|
||||
"activity.stock": "已使用库存",
|
||||
"activity.approval_trade_no": "审批交易号",
|
||||
"activity.amount": "支付金额",
|
||||
"activity.channels": "支付渠道",
|
||||
"activity.key_begin": "开始月份",
|
||||
"activity.key_end": "截止月份",
|
||||
"activity.key_unit": "时间单位",
|
||||
"activity.key_pay_button_text": "Key支付按钮文本",
|
||||
"activity.goods_pay_button_text": "商品支付按钮文本",
|
||||
"activity.is_open_db_transaction": "是否开启事务",
|
||||
"merchant.id": "客户ID",
|
||||
"merchant.name": "客户名称",
|
||||
"merchant.user_id": "用户中心ID",
|
||||
"merchant.merchant_no": "商户编码",
|
||||
"merchant.subject": "客户主体",
|
||||
"merchant.third_party": "供应商类型",
|
||||
"merchant.status": "状态",
|
||||
"merchant.balance": "客户余额",
|
||||
"merchant.total_consumption": "累计消费",
|
||||
"merchant.contact_name": "联系人名称",
|
||||
"merchant.contact_phone": "联系人电话",
|
||||
"merchant.contact_email": "联系人Email",
|
||||
"merchant.create_time": "创建时间",
|
||||
"merchant.update_time": "编辑时间",
|
||||
"activity.id": "活动ID",
|
||||
"activity.name": "活动名称",
|
||||
"activity.user_id": "创建者ID",
|
||||
"activity.merchant_id": "客户ID",
|
||||
"activity.user_name": "创建者名称",
|
||||
"activity.activity_no": "活动编号",
|
||||
"activity.status": "状态",
|
||||
"activity.key_total_num": "Key码总量",
|
||||
"activity.key_generate_num": "Key码已生成数量",
|
||||
"activity.key_usable_num": "Key可使用次数",
|
||||
"activity.domain_url": "域名",
|
||||
"activity.theme_login_id": "登录模版ID",
|
||||
"activity.theme_list_id": "列表模版ID",
|
||||
"activity.theme_verify_id": "验证模版ID",
|
||||
"activity.settlement_type": "结算方式",
|
||||
"activity.key_style": "Key样式",
|
||||
"activity.begin_time": "开始时间",
|
||||
"activity.end_time": "结束时间",
|
||||
"activity.is_retry": "是否自动重试",
|
||||
"activity.create_time": "创建时间",
|
||||
"activity.update_time": "修改时间",
|
||||
"activity.discard_time": "作废时间",
|
||||
"activity.delete_time": "删除时间",
|
||||
"activity.auto_charge": "是否充值到账",
|
||||
"activity.stock": "已使用库存",
|
||||
"activity.approval_trade_no": "审批交易号",
|
||||
"activity.amount": "支付金额",
|
||||
"activity.channels": "支付渠道",
|
||||
"activity.key_begin": "开始月份",
|
||||
"activity.key_end": "截止月份",
|
||||
"activity.key_unit": "时间单位",
|
||||
"activity.key_pay_button_text": "Key支付按钮文本",
|
||||
"activity.goods_pay_button_text": "商品支付按钮文本",
|
||||
"activity.is_open_db_transaction": "是否开启事务",
|
||||
// removed bank_tag: not present in current YMT activity schema
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,28 +12,29 @@ func (marketingSchema) BuildJoins(need map[string]bool, main string) []string {
|
|||
out = append(out, " LEFT JOIN `order_detail` ON `order_detail`.order_number = `order`.order_number")
|
||||
}
|
||||
if need["order_cash"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `order_cash`.*, ROW_NUMBER() OVER (PARTITION BY `order_cash`.order_number ORDER BY `order_cash`.id DESC) AS rn FROM `order_cash`) t WHERE t.rn = 1) AS `order_cash` ON `order_cash`.order_number = `order`.order_number")
|
||||
// MySQL 5.7: no window functions; keep latest row by id via correlated subquery (no GROUP BY)
|
||||
out = append(out, " LEFT JOIN `order_cash` ON `order_cash`.id = (SELECT MAX(oc2.id) FROM `order_cash` oc2 WHERE oc2.order_number = `order`.order_number)")
|
||||
}
|
||||
if need["order_voucher"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `order_voucher`.*, ROW_NUMBER() OVER (PARTITION BY `order_voucher`.order_number ORDER BY `order_voucher`.id DESC) AS rn FROM `order_voucher`) t WHERE t.rn = 1) AS `order_voucher` ON `order_voucher`.order_number = `order`.order_number")
|
||||
out = append(out, " LEFT JOIN `order_voucher` ON `order_voucher`.id = (SELECT MAX(ov2.id) FROM `order_voucher` ov2 WHERE ov2.order_number = `order`.order_number)")
|
||||
}
|
||||
if need["plan"] || need["key_batch"] {
|
||||
out = append(out, " LEFT JOIN `plan` ON `plan`.id = `order`.plan_id")
|
||||
}
|
||||
if need["key_batch"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `key_batch`.*, ROW_NUMBER() OVER (PARTITION BY `key_batch`.plan_id ORDER BY `key_batch`.id DESC) AS rn FROM `key_batch`) t WHERE t.rn = 1) AS `key_batch` ON `key_batch`.plan_id = `plan`.id")
|
||||
out = append(out, " LEFT JOIN `key_batch` ON `key_batch`.plan_id = `plan`.id")
|
||||
}
|
||||
if need["code_batch"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `code_batch`.*, ROW_NUMBER() OVER (PARTITION BY `code_batch`.key_batch_id ORDER BY `code_batch`.id DESC) AS rn FROM `code_batch`) t WHERE t.rn = 1) AS `code_batch` ON `code_batch`.key_batch_id = `key_batch`.id")
|
||||
out = append(out, " LEFT JOIN `code_batch` ON `code_batch`.key_batch_id = `key_batch`.id")
|
||||
}
|
||||
if need["voucher"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `voucher`.*, ROW_NUMBER() OVER (PARTITION BY `voucher`.channel_activity_id ORDER BY `voucher`.id DESC) AS rn FROM `voucher`) t WHERE t.rn = 1) AS `voucher` ON `voucher`.channel_activity_id = `order_voucher`.channel_activity_id")
|
||||
out = append(out, " LEFT JOIN `voucher` ON `voucher`.id = (SELECT MAX(v2.id) FROM `voucher` v2 WHERE v2.channel_activity_id = `order_voucher`.channel_activity_id)")
|
||||
}
|
||||
if need["voucher_batch"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `voucher_batch`.*, ROW_NUMBER() OVER (PARTITION BY `voucher_batch`.voucher_id ORDER BY `voucher_batch`.id DESC) AS rn FROM `voucher_batch`) t WHERE t.rn = 1) AS `voucher_batch` ON `voucher_batch`.voucher_id = `voucher`.id")
|
||||
out = append(out, " LEFT JOIN `voucher_batch` ON `voucher_batch`.id = (SELECT MAX(vb2.id) FROM `voucher_batch` vb2 WHERE vb2.voucher_id = `voucher`.id)")
|
||||
}
|
||||
if need["merchant_key_send"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `merchant_key_send`.*, ROW_NUMBER() OVER (PARTITION BY `merchant_key_send`.key ORDER BY `merchant_key_send`.id DESC) AS rn FROM `merchant_key_send`) t WHERE t.rn = 1) AS `merchant_key_send` ON `order`.`key` = `merchant_key_send`.key")
|
||||
out = append(out, " LEFT JOIN `merchant_key_send` ON `order`.`key` = `merchant_key_send`.key")
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,14 +52,13 @@ func (s ymtSchema) MapField(t, f string) (string, bool) {
|
|||
func (s ymtSchema) BuildJoins(need map[string]bool, main string) []string {
|
||||
out := []string{}
|
||||
if need["order_cash"] {
|
||||
// avoid 1:N duplication: keep latest row per order_no (no GROUP BY)
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `order_cash`.*, ROW_NUMBER() OVER (PARTITION BY `order_cash`.order_no ORDER BY `order_cash`.id DESC) AS rn FROM `order_cash`) t WHERE t.rn = 1) AS `order_cash` ON `order_cash`.order_no = `order_info`.order_no")
|
||||
out = append(out, " LEFT JOIN `order_cash` ON `order_cash`.order_no = `order_info`.order_no")
|
||||
}
|
||||
if need["order_voucher"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `order_voucher`.*, ROW_NUMBER() OVER (PARTITION BY `order_voucher`.order_no ORDER BY `order_voucher`.id DESC) AS rn FROM `order_voucher`) t WHERE t.rn = 1) AS `order_voucher` ON `order_voucher`.order_no = `order_info`.order_no")
|
||||
out = append(out, " LEFT JOIN `order_voucher` ON `order_voucher`.order_no = `order_info`.order_no")
|
||||
}
|
||||
if need["order_digit"] {
|
||||
out = append(out, " LEFT JOIN (SELECT * FROM (SELECT `order_digit`.*, ROW_NUMBER() OVER (PARTITION BY `order_digit`.order_no ORDER BY `order_digit`.id DESC) AS rn FROM `order_digit`) t WHERE t.rn = 1) AS `order_digit` ON `order_digit`.order_no = `order_info`.order_no")
|
||||
out = append(out, " LEFT JOIN `order_digit` ON `order_digit`.order_no = `order_info`.order_no")
|
||||
}
|
||||
if need["goods_voucher_batch"] {
|
||||
out = append(out, " LEFT JOIN `goods_voucher_batch` ON `goods_voucher_batch`.channel_batch_no = `order_voucher`.channel_batch_no")
|
||||
|
|
|
|||
Loading…
Reference in New Issue