#!/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")