1. 立项背景和目标
公司销售环节已使用纷享销客 CRM 管理客户、销售订单与回款流程,但财务、库存、生产环节仍依赖 K/3 ERP(SQL Server 2008 R2,AIS20130806192009 账套)。两套系统长期互不相通,订单需要人工二次录入,客户变更也无法及时回流到 ERP,导致数据孤岛、人力浪费以及业务-财务对账滞后等问题。本项目旨在构建一个轻量级中间对接服务(ConnectDemo),以 K/3 为主数据底座,将纷享销客的客户主数据与销售订单自动同步到 K/3,支撑业务一体化运营。
2. 软件功能、核心功能模块介绍
本服务围绕「K/3 数据查询、纷享→K/3 客户/订单同步、辅助工具、定时任务」四大模块建设,共 25+ 个 REST 接口:
K/3 业务数据查询:封装物料(ICItem)、库存(ICInventory)、销售订单(SEOrder)、应收单(ICSale)、收款单(ReceiveBill)、销售发票(ICSale2)六大实体的列表与数量接口,按日期范围分页查询。
客户主数据同步:调用纷享 Open API(/cgi/crm/v2/data/query)按 life_status=normal + k3_sync_fields_last_modify__c >= 1小时前 增量拉取客户,结合 Address/Contact 对象补全地址与联系人,写入 K/3 的 t_Item、t_Organization 表。
销售订单同步:/k3/sync-seorder 是核心,按 FBillNo + FHeadSelfS0170 来源标识判定新建/修改,调用 GetICMaxNum 存储过程获取 FInterID,通过 t_billcodeby 生成 XSDD15+yyyymmdd+流水号 形式的单据编号,写入 SEOrder 主表、明细表后执行 p_UpdateBillRelateData 重建关联。
辅助工具:地址智能解析(/util/parse-address-info)将「姓名+电话+省市区+详细地址」一锅端的混合文本拆分为结构化字段;客户档案修订接口(/account/update-account-number)支持必要时调整 K/3 客户编码。
3. 业务流程、功能路径描述
被动同步(客户):纷享销客工作流回调 GET /fxapi/sync-accounts → 服务 60 秒后异步拉取最新客户 → 写入 K/3。主动同步(客户):APScheduler 每小时执行 sync_accounts_from_fxiaoke_to_k3 → 调用本地 accounts_by_filters → 拉取增量客户 → 写入 K/3。
订单同步:纷享订单审批完成后回调 POST /k3/sync-seorder → 服务按
1. 整体架构和设计思路,不同模块使用的技术栈
整体架构:采用「单体服务 + 多线程生产部署」的轻量架构,Flask 负责路由分发,Waitress 作为生产 WSGI 服务器(4 线程,监听 0.0.0.0:43686),APScheduler 以 BackgroundScheduler 形式同进程内托管后台任务;通过 Flask 的 g 对象 + teardown_appcontext 实现请求级 DB 连接隔离,避免全局连接在多线程下被并发踩踏。
技术栈:
Web:Python 3.11 + Flask 3.1.3 + Waitress 3.0.2
数据:pyodbc 5.3.0(直连 SQL Server 2008 R2)
集成:Requests 2.33.1(调 https://open.fxiaoke.com OpenAPI)
调度:APScheduler 3.11.2(Asia/Shanghai 时区)
日志:logging + TimedRotatingFileHandler(按天滚动、保留 30 天、all/info/error 三级目录)
2. “我” 的负责模块和结果(尽可能量化)
我独立完成整个服务的需求拆解、架构设计、编码与上线,核心成果如下:
25+ 个 REST API 路由,覆盖 K/3 六大业务实体的查询/同步。
完成 6 个客户自定义字段、17 个订单明细自定义字段的对接映射(含色号、工艺、幅宽、缸号、回扣单价/金额/回扣后金额等业务特有字段)。
纷享 Token 二级缓存机制(corpAccessToken 缓存 2h、openUserId 缓存 1h,提前 5 分钟失效),将高频接口的鉴权请求降低 99%。
订单号生成器(XSDD15+yyyymmdd+N 位流水),通过 UPDLOCK, HOLDLOCK 行锁解决高并发下 t_billcodeby 唯一性冲突。
订单同步链路:单条订单从「接收→生成 FInterID→写主表→删后插明细→跑关联存储过程」平均耗时 < 300ms。
三级日志目录(all/info/error)按天滚动 30 天,定位故障链路缩短到分钟级。
3. “我” 遇到的难点、坑,和解决方案
K/3 SQL Server 2008 R2 多部分名称无法绑定(错误 4104):JOIN 多表查询自定义字段(如 SaleOrder.FHeadSelfS0169)时报错。解决:调整查询策略,必要时拆为单表查询 + 程序内关联,避免多部分标识符。
K/3 中存在同 FBillNo 的手工订单,误更新会覆盖财务数据:直接按 FBillNo 更新存在数据安全风险。解决:在 UPDATE WHERE 中加 FHeadSelfS0170 != ''(纷享来源标识),仅更新由本服务写入的订单。
SEOrde