news 2026/9/2 15:59:46

本地生活服务系统:成品模块和定制接口怎么划界

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
本地生活服务系统:成品模块和定制接口怎么划界

地级市综合运营商做本地生活服务系统,技术评审里除了问「有哪些模块」,更该问「模块边界怎么划、结算字段放哪张表」。若外卖、跑腿、同城团购各维护独立结算导出逻辑,财务对账就要人工拼;加模块时结算规则又要重写一遍,专项定制预算很快烧在返工上。

下文从模块边界、结算表结构、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

边界原则:

  1. order-hub管订单状态,settlement-hub管结算明细与导出,业态插件禁止直连 UPDATE 结算主表。
  2. biz-plugin只提供业态扩展字段与合法状态分支,结算通用字段在settlement-hub统一维护。
  3. Admin 控制台结算导出走export-config,列定义来自 YAML,而非各模块硬编码。

结算主表:通用字段 + 业态扩展

-- 结算明细主表:全业态共用CREATETABLEst_settle_detail(idBIGINTPRIMARYKEYAUTO_INCREMENT,order_idBIGINTNOTNULL,order_noVARCHAR(32)NOTNULL,biz_typeVARCHAR(16)NOTNULLCOMMENT'takeout|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)NOTNULLCOMMENT'pending|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)NOTNULLCOMMENT'st_settle_detail|ext',source_fieldVARCHAR(64)NOTNULL,sort_orderINTNOTNULLDEFAULT0,enabledTINYINTNOTNULLDEFAULT1);

设计约束:

  1. merchant_incomeplatform_fee等通用字段只在st_settle_detail维护,禁止各模块复制结算表。
  2. 业态差异放st_settle_*_ext,导出时 JOIN 主表与扩展表。
  3. 商务结算规则由客户确定;系统提供可配置核对字段与导出项,不作收益承诺。

导出列配置: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_fee"takeout: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){Orderorder=orderRepo.findById(cmd.getOrderId());SettleRulerule=ruleLoader.load(order.getBizType());SettleDetaildetail=newSettleDetail();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){List<ColumnDef>columns=columnDefRepo.load(profile);List<Map<String,Object>>rows=reconcileRead.query(batchNo,columns);returncsvWriter.write(rows,columns);}}

所有结算明细生成只经SettlementCommandService;导出只经SettlementExportService,Admin 控制台不得各模块各自写导出 SQL。

与统一后台的关系

结算中枢与订单中枢、用户核心资料同属统一后台层:

  • 统一后台:结算导出、批次确认、争议标记在同一 Admin 入口,按biz_type筛选。
  • 数据互通:结算明细关联统一order_idmerchant_iduser_id,禁止各模块独立结算副本。
  • 能力共享:新增导出列、调整核对字段,在settlement-hub/export-config一处变更,各业态同步生效。

光合同城国内综合形态走统一后台一体化路线:内置多业务模块,模块数据互通、后台统一管理。成品可直接部署;支持私有化源码与按需定制,商务结算规则由客户自行确定。

验收清单(技术评审可用)

  1. 结算主表是否全业态共用?禁止各模块复制settle_detail
  2. 导出列是否 YAML 可配置?财务临时加列是否不必改各模块代码?
  3. 加第三业态时,结算规则是否inherit: common即可?
  4. 结算写路径是否唯一?禁止业态插件直连 UPDATE 结算表。
  5. 统一 Admin 是否一处导出,而非每个业态各导一份再拼?

本地生活服务系统里,模块边界与结算字段怎么拆,决定了后期是改配置还是反复返工。先把结算中枢和导出配置收敛,再按节奏叠业态插件,比每个模块各存各的结算逻辑,往往更稳。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 15:59:18

同城上门预约系统源码拆解:从派单逻辑到多端运营落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 15:58:27

C++编程实例100篇实战:实例驱动学习路线与工程思维培养

简介&#xff1a;C编程实例100篇是一份以实践为导向的C学习资源包&#xff0c;精选100个典型示例&#xff0c;覆盖变量、数据类型、运算符、控制结构、函数、文件输入输出、面向对象&#xff08;封装、继承、多态&#xff09;、模板、异常处理及标准库容器等内容。资源包共包含…

作者头像 李华
网站建设 2026/9/2 15:57:25

希尔排序是什么?一文详解(附例题)

摘要 希尔排序是插入排序的改进版&#xff0c;通过增量分组实现元素跨距离移动&#xff0c;大幅减少逐位挪动开销。每趟排序按当前增量将序列分成若干子序列&#xff0c;分别进行插入排序&#xff1b;随后逐步缩小增量&#xff0c;直到增量为1时做最后一次整体插入排序。若增量…

作者头像 李华
网站建设 2026/9/2 15:52:37

7 MCP协议

一、MCP 必知必会 什么是 MCP&#xff1f; MCP&#xff08;Model Co⁠ntext Protocol&#xff0c;模型上下文协议&#xff09;是‌一种开放标准&#xff0c;目的是增强 AI 与外部系统的交互​能力。MCP 为 AI 提供了与外部工具、资源和‎服务交互的标准化方式&#xff0c;让 A…

作者头像 李华
网站建设 2026/9/2 15:50:26

单片机计算机毕设之基于 STM32 的本地身份核验与 APP 远程管理门禁系统实现 基于 STM32 的指纹射频卡密码智能门锁监控系统设计(012506)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华