Files
notes/work/移动杭研/开发记录/7.18.0/domain_request 分支梳理.md
2026-03-01 01:43:46 +08:00

23 KiB
Raw Permalink Blame History

WorkOrderServiceImpl.saveCustomWorkOrder 中 domain_request 分支梳理

目标:把 saveCustomWorkOrderif (WorkOrderEnums.Type.domain_request.name().equals(workList.getType())) 这一支的整体链路、分支条件、以及涉及的库表操作梳理清楚(包含精确/泛域名、批量/非批量两条线),用于后续重构前的理解与拆分。


0. 入口位置与范围

入口方法:

  • WorkOrderServiceImpl.saveCustomWorkOrder(…)
    cdn-service/src/main/java/com/cmcc/cdn/platform/selfservice/order/WorkOrderServiceImpl.java:2634

本文聚焦分支:

  • WorkOrderServiceImpl.saveCustomWorkOrder
    if (WorkOrderEnums.Type.domain_request.name().equals(workList.getType())) { … }
    WorkOrderServiceImpl.java:2664

1. saveCustomWorkOrder 的前置校验(进入 domain_request 分支之前)

1.1 登录态与企业操作权限校验

  • 登录态为空直接失败:WorkOrderServiceImpl.java:2635-2637
  • 校验当前用户是否能操作 workList.enterprise
    • 读取当前用户可操作的企业列表:enterpriseService.getNewCustomDisplay(SecurityUserUtil.getId())
    • workList.enterprise != 当前登录企业 且也不在可操作企业列表里:抛错
      WorkOrderServiceImpl.java:2638-2643

涉及表:这里主要是服务查询,具体表在 enterpriseService 内部(本文不展开)。

1.2 企业信息读取(用于后续显示/通知等)

  • 通过 enterpriseInfoDao.findByEnterpriseId(workList.getEnterprise()) 拿企业名称
    WorkOrderServiceImpl.java:2646-2649

enterprise_info(推断)被读;实际表名需以 EnterpriseInfo 实体为准。

1.3 CP 角色分支:配置校验 + model 文案拼接

