十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

本地生活服务系统:模块边界与结算字段怎么拆

本地生活服务系统:模块边界与结算字段怎么拆 地级市综合运营商做本地生活服务系统技术评审里除了问「有哪些模块」更该问「模块边界怎么划、结算字段放哪张表」。若外卖、跑腿、同城团购各维护独立结算导出逻辑财务对账就要人工拼加模块时结算规则又要重写一遍专项定制预算很快烧在返工上。下文从模块边界、结算表结构、Service 伪代码说明「统一结算中枢 业态扩展字段」怎么拆。示例为教学示意以光合同城当期交付为准。痛点结算返工根因往往是字段散落各模块早期拼装方案常见结构外卖模块自带wm_settle_detail跑腿模块自带errand_settle_detail各模块独立导出 CSV列名、精度、状态枚举各不一致加第三业态时财务要求的核对列又要重新开发后果很直观周会前要对结算运营从三个后台各导一份表再拼改一条商务规则要在多个系统各改一遍。本地生活服务系统若走统一后台一体化架构上应先收敛结算写路径与导出配置再谈 UI 有多少菜单。地级市评审时可先问结算明细是否全业态共用主表导出列是否可配置加模块时结算规则是否可继承答不上来后面多半要反复花钱改字段。模块边界订单中枢、结算中枢、业态插件local-life-service/ ├── apps/ │ ├── user-app/ │ ├── merchant-app/ │ ├── rider-app/ │ └── admin-console/ # 统一运营后台 ├── order-hub/ # 订单中枢唯一写入口 │ ├── command-api/ │ ├── state-machine/ │ └── read-model/ ├── settlement-hub/ # 结算中枢唯一写入口 │ ├── settle-command/ │ ├── export-config/ │ ├── reconcile-read/ │ └── field-mapping.yaml ├── biz-plugins/ │ ├── takeout/ │ ├── errand/ │ └── group-buy/ ├── mid-shared/ │ ├── user-master/ │ ├── merchant-master/ │ └── marketing-core/ └── ops/ ├── settle-export-columns.yaml └── biz-settle-rules.yaml边界原则order-hub管订单状态settlement-hub管结算明细与导出业态插件禁止直连 UPDATE 结算主表。各biz-plugin只提供业态扩展字段与合法状态分支结算通用字段在settlement-hub统一维护。Admin 控制台结算导出走export-config列定义来自 YAML而非各模块硬编码。结算主表通用字段 业态扩展-- 结算明细主表全业态共用CREATETABLEst_settle_detail(idBIGINTPRIMARYKEYAUTO_INCREMENT,order_idBIGINTNOTNULL,order_noVARCHAR(32)NOTNULL,biz_typeVARCHAR(16)NOTNULLCOMMENTtakeout|errand|group_buy|...,merchant_idBIGINTNOTNULL,user_idBIGINTNOTNULL,city_codeVARCHAR(12)NOTNULL,order_amountDECIMAL(12,2)NOTNULLCOMMENT订单原价,discount_amountDECIMAL(12,2)NOTNULLDEFAULT0COMMENT优惠抵扣,platform_feeDECIMAL(12,2)NOTNULLDEFAULT0COMMENT平台服务费客户自定规则,merchant_incomeDECIMAL(12,2)NOTNULLCOMMENT商家应得,rider_feeDECIMAL(12,2)NULLCOMMENT配送费如有,settle_statusVARCHAR(16)NOTNULLCOMMENTpending|confirmed|paid|disputed,settle_batch_noVARCHAR(32)NULLCOMMENT结算批次号,created_atDATETIMENOTNULL,updated_atDATETIMENOTNULL,INDEXidx_merchant_batch(merchant_id,settle_batch_no),INDEXidx_biz_status(biz_type,settle_status))COMMENT本地生活统一结算明细;-- 外卖结算扩展CREATETABLEst_settle_takeout_ext(settle_idBIGINTPRIMARYKEY,delivery_subsidyDECIMAL(12,2)NULLCOMMENT配送补贴,packaging_feeDECIMAL(12,2)NULL,CONSTRAINTfk_takeout_settleFOREIGNKEY(settle_id)REFERENCESst_settle_detail(id));-- 跑腿结算扩展CREATETABLEst_settle_errand_ext(settle_idBIGINTPRIMARYKEY,distance_kmDECIMAL(8,2)NULL,weight_surchargeDECIMAL(12,2)NULL,CONSTRAINTfk_errand_settleFOREIGNKEY(settle_id)REFERENCESst_settle_detail(id));-- 导出配置列定义可配置避免各模块硬编码CREATETABLEst_export_column_def(idINTPRIMARYKEYAUTO_INCREMENT,column_keyVARCHAR(32)NOTNULLUNIQUE,column_labelVARCHAR(64)NOTNULL,source_tableVARCHAR(64)NOTNULLCOMMENTst_settle_detail|ext,source_fieldVARCHAR(64)NOTNULL,sort_orderINTNOTNULLDEFAULT0,enabledTINYINTNOTNULLDEFAULT1);设计约束merchant_income、platform_fee等通用字段只在st_settle_detail维护禁止各模块复制结算表。业态差异放st_settle_*_ext导出时 JOIN 主表与扩展表。商务结算规则由客户确定系统提供可配置核对字段与导出项不作收益承诺。导出列配置YAML 驱动少返工# ops/settle-export-columns.yaml示意default_export:columns:-key:order_nolabel:订单号source:st_settle_detail.order_no-key:biz_typelabel:业态source:st_settle_detail.biz_type-key:merchant_namelabel:商家名称source:md_merchant.namejoin:merchant_id-key:order_amountlabel:订单金额source:st_settle_detail.order_amount-key:discount_amountlabel:优惠抵扣source:st_settle_detail.discount_amount-key:platform_feelabel:平台服务费source:st_settle_detail.platform_fee-key:merchant_incomelabel:商家应得source:st_settle_detail.merchant_income-key:settle_statuslabel:结算状态source:st_settle_detail.settle_status-key:settle_batch_nolabel:结算批次source:st_settle_detail.settle_batch_notakeout_extra:-key:delivery_subsidylabel:配送补贴source:st_settle_takeout_ext.delivery_subsidywhen_biz:takeouterrand_extra:-key:distance_kmlabel:配送公里source:st_settle_errand_ext.distance_kmwhen_biz:errand财务临时要求加一列核对项时优先在 YAML 和st_export_column_def配置而非各模块改硬编码导出逻辑。这是减少本地生活服务系统后期返工的关键。业态结算规则分支在配置不在代码复制# ops/biz-settle-rules.yaml示意common:platform_fee_mode:percent# percent|fixed|tiered客户配置platform_fee_rate:0.05# 示意值客户自定merchant_income_formula:order_amount - discount_amount - platform_feetakeout:inherit:commonextra_fields:-packaging_fee-delivery_subsidyrider_fee_source:order_ext.rider_feeerrand:inherit:commonextra_fields:-distance_km-weight_surchargerider_fee_source:calculated_by_distancegroup_buy:inherit:commonextra_fields:-verify_code-verify_time加第三业态时只需在 YAML 增加inherit: common与扩展字段清单结算主表结构不变。Service 伪代码结算唯一写入口ServicepublicclassSettlementCommandService{publicSettleDetailconfirmSettle(ConfirmSettleCmdcmd,Operatorop){OrderorderorderRepo.findById(cmd.getOrderId());SettleRuleruleruleLoader.load(order.getBizType());SettleDetaildetailnewSettleDetail();detail.setOrderId(order.getId());detail.setOrderNo(order.getOrderNo());detail.setBizType(order.getBizType());detail.setMerchantId(order.getMerchantId());detail.setOrderAmount(order.getPayAmount());detail.setDiscountAmount(calcDiscount(order));detail.setPlatformFee(calcPlatformFee(order,rule));detail.setMerchantIncome(calcMerchantIncome(order,rule));detail.setSettleStatus(pending);settleRepo.save(detail);saveBizExtIfNeeded(detail,order,rule);auditLog.append(settle_confirmed,detail.getId(),op);returndetail;}privateBigDecimalcalcPlatformFee(Orderorder,SettleRulerule){if(percent.equals(rule.getPlatformFeeMode())){returnorder.getPayAmount().multiply(rule.getPlatformFeeRate()).setScale(2,RoundingMode.HALF_UP);}// fixed / tiered 分支略returnBigDecimal.ZERO;}}ServicepublicclassSettlementExportService{publicExportFileexportByBatch(StringbatchNo,ExportProfileprofile){ListColumnDefcolumnscolumnDefRepo.load(profile);ListMapString,ObjectrowsreconcileRead.query(batchNo,columns);returncsvWriter.write(rows,columns);}}所有结算明细生成只经SettlementCommandService导出只经SettlementExportServiceAdmin 控制台不得各模块各自写导出 SQL。与统一后台的关系结算中枢与订单中枢、用户核心资料同属统一后台层统一后台结算导出、批次确认、争议标记在同一 Admin 入口按biz_type筛选。数据互通结算明细关联统一order_id、merchant_id、user_id禁止各模块独立结算副本。能力共享新增导出列、调整核对字段在settlement-hub/export-config一处变更各业态同步生效。光合同城国内综合形态走统一后台一体化路线内置多业务模块模块数据互通、后台统一管理。成品可直接部署支持私有化源码与按需定制商务结算规则由客户自行确定。验收清单技术评审可用结算主表是否全业态共用禁止各模块复制settle_detail。导出列是否 YAML 可配置财务临时加列是否不必改各模块代码加第三业态时结算规则是否inherit: common即可结算写路径是否唯一禁止业态插件直连 UPDATE 结算表。统一 Admin 是否一处导出而非每个业态各导一份再拼本地生活服务系统里模块边界与结算字段怎么拆决定了后期是改配置还是反复返工。先把结算中枢和导出配置收敛再按节奏叠业态插件比每个模块各存各的结算逻辑往往更稳。
返回列表