Initial commit

This commit is contained in:
Docker7530
2026-03-01 01:43:46 +08:00
commit c6125c117b
3840 changed files with 415340 additions and 0 deletions
@@ -0,0 +1,624 @@
# WorkOrderServiceImpl.saveCustomWorkOrder 中 domain_request 分支梳理
> 目标:把 `saveCustomWorkOrder` 里 `if (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=true``workType = 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_order``workOrderService.findById(workList.getId())``516`
- 用新的域名列表覆盖 `work_order.details``517-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_list``ConfigureDomainOrderPO.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_domain``SubDomainPO.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_info``FileInfoPO.java:30-31`
- `log_file_resource`
1. 清空该 configure_list 下的所有附件关联:
- `logFileResourceRepository.deleteAllByOrderId(domainOrderPOId)`
`WorkOrderServiceImpl.java:2678-2682`
repository`LogFileResourceRepository.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)` 为 true`uploadInformation(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_domain``batchSelfDomainDao.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_task``bpmTaskDao`
- `work_order``workOrderRepository`
- `bboss order` 相关表(`orderDao`/`OrderInfo`
---
## 12. 涉及库表与操作一览(按“表 -> 操作 -> 代码点”)
### 12.1 work_order(运营总表)
- 新建/复用/修改 details、设置 code、corpName、省份信息、审批人等
`DomainOrderService.saveConfigureDomain``DomainOrderService.java:523-563``679-698`
- 设置下一审批人(dealer/approvingUser/userTemp
`DomainOrderService.updateNextCheckUserInOrderSubmit``DomainOrderService.java:1130-1168`
### 12.2 configure_list(域名配置需求工单子表)
- 保存 configure_list 主记录
`DomainOrderService.saveConfigureDomain``DomainOrderService.java:635`
- 保存备案号查询结果 recordNumber(非批量)
`DomainOrderService.updateCheckedIcpInfo``DomainOrderService.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.createConfigureDomainOrderPOFromBatchDomainFile``DomainOrderService.java:721-723`
- ICP 查询后回写 recordNumber/icpEquals
`DomainOrderService.updateCheckedIcpInfo``DomainOrderService.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.checkAndSaveConfigDomain``DomainOrderService.java:2400-2481`
- ICP 查询后更新 legal(合法性)
`DomainOrderService.updateCheckedIcpInfo``DomainOrderService.java:954-955``975-976``988-989`
实体:
- `SelfServiceDomainConfigPO` => `self_service_domain_config`
`SelfServiceDomainConfigPO.java:79-80`
### 12.6 domain_history(域名配置需求工单历史)
- 保存初始/提交记录、IC P 校验控制记录等
`DomainOrderService.saveConfigureDomain``DomainOrderService.java:636-654`
- ICP 校验完成标记
`DomainOrderService.updateCheckedIcpInfo``DomainOrderService.java:992-999``956-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`
- 新建附件关联:
- md5List`LogOrderService.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.deleteHistoryFileInfo``WorkOrderServiceImpl.java:3660-3679`
实体:
- `FileInfoPO` => `file_info`
`FileInfoPO.java:30-31`
### 12.9 worker_order_enterprise(工单-企业关系映射)
- 新建工单:插入映射
- 修改且企业变更:更新映射
`WorkOrderServiceImpl.setNewWorkOrderEnterpriseForDR``WorkOrderServiceImpl.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**
根因:`saveConfigureDomain``cpFlag ? configure : domain_request`
`DomainOrderService.java:510-513`
2. **修改重提的附件清理策略**:同时删 `log_file_resource` + `file_info`,并且 `LogFileResource.md5` 实际是 mongodb_id
`WorkOrderServiceImpl.java:2673-2682``3660-3679``LogFileResource.java:51`
3. **BPM 存在时覆盖审批人** 的取数链路(`workOrderRepository.findByMyId(domainOrderPO.getId())`)参数语义可疑
`WorkOrderServiceImpl.java:2726-2733`