如果当前登录角色为企业账号(CP):

  • checkOrderConfig(workList) 校验姓名/手机号/邮箱格式
    WorkOrderServiceImpl.java:2650-2652
    WorkOrderServiceImpl.java:3038-3049
  • workList.model 解析成文案(CustomOrderEnums.ModelVO
    WorkOrderServiceImpl.java:2652-2658

1.4 附件数量限制

  • workList.md5List(通用附件)最多 5 个
    WorkOrderServiceImpl.java:2660-2662

2. domain_request 分支总览(主流程)

核心代码范围:

  • WorkOrderServiceImpl.java:2664-2734

整体顺序可以理解为:

  1. 企业惩戒复核(联合惩戒黑名单)
  2. DomainOrderService.handleWithDomainOrder 生成/更新域名配置需求工单(含写库)
  3. 若是修改重提:清理历史“信安附件 file_info + 工单附件关联 log_file_resource”冗余
  4. 重建本次提交的附件关联(log_file_resource
  5. 绑定工单-企业关系(worker_order_enterprise
  6. 触发信安/备案号校验与流程流转(WorkOrderManager
  7. 拼 domainInfo / enterpriseInfo 写入 request header(疑似用于后续启动 BPM 或审计)
  8. 特殊:若工单已落 BPM 且为新建(非修改),则覆盖工单下一处理人

下面按步骤拆开。


3. Step 1:联合惩戒复核(企业是否被惩戒)

  • recheckEnterprisePunishmentStatus(info)
    WorkOrderServiceImpl.java:2665-2666
    方法本体:WorkOrderServiceImpl.java:2753-2772

逻辑要点:

  • info 不存在:仅 warn,不阻断(2754-2757
  • 调用 BBoss 联合惩戒查询:bBossInteractiveService.queryJointPunish(enterpriseInfo.getEcId())2759
  • 若响应失败或已惩戒:抛 PlatformException 阻断(2761-2771

库表:无直接 DB 写入(是外部接口/服务调用)。


4. Step 2:创建/修改域名配置需求工单(核心入库点)

4.1 是否修改重提

  • boolean isModify = Objects.nonNull(workList.getId());
    WorkOrderServiceImpl.java:2667

这里的 workList.id 代表 work_order.id(运营总表主键)

4.2 调用 DomainOrderService.handleWithDomainOrder(★主入口)

  • ConfigureDomainOrderPO domainOrderPO = domainOrderService.handleWithDomainOrder(workList, modelStr);
    WorkOrderServiceImpl.java:2669

该方法位置:

  • DomainOrderService.handleWithDomainOrder(…)
    cdn-service/src/main/java/com/cmcc/cdn/platform/selfservice/order/DomainOrderService.java:2569

4.2.1 handleWithDomainOrder:域名规模/泛域名/迁移工单校验

  • 单次 add/delete 的域名数上限(配置项 MAX_DOMAIN_ADD_SIZE,默认 100
    DomainOrderService.java:2570-2574
  • 域名存在性校验(域名表或工单表):
    domainStateService.checkDomainExist(domains, workList.getCode(), workList.getRequirement())
    DomainOrderService.java:2576-2580
  • 新增(add)时泛域名包含关系校验(泛域名之间、与系统已有泛域名)
    DomainOrderService.java:2587-2596
  • 删除(delete)时校验不能存在未完成的域名迁移工单
    domainMigrateService.judgeUnCompleteDomainMigRateOrder(domains)
    DomainOrderService.java:2598-2609
  • 省份“全国(33)”展开为 31 省
    DomainOrderService.java:2612-2617
  • 非 delete 时:BSS/THIRD/WEB 来源企业必须上传信安附件
    DomainOrderService.java:2625-2632

最后落到:

  • return checkAndSaveConfigDomain(workList, modelStr);
    DomainOrderService.java:2633

4.2.2 checkAndSaveConfigDomain:批量/非批量分流、重复工单校验、入域名表

入口:

  • DomainOrderService.checkAndSaveConfigDomain(…)
    DomainOrderService.java:2328

关键分支:

  1. 批量单要求必须有 fileId(批量附件)

    • isBatch=true,把 fileId fallback 为 secInfoFileId[0](存在明显历史兼容)
      DomainOrderService.java:2333-2338
  2. 非批量必须有 speedList;删除时还校验域名状态
    DomainOrderService.java:2339-2351

  3. 修改重提场景:允许同域名的“进行中工单”只排除自己

    • 查询 configure_list + speed_configure_domain 的进行中工单:
      orderRepository.findByDomainAndStatusIsNot(domain, Finish)
      DomainOrderService.java:2354-2373
    • DomainOrderRepository.findByDomainAndStatusIsNot 是 native join(见库表章节)
  4. 直播产品不支持冲突域名(cpDomain)场景
    DomainOrderService.java:2393-2397

然后真正保存工单子表(configure_list):

  • ConfigureDomainOrderPO domainOrderPO = saveConfigureDomain(workList, modelStr);
    DomainOrderService.java:2398

并且在 domain_request + requirement=CREATE 情况下,会把域名落到域名配置表:

  • 批量:从 batch_self_domain 生成 self_service_domain_config
    DomainOrderService.java:2406-2444
  • 非批量:从 speed_configure_domain 生成 self_service_domain_config
    DomainOrderService.java:2445-2481

这一步是 “域名入域名表” 的关键点:selfServiceDomainConfigDao.saveAll(…)


5. Step 2.3 saveConfigureDomainwork_order / configure_list / 关联表写入(非常关键)

入口:

  • DomainOrderService.saveConfigureDomain(…)
    DomainOrderService.java:509

5.1 “workList.type == domain_request” vs “最终写入 work_order.type”

这里有一个容易踩坑的点:

  • saveCustomWorkOrder 的分支条件看的是 workList.getType()(前端传参)
  • saveConfigureDomain 内部会根据是否 CP 账号改写实际工单类型:
    • cpFlag=trueworkType = WorkOrderEnums.Type.configure
    • 否则 workType = WorkOrderEnums.Type.domain_request
      DomainOrderService.java:510-513

也就是说:同样走 domain_request 分支,落库可能是 configure 或 domain_request 两种工单类型(看当前登录角色)。

5.2 修改重提(isModify)的认定

  • isModify = workList.id != null && workType == domain_request
    DomainOrderService.java:514-515
  • 修改时:
    • 读取旧 work_orderworkOrderService.findById(workList.getId())516
    • 用新的域名列表覆盖 work_order.details517-521
    • 同时记录旧的 speedDomains,稍后删除旧关联行
      DomainOrderService.java:565-575

5.3 非批量新建:work_order 复用/创建 & 工单号生成

非批量 !isBatch 时:

  • 通过 customService.getWorkOrder(workType, domains, enterprise) 获取/复用 work_order
    DomainOrderService.java:523-528
  • 如果 workOrder 为空且不是 delete:生成 code
    • domain_request:调用 workOrderService.getWorkOrderCode(domain_request)
      DomainOrderService.java:534-536
    • configure:随机 16 位并保证不重复
      DomainOrderService.java:537-543

5.4 信安附件内容校验(重要:精确/泛域名都在这里做一致性校验)

  • 非 delete 时做校验:checkUnitInfomation(workList, workOrder.getCode())
    DomainOrderService.java:545-548

方法本体:

  • DomainOrderService.checkUnitInfomation(WorkOrderVO, workId)
    DomainOrderService.java:372

关键点:

  • 海外产品(ProdTypeEnum.isOverseas)且是 domain_request:跳过信安附件校验
    DomainOrderService.java:373-377
  • 读取信安 Excel(从 secInfoFileId[0])解析为对象:
    excelUtil.convertToObjectFromExcel(…)
    DomainOrderService.java:379-384
  • 信安信息不允许泛域名(domain 以 * 开头直接抛错)
    DomainOrderService.java:385-389
  • 若是泛域名(EXTENSIVEDOMAIN):
    • 校验上传信安域名与页面 subdomain 列表一一对应、备案号一致
      DomainOrderService.java:391-403
  • 若是精确域名(非 EXTENSIVE):
    • 校验上传信安域名与页面 speedList 一一对应、备案号一致
      DomainOrderService.java:404-416
  • 校验域名未在域名表中存在:selfServiceDomainConfigDao.findByDomain(domain)
    DomainOrderService.java:420-426
  • 给每条信安记录打上 informaionId = workId(这里的 workId 实际是工单 code
    DomainOrderService.java:427-429

这里的校验是“前端页面填写信息”与“上传信安模板内容”的强一致校验,是后续重构时最容易拆坏的点。

5.5 生成 ConfigureDomainOrderPO 并保存(configure_list

  • 非批量:用 ConfigureDomainOrderPO.createDomainOrderPO(…) 构造
    DomainOrderService.java:579-583
    对应实体表:configure_listConfigureDomainOrderPO.java:40-41

  • 批量:走 createConfigureDomainOrderPOFromBatchDomainFile(…)
    DomainOrderService.java:577-579

批量域名表:

  • BatchSelfDomainPO => batch_self_domain
    BatchSelfDomainPO.java:32-33

关联的“加速域名明细”表:

  • SpeedConfigureDomainPO => speed_configure_domain
    SpeedConfigureDomainPO.java:26-27

5.6 泛域名(EXTENSIVEDOMAIN):子域名入库(sub_domain + join 表)

如果 workList.domainType == EXTENSIVEDOMAIN

  • 校验每个子域名必须属于该泛域名后缀
  • domainOrderPO.setSubDomains(…) 存子域名列表(SubDomainPO
    DomainOrderService.java:611-625

子域名表:

  • sub_domainSubDomainPO.java:20-21

join 表:

  • work_order_domain_request_sub(在 ConfigureDomainOrderPO@JoinTable 上)
    ConfigureDomainOrderPO.java:139-145

5.7 修改重提:删除旧 speed_configure_domain

  • preSpeedDomains 非空:speedConfigureDomainDao.deleteAll(preSpeedDomains)
    DomainOrderService.java:629-633

5.8 保存 configure_list + 追加 domain_history 记录

  • ConfigureDomainOrderPO p = orderRepository.save(domainOrderPO);
    DomainOrderService.java:635

  • domain_history:至少写 1 条

    • 修改重提:Button.submit
      DomainOrderService.java:637-640
    • 普通新建:result 为 null
      DomainOrderService.java:641-643

此外(非海外 + 创建单)还会写一条“控制信安信息显示/校验状态”的记录:

  • DomainHistoryPO.create(p.getId(), false, false, submit)
    DomainOrderService.java:651-654

6. Step 3:修改重提时的“历史附件清理”(file_info + log_file_resource

回到 WorkOrderServiceImpl.saveCustomWorkOrder

如果 isModify=true

  1. 查旧 configure_list(通过 work_order.id)拿 orgEnterId

    • ConfigureDomainOrderPO orgPo = orderRepository.findByWorkOrderId(workList.getId()).orElse(null);
    • orgEnterId = orgPo.getTenantId();
      WorkOrderServiceImpl.java:2671-2672
  2. 删除历史信安附件(file_info)冗余:

  • deleteHistoryFileInfo(workList, domainOrderPOId)
    WorkOrderServiceImpl.java:2676
    方法:WorkOrderServiceImpl.java:3660-3683

其删除策略:

  • 新提交的 secInfoFileId 为空则不删
  • 查当前工单关联的 log_file_resource,取 fileContentType == security_info 的 md5 列表
  • oldMd5.removeAll(newSecInfoFileId) 得到“旧有但本次未再使用”的 md5
  • fileInfoDao.findByMd5In(oldMd5)fileInfoDao.deleteAll(…)
    WorkOrderServiceImpl.java:3663-3679

涉及表:

  • file_infoFileInfoPO.java:30-31
  • log_file_resource
  1. 清空该 configure_list 下的所有附件关联:
  • logFileResourceRepository.deleteAllByOrderId(domainOrderPOId)
    WorkOrderServiceImpl.java:2678-2682
    repositoryLogFileResourceRepository.deleteAllByOrderId
    LogFileResourceRepository.java:147-149

7. Step 4:重建本次提交的附件关联(log_file_resource

无论新建还是修改,都会重新生成附件关联:

7.1 md5List(最多 5 个)

  • logOrderService.saveFilesToTable(domainOrderPO.getId(), workList.getMd5List(), WorkOrderEnums.Type.configure);
    WorkOrderServiceImpl.java:2684-2685

LogOrderService.saveFilesToTable(…)

  • 对 list 中每个 md5 插入 LogFileResource(type, md5, orderId)
    LogOrderService.java:761-772

7.2 fileId(单文件,标记 domain_config

  • logOrderService.saveFiles([LogFileResource.create(…, FileContentTypeEnum.domain_config)])
    WorkOrderServiceImpl.java:2686-2689

7.3 secInfoFileId(信安附件,标记 security_info

  • 遍历每个 md5,插入 LogFileResource(…, FileContentTypeEnum.security_info)
    WorkOrderServiceImpl.java:2690-2697

LogFileResource 说明:

  • repository 的 SQL 指向 log_file_resource
  • 字段 md5 注释说明“是 mongodb_Id 值,不是文件 md5 值”(非常重要)
    LogFileResource.java:51

8. Step 5:绑定工单与企业关系(worker_order_enterprise

  • workOrderService.setNewWorkOrderEnterpriseForDR(workOrderId, newEnterpriseId, orgEnterpriseId)
    WorkOrderServiceImpl.java:2698-2701

方法位置:

  • WorkOrderServiceImpl.setNewWorkOrderEnterpriseForDR(…)
    WorkOrderServiceImpl.java:1183-1209

逻辑:

  • orgEnterpriseId 不为空(修改工单)且企业变更:
    • worker_order_enterprise 记录并更新 enterpriseId/enterpriseType
      WorkOrderServiceImpl.java:1185-1196
  • 否则(新建):
    • 插入一条新的 WorkOrderEnterprise
      WorkOrderServiceImpl.java:1197-1208

表:

  • worker_order_enterprise(注意表名是 worker_order_enterprise
    WorkOrderEnterprise.java:22-23

9. Step 6:触发信安/备案号校验与流程流转(WorkOrderManager

  • workOrderManager.handleDomainConfigXinAnInfo(SecurityUserUtil.getId(), domainOrderPO.getId());
    WorkOrderServiceImpl.java:2702-2703

方法位置:

  • WorkOrderManager.handleDomainConfigXinAnInfo(…)
    WorkOrderManager.java:58-92

核心逻辑(只说需求类相关):

  1. 读 configure_list

    • orderRepository.findById(orderId)
      WorkOrderManager.java:59
  2. 若 operateType == CREATE

    • 海外产品:直接 updateNextCheckUserInOrderSubmit(…) 并返回
      WorkOrderManager.java:62-67
    • 非海外:先刷新备案号/一致性状态:
      • domainOrderService.updateCheckedIcpInfo(po)
        WorkOrderManager.java:68
      • 如果 checkDomainIcpEqual(po) 为 trueuploadInformation(po)(同步信安系统)
        WorkOrderManager.java:71-73
      • 最后如果仍然 checkDomainIcpEqual(po) 为 true:进入流转
        domainOrderService.updateNextCheckUserInOrderSubmit(…)
        WorkOrderManager.java:83-85
  3. 若 operateType != CREATE:直接 updateNextCheckUserInOrderSubmit(…)
    WorkOrderManager.java:86-88


10. Step 7:拼 domainInfo/enterpriseInfo 写入请求头(包含精确+批量域名)

代码位置:

  • WorkOrderServiceImpl.java:2704-2726

逻辑:

  1. 先从 domainOrderPO.getSpeedDomains() 拿域名(对应 speed_configure_domain
    WorkOrderServiceImpl.java:2706-2708

  2. 如果 domainOrderPO.getBatchId() != null

    • batch_self_domainbatchSelfDomainDao.findByBatchId(domainOrderPO.getBatchId())
      WorkOrderServiceImpl.java:2709-2713
    • 把批量域名也加入 domains
  3. domains 去重(Set
    WorkOrderServiceImpl.java:2716-2719

  4. 拼成 "a.com,b.com" 写入 header

    • req.putHeader("domainInfo", "…")
    • req.putHeader("enterpriseInfo", domainOrderPO.getTenantId())
      WorkOrderServiceImpl.java:2720-2726

11. Step 8:BPM 已存在且是新建(非修改)时的特殊“下一处理人覆盖”

代码:

  • WorkOrderServiceImpl.java:2726-2733

条件:

  • BpmTaskPO bpmTaskPO = bpmTaskDao.findByCode(domainOrderPO.getWorkOrder().getCode());
  • if (bpmTaskPO != null && !isModify) { … }

动作:

  • WorkOrder workOrder = workOrderRepository.findByMyId(domainOrderPO.getId());
    WorkOrderServiceImpl.java:2728

这里传入的是 domainOrderPO.getId()configure_list.id),但方法名 findByMyId 从语义上更像查 work_order.id。后续重构/排雷建议重点确认。

然后:

  • orderDao.findByEcId(enter.get().getEcId()) 找到 BBoss 侧订单
  • currentUserId 找用户,设置为工单审批人:
    • workOrder.setApprovingUser(users);
    • workOrderRepository.save(workOrder);
      WorkOrderServiceImpl.java:2729-2733

涉及表(推断/部分不在本文展开):

  • bpm_taskbpmTaskDao
  • work_orderworkOrderRepository
  • bboss order 相关表(orderDao/OrderInfo

12. 涉及库表与操作一览(按“表 -> 操作 -> 代码点”)

12.1 work_order(运营总表)

  • 新建/复用/修改 details、设置 code、corpName、省份信息、审批人等
    DomainOrderService.saveConfigureDomainDomainOrderService.java:523-563679-698
  • 设置下一审批人(dealer/approvingUser/userTemp
    DomainOrderService.updateNextCheckUserInOrderSubmitDomainOrderService.java:1130-1168

12.2 configure_list(域名配置需求工单子表)

  • 保存 configure_list 主记录
    DomainOrderService.saveConfigureDomainDomainOrderService.java:635
  • 保存备案号查询结果 recordNumber(非批量)
    DomainOrderService.updateCheckedIcpInfoDomainOrderService.java:977-982

实体:

  • ConfigureDomainOrderPO => configure_list
    ConfigureDomainOrderPO.java:40-41

12.3 speed_configure_domain(工单加速域名明细)

  • 新建:由 ConfigureDomainOrderPO.createDomainOrderPO 生成并随 configure_list 保存
    DomainOrderService.java:579-583
  • 修改重提:删除旧的 speedDomains 记录
    speedConfigureDomainDao.deleteAll(preSpeedDomains)
    DomainOrderService.java:629-633

实体:

  • SpeedConfigureDomainPO => speed_configure_domain
    SpeedConfigureDomainPO.java:26-27

12.4 batch_self_domain(批量域名明细)

  • 批量新建时写入(saveBatchDomains / saveAll
    DomainOrderService.createConfigureDomainOrderPOFromBatchDomainFileDomainOrderService.java:721-723
  • ICP 查询后回写 recordNumber/icpEquals
    DomainOrderService.updateCheckedIcpInfoDomainOrderService.java:934-963
  • saveCustomWorkOrder 用于拼装 domainInfo(按 batchId 查询)
    WorkOrderServiceImpl.java:2709-2713

实体:

  • BatchSelfDomainPO => batch_self_domain
    BatchSelfDomainPO.java:32-33

12.5 self_service_domain_config(域名配置表/域名主表)

  • domain_request 且 requirement=CREATE 时:把域名插入域名表(批量/非批量两条线)
    DomainOrderService.checkAndSaveConfigDomainDomainOrderService.java:2400-2481
  • ICP 查询后更新 legal(合法性)
    DomainOrderService.updateCheckedIcpInfoDomainOrderService.java:954-955975-976988-989

实体:

  • SelfServiceDomainConfigPO => self_service_domain_config
    SelfServiceDomainConfigPO.java:79-80

12.6 domain_history(域名配置需求工单历史)

  • 保存初始/提交记录、IC P 校验控制记录等
    DomainOrderService.saveConfigureDomainDomainOrderService.java:636-654
  • ICP 校验完成标记
    DomainOrderService.updateCheckedIcpInfoDomainOrderService.java:992-999956-962
  • 异常时写 msgWorkOrderManager 捕获 uploadInformation 异常)
    WorkOrderManager.java:75-78

实体:

  • DomainHistoryPO => domain_history
    DomainHistoryPO.java:21-22

12.7 log_file_resource(工单附件关联表)

  • 修改重提时:按 orderIdconfigure_list.id)清空
    logFileResourceRepository.deleteAllByOrderId(domainOrderPOId)
    WorkOrderServiceImpl.java:2678-2682
  • 新建附件关联:
    • md5ListLogOrderService.saveFilesToTable
      WorkOrderServiceImpl.java:2684-2685 / LogOrderService.java:761-772
    • fileIddomain_config):WorkOrderServiceImpl.java:2686-2689
    • secInfoFileIdsecurity_info):WorkOrderServiceImpl.java:2690-2697

12.8 file_info(信安附件内容落库)

  • 修改重提时:根据“旧的安全信息 md5 列表”删除 file_info 记录
    WorkOrderServiceImpl.deleteHistoryFileInfoWorkOrderServiceImpl.java:3660-3679

实体:

  • FileInfoPO => file_info
    FileInfoPO.java:30-31

12.9 worker_order_enterprise(工单-企业关系映射)

  • 新建工单:插入映射
  • 修改且企业变更:更新映射
    WorkOrderServiceImpl.setNewWorkOrderEnterpriseForDRWorkOrderServiceImpl.java:1183-1209

实体:

  • WorkOrderEnterprise => worker_order_enterprise
    WorkOrderEnterprise.java:22-23

12.10 sub_domain / work_order_domain_request_sub(泛域名子域名)

  • EXTENSIVEDOMAIN 时保存子域名集合(SubDomainPO
  • join 表:work_order_domain_request_sub(配置在 ConfigureDomainOrderPO 上)
    ConfigureDomainOrderPO.java:139-145
    SubDomainPO.java:20-21

13. 重构前建议你重点“标注/解耦”的风险点(仅提示,不做重构方案)

  1. domain_request 分支里实际落库的工单类型可能是 configure 或 domain_request
    根因:saveConfigureDomaincpFlag ? configure : domain_request
    DomainOrderService.java:510-513

  2. 修改重提的附件清理策略:同时删 log_file_resource + file_info,并且 LogFileResource.md5 实际是 mongodb_id
    WorkOrderServiceImpl.java:2673-26823660-3679LogFileResource.java:51

  3. BPM 存在时覆盖审批人 的取数链路(workOrderRepository.findByMyId(domainOrderPO.getId()))参数语义可疑
    WorkOrderServiceImpl.java:2726-2733