From dec6a6d5af9e225239b4a688b631228f5655293a Mon Sep 17 00:00:00 2001 From: huwei <3313749341@qq.com> Date: Fri, 31 Jul 2026 15:28:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=9B=91=E7=AE=A1=E7=AB=AF?= =?UTF-8?q?=E5=92=8C=E6=9C=BA=E6=9E=84=E7=AB=AF=E9=A6=96=E9=A1=B5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstitutionDashboardExecutor.java | 287 +++++++++++ .../InstitutionDashboardExecutor.kt | 235 --------- scripts/gen-p2-api.py | 183 ------- scripts/gen-p2-impl.py | 465 ------------------ scripts/gen-p2-nodes.py | 295 ----------- scripts/gen-p2-rest.py | 130 ----- 6 files changed, 287 insertions(+), 1308 deletions(-) create mode 100644 safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.java delete mode 100644 safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.kt delete mode 100644 scripts/gen-p2-api.py delete mode 100644 scripts/gen-p2-impl.py delete mode 100644 scripts/gen-p2-nodes.py delete mode 100644 scripts/gen-p2-rest.py diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.java new file mode 100644 index 00000000..13c9fc83 --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.java @@ -0,0 +1,287 @@ +package org.qinan.safetyeval.app.executor.institution; + +import org.qinan.safetyeval.app.executor.support.EvalProjectNodeOverviewAssembler; +import org.qinan.safetyeval.client.api.institution.InstitutionDashboardApi; +import org.qinan.safetyeval.client.co.institution.EvalProjectNodeItemCO; +import org.qinan.safetyeval.client.co.institution.EvalProjectNodeOverviewCO; +import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardEvalTypeRatioCO; +import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardIndustryStatCO; +import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardNoticeCO; +import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardProjectExecutionCO; +import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardProjectNodeStatsCO; +import org.qinan.safetyeval.client.dto.SingleResponse; +import org.qinan.safetyeval.domain.constant.EvalTypeEnum; +import org.qinan.safetyeval.domain.constant.IndustryEnum; +import org.qinan.safetyeval.domain.entity.EvalCustomerEntity; +import org.qinan.safetyeval.domain.entity.EvalProjectEntity; +import org.qinan.safetyeval.domain.gateway.EvalCustomerGateway; +import org.qinan.safetyeval.domain.gateway.EvalProjectGateway; +import org.qinan.safetyeval.domain.gateway.SafetyMessageGateway; +import org.qinan.safetyeval.domain.query.EvalProjectQuery; +import org.qinan.safetyeval.domain.query.PageResult; +import org.qinan.safetyeval.domain.query.SafetyMessageQuery; +import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 机构端首页(驾驶舱)聚合执行器 + * + *

全部为新增接口实现,复用既有 Gateway / 节点聚合装配器,不做任何写操作、不改动既有功能。

+ *

orgId 取自 {@link ThreadLocalUserInfoAdapter}(机构端请求上下文)。

