``` sequenceDiagram autonumber participant U as User/前端 participant C as NewWorkOrderController participant W as WorkOrderServiceImpl participant E as EnterpriseInfoDao participant BB as BBossInteractiveService participant DS as DomainOrderService participant CS as CustomService participant WOR as work_order(Repo) participant DOR as configure_list(DomainOrderRepository) participant SDR as speed_configure_domain(SpeedConfigureDomainDao) participant BSD as BatchSelfDomainService participant BSDao as batch_self_domain(BatchSelfDomainDao) participant LFS as LogOrderService participant LFR as log_file_resource(LogFileResourceRepository) participant FI as file_info(FileInfoDao) participant WOE as work_order_enterprise(WorkOrderEnterPriseDao) participant WM as WorkOrderManager participant DICP as DomainICPService participant PIS as portalInformationService participant BPM as BpmTaskDao participant ODao as OrderDao participant UR as UserRepository U->>C: POST /workorder/custom/save(workList) C->>C: checkParam(workList) C->>W: newOrderAllowed() C->>W: saveCustomWorkOrder(MutableHttpServletRequest, workList) W->>W: 校验当前用户 & 企业可操作性 W->>E: findByEnterpriseId(workList.enterprise) E-->>W: Optional alt workList.type == domain_request W->>W: recheckEnterprisePunishmentStatus(info) W->>BB: queryJointPunish(ecId) BB-->>W: JointPunishResponse W->>W: isModify = (workList.id != null) W->>DS: handleWithDomainOrder(workList, modelStr) alt isBatch == true DS->>W: getWorkOrderCode(domain_request) DS->>BSD: readBatchInformationFromExcel440(secInfoFile) BSD-->>DS: List DS->>BSD: saveBatchDomains(batchVO, batchId=workOrder.code, provinceCodes, product, enterprise) BSD->>BSDao: saveAll(batch_self_domain) BSDao-->>BSD: saved DS->>DOR: save(configure_list with isBatch=true, batchId=code) else isBatch == false DS->>CS: getWorkOrder(domain_request, details, enterprise) CS-->>DS: WorkOrder(in memory) DS->>DOR: save(configure_list) end DS->>WOR: save(work_order) %% (via cascade in configure_list.workOrder / or other path) DS->>DOR: save(domain_history create + (create且非海外时) icp check marker) alt isModify == true W->>W: deleteHistoryFileInfo(workList, domainOrderPO.id) W->>LFR: findByOrderId(configure_list.id) LFR-->>W: old LogFileResource list W->>FI: deleteAll(file_info by md5 diff) W->>LFR: deleteAllByOrderId(configure_list.id) end W->>LFS: saveFilesToTable(orderId=configure_list.id, md5List, type=configure) W->>LFR: saveAll(log_file_resource: normal attachments) opt fileId not empty W->>LFR: save(domain_config file link) end opt secInfoFileId not empty W->>LFR: saveAll(security_info file links) end W->>WOE: setNewWorkOrderEnterpriseForDR(workOrderId, enterpriseId, orgEnterId?) W->>WM: handleDomainConfigXinAnInfo(submitUserId, configure_list.id) WM->>DOR: findById(configure_list.id) WM->>UR: findById(submitUserId) alt operateType == CREATE alt overseas product WM->>DS: updateNextCheckUserInOrderSubmit(order, submit, CREATE) else non-overseas WM->>DS: updateCheckedIcpInfo(order) DS->>DICP: getDomainIcp(domains) DICP-->>DS: recordNumber map DS->>BSDao: saveAll(batch_self_domain recordNumber/icpEquals) %% batch DS->>DOR: save(configure_list recordNumber) %% non-batch DS->>DOR: save(domain_history isIcpCheckCompleted=true) alt checkDomainIcpEqual == true WM->>DS: uploadInformation(order) DS->>PIS: validateAndSyncInformation(vos, domains, enterpriseId, provinceCode?) alt sync failed DS->>DOR: update(domain_history.last.msg=error) DS-->>WM: return (stop flow) else sync ok DS->>DOR: update(domain_history.last.msg=null) WM->>DS: updateNextCheckUserInOrderSubmit(order, submit, CREATE) end else icp incomplete WM-->>W: (不进入信安同步与流转) end end else operateType != CREATE WM->>DS: updateNextCheckUserInOrderSubmit(order, submit, operateType) end W->>W: build domains from speedDomains + batch_self_domain W->>W: req.putHeader(domainInfo, enterpriseInfo) opt bpmTask exists && !isModify W->>BPM: findByCode(workOrder.code) BPM-->>W: BpmTaskPO W->>ODao: findByEcId(ecId) ODao-->>W: OrderInfo list W->>UR: findById(currentUserId) UR-->>W: nextApprover W->>WOR: save(work_order.approvingUser=nextApprover) end C-->>U: success Note over C,W: finally: logSubscribeService.updateSubscribeInfoForWorkOrder(domainInfo, enterpriseInfo, isSubscribe) else workList.type != domain_request W-->>C: (其它工单类型分支) end ```