3.4 KiB
3.4 KiB
Tasks
- Task 1: customer 表新增 icc_code 字段(数据库层)
- 新建迁移文件
database/migrations/20261016_icc_customer_sync.sql:ALTER TABLE customer ADD COLUMN icc_code(幂等)+ 唯一索引 - 同步更新
database/db_init.sql中 customer 建表结构(含 icc_code 与唯一索引),保持幂等一致
- 新建迁移文件
- Task 2: customer 实体新增 iccCode 字段
server/src/entity/customer.entity.ts增加iccCode(STRING(64),field=icc_code,不设 unique 避免与迁移脚本索引重复)
- Task 3: ICC OAuth2 鉴权客户端
- 封装公钥获取(GET
/evo-apigw/evo-oauth/{version}/oauth/public-key) - 封装 RSA/ECB/PKCS1 分块加密(Node
crypto.publicEncrypt,块长 117,Base64 输出,对齐文档 Java 示例)— 已冒烟验证加解密往返一致 - 封装 token 获取(POST
/evo-apigw/evo-oauth/{version}/oauth/extend/token),进程内缓存 access_token,按 expires_in 过期自动续签
- 封装公钥获取(GET
- Task 4: ICC 客户字段映射器
server/src/task/icc_customer_mapper.ts:集中配置接口端点、org_base 过滤条件、字段映射(orgCode→iccCode、orgName→customerName、province/city/county)、PageVO 解析 — 修复读取 bug 后冒烟验证通过
- Task 5: IccCustomerSyncService 同步服务
server/src/service/icc_customer_sync.service.ts:读取.env配置(缺失视为失败仅记日志)- 分页全量拉取(maxRangeId=0,pageSize=1000,循环至末页),过滤 orgType=org_base
- 预取现有客户 icc_code 映射,按 iccCode 幂等 upsert:先比较 customer_name/province/city/district 四个映射字段,仅任一字段不一致才 update,一致则跳过;新增客户复用 CustomerService.generateCustomerNo(已改 public,KH+YYYYMMDD+3位序号);其余字段(status/salesman_id/联系方式等)不动
- 每次同步写
icc_sync_log(sync_type=customer,status/record_count/error_message);失败仅记录不抛出
- Task 6: 定时任务注册与调度器接线
server/src/task/icc_customer_sync.task.ts:jobKey=icc_customer_sync,默认 cron*/10 * * * *server/src/task/job_registry.ts:注册到 BUILTIN_JOBS,JobRuntime 增加 syncIccCustomersserver/src/service/job_scheduler.service.ts:buildRuntime 增加syncIccCustomers,经匿名上下文注入 IccCustomerSyncServicedatabase/db_seed.sql新增 sys_job 种子(job_key=icc_customer_sync,按 job_key 幂等)
- Task 7: .env 配置
server/.env增加 ICC_BASE_URL / ICC_VERSION / ICC_CLIENT_ID / ICC_CLIENT_SECRET / ICC_USERNAME / ICC_PASSWORD(凭据取自接口文档)
- Task 8: 编译与运行验证
server目录执行yarn build通过(修复 mapper 后复验通过)- 冒烟验证:RSA 分块加解密往返一致、映射器字段映射与分页解析正确(无副作用,未连库);端到端写库同步需在部署环境首次执行时由真实 ICC 接口 + 数据库实际确认
Task Dependencies
- [Task 1] 无依赖,可先行
- [Task 2] 依赖 [Task 1](字段定义与库结构一致)
- [Task 3] 无依赖,可与 [Task 1] 并行
- [Task 4] 依赖 [Task 3](需确认响应结构/鉴权头),也可并行开发
- [Task 5] 依赖 [Task 1][Task 2][Task 3][Task 4]
- [Task 6] 依赖 [Task 5]
- [Task 7] 依赖 [Task 3](凭据键名一致),可并行
- [Task 8] 依赖全部前置任务