+ */ +@Component +public class InstitutionDashboardExecutor implements InstitutionDashboardApi { + + @Resource + private EvalProjectGateway evalProjectGateway; + + @Resource + private EvalProjectNodeOverviewAssembler evalProjectNodeOverviewAssembler; + + @Resource + private SafetyMessageGateway safetyMessageGateway; + + @Resource + private EvalCustomerGateway evalCustomerGateway; + + /** 节点编码 → 大屏展示名称(待X) */ + private static final LinkedHashMap NODE_DISPLAY = new LinkedHashMap<>(); + static { + NODE_DISPLAY.put("NODE_01", "待风险分析"); + NODE_DISPLAY.put("NODE_02", "待合同录入"); + NODE_DISPLAY.put("NODE_03", "待项目组成立"); + NODE_DISPLAY.put("NODE_04", "待现场踏勘"); + NODE_DISPLAY.put("NODE_05", "待报告编制"); + NODE_DISPLAY.put("NODE_06", "待内部审核"); + NODE_DISPLAY.put("NODE_07", "待技术审核"); + NODE_DISPLAY.put("NODE_08", "待过程控制审核"); + } + + private static final int PAGE_SIZE = 1000; + /** SafetyMessage 已读状态值(MessageSendStateEnum.SENT.code) */ + private static final int SENT_CODE = 1; + + // ============================ 1. 当前项目节点统计 ============================ + + @Override + public SingleResponse projectNodeStats() { + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId == null) { + return SingleResponse.success(new InstitutionDashboardProjectNodeStatsCO()); + } + List projects = listOrgProjects(orgId); + + int total = projects.size(); + int statutory = (int) projects.stream().filter(p -> Boolean.TRUE.equals(p.getIsStatutory())).count(); + + // 节点待办数(待办=节点状态为「未开始」) + LinkedHashMap pending = new LinkedHashMap<>(); + for (String code : NODE_DISPLAY.keySet()) { + pending.put(code, 0); + } + for (EvalProjectEntity p : projects) { + try { + EvalProjectNodeOverviewCO ov = evalProjectNodeOverviewAssembler.buildForInstitution(p.getId()); + if (ov == null || ov.getNodes() == null) { + continue; + } + for (EvalProjectNodeItemCO n : ov.getNodes()) { + String code = n.getNodeCode(); + if (code != null && pending.containsKey(code) && "未开始".equals(n.getStatusName())) { + pending.put(code, pending.get(code) + 1); + } + } + } catch (Exception e) { + // 单项目装配异常忽略,保证其余节点统计可用 + } + } + + List nodeStats = new ArrayList<>(); + for (Map.Entry entry : NODE_DISPLAY.entrySet()) { + InstitutionDashboardProjectNodeStatsCO.NodeStat ns = new InstitutionDashboardProjectNodeStatsCO.NodeStat(); + ns.setNodeCode(entry.getKey()); + ns.setNodeName(entry.getValue()); + ns.setPendingCount(pending.getOrDefault(entry.getKey(), 0)); + nodeStats.add(ns); + } + + int archived = (int) projects.stream().filter(p -> Boolean.TRUE.equals(p.getArchiveFlag())).count(); + int delayed = evalProjectGateway.countByOrgIdAndProgressStatus(orgId, "DELAY"); + + InstitutionDashboardProjectNodeStatsCO co = new InstitutionDashboardProjectNodeStatsCO(); + co.setTotalProjects(total); + co.setStatutoryProjects(statutory); + co.setNodeStats(nodeStats); + co.setArchivedProjectCount(archived); + co.setDelayedProjectCount(delayed); + return SingleResponse.success(co); + } + + // ============================ 2. 通知提醒 ============================ + + @Override + public SingleResponse notices() { + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId == null) { + return SingleResponse.success(new InstitutionDashboardNoticeCO()); + } + InstitutionDashboardNoticeCO co = new InstitutionDashboardNoticeCO(); + co.setQualOnSiteReviewCount(countMessages(orgId, "ON_SITE_REVIEW_NOTICE")); + co.setInspectionCount(countMessages(orgId, "INSP_NOTICE_ORG")); + co.setUnreadRegulatoryCount(countUnread(orgId)); + return SingleResponse.success(co); + } + + // ============================ 3. 服务行业项目统计 ============================ + + @Override + public SingleResponse industryStat() { + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId == null) { + return SingleResponse.success(new InstitutionDashboardIndustryStatCO()); + } + List projects = listOrgProjects(orgId); + + Map> grouped = projects.stream() + .collect(Collectors.groupingBy(EvalProjectEntity::getIndustryCode, LinkedHashMap::new, Collectors.toList())); + + List list = new ArrayList<>(); + for (Map.Entry> entry : grouped.entrySet()) { + String code = entry.getKey(); + List ps = entry.getValue(); + InstitutionDashboardIndustryStatCO.IndustryStat is = new InstitutionDashboardIndustryStatCO.IndustryStat(); + is.setIndustryCode(code); + IndustryEnum ie = IndustryEnum.ofCode(code); + is.setIndustryName(ie != null ? ie.getValue() : code); + is.setProjectCount(ps.size()); + is.setStatutoryProjectCount((int) ps.stream().filter(p -> Boolean.TRUE.equals(p.getIsStatutory())).count()); + list.add(is); + } + + InstitutionDashboardIndustryStatCO co = new InstitutionDashboardIndustryStatCO(); + co.setList(list); + return SingleResponse.success(co); + } + + // ============================ 4. 评价类别占比 ============================ + + @Override + public SingleResponse evalTypeRatio() { + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId == null) { + return SingleResponse.success(new InstitutionDashboardEvalTypeRatioCO()); + } + List projects = listOrgProjects(orgId); + + Map> grouped = projects.stream() + .collect(Collectors.groupingBy(EvalProjectEntity::getEvalTypeCode, LinkedHashMap::new, Collectors.toList())); + + List items = new ArrayList<>(); + for (Map.Entry> entry : grouped.entrySet()) { + String code = entry.getKey(); + InstitutionDashboardEvalTypeRatioCO.EvalTypeRatio ratio = new InstitutionDashboardEvalTypeRatioCO.EvalTypeRatio(); + ratio.setEvalTypeCode(code); + EvalTypeEnum ee = EvalTypeEnum.ofCode(code); + ratio.setEvalTypeName(ee != null ? ee.getValue() : code); + ratio.setCount(entry.getValue().size()); + items.add(ratio); + } + + InstitutionDashboardEvalTypeRatioCO co = new InstitutionDashboardEvalTypeRatioCO(); + co.setTotalProjectCount(projects.size()); + co.setItems(items); + return SingleResponse.success(co); + } + + // ============================ 5. 项目执行情况 ============================ + + @Override + public SingleResponse projectExecution(Integer limit) { + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId == null) { + return SingleResponse.success(new InstitutionDashboardProjectExecutionCO()); + } + List projects = listOrgProjects(orgId); + int lim = limit == null ? 10 : Math.max(1, Math.min(50, limit)); + + // 按项目结束日期升序(最近到期在前),空日期置尾 + projects.sort(Comparator.comparing( + (EvalProjectEntity p) -> p.getPlanEndDate() != null ? p.getPlanEndDate().toString() : "9999-12-31")); + + List list = new ArrayList<>(); + for (int i = 0; i < Math.min(lim, projects.size()); i++) { + EvalProjectEntity p = projects.get(i); + InstitutionDashboardProjectExecutionCO.ProjectExecutionItem item = + new InstitutionDashboardProjectExecutionCO.ProjectExecutionItem(); + item.setProjectId(p.getId()); + item.setProjectNo(p.getProjectNo()); + item.setProjectName(p.getProjectName()); + item.setCustomerName(resolveCustomerName(p.getCustomerId())); + item.setEvalTypeCode(p.getEvalTypeCode()); + EvalTypeEnum ee = EvalTypeEnum.ofCode(p.getEvalTypeCode()); + item.setEvalTypeName(ee != null ? ee.getValue() : p.getEvalTypeCode()); + item.setProjectLeaderName(p.getProjectLeaderName()); + item.setPlanEndDate(p.getPlanEndDate() != null ? p.getPlanEndDate().toString() : null); + list.add(item); + } + + InstitutionDashboardProjectExecutionCO co = new InstitutionDashboardProjectExecutionCO(); + co.setList(list); + return SingleResponse.success(co); + } + + // ============================ 通用方法 ============================ + + private List listOrgProjects(Long orgId) { + EvalProjectQuery q = new EvalProjectQuery(); + q.setOrgId(orgId); + q.setPageNum(1L); + q.setPageSize((long) PAGE_SIZE); + PageResult p = evalProjectGateway.page(q); + return p != null && p.getRecords() != null ? p.getRecords() : new ArrayList<>(); + } + + private int countMessages(Long orgId, String sendType) { + SafetyMessageQuery q = new SafetyMessageQuery(); + q.setOrgId(orgId); + q.setSendType(sendType); + q.setPageNum(1L); + q.setPageSize(1L); + PageResult p = safetyMessageGateway.page(q); + return p != null && p.getTotal() != null ? p.getTotal().intValue() : 0; + } + + private int countUnread(Long orgId) { + SafetyMessageQuery q = new SafetyMessageQuery(); + q.setOrgId(orgId); + q.setPageNum(1L); + q.setPageSize((long) PAGE_SIZE); + PageResult p = safetyMessageGateway.page(q); + if (p == null || p.getRecords() == null) { + return 0; + } + return (int) p.getRecords().stream() + .filter(m -> m.getSendState() == null || m.getSendState() != SENT_CODE) + .count(); + } + + private String resolveCustomerName(Long customerId) { + if (customerId == null) { + return null; + } + try { + EvalCustomerEntity c = evalCustomerGateway.get(customerId); + return c != null ? c.getCustomerName() : null; + } catch (Exception e) { + return null; + } + } +} diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.kt b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.kt deleted file mode 100644 index 7a301606..00000000 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/InstitutionDashboardExecutor.kt +++ /dev/null @@ -1,235 +0,0 @@ -package org.qinan.safetyeval.app.executor.institution - -import org.qinan.safetyeval.client.api.institution.InstitutionDashboardApi -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardEvalTypeRatioCO -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardEvalTypeRatioCO.EvalTypeRatio -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardIndustryStatCO -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardIndustryStatCO.IndustryStat -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardNoticeCO -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardProjectExecutionCO -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardProjectExecutionCO.ProjectExecutionItem -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardProjectNodeStatsCO -import org.qinan.safetyeval.client.co.institution.dashboard.InstitutionDashboardProjectNodeStatsCO.NodeStat -import org.qinan.safetyeval.client.dto.SingleResponse -import org.qinan.safetyeval.domain.constant.EvalTypeEnum -import org.qinan.safetyeval.domain.constant.IndustryEnum -import org.qinan.safetyeval.domain.entity.EvalProjectEntity -import org.qinan.safetyeval.domain.gateway.EvalCustomerGateway -import org.qinan.safetyeval.domain.gateway.EvalProjectGateway -import org.qinan.safetyeval.domain.gateway.SafetyMessageGateway -import org.qinan.safetyeval.domain.query.EvalProjectQuery -import org.qinan.safetyeval.domain.query.SafetyMessageQuery -import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter -import org.springframework.stereotype.Component -import javax.annotation.Resource - -/** - * 机构端首页(驾驶舱)聚合执行器 - * - *

全部为新增接口实现,复用既有 Gateway / 节点聚合装配器,不做任何写操作、不改动既有功能。

- *

orgId 取自 [ThreadLocalUserInfoAdapter](机构端请求上下文)。

- */ -@Component -class InstitutionDashboardExecutor : InstitutionDashboardApi { - - @Resource - private lateinit var evalProjectGateway: EvalProjectGateway - - @Resource - private lateinit var evalProjectNodeOverviewAssembler: EvalProjectNodeOverviewAssembler - - @Resource - private lateinit var safetyMessageGateway: SafetyMessageGateway - - @Resource - private lateinit var evalCustomerGateway: EvalCustomerGateway - - /** 节点编码 → 大屏展示名称(待X) */ - private val NODE_DISPLAY = linkedMapOf( - "NODE_01" to "待风险分析", - "NODE_02" to "待合同录入", - "NODE_03" to "待项目组成立", - "NODE_04" to "待现场踏勘", - "NODE_05" to "待报告编制", - "NODE_06" to "待内部审核", - "NODE_07" to "待技术审核", - "NODE_08" to "待过程控制审核" - ) - - private val PAGE_SIZE = 1000 - /** SafetyMessage 已读状态值(MessageSendStateEnum.SENT.code) */ - private val SENT_CODE = 1 - - // ============================ 1. 当前项目节点统计 ============================ - - override fun projectNodeStats(): SingleResponse { - val orgId = ThreadLocalUserInfoAdapter.get() ?: return SingleResponse.success(InstitutionDashboardProjectNodeStatsCO()) - val projects = listOrgProjects(orgId) - - val total = projects.size - val statutory = projects.count { it.isStatutory == true } - - // 节点待办数(待办=节点状态为「未开始」) - val pending = NODE_DISPLAY.keys.associateWith { 0 }.toLinkedMap() - for (p in projects) { - try { - val ov = evalProjectNodeOverviewAssembler.buildForInstitution(p.id!!) ?: continue - ov.nodes?.forEach { n -> - val code = n.nodeCode - if (code != null && pending.containsKey(code) && "未开始" == n.statusName) { - pending[code] = pending[code]!! + 1 - } - } - } catch (e: Exception) { - // 单项目装配异常忽略,保证其余节点统计可用 - } - } - - val nodeStats = NODE_DISPLAY.map { (code, name) -> - NodeStat().also { - it.nodeCode = code - it.nodeName = name - it.pendingCount = pending[code] ?: 0 - } - } - - val archived = projects.count { it.archiveFlag == true } - val delayed = evalProjectGateway.countByOrgIdAndProgressStatus(orgId, "DELAY") - - val co = InstitutionDashboardProjectNodeStatsCO() - co.totalProjects = total - co.statutoryProjects = statutory - co.nodeStats = nodeStats - co.archivedProjectCount = archived - co.delayedProjectCount = delayed - return SingleResponse.success(co) - } - - // ============================ 2. 通知提醒 ============================ - - override fun notices(): SingleResponse { - val orgId = ThreadLocalUserInfoAdapter.get() ?: return SingleResponse.success(InstitutionDashboardNoticeCO()) - val co = InstitutionDashboardNoticeCO() - co.qualOnSiteReviewCount = countMessages(orgId, "ON_SITE_REVIEW_NOTICE") - co.inspectionCount = countMessages(orgId, "INSP_NOTICE_ORG") - co.unreadRegulatoryCount = countUnread(orgId) - return SingleResponse.success(co) - } - - // ============================ 3. 服务行业项目统计 ============================ - - override fun industryStat(): SingleResponse { - val orgId = ThreadLocalUserInfoAdapter.get() ?: return SingleResponse.success(InstitutionDashboardIndustryStatCO()) - val projects = listOrgProjects(orgId) - val grouped = projects.groupBy { it.industryCode } - - val list = grouped.map { (code, ps) -> - IndustryStat().also { - it.industryCode = code - it.industryName = IndustryEnum.ofCode(code)?.value ?: code - it.projectCount = ps.size - it.statutoryProjectCount = ps.count { p -> p.isStatutory == true } - } - } - - val co = InstitutionDashboardIndustryStatCO() - co.list = list - return SingleResponse.success(co) - } - - // ============================ 4. 评价类别占比 ============================ - - override fun evalTypeRatio(): SingleResponse { - val orgId = ThreadLocalUserInfoAdapter.get() ?: return SingleResponse.success(InstitutionDashboardEvalTypeRatioCO()) - val projects = listOrgProjects(orgId) - val grouped = projects.groupBy { it.evalTypeCode } - - val items = grouped.map { (code, ps) -> - EvalTypeRatio().also { - it.evalTypeCode = code - it.evalTypeName = EvalTypeEnum.ofCode(code)?.value ?: code - it.count = ps.size - } - } - - val co = InstitutionDashboardEvalTypeRatioCO() - co.totalProjectCount = projects.size - co.items = items - return SingleResponse.success(co) - } - - // ============================ 5. 项目执行情况 ============================ - - override fun projectExecution(limit: Int?): SingleResponse { - val orgId = ThreadLocalUserInfoAdapter.get() ?: return SingleResponse.success(InstitutionDashboardProjectExecutionCO()) - val projects = listOrgProjects(orgId) - val lim = (limit ?: 10).coerceAtLeast(1).coerceAtMost(50) - - // 按项目结束日期升序(最近到期在前),空日期置尾 - val sorted = projects.sortedBy { it.planEndDate?.toString() ?: "9999-12-31" } - val top = sorted.take(lim) - - val list = top.map { p -> - ProjectExecutionItem().also { - it.projectId = p.id - it.projectNo = p.projectNo - it.projectName = p.projectName - it.customerName = resolveCustomerName(p.customerId) - it.evalTypeCode = p.evalTypeCode - it.evalTypeName = EvalTypeEnum.ofCode(p.evalTypeCode)?.value ?: p.evalTypeCode - it.projectLeaderName = p.projectLeaderName - it.planEndDate = p.planEndDate?.toString() - } - } - - val co = InstitutionDashboardProjectExecutionCO() - co.list = list - return SingleResponse.success(co) - } - - // ============================ 通用方法 ============================ - - private fun listOrgProjects(orgId: Long): List { - val q = EvalProjectQuery() - q.orgId = orgId - q.pageNum = 1L - q.pageSize = PAGE_SIZE.toLong() - val p = evalProjectGateway.page(q) - return p?.records ?: emptyList() - } - - private fun countMessages(orgId: Long, sendType: String): Int { - val q = SafetyMessageQuery() - q.orgId = orgId - q.sendType = sendType - q.pageNum = 1L - q.pageSize = 1L - val p = safetyMessageGateway.page(q) - return (p?.total ?: 0L).toInt() - } - - private fun countUnread(orgId: Long): Int { - val q = SafetyMessageQuery() - q.orgId = orgId - q.pageNum = 1L - q.pageSize = PAGE_SIZE.toLong() - val p = safetyMessageGateway.page(q) ?: return 0 - return p.records?.count { it.sendState == null || it.sendState != SENT_CODE } ?: 0 - } - - private fun resolveCustomerName(customerId: Long?): String? { - if (customerId == null) return null - return try { - evalCustomerGateway.get(customerId)?.customerName - } catch (e: Exception) { - null - } - } - - /** 保持插入顺序的可变 Map */ - private fun Map.toLinkedMap(): LinkedHashMap { - val m = LinkedHashMap() - forEach { (k, v) -> m[k] = v } - return m - } -} diff --git a/scripts/gen-p2-api.py b/scripts/gen-p2-api.py deleted file mode 100644 index 1bd80d26..00000000 --- a/scripts/gen-p2-api.py +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env python3 -import os -ROOT = os.path.join(os.path.dirname(__file__), "..") - -def w(rel, c): - p = os.path.join(ROOT, rel.replace('/', os.sep)) - os.makedirs(os.path.dirname(p), exist_ok=True) - open(p, 'w', encoding='utf-8', newline='\n').write(c) - -# Save cmd - generic with all fields as optional for copy from client -def gen_save_cmd(name): - w(f"safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/{name}SaveCmd.java", f"""package org.qinan.safetyeval.client.dto.institution; - -import lombok.Data; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -@Data -public class {name}SaveCmd {{ - private String id; - private String projectId; - private String riskId; - private String surveyId; - private String signTaskId; - private LocalDate analysisDate; - private String evalTypeCode; - private String evalTypeName; - private String industryCode; - private String industryName; - private String evalScope; - private Integer inBizScopeFlag; - private String unitOverview; - private String industryRiskDesc; - private Integer staffMatchCode; - private Integer needExpertCode; - private Integer capabilityCode; - private Integer feasibleCode; - private Integer economicCode; - private Integer riskLevelCode; - private String riskLevelName; - private Integer signContractCode; - private String conclusionContent; - private String approverName; - private Integer approvalOpinionCode; - private String approvalOpinionName; - private LocalDate approvalDate; - private Integer statusCode; - private String personnelId; - private String personnelName; - private String deptName; - private Integer signStatusCode; - private String signFileUrl; - private Integer sortOrder; - private String orgName; - private String contractNo; - private String projectName; - private String projectIntro; - private Long amountFen; - private String projectTypeCode; - private String projectTypeName; - private String riskSummary; - private String projectRegion; - private String projectAddress; - private LocalDate contractStartDate; - private LocalDate contractEndDate; - private Integer toxicFlag; - private Integer precursorFlag; - private Integer crossProvinceFlag; - private String businessScope; - private String enterpriseName; - private String industryCategory; - private String officeAddress; - private String creditCode; - private String postCode; - private String enterprisePhone; - private String fax; - private String legalPerson; - private String contactName; - private Integer staffCount; - private String scanFileUrl; - private String leaderPersonnelId; - private String leaderName; - private String controlPersonnelId; - private String controlName; - private Integer memberCount; - private LocalDate planSurveyDate; - private String surveyPlace; - private Integer noticeDoneFlag; - private Integer inspectDoneFlag; - private Integer rectifyDoneFlag; - private Integer enterpriseDoneFlag; - private Integer reviewDoneFlag; - private String noticeContent; - private String memberSnapshot; - private String stampFileUrl; - private Integer taskStatusCode; - private LocalDateTime planTime; - private Integer checkinTypeCode; - private String checkinTypeName; - private LocalDateTime checkinTime; - private java.math.BigDecimal longitude; - private java.math.BigDecimal latitude; - private String address; - private Integer facePassFlag; - private String photoUrls; - private String signImageUrl; - private String attachTypeCode; - private String attachTypeName; - private String fileName; - private String fileUrl; - private Integer reviewResultCode; - private String reviewResultName; - private String reviewContent; - private String templateCode; - private String templateName; - private String contentUrl; - private String hintContent; - private String draftId; - private String reviewerPersonnelId; - private String reviewerName; - private Integer resultCode; - private String resultName; - private String opinionContent; - private LocalDateTime reviewTime; - private String controllerPersonnelId; - private String controllerName; - private Integer precheckPassFlag; - private Integer archiveFlag; - private LocalDateTime controlTime; - private String nodeCode; - private String nodeName; - private String bizTypeCode; - private String bizTypeName; - private String bizRefId; - private String signerPersonnelId; - private String signerName; - private String taskTitle; - private LocalDateTime expireTime; - private LocalDateTime signTime; - private Integer clientTypeCode; - private String clientTypeName; - private String remarks; -}} -""") - -def gen_page_query(name): - w(f"safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/{name}PageQuery.java", f"""package org.qinan.safetyeval.client.dto.institution; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.qinan.safetyeval.client.dto.BasePageQuery; - -@Data -@EqualsAndHashCode(callSuper = true) -public class {name}PageQuery extends BasePageQuery {{ - private String projectId; -}} -""") - -def gen_archive_cmd(): - w("safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/institution/EvalProcessArchiveCmd.java", """package org.qinan.safetyeval.client.dto.institution; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -@Data -public class EvalProcessArchiveCmd { - @NotBlank - private String projectId; -} -""") - -# Generate save cmds for all -for n in ["EvalRiskAnalysis","EvalRiskParticipant","EvalContract","EvalTeam","EvalSurvey","EvalSurveyNotice", - "EvalSurveyCheckin","EvalSurveyAttach","EvalReportDraft","EvalInternalReview","EvalTechReview", - "EvalProcessControl","EvalSignTask","EvalSignRecord"]: - gen_save_cmd(n) -gen_page_query("EvalReportDraft") -gen_page_query("EvalSignTask") -gen_archive_cmd() -print("cmds done") diff --git a/scripts/gen-p2-impl.py b/scripts/gen-p2-impl.py deleted file mode 100644 index 690edab7..00000000 --- a/scripts/gen-p2-impl.py +++ /dev/null @@ -1,465 +0,0 @@ -#!/usr/bin/env python3 -"""Generate P2 gateway impl, query, domain service, client and adapter layers.""" -import os -import re - -ROOT = os.path.join(os.path.dirname(__file__), "..") - -ENTITIES = [ - ("EvalRiskAnalysis", "NODE_01", True, None), - ("EvalRiskParticipant", "NODE_01", False, "risk"), - ("EvalContract", "NODE_02", True, None), - ("EvalTeam", "NODE_03", True, None), - ("EvalSurvey", "NODE_04", True, None), - ("EvalSurveyNotice", "NODE_04", False, "survey_unique"), - ("EvalSurveyCheckin", "NODE_04", False, "survey"), - ("EvalSurveyAttach", "NODE_04", False, "survey"), - ("EvalReportDraft", "NODE_05", False, None), - ("EvalInternalReview", "NODE_06", True, None), - ("EvalTechReview", "NODE_07", True, None), - ("EvalProcessControl", "NODE_08", True, None), - ("EvalSignTask", "SIGN", False, None), - ("EvalSignRecord", "SIGN", False, "task"), - ("EvalReport", "NODE_08", False, None), -] - -def kebab(name): - s = re.sub('(.)([A-Z][a-z]+)', r'\1-\2', name) - return re.sub('([a-z0-9])([A-Z])', r'\1-\2', s).lower().replace('eval-', 'eval-') - -def resource_path(name): - mapping = { - "EvalRiskAnalysis": "eval-risk-analysis", - "EvalRiskParticipant": "eval-risk-participant", - "EvalContract": "eval-contract", - "EvalTeam": "eval-team", - "EvalSurvey": "eval-survey", - "EvalSurveyNotice": "eval-survey-notice", - "EvalSurveyCheckin": "eval-survey-checkin", - "EvalSurveyAttach": "eval-survey-attach", - "EvalReportDraft": "eval-report-draft", - "EvalInternalReview": "eval-internal-review", - "EvalTechReview": "eval-tech-review", - "EvalProcessControl": "eval-process-control", - "EvalSignTask": "eval-sign-task", - "EvalSignRecord": "eval-sign-record", - "EvalReport": "eval-report", - } - return mapping[name] - -def write(rel, content): - full = os.path.join(ROOT, rel.replace("/", os.sep)) - os.makedirs(os.path.dirname(full), exist_ok=True) - with open(full, "w", encoding="utf-8", newline="\n") as f: - f.write(content) - -def gen_query(name): - content = f"""package org.qinan.safetyeval.domain.query; - -import lombok.Data; - -@Data -public class {name}Query {{ - - private Long pageNum; - private Long pageSize; - private Long orgId; - private Long projectId; - private Long riskId; - private Long surveyId; - private Long signTaskId; -}} -""" - write(f"safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/query/{name}Query.java", content) - -def gen_gateway(name, by_project, list_by): - methods = [f" {name}Entity save({name}Entity entity);", - f" {name}Entity get(Long id);", - f" {name}Entity modify({name}Entity entity);", - " void delete(Long id);"] - if by_project: - methods.append(f" {name}Entity getByProjectId(Long projectId, Long orgId);") - if list_by == "risk": - methods.append(f" java.util.List<{name}Entity> listByRiskId(Long riskId, Long orgId);") - elif list_by == "survey": - methods.append(f" java.util.List<{name}Entity> listBySurveyId(Long surveyId, Long orgId);") - elif list_by == "task": - methods.append(f" java.util.List<{name}Entity> listBySignTaskId(Long signTaskId, Long orgId);") - if name == "EvalSurveyNotice": - methods.append(f" {name}Entity getBySurveyId(Long surveyId, Long orgId);") - if name in ("EvalReportDraft", "EvalSignTask"): - methods.append(f" PageResult<{name}Entity> page({name}Query query);") - if name == "EvalReportDraft": - methods.append(" int nextDraftVersionNo(Long projectId, Long orgId);") - if name == "EvalReport": - methods.append(f" {name}Entity saveInternal({name}Entity entity);") - body = "\n".join(methods) - content = f"""package org.qinan.safetyeval.domain.gateway; - -import org.qinan.safetyeval.domain.entity.{name}Entity; -import org.qinan.safetyeval.domain.query.{name}Query; -import org.qinan.safetyeval.domain.query.PageResult; - -import java.util.List; - -public interface {name}Gateway {{ - -{body} -}} -""" - write(f"safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/{name}Gateway.java", content) - -def gen_gateway_impl(name, by_project, list_by, has_delete_list): - mapper_var = name[0].lower() + name[1:] + "Mapper" - extra_methods = "" - if by_project: - extra_methods += f""" - @Override - public {name}Entity getByProjectId(Long projectId, Long orgId) {{ - LambdaQueryWrapper<{name}DO> wrapper = new LambdaQueryWrapper<>(); - wrapper.eq({name}DO::getDeleteEnum, "false"); - wrapper.eq({name}DO::getProjectId, projectId); - if (orgId != null) {{ - wrapper.eq({name}DO::getOrgId, orgId); - }} - return toEntity({mapper_var}.selectOne(wrapper)); - }} -""" - if name == "EvalSurveyNotice": - extra_methods += f""" - @Override - public {name}Entity getBySurveyId(Long surveyId, Long orgId) {{ - LambdaQueryWrapper<{name}DO> wrapper = new LambdaQueryWrapper<>(); - wrapper.eq({name}DO::getDeleteEnum, "false"); - wrapper.eq({name}DO::getSurveyId, surveyId); - if (orgId != null) {{ - wrapper.eq({name}DO::getOrgId, orgId); - }} - return toEntity({mapper_var}.selectOne(wrapper)); - }} -""" - if list_by == "risk": - extra_methods += f""" - @Override - public List<{name}Entity> listByRiskId(Long riskId, Long orgId) {{ - LambdaQueryWrapper<{name}DO> wrapper = new LambdaQueryWrapper<>(); - wrapper.eq({name}DO::getDeleteEnum, "false"); - wrapper.eq({name}DO::getRiskId, riskId); - if (orgId != null) {{ - wrapper.eq({name}DO::getOrgId, orgId); - }} - wrapper.orderByAsc({name}DO::getSortOrder); - return {mapper_var}.selectList(wrapper).stream().map(this::toEntity).collect(Collectors.toList()); - }} -""" - elif list_by == "survey": - extra_methods += f""" - @Override - public List<{name}Entity> listBySurveyId(Long surveyId, Long orgId) {{ - LambdaQueryWrapper<{name}DO> wrapper = new LambdaQueryWrapper<>(); - wrapper.eq({name}DO::getDeleteEnum, "false"); - wrapper.eq({name}DO::getSurveyId, surveyId); - if (orgId != null) {{ - wrapper.eq({name}DO::getOrgId, orgId); - }} - wrapper.orderByDesc({name}DO::getCreateTime); - return {mapper_var}.selectList(wrapper).stream().map(this::toEntity).collect(Collectors.toList()); - }} -""" - elif list_by == "task": - extra_methods += f""" - @Override - public List<{name}Entity> listBySignTaskId(Long signTaskId, Long orgId) {{ - LambdaQueryWrapper<{name}DO> wrapper = new LambdaQueryWrapper<>(); - wrapper.eq({name}DO::getDeleteEnum, "false"); - wrapper.eq({name}DO::getSignTaskId, signTaskId); - if (orgId != null) {{ - wrapper.eq({name}DO::getOrgId, orgId); - }} - wrapper.orderByDesc({name}DO::getCreateTime); - return {mapper_var}.selectList(wrapper).stream().map(this::toEntity).collect(Collectors.toList()); - }} -""" - page_method = "" - if name in ("EvalReportDraft", "EvalSignTask"): - page_method = f""" - @Override - public PageResult<{name}Entity> page({name}Query query) {{ - Page<{name}DO> page = new Page<>(query.getPageNum(), query.getPageSize()); - LambdaQueryWrapper<{name}DO> wrapper = new LambdaQueryWrapper<>(); - wrapper.eq({name}DO::getDeleteEnum, "false"); - if (query.getOrgId() != null) {{ - wrapper.eq({name}DO::getOrgId, query.getOrgId()); - }} - if (query.getProjectId() != null) {{ - wrapper.eq({name}DO::getProjectId, query.getProjectId()); - }} - wrapper.orderByDesc({name}DO::getCreateTime); - IPage<{name}DO> result = {mapper_var}.selectPage(page, wrapper); - List<{name}Entity> records = result.getRecords().stream().map(this::toEntity).collect(Collectors.toList()); - return PageResult.of(records, result.getTotal(), result.getCurrent(), result.getSize()); - }} -""" - version_method = "" - if name == "EvalReportDraft": - version_method = """ - @Override - public int nextDraftVersionNo(Long projectId, Long orgId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(EvalReportDraftDO::getDeleteEnum, "false"); - wrapper.eq(EvalReportDraftDO::getProjectId, projectId); - if (orgId != null) { - wrapper.eq(EvalReportDraftDO::getOrgId, orgId); - } - wrapper.orderByDesc(EvalReportDraftDO::getDraftVersionNo); - wrapper.last("LIMIT 1"); - EvalReportDraftDO latest = evalReportDraftMapper.selectOne(wrapper); - return latest == null || latest.getDraftVersionNo() == null ? 1 : latest.getDraftVersionNo() + 1; - } -""" - internal_save = "" - if name == "EvalReport": - internal_save = f""" - @Override - public {name}Entity saveInternal({name}Entity entity) {{ - return save(entity); - }} -""" - content = f"""package org.qinan.safetyeval.infrastructure.gatewayimpl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.qinan.safetyeval.domain.entity.{name}Entity; -import org.qinan.safetyeval.domain.gateway.{name}Gateway; -import org.qinan.safetyeval.domain.query.{name}Query; -import org.qinan.safetyeval.domain.query.PageResult; -import org.qinan.safetyeval.infrastructure.dataobject.{name}DO; -import org.qinan.safetyeval.infrastructure.mapper.{name}Mapper; -import org.qinan.safetyeval.infrastructure.support.EvalBeanCopy; -import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; -import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.util.List; -import java.util.stream.Collectors; - -@Component -public class {name}GatewayImpl implements {name}Gateway {{ - - @Resource - private {name}Mapper {mapper_var}; - - @Resource - private OrgContextResolver orgContextResolver; - - @Override - public {name}Entity save({name}Entity entity) {{ - {name}DO dataObject = toDO(entity); - InsertFieldDefaults.apply(dataObject); - {mapper_var}.insert(dataObject); - entity.setId(dataObject.getId()); - return entity; - }} - - @Override - public {name}Entity get(Long id) {{ - {name}DO dataObject = {mapper_var}.selectById(id); - if (dataObject == null || !"false".equals(dataObject.getDeleteEnum())) {{ - return null; - }} - return toEntity(dataObject); - }} - - @Override - public {name}Entity modify({name}Entity entity) {{ - {name}DO dataObject = toDO(entity); - dataObject.setId(entity.getId()); - InsertFieldDefaults.applyForUpdate(dataObject); - {mapper_var}.updateById(dataObject); - return get(entity.getId()); - }} - - @Override - public void delete(Long id) {{ - {mapper_var}.deleteById(id); - }} -{extra_methods}{page_method}{version_method}{internal_save} - private {name}DO toDO({name}Entity entity) {{ - {name}DO dataObject = EvalBeanCopy.toNew(entity, {name}DO.class); - dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId())); - return dataObject; - }} - - private {name}Entity toEntity({name}DO dataObject) {{ - if (dataObject == null) {{ - return null; - }} - return EvalBeanCopy.toNew(dataObject, {name}Entity.class); - }} -}} -""" - write(f"safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/{name}GatewayImpl.java", content) - -def gen_co(name): - content = f"""package org.qinan.safetyeval.client.co.institution; - -import lombok.Data; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -@Data -public class {name}CO {{ - - private String id; - private String orgId; - private String projectId; - private String riskId; - private String surveyId; - private String signTaskId; - private LocalDate analysisDate; - private String evalTypeCode; - private String evalTypeName; - private String industryCode; - private String industryName; - private String evalScope; - private Integer inBizScopeFlag; - private String unitOverview; - private String industryRiskDesc; - private Integer staffMatchCode; - private Integer needExpertCode; - private Integer capabilityCode; - private Integer feasibleCode; - private Integer economicCode; - private Integer riskLevelCode; - private String riskLevelName; - private Integer signContractCode; - private String conclusionContent; - private String approverName; - private Integer approvalOpinionCode; - private String approvalOpinionName; - private LocalDate approvalDate; - private Integer statusCode; - private String statusName; - private String personnelId; - private String personnelName; - private String deptName; - private Integer signStatusCode; - private String signStatusName; - private String signFileUrl; - private Integer sortOrder; - private String orgName; - private String contractNo; - private String projectName; - private String projectIntro; - private Long amountFen; - private String projectTypeCode; - private String projectTypeName; - private String riskSummary; - private String projectRegion; - private String projectAddress; - private LocalDate contractStartDate; - private LocalDate contractEndDate; - private Integer toxicFlag; - private Integer precursorFlag; - private Integer crossProvinceFlag; - private String businessScope; - private String enterpriseName; - private String industryCategory; - private String officeAddress; - private String creditCode; - private String postCode; - private String enterprisePhone; - private String fax; - private String legalPerson; - private String contactName; - private Integer staffCount; - private String scanFileUrl; - private String leaderPersonnelId; - private String leaderName; - private String controlPersonnelId; - private String controlName; - private Integer memberCount; - private LocalDateTime finishTime; - private LocalDate planSurveyDate; - private String surveyPlace; - private Integer noticeDoneFlag; - private Integer inspectDoneFlag; - private Integer rectifyDoneFlag; - private Integer enterpriseDoneFlag; - private Integer reviewDoneFlag; - private String noticeContent; - private String memberSnapshot; - private String stampFileUrl; - private Integer taskStatusCode; - private String taskStatusName; - private LocalDateTime planTime; - private Integer checkinTypeCode; - private String checkinTypeName; - private LocalDateTime checkinTime; - private java.math.BigDecimal longitude; - private java.math.BigDecimal latitude; - private String address; - private Integer facePassFlag; - private String photoUrls; - private String signImageUrl; - private String attachTypeCode; - private String attachTypeName; - private String fileName; - private String fileUrl; - private Integer reviewResultCode; - private String reviewResultName; - private String reviewContent; - private Integer draftVersionNo; - private String templateCode; - private String templateName; - private String contentUrl; - private String hintContent; - private String draftId; - private String reviewerPersonnelId; - private String reviewerName; - private Integer resultCode; - private String resultName; - private String opinionContent; - private LocalDateTime reviewTime; - private String controllerPersonnelId; - private String controllerName; - private Integer precheckPassFlag; - private Integer archiveFlag; - private LocalDateTime controlTime; - private String nodeCode; - private String nodeName; - private String bizTypeCode; - private String bizTypeName; - private String bizRefId; - private String signerPersonnelId; - private String signerName; - private String taskTitle; - private LocalDateTime expireTime; - private LocalDateTime signTime; - private Integer clientTypeCode; - private String clientTypeName; - private String customerId; - private String reportNo; - private String reportName; - private Integer reportYear; - private Integer publicFlag; - private Integer completeFlag; - private Integer reportStatusCode; - private String reportStatusName; - private LocalDateTime archiveTime; -}} -""" - write(f"safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/institution/{name}CO.java", content) - -for e in ENTITIES: - name, node, by_project, list_by = e - gen_query(name) - gen_gateway(name, by_project, list_by) - gen_gateway_impl(name, by_project, list_by if list_by not in ("survey_unique",) else "survey", False) - gen_co(name) - print(name) - -print("done") diff --git a/scripts/gen-p2-nodes.py b/scripts/gen-p2-nodes.py deleted file mode 100644 index 867fcade..00000000 --- a/scripts/gen-p2-nodes.py +++ /dev/null @@ -1,295 +0,0 @@ -#!/usr/bin/env python3 -"""Generate P2 eight-node COLA boilerplate files.""" -import os - -ROOT = os.path.join(os.path.dirname(__file__), "..") - -TABLES = { - "EvalRiskAnalysis": { - "table": "eval_risk_analysis", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("LocalDate", "analysisDate"), - ("String", "evalTypeCode"), ("String", "evalTypeName"), ("String", "industryCode"), - ("String", "industryName"), ("String", "evalScope"), ("Integer", "inBizScopeFlag"), - ("String", "unitOverview"), ("String", "industryRiskDesc"), ("Integer", "staffMatchCode"), - ("Integer", "needExpertCode"), ("Integer", "capabilityCode"), ("Integer", "feasibleCode"), - ("Integer", "economicCode"), ("Integer", "riskLevelCode"), ("String", "riskLevelName"), - ("Integer", "signContractCode"), ("String", "conclusionContent"), ("String", "approverName"), - ("Integer", "approvalOpinionCode"), ("String", "approvalOpinionName"), ("LocalDate", "approvalDate"), - ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_RISK_NOT_FOUND", - "node": "NODE_01", - }, - "EvalRiskParticipant": { - "table": "eval_risk_participant", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "riskId"), - ("Long", "personnelId"), ("String", "personnelName"), ("String", "deptName"), - ("Integer", "signStatusCode"), ("String", "signStatusName"), ("String", "signFileUrl"), - ("Integer", "sortOrder"), - ], - "not_found": "EVAL_RISK_NOT_FOUND", - "node": "NODE_01", - "list_by": "riskId", - }, - "EvalContract": { - "table": "eval_contract", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("String", "orgName"), ("String", "contractNo"), - ("String", "projectName"), ("String", "projectIntro"), ("Long", "amountFen"), - ("String", "projectTypeCode"), ("String", "projectTypeName"), ("String", "riskSummary"), - ("String", "projectRegion"), ("String", "projectAddress"), ("LocalDate", "contractStartDate"), - ("LocalDate", "contractEndDate"), ("String", "evalTypeCode"), ("String", "evalTypeName"), - ("Integer", "toxicFlag"), ("Integer", "precursorFlag"), ("Integer", "crossProvinceFlag"), - ("String", "businessScope"), ("String", "enterpriseName"), ("String", "industryCategory"), - ("String", "officeAddress"), ("String", "creditCode"), ("String", "postCode"), - ("String", "enterprisePhone"), ("String", "fax"), ("String", "legalPerson"), - ("String", "contactName"), ("Integer", "staffCount"), ("String", "scanFileUrl"), - ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_CONTRACT_NOT_FOUND", - "node": "NODE_02", - }, - "EvalTeam": { - "table": "eval_team", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "leaderPersonnelId"), - ("String", "leaderName"), ("Long", "controlPersonnelId"), ("String", "controlName"), - ("Integer", "memberCount"), ("Integer", "statusCode"), ("String", "statusName"), - ("LocalDateTime", "finishTime"), - ], - "not_found": "EVAL_TEAM_NOT_FOUND", - "node": "NODE_03", - }, - "EvalSurvey": { - "table": "eval_survey", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("LocalDate", "planSurveyDate"), - ("String", "surveyPlace"), ("Integer", "noticeDoneFlag"), ("Integer", "inspectDoneFlag"), - ("Integer", "rectifyDoneFlag"), ("Integer", "enterpriseDoneFlag"), ("Integer", "reviewDoneFlag"), - ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_SURVEY_NOT_FOUND", - "node": "NODE_04", - }, - "EvalSurveyNotice": { - "table": "eval_survey_notice", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "surveyId"), - ("String", "noticeContent"), ("String", "memberSnapshot"), ("String", "stampFileUrl"), - ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_SURVEY_NOT_FOUND", - "node": "NODE_04", - "unique_by": "surveyId", - }, - "EvalSurveyCheckin": { - "table": "eval_survey_checkin", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "surveyId"), - ("Long", "personnelId"), ("String", "personnelName"), - ("Integer", "taskStatusCode"), ("String", "taskStatusName"), ("LocalDateTime", "planTime"), - ("Integer", "checkinTypeCode"), ("String", "checkinTypeName"), ("LocalDateTime", "checkinTime"), - ("java.math.BigDecimal", "longitude"), ("java.math.BigDecimal", "latitude"), - ("String", "address"), ("Integer", "facePassFlag"), ("String", "photoUrls"), - ("String", "signImageUrl"), - ], - "not_found": "EVAL_SURVEY_NOT_FOUND", - "node": "NODE_04", - "list_by": "surveyId", - }, - "EvalSurveyAttach": { - "table": "eval_survey_attach", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "surveyId"), - ("String", "attachTypeCode"), ("String", "attachTypeName"), ("String", "fileName"), - ("String", "fileUrl"), ("Integer", "reviewResultCode"), ("String", "reviewResultName"), - ("String", "reviewContent"), - ], - "not_found": "EVAL_SURVEY_NOT_FOUND", - "node": "NODE_04", - "list_by": "surveyId", - }, - "EvalReportDraft": { - "table": "eval_report_draft", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Integer", "draftVersionNo"), - ("String", "templateCode"), ("String", "templateName"), ("String", "contentUrl"), - ("String", "hintContent"), ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_DRAFT_NOT_FOUND", - "node": "NODE_05", - }, - "EvalInternalReview": { - "table": "eval_internal_review", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "draftId"), - ("Long", "reviewerPersonnelId"), ("String", "reviewerName"), - ("Integer", "resultCode"), ("String", "resultName"), ("String", "opinionContent"), - ("LocalDateTime", "reviewTime"), ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_INTERNAL_REVIEW_NOT_FOUND", - "node": "NODE_06", - }, - "EvalTechReview": { - "table": "eval_tech_review", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "draftId"), - ("Long", "reviewerPersonnelId"), ("String", "reviewerName"), - ("Integer", "resultCode"), ("String", "resultName"), ("String", "opinionContent"), - ("LocalDateTime", "reviewTime"), ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_TECH_REVIEW_NOT_FOUND", - "node": "NODE_07", - }, - "EvalProcessControl": { - "table": "eval_process_control", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "controllerPersonnelId"), - ("String", "controllerName"), ("Integer", "precheckPassFlag"), - ("Integer", "resultCode"), ("String", "resultName"), ("String", "opinionContent"), - ("Integer", "archiveFlag"), ("LocalDateTime", "controlTime"), - ("Integer", "statusCode"), ("String", "statusName"), - ], - "not_found": "EVAL_PROCESS_NOT_FOUND", - "node": "NODE_08", - }, - "EvalSignTask": { - "table": "eval_sign_task", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("String", "nodeCode"), ("String", "nodeName"), - ("String", "bizTypeCode"), ("String", "bizTypeName"), ("Long", "bizRefId"), - ("Long", "signerPersonnelId"), ("String", "signerName"), ("String", "taskTitle"), - ("Integer", "taskStatusCode"), ("String", "taskStatusName"), ("LocalDateTime", "expireTime"), - ], - "not_found": "EVAL_SIGN_TASK_NOT_FOUND", - "node": "SIGN", - }, - "EvalSignRecord": { - "table": "eval_sign_record", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "signTaskId"), - ("Long", "signerPersonnelId"), ("String", "signerName"), ("String", "signImageUrl"), - ("LocalDateTime", "signTime"), ("Integer", "clientTypeCode"), ("String", "clientTypeName"), - ], - "not_found": "EVAL_SIGN_RECORD_NOT_FOUND", - "node": "SIGN", - "list_by": "signTaskId", - }, - "EvalReport": { - "table": "eval_report", - "fields": [ - ("Long", "orgId"), ("Long", "projectId"), ("Long", "customerId"), - ("String", "reportNo"), ("String", "reportName"), ("Integer", "reportYear"), - ("String", "evalTypeCode"), ("String", "evalTypeName"), ("String", "businessScope"), - ("String", "fileUrl"), ("String", "fileName"), ("Integer", "publicFlag"), - ("Integer", "completeFlag"), ("Integer", "reportStatusCode"), ("String", "reportStatusName"), - ("LocalDateTime", "archiveTime"), - ], - "not_found": "EVAL_PROJECT_NOT_FOUND", - "internal": True, - }, -} - -COMMON_DO_FIELDS = [ - ("String", "deleteEnum"), ("String", "remarks"), ("String", "createName"), ("String", "updateName"), - ("Long", "tenantId"), ("Integer", "version"), ("LocalDateTime", "createTime"), - ("LocalDateTime", "updateTime"), ("Long", "createId"), ("Long", "updateId"), ("String", "env"), -] - -def camel_to_snake(name): - import re - s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) - return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() - -def write(path, content): - full = os.path.join(ROOT, path.replace("/", os.sep)) - os.makedirs(os.path.dirname(full), exist_ok=True) - with open(full, "w", encoding="utf-8", newline="\n") as f: - f.write(content) - -def gen_entity(name, fields): - imports = set() - for t, _ in fields + COMMON_DO_FIELDS: - if t.startswith("java."): - imports.add(f"import {t};") - elif t == "LocalDate": - imports.add("import java.time.LocalDate;") - elif t == "LocalDateTime": - imports.add("import java.time.LocalDateTime;") - imp = "\n".join(sorted(imports)) - lines = [f"package org.qinan.safetyeval.domain.entity;\n", imp, "\n\n@Data\n", f"public class {name}Entity {{\n\n", " private Long id;\n"] - for t, f in fields: - lines.append(f" private {t.replace('java.math.', '')} {f};\n") - for t, f in COMMON_DO_FIELDS: - lines.append(f" private {t.replace('java.math.', '')} {f};\n") - lines.append("}\n") - write(f"safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/{name}Entity.java", - "".join(["import lombok.Data;\n\n"] + lines[1:])) - -def gen_do(name, table, fields): - imports = ["import com.baomidou.mybatisplus.annotation.TableName;", "import lombok.Data;"] - for t, _ in fields + COMMON_DO_FIELDS: - if t.startswith("java."): - imports.append(f"import {t};") - elif t in ("LocalDate", "LocalDateTime"): - imports.append(f"import java.time.{t};") - body = "\n".join(imports) + f"\n\n@Data\n@TableName(\"{table}\")\npublic class {name}DO {{\n\n private Long id;\n" - for t, f in fields + COMMON_DO_FIELDS: - body += f" private {t.replace('java.math.', '')} {f};\n" - body += "}\n" - write(f"safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/{name}DO.java", body) - -def gen_mapper(name): - content = f"""package org.qinan.safetyeval.infrastructure.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.qinan.safetyeval.infrastructure.dataobject.{name}DO; - -@Mapper -public interface {name}Mapper extends BaseMapper<{name}DO> {{ -}} -""" - write(f"safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/{name}Mapper.java", content) - -def gen_gateway(name): - content = f"""package org.qinan.safetyeval.domain.gateway; - -import org.qinan.safetyeval.domain.entity.{name}Entity; -import org.qinan.safetyeval.domain.query.{name}Query; -import org.qinan.safetyeval.domain.query.PageResult; - -import java.util.List; - -public interface {name}Gateway {{ - - {name}Entity save({name}Entity entity); - - {name}Entity get(Long id); - - {name}Entity modify({name}Entity entity); - - void delete(Long id); - - {name}Entity getByProjectId(Long projectId, Long orgId); - - List<{name}Entity> list({name}Query query); - - PageResult<{name}Entity> page({name}Query query); - - int nextDraftVersionNo(Long projectId, Long orgId); -}} -""" - # simplify gateway - not all need all methods; we'll trim in gateway impl - write(f"safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/{name}Gateway.java", content) - -print("Generator scaffold - run manual implementation for business logic") -for n in TABLES: - cfg = TABLES[n] - gen_entity(n, cfg["fields"]) - gen_do(n, cfg["table"], cfg["fields"]) - gen_mapper(n) - gen_gateway(n) - print(f"Generated {n}") diff --git a/scripts/gen-p2-rest.py b/scripts/gen-p2-rest.py deleted file mode 100644 index 1a486fbd..00000000 --- a/scripts/gen-p2-rest.py +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/env python3 -"""Generate remaining P2 Api/Executor/Controller triples.""" -import os -ROOT = os.path.join(os.path.dirname(__file__), "..") - -def w(rel, c): - p = os.path.join(ROOT, rel.replace('/', os.sep)) - os.makedirs(os.path.dirname(p), exist_ok=True) - open(p, 'w', encoding='utf-8', newline='\n').write(c) - -GET_OR_SAVE = [ - ("EvalContract", "EvalContract", "NODE_02", "EVAL_CONTRACT_NOT_FOUND", "业务合同", "eval-contract", "toContractCO"), - ("EvalTeam", "EvalTeam", "NODE_03", "EVAL_TEAM_NOT_FOUND", "项目组成立", "eval-team", "toTeamCO"), - ("EvalSurvey", "EvalSurvey", "NODE_04", "EVAL_SURVEY_NOT_FOUND", "现场踏勘", "eval-survey", "toSurveyCO"), - ("EvalInternalReview", "EvalInternalReview", "NODE_06", "EVAL_INTERNAL_REVIEW_NOT_FOUND", "内部审核", "eval-internal-review", "toInternalCO"), - ("EvalTechReview", "EvalTechReview", "NODE_07", "EVAL_TECH_REVIEW_NOT_FOUND", "技术审核", "eval-tech-review", "toTechCO"), - ("EvalProcessControl", "EvalProcessControl", "NODE_08", "EVAL_PROCESS_NOT_FOUND", "过程控制", "eval-process-control", "toProcessCO"), -] - -for entity, name, node, err, tag, path, conv in GET_OR_SAVE: - w(f"safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/institution/{name}Api.java", f"""package org.qinan.safetyeval.client.api.institution; - -import org.qinan.safetyeval.client.co.institution.{name}CO; -import org.qinan.safetyeval.client.dto.SingleResponse; -import org.qinan.safetyeval.client.dto.institution.{name}SaveCmd; - -public interface {name}Api {{ - SingleResponse<{name}CO> getOrSave({name}SaveCmd cmd); - SingleResponse<{name}CO> getByProject(String projectId); -}} -""") - w(f"safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/{name}Executor.java", f"""package org.qinan.safetyeval.app.executor.institution; - -import org.qinan.safetyeval.app.executor.institution.support.EvalCmdCopy; -import org.qinan.safetyeval.app.executor.institution.support.EvalNodeCoConverter; -import org.qinan.safetyeval.app.executor.institution.support.EvalProjectNodeSupport; -import org.qinan.safetyeval.client.api.institution.{name}Api; -import org.qinan.safetyeval.client.co.institution.{name}CO; -import org.qinan.safetyeval.client.dto.SingleResponse; -import org.qinan.safetyeval.client.dto.institution.{name}SaveCmd; -import org.qinan.safetyeval.domain.entity.EvalProjectEntity; -import org.qinan.safetyeval.domain.entity.{entity}Entity; -import org.qinan.safetyeval.domain.exception.BizException; -import org.qinan.safetyeval.domain.exception.ErrorCode; -import org.qinan.safetyeval.domain.gateway.{entity}Gateway; -import org.qinan.safetyeval.domain.support.EvalNodeCodes; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -@Service -public class {name}Executor implements {name}Api {{ - - @Resource - private {entity}Gateway {entity[0].lower() + entity[1:]}Gateway; - @Resource - private EvalProjectNodeSupport evalProjectNodeSupport; - - @Override - public SingleResponse<{name}CO> getOrSave({name}SaveCmd cmd) {{ - Long projectId = Long.parseLong(cmd.getProjectId()); - EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId); - evalProjectNodeSupport.assertWrite(projectId, EvalNodeCodes.{node}); - {entity}Entity entity = {entity[0].lower() + entity[1:]}Gateway.getByProjectId(projectId, project.getOrgId()); - if (entity == null) {{ - entity = new {entity}Entity(); - entity.setOrgId(project.getOrgId()); - entity.setProjectId(projectId); - entity.setStatusCode(1); - evalProjectNodeSupport.fillNodeStatus(1, entity); - entity = {entity[0].lower() + entity[1:]}Gateway.save(entity); - }} - EvalCmdCopy.apply(cmd, entity); - evalProjectNodeSupport.fillNodeStatus(entity.getStatusCode(), entity); - entity = {entity[0].lower() + entity[1:]}Gateway.modify(entity); - evalProjectNodeSupport.afterNodeSaved(projectId, EvalNodeCodes.{node}, entity.getStatusCode()); - return SingleResponse.success(EvalNodeCoConverter.{conv}(entity)); - }} - - @Override - public SingleResponse<{name}CO> getByProject(String projectId) {{ - Long pid = Long.parseLong(projectId); - evalProjectNodeSupport.assertRead(pid); - EvalProjectEntity project = evalProjectNodeSupport.requireProject(pid); - {entity}Entity entity = {entity[0].lower() + entity[1:]}Gateway.getByProjectId(pid, project.getOrgId()); - if (entity == null) {{ - throw new BizException(ErrorCode.{err}); - }} - return SingleResponse.success(EvalNodeCoConverter.{conv}(entity)); - }} -}} -""") - w(f"safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/institution/{name}Controller.java", f"""package org.qinan.safetyeval.adapter.web.institution; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.qinan.safetyeval.client.api.institution.{name}Api; -import org.qinan.safetyeval.client.co.institution.{name}CO; -import org.qinan.safetyeval.client.dto.SingleResponse; -import org.qinan.safetyeval.client.dto.institution.{name}SaveCmd; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -@Api(tags = "机构端-{tag}") -@RestController -@RequestMapping("/safetyEval/institution/{path}") -public class {name}Controller {{ - - @Resource - private {name}Api {name[0].lower() + name[1:]}Api; - - @ApiOperation("按项目获取或保存") - @PostMapping("/get-or-save") - public SingleResponse<{name}CO> getOrSave(@Validated @RequestBody {name}SaveCmd cmd) {{ - return {name[0].lower() + name[1:]}Api.getOrSave(cmd); - }} - - @ApiOperation("按项目查询") - @GetMapping("/get") - public SingleResponse<{name}CO> get(@ApiParam("项目ID") @RequestParam String projectId) {{ - return {name[0].lower() + name[1:]}Api.getByProject(projectId); - }} -}} -""") - print(name) - -print("get-or-save done")