commit 2950b06f8998e11cccd1b75bc7cb3af8a0878b2d Author: huwei <3313749341@qq.com> Date: Wed Jun 17 17:24:40 2026 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/docs/GBS底座服务手册.md b/docs/GBS底座服务手册.md new file mode 100644 index 0000000..8cd68de --- /dev/null +++ b/docs/GBS底座服务手册.md @@ -0,0 +1,398 @@ +# GBS 底座服务手册 + +> 最后更新:2026-06-16 +> 文档范围:K8s 集群、中间件、微服务全部服务清单 + +--- + +## 一、服务器信息 + +| 角色 | 主机名 | IP | OS | SSH 账号 | SSH 密码 | +|------|--------|-----|-----|----------|----------| +| Master | k8s-master | 192.168.20.100 | CentOS 7 | root | `Zcloud@zcloud100` | +| Worker01 | k8s-work01 | 192.168.20.110 | CentOS 7 | root | `Zcloud@zcloud110` | +| Worker02 | k8s-work02 | 192.168.20.120 | CentOS 7 | root | `Zcloud@zcloud120` | + +**K8s 集群版本**:v1.27.6 +**容器运行时**:Docker 26.1.3 + cri-dockerd 0.3.4 +**网络插件**:Calico v3.26.1 +**Pod 网段**:10.244.0.0/16 +**Service 网段**:10.96.0.0/12 +**DNS 域名**:cluster.local + +--- + +## 二、基础设施服务(Docker 直接部署在 Master 节点) + +### 2.1 MySQL + +| 属性 | 值 | +|------|-----| +| **部署方式** | Docker(Master 节点) | +| **镜像版本** | mysql:8.0.35 | +| **访问地址** | `192.168.20.100:33080` | +| **集群内部地址** | 通过宿主机 IP 访问 | +| **账号** | `root` | +| **密码** | `Mysql@zcloud33080` | +| **字符集** | utf8mb4 / utf8mb4_0900_ai_ci | + +> **注意**:Docker 环境变量中 `MYSQL_ROOT_PASSWORD=Zcloud@zcloud2026` 是容器创建时的初始密码,但实际 root 密码已被后续操作改为 `Mysql@zcloud33080`。**请使用 `Mysql@zcloud33080` 连接。** + +**数据库列表**(24 个业务库 + 系统库): + +| 数据库名 | 用途 | +|----------|------| +| `nacos` | Nacos 配置存储(注意:不是 nacos_config) | + +**连接方式**: +```bash +# 外部连接(任意客户端) +mysql -h 192.168.20.100 -P 33080 -uroot -p'Mysql@zcloud33080' + +# 集群内部 Pod 连接(通过宿主机 IP) +mysql -h 192.168.20.100 -P 33080 -uroot -p'Mysql@zcloud33080' +``` + +--- + +### 2.2 Redis + +| 属性 | 值 | +|------|-----| +| **部署方式** | Docker(Master 节点) | +| **镜像版本** | redis:7.2-alpine(实际版本 7.2.14) | +| **访问地址** | `192.168.20.100:6379` | +| **密码** | `Zcloud@zcloud2026` | +| **模式** | 单机(standalone) | + +**连接方式**: +```bash +# 外部连接 +redis-cli -h 192.168.20.100 -p 6379 -a 'Zcloud@zcloud2026' + +# Spring Boot 配置(application.yml) +spring: + redis: + host: 192.168.20.100 + port: 6379 + password: Zcloud@zcloud2026 +``` + +--- + +### 2.3 MinIO(对象存储) + +| 属性 | 值 | +|------|-----| +| **部署方式** | Docker(Master 节点) | +| **镜像版本** | minio/minio:latest | +| **API 地址** | `http://192.168.20.100:9000` | +| **Web 控制台** | `http://192.168.20.100:9001` | +| **账号** | `admin` | +| **密码** | `Zcloud@zcloud2026` | +| **Browser** | 已开启(MINIO_BROWSER=on) | + +**使用方式**: +1. 浏览器打开 `http://192.168.20.100:9001` +2. 使用 `admin / Zcloud@zcloud2026` 登录 +3. 可创建 Bucket、上传文件、管理访问策略 + +--- + +## 三、K8s 集群基础服务 + +### 3.1 Nacos(注册中心 & 配置中心) + +| 属性 | 值 | +|------|-----| +| **部署方式** | K8s Deployment(namespace: jjb-dragon) | +| **镜像版本** | nacos-server:2.0.3 | +| **副本数** | 1 | +| **运行节点** | k8s-master | +| **Web 控制台** | `http://192.168.20.100:30290/nacos` | +| **集群内部地址** | `prod-nacos.jjb-dragon.svc.cluster.local:8848` 或简写 `prod-nacos:8848` | +| **账号** | `nacos` | +| **密码** | `nacos`(默认密码) | +| **模式** | standalone | +| **数据存储** | MySQL(nacos 库) | + +**端口映射**: + +| 服务端口 | NodePort | 用途 | +|----------|----------|------| +| 8848 | 30290 | HTTP 控制台 & API | +| 9848 | 31290 | gRPC 客户端通信 | +| 9849 | 31291 | gRPC Raft 通信 | +| 7848 | 30740 | Jraft 通信 | + +**命名空间**: + +| 命名空间 ID | 显示名称 | 配置数 | +|-------------|----------|--------| +| (空) | public | 1 | +| `jjb-dragon` | jjb-dragon | 51 | +| `jjb-dragon-facade` | jjb-dragon-facade | 537 | + +**接入方式**: +```yaml +# Spring Boot 微服务配置 +spring: + cloud: + nacos: + discovery: + server-addr: prod-nacos:8848 + namespace: jjb-dragon + config: + server-addr: prod-nacos:8848 + namespace: jjb-dragon +``` + +--- + +### 3.2 RocketMQ(消息队列) + +| 属性 | 值 | +|------|-----| +| **部署方式** | K8s Deployment(namespace: jjb-dragon) | +| **镜像版本** | rocketmq:4.4.0 / rocketmq-console-ng:new | +| **副本数** | 1(含 NameServer + Broker + Console 三容器) | +| **运行节点** | k8s-work01 | +| **集群名称** | JjbMqCluster | +| **Web 控制台** | `http://192.168.20.100:30300` | +| **集群内部 NameServer** | `rocketmq.jjb-dragon.svc.cluster.local:9876` | +| **认证** | 无(默认未开启 ACL) | + +**端口映射**: + +| 服务 | 容器端口 | NodePort | 用途 | +|------|----------|----------|------| +| Console | 8080 | 30300 | Web 管理控制台 | +| NameServer | 9876 | 30658 | 服务发现 | +| Broker | 10909 | 30161 | Broker VIP 通道 | +| Broker | 10911 | 31356 | Broker 主端口 | +| Broker | 10912 | 31493 | Broker HA | + +**接入方式**: +```yaml +# Spring Boot 配置 +rocketmq: + name-server: rocketmq:9876 + producer: + group: jjb-producer-group +``` + +**Broker 配置要点**: +- 自动创建 Topic:已开启 +- 默认队列数:4 +- 消息最大大小:655360 字节 +- Broker 角色:ASYNC_MASTER +- 刷盘方式:ASYNC_FLUSH + +--- + +### 3.3 Kubernetes Dashboard + +| 属性 | 值 | +|------|-----| +| **部署方式** | Helm Chart(namespace: kubernetes-dashboard) | +| **版本** | v2.7.0 | +| **访问地址** | `https://192.168.20.100:30180` | +| **认证方式** | Token | + +**获取 Token**: +```bash +# 如果 SA 和绑定已存在(文档中显示已创建过 kube-dashboard-admin-sa) +# 但当前集群中该 SA 不存在,需要重新创建: + +# 1. 创建 ServiceAccount 和 ClusterRoleBinding +kubectl create serviceaccount kube-dashboard-admin-sa -n kube-system +kubectl create clusterrolebinding kube-dashboard-admin-binding \ + --clusterrole=cluster-admin \ + --serviceaccount=kube-system:kube-dashboard-admin-sa + +# 2. 生成 Token(有效期 10 年) +kubectl create token kube-dashboard-admin-sa -n kube-system --duration=87600h +``` + +> **注意**:之前部署文档中生成的 Token 对应的 SA 已不存在,需要重新创建。 + +--- + +### 3.4 Metrics Server + +| 属性 | 值 | +|------|-----| +| **部署方式** | K8s YAML(namespace: kube-system) | +| **版本** | v0.6.0 | +| **用途** | 提供 `kubectl top` 命令的 CPU/内存指标数据 | +| **状态** | 正常运行 | + +--- + +### 3.5 Calico(网络插件) + +| 属性 | 值 | +|------|-----| +| **版本** | v3.26.1 | +| **部署方式** | K8s YAML(namespace: kube-system) | +| **Pod 网段** | 10.244.0.0/16 | + +--- + +## 四、镜像仓库凭证 + +### 4.1 image-pull-secret(底座镜像) + +| 属性 | 值 | +|------|-----| +| **Secret 名** | `image-pull-secret` | +| **命名空间** | jjb-dragon | +| **仓库地址** | `jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com` | +| **用户名** | `10952138@qq.com` | +| **密码** | `idurCT!rIq9EzISD` | + +### 4.2 image-pull-secret1(应用镜像) + +| 属性 | 值 | +|------|-----| +| **Secret 名** | `image-pull-secret1` | +| **命名空间** | jjb-dragon | +| **仓库地址** | `registry.cn-zhangjiakou.aliyuncs.com` | +| **用户名** | `kilaa` | +| **密码** | `Kilaa@6666` | + +--- + +## 五、业务微服务清单 + +所有微服务部署在 `jjb-dragon` 命名空间,使用 Helm Chart `jjb-prod/jjb-java-app` 部署。 + +| 序号 | 服务名 | Deployment | 状态 | 镜像版本 | 运行节点 | +|------|--------|------------|------|----------|----------| +| 1 | 网关 | jjb-saas-gateway | **Running** | oat-20250902-1 | k8s-work01 | +| 2 | 认证 | jjb-saas-auth | **Running** | ota-20260528-1 | k8s-work01 | +| 3 | 数据中心 | jjb-saas-data-center | **Running** | ota-20251111-1 | k8s-work01 | +| 4 | 事件 | jjb-saas-events | **Running** | ota-20251119-1 | k8s-work01 | +| 5 | 消息 | jjb-saas-message | **Running** | ota-20260317-1 | k8s-work01 | +| 6 | 官网 | jjb-saas-official | **Running** | ipass-20250816-2 | k8s-work01 | +| 7 | 流程布局 | jjb-saas-process-layout | **Running** | ota-20250926-1 | k8s-work01 | +| 8 | 安全 | jjb-saas-security | **Running** | ipass-20250906-2 | k8s-work01 | +| 9 | 用户 | jjb-saas-user | CrashLoopBackOff | 20251107-1808 | k8s-work01 | +| 10 | 系统 | jjb-saas-system | CrashLoopBackOff | ota-20260427-1 | k8s-work01 | +| 11 | 配置 | jjb-saas-config | CrashLoopBackOff | ota-20260115-1 | k8s-work01 | +| 12 | 附件 | jjb-saas-attachment | CrashLoopBackOff | ipass-20250906-2 | k8s-work01 | +| 13 | 应用 | jjb-saas-application | CrashLoopBackOff | ota-20260304-2 | k8s-work01 | +| 14 | 工作台 | jjb-saas-desk | CrashLoopBackOff | ota-20260116-1 | k8s-work01 | +| 15 | 门面 | jjb-saas-facade | CrashLoopBackOff | ota-20260603-1 | k8s-work01 | +| 16 | 基础 | jjb-saas-base | CrashLoopBackOff | ota-20260528-2 | k8s-work01 | +| 17 | 表单设计 | jjb-saas-formily-design | CrashLoopBackOff | wb-20250904-1 | k8s-work01 | +| 18 | 登录 | jjb-saas-login | CrashLoopBackOff | ota-20251216-1 | k8s-work01 | +| 19 | 开放平台 | jjb-saas-open-platform | CrashLoopBackOff | ota-20260401-1 | k8s-work01 | +| 20 | Netty 服务 | jjb-saas-netty-server | CrashLoopBackOff | ota-20250820-3 | k8s-work01 | +| 21 | BPM 流程 | jjb-saas-bpm | CrashLoopBackOff | ota-20251111-2 | k8s-work01 | +| 22 | 组件设计 | jjb-saas-component-design | CrashLoopBackOff | ota-20251111-1 | k8s-work01 | +| 23 | 文档 | jjb-saas-document | CrashLoopBackOff | ota-20250617-1 | k8s-work01 | +| 24 | 视图 | jjb-saas-view | CrashLoopBackOff | ota-20241129-1 | k8s-work01 | + +**服务端口**: +- 网关(jjb-saas-gateway):NodePort **30140**(外部访问入口) +- 其余微服务:均为 ClusterIP 类型(集群内部 80 端口) + + +## 七、快速接入指南 + +### 7.1 访问各管理控制台 + +| 服务 | 地址 | 账号 | 密码 | +|------|------|------|------| +| Nacos | http://192.168.20.100:30290/nacos | `nacos` | `nacos` | +| RocketMQ Console | http://192.168.20.100:30300 | 无需登录 | - | +| MinIO Console | http://192.168.20.100:9001 | `admin` | `Zcloud@zcloud2026` | +| K8s Dashboard | https://192.168.20.100:30180 | Token 登录 | 见 3.3 节 | +| 业务网关 | http://192.168.20.100:30140 | 待业务修复后可用 | - | + +### 7.2 微服务 Nacos 配置模板 + +```yaml +spring: + cloud: + nacos: + discovery: + server-addr: prod-nacos:8848 + namespace: jjb-dragon + config: + server-addr: prod-nacos:8848 + namespace: jjb-dragon + file-extension: yml + datasource: + url: jdbc:mysql://192.168.20.100:33080/jjb-saas-xxx?useUnicode=true&characterEncoding=utf8&useSSL=false + username: root + password: Mysql@zcloud33080 + redis: + host: 192.168.20.100 + port: 6379 + password: Zcloud@zcloud2026 +``` + +### 7.3 SSH 连接服务器 + +```bash +# Master +ssh root@192.168.20.100 # 密码: Zcloud@zcloud100 + +# Worker01 +ssh root@192.168.20.110 # 密码: Zcloud@zcloud110 + +# Worker02 +ssh root@192.168.20.120 # 密码: Zcloud@zcloud120 +``` + +### 7.4 常用运维命令 + +```bash +# 查看所有 Pod 状态 +kubectl get pods -A -o wide + +# 查看 jjb-dragon 命名空间下所有资源 +kubectl get all -n jjb-dragon + +# 查看 Pod 日志 +kubectl logs -n jjb-dragon deploy/ --tail=100 + +# 重启某个服务 +kubectl rollout restart deployment/ -n jjb-dragon + +# 查看节点资源使用 +kubectl top nodes +kubectl top pods -n jjb-dragon + +# 进入 Pod 内部 +kubectl exec -it -n jjb-dragon deploy/ -- /bin/bash +``` + +--- + +## 八、服务端口速查表 + +| 端口 | 协议 | 服务 | 说明 | +|------|------|------|------| +| 22 | TCP | SSH | 服务器管理 | +| 80 | TCP | 业务网关(ClusterIP) | 集群内部 | +| 6379 | TCP | Redis | 外部可访问 | +| 6443 | TCP | K8s API Server | 集群管理 | +| 8848 | TCP | Nacos HTTP | 集群内部 | +| 9000 | TCP | MinIO API | 对象存储 API | +| 9001 | TCP | MinIO Console | Web 管理界面 | +| 9876 | TCP | RocketMQ NameServer | 集群内部 | +| 10911 | TCP | RocketMQ Broker | 集群内部 | +| 30140 | TCP | 业务网关 NodePort | 外部访问入口 | +| 30180 | TCP | K8s Dashboard | Web UI(HTTPS) | +| 30290 | TCP | Nacos Console | Web 管理界面 | +| 30300 | TCP | RocketMQ Console | Web 管理界面 | +| 30658 | TCP | RocketMQ NameServer NodePort | 外部访问 | +| 30740 | TCP | Nacos Jraft | 集群通信 | +| 31290 | TCP | Nacos gRPC Client | 集群通信 | +| 31291 | TCP | Nacos gRPC Raft | 集群通信 | +| 33080 | TCP | MySQL | 数据库连接 | + +--- diff --git a/docs/Gbs后端开发规范.docx b/docs/Gbs后端开发规范.docx new file mode 100644 index 0000000..c3c8dd8 --- /dev/null +++ b/docs/Gbs后端开发规范.docx @@ -0,0 +1,1586 @@ + + Gbs后端开发规范 + + + + + + + + + +修订者 + + + +版本号 + + + +说明 + + + + + +王轩 + + + +25-10-28V1.0 + + + + + + + + + +王轩 + + + +25-10-29V1.1 + + + +完善库表规范 + + + + + +王轩 + + + +25-11-01V1.2 + + + +完善服务之间Dubbo调用 + + + + + +王轩 + + + +25-11-07V1.3 + + + +完善系统内用户兑换 + + + + + +王轩 + + + +25-11-07V1.4 + + + +Idea本地DEBUG线上环境 + + + 应用注意事项说明 + +所有应用之间数据库是隔离的。 + + 架构说明文档 + +https://blog.csdn.net/significantfrank/article/details/110934799 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 系统内包说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Start + +启动类。 + + 适配层 + +负责对前端展示(web,wireless,wap)的路由和适配,对于传统B/S系统而言,adapter就相当于MVC中的controller; + + 应用层 + +主要负责获取输入,组装上下文,参数校验,调用领域层做业务处理,如果需要的话,发送消息通知等。层次是开放的,应用层也可以绕过领域层,直接访问基础实施层; + + 领域层 + +主要是封装了核心业务逻辑,并通过领域服务和领域对象的方法对App层提供业务实体和业务逻辑计算。领域是应用的核心,不依赖任何其他层次; + + 基础实施层 + +主要负责技术细节问题的处理,比如数据库的CRUD、搜索引擎、文件系统、分布式服务的RPC等。此外,领域防腐的重任也落在这里,外部依赖需要通过gateway的转义处理,才能被上面的App层和Domain层使用。 + + 引用关系说明 + +禁止不按分层思想各个包相互之间引用。 +Adapter层引用client层与App层。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +client层引用domain层。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +domain层不引用其他层 +App层引用client(与domain)、infrastructure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 代码注意事项说明 + + + 接口权限:后端接口权限使用注解 + +@PreAuthorize("@pms.hasPermission('*-*-*')") +代码示例: +@ApiOperation("新增")@PostMapping("/save") + +// 接口权限注解 + +@PreAuthorize("@pms.hasPermission('1-6-1')") + +public SingleResponse add(@Validated @RequestBody RiskPointAddCmd cmd) { + + SSOUser ssoUser = AuthContext.getCurrentUser(); + + // com.jjb.saas.system.client.dept.facade + + SingleResponse allTreeByCurrentOrgId = deptFacade.getAllTreeByCurrentOrgId(); + + DeptCO data = allTreeByCurrentOrgId.getData(); + + return riskPointService.add(cmd); + +} + + + 数据权限:实现说明 + +@DataScopes( @DataScope(method = "selectOne", menuPerms = "open_platform_100012", tenantAlias = "tenant_id")) + +系统支持租户下权限查询。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 标准返回类 + +SingleResponse(单数据返回封装类),PageResponse(分页数据返回封装类) +MultiResponse(集合数据返回封装类),Response(无数据返回封装类) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +异常处理: +使用BizException类。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 代码实现事项说明 + +服务之间Dubbo调用功能 +先在gbscommon中按一下目录添加facade。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +然后再具体实现得项目中实现这个接口,完善功能 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +服务之间事件调用功能 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 项目后端脚手架地址 + +http://192.168.20.100:8578/repository/maven-snapshots + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 后端项目setting文件 + +请至钉钉文档查看附件《settingsfjk.xml》。 [HYPERLINK: https://alidocs.dingtalk.com/i/nodes/PwkYGxZV3LXLZeNoI39RnOAeJAgozOKL?doc_type=wiki_doc&iframeQuery=anchorId%3DX02mh9zegta3q0fni9oati] + 后端代码生成器 + +请至钉钉文档查看附件《EasyCodeConfig-GBS.json》。 [HYPERLINK: https://alidocs.dingtalk.com/i/nodes/PwkYGxZV3LXLZeNoI39RnOAeJAgozOKL?doc_type=wiki_doc&iframeQuery=anchorId%3DX02mh9zfjsgs1hreibibom]安装easycode插件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +从本地导入 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +下载好上边的json + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +添加数据源 +打开表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +选中Generate Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +通用jar包Git仓库地址 +http://47.92.113.182:3000/zcloud_gbs/zcloud_gbs_common.git + +Adapter层定义接口实现app,web,socket等。要注意swagger接口注解、接口权限注解。如需引用其他服务,启动类加@EnableFacadeRpcClient注解。使用@DubboReference注入其他服务接口。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Get、Post、Put接口按规范定义。 +新增、修改定义对应xxCmd类。配合@Validated 注解实现接口校验参数。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Adapter层的返回值为Co对象。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Adapter层使用的接口,接参数的类定义在client层 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +client层的接口实现在App层。通过执行器执行传过来的参数。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +执行器一般不处理业务逻辑、在领域模型里处理业务逻辑。领域模型禁止调用基础设施层接口。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +执行器中定义了xxxGateway,接口在domain层,实现在基础设施层。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +执行器通过domain调用基础实施层返回领域模型。参数为dto对象。 +执行器也可直接调用基础实施层。 +查询执行器extends BasePageQuery +使用的时候toHashMap 按以下规则命名。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +查询按如下进行分页参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 定时任务注意事项说明 + +定时任务为xxljob任务 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 表结构注意事项说明 + + + 默认字段 + + `delete_enum` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '删除标识true false', + + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注', + + `create_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人姓名', + + `update_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人姓名', + + `tenant_id` bigint DEFAULT NULL COMMENT '租户id', + + `org_id` bigint DEFAULT NULL COMMENT '单位id', + + `version` int DEFAULT NULL COMMENT '版本', + + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + + `create_id` bigint DEFAULT NULL COMMENT '创建人id', + + `update_id` bigint DEFAULT NULL COMMENT '修改人id', + + `env` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + + 库与表规范 + +字符集utf8mb4,排序规则utf8mb4_0900_ai_ci +所有表格均需采用字典信息,并需进行编码处理,同时在表中增加翻译字段。 +数据表中,人员名称和部门名称字段采用varchar类型,长度设定为50。 +时间统一采用DATETIME,或者date,如果使用的时分秒的DATETIME类型,如果只是记录年月日的使用date。 +在业务表中使用签字时,需要将签字图片的地址自行存储于业务表中。 +隐患需存储在其他相关业务ID中,通过此处编写接口,使其他应用能够使用。 +标识字段 使用 xxx_flag + + 系统内兑换用户信息 + +通过id兑换用户部门岗位企业信息 +@ZCloudTranslates()为翻译注解 写在类上。 +@ZCloudTranslate() 为要翻译得属性,其中primaryKeyType对应要翻译得类型,primaryKey为类中对应id得字段,mappedFields 为${target}:${source} 也就是前一个为类内属性,后一个为对应得common中Co对象里属性名称。 +public class DemoClass { + + private TranslateField translateField; + + + + public void test() { + + // 兑换用户 + + ZcloudUserCo zcloudUserInfoById = translateField.getZcloudUserInfoById(1L); + + List zcloudUserInfoByIds = translateField.getZcloudUserInfoByIds(Arrays.asList(1L, 2L)); + + // 兑换岗位 + + ZcloudPostCO zcloudPostInfoById = translateField.getZcloudPostInfoById(1L); + + List zcloudPostInfoByIds = translateField.getZcloudPostInfoByIds(Arrays.asList(1L, 2L)); + + // 兑换部门 + + ZcloudDepartmentInfoCo zcloudDpetInfoById = translateField.getZcloudDpetInfoById(1L); + + List zcloudDpetInfoByIds = translateField.getZcloudDpetInfoByIds(Arrays.asList(1L, 2L)); + + // 兑换企业 + + ZcloudCorpInfoCO zcloudCorpInfoById = translateField.getZcloudCorpInfoById(1L); + + List zcloudCorpInfoByIds = translateField.getZcloudCorpInfoByIds(Arrays.asList(1L, 2L)); + + ArrayList testEntities = new ArrayList<>(); + + TestEntity testEntity = new TestEntity(); + + testEntity.setUserId(1L); + + testEntity.setPostId(2L); + + testEntity.setCorpId(3L); + + testEntity.setDeptId(4L); + + List testEntities1 = translateField.translateZcloudCommonInformation(testEntities, TestEntity.class); + + TestEntity testEntity1 = translateField.translateZcloudCommonInformation(testEntity, TestEntity.class); + + } + + + + @ZCloudTranslates({ + + @ZCloudTranslate(primaryKeyType = TranslateEunm.USER, primaryKey = "userId", + + mappedFields = {"userName:username", "name:name"}), + + @ZCloudTranslate(primaryKeyType = TranslateEunm.POST, primaryKey = "postId", mappedFields = {"postName:name"}), + + @ZCloudTranslate(primaryKeyType = TranslateEunm.CORP, primaryKey = "corpId", mappedFields = {"corpName:name"}), + + @ZCloudTranslate(primaryKeyType = TranslateEunm.DEPT, primaryKey = "deptId", mappedFields = {"deptName:name"}), + + }) + + @Data + + static class TestEntity { + + private Long userId; + + private Long postId; + + private Long deptId; + + private Long corpId; + + private String userName; + + private String postName; + + private String deptName; + + private String corpName; + + } + +} + + Idea本地DEBUG线上环境 + +请至钉钉文档查看附件《conf》。 [HYPERLINK: https://alidocs.dingtalk.com/i/nodes/PwkYGxZV3LXLZeNoI39RnOAeJAgozOKL?doc_type=wiki_doc&iframeQuery=anchorId%3DX02moifyte30mkb854046cr]首先需要保持已部署的应用与本地代码一致 +添加上方的配置文件到idea里 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +配置好以后,来到服务这里,右键选择k8s的命名空间。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +选择对应的pod 转发端口 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +出现这个一般是可以了。如有问题没出现对应的提示需检查是否有 +"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"此项注入。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +新加一个启动配置选择远程jvm调试 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +跟据本地情况填入本地端口号运行,正常进行idea断点就行了。 + diff --git a/docs/sql/init.sql b/docs/sql/init.sql new file mode 100644 index 0000000..ee0715a --- /dev/null +++ b/docs/sql/init.sql @@ -0,0 +1,39 @@ +-- ============================================= +-- 安全评价业务库初始建表脚本 +-- 数据库:safety_eval_db +-- 字符集:utf8mb4,排序规则:utf8mb4_0900_ai_ci +-- ============================================= + +CREATE DATABASE IF NOT EXISTS `safety_eval_db` + CHARACTER SET utf8mb4 + COLLATE utf8mb4_0900_ai_ci; + +USE `safety_eval_db`; + +-- ============================================= +-- 评价机构主档案 +-- ============================================= +CREATE TABLE IF NOT EXISTS `se_institution` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '机构名称', + `credit_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '统一社会信用代码', + `legal_person_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '法人姓名', + `contact_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '联系人姓名', + `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '联系电话', + `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '入驻状态(PENDING/APPROVED/REJECTED)', + -- GBS默认字段 + `delete_enum` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT 'false' COMMENT '删除标识true/false', + `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注', + `create_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人姓名', + `update_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人姓名', + `tenant_id` bigint DEFAULT NULL COMMENT '租户id', + `org_id` bigint DEFAULT NULL COMMENT '单位id', + `version` int DEFAULT NULL COMMENT '版本', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `create_id` bigint DEFAULT NULL COMMENT '创建人id', + `update_id` bigint DEFAULT NULL COMMENT '更新人id', + `env` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '环境', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_credit_code` (`credit_code`, `delete_enum`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='评价机构主档案'; \ No newline at end of file diff --git a/docs/基于 GBS 底座的安全评价系统开发内容梳理.md b/docs/基于 GBS 底座的安全评价系统开发内容梳理.md new file mode 100644 index 0000000..9280528 --- /dev/null +++ b/docs/基于 GBS 底座的安全评价系统开发内容梳理.md @@ -0,0 +1,433 @@ +# 基于 GBS 底座的安全评价系统开发内容梳理 + +## 1. 建设定位 + +重庆安全评价在线服务应用基于 GBS 底座和已有基础服务建设,采用“GBS 基础能力复用 + 安全评价业务服务扩展”的方式落地。 + +当前建设主线聚焦评价机构准入和档案形成,优先完成以下闭环: + +1. 评价机构账号注册与身份接入。 +2. 机构入驻申请。 +3. 机构基础信息、资质材料、人员证书、制度文件等资料提交。 +4. 监管端资料受理、资料评审、补正、复审和审核确认。 +5. 入驻结果通知、公示查询和机构档案形成。 +6. 项目管理、现场监管、报告归档、服务评价等扩展能力基于机构档案逐步建设。 + +## 2. GBS 底座复用范围 + +| GBS 能力/服务 | 本系统使用方式 | 复用标识 | 落地内容 | +| --- | --- | --- | --- | +| `jjb-saas-gateway` | 统一访问入口、路由、鉴权前置 | 复用 | 机构端、监管端、公示端统一入口 | +| `jjb-saas-auth` / `jjb-saas-login` | 登录、Token、认证 | 复用 | 支撑机构用户和监管用户登录 | +| `jjb-saas-user` | 用户、账号、人员基础信息 | 复用 | 用户账号、联系人、审核人员基础信息 | +| `jjb-saas-system` | 菜单、角色、组织、数据权限 | 复用 | 机构端、监管端菜单和角色配置 | +| `jjb-saas-security` | 安全审计、权限控制 | 复用 | 操作审计、接口访问控制 | +| `jjb-saas-base` | 字典、区域、通用主数据 | 复用 | 行政区划、机构类型、证书类型、材料类型 | +| `jjb-saas-attachment` | 文件上传、预览、下载、存储 | 复用 | 营业执照、资质证书、人员证书、制度文件等材料 | +| `jjb-saas-message` | 通知、待办、催办 | 复用 | 审核待办、补正提醒、审核结果通知 | +| `jjb-saas-bpm` | 流程流转、待办、审批轨迹 | 复用 | 入驻审核、资料补正、资质变更审核 | +| `jjb-saas-process-layout` | 流程页面和流程布局 | 复用 | 入驻评审节点页面布局 | +| `jjb-saas-formily-design` | 动态表单设计 | 复用 | 入驻申请表、资料清单表、审核表单 | +| `jjb-saas-component-design` | 通用组件设计 | 复用 | 查询列表、详情页、附件列表、审核表单组件 | +| `jjb-saas-open-platform` | 外部接口接入 | 复用 | 统一社会信用代码、证书查询等接口接入 | +| `jjb-saas-data-center` | 数据汇总、统计分析 | 复用 | 机构数量、审核效率、入驻态势统计 | +| `jjb-saas-events` / `RocketMQ` | 状态变更事件 | 复用 | 入驻状态、档案变更、通知事件 | +| `Nacos` | 配置中心、服务注册 | 复用 | 安评业务服务注册与配置 | +| `MinIO` | 附件对象存储 | 复用 | 通过附件服务保存材料文件 | +| `MySQL` | 业务数据存储 | 复用基础设施 | 新增安评业务库 | +| `Redis` | 缓存、验证码、临时状态 | 复用 | 登录辅助、验证码、短期缓存 | + +## 3. 新增业务服务 + +### 3.1 服务设置 + +| 服务 | 建议名称 | 主要职责 | +| --- | --- | --- | +| 安全评价业务服务 | `safety-eval-service` | 承载评价机构入驻、资料评审、机构档案、资质人员维护、项目登记、报告归档、服务评价等安全评价业务 | + +### 3.2 服务职责 + +`safety-eval-service` 负责安全评价行业数据和业务规则的统一承载,重点包含: + +1. 机构入驻申请单。 +2. 机构业务档案。 +3. 机构资质和人员证书。 +4. 材料清单、材料附件引用和材料审核结果。 +5. 审核意见、补正记录、档案版本。 +6. 与 GBS 用户、权限、流程、附件、消息、字典、数据中心等服务的接口适配。 + +### 3.3 业务校验 + +业务校验由 `safety-eval-service` 通过固定校验、字典配置和参数配置实现: + +| 校验场景 | 实现方式 | +| --- | --- | +| 统一社会信用代码格式校验 | 服务内固定校验 | +| 入驻材料完整性校验 | 材料清单配置 + 必填项校验 | +| 资质证书有效期校验 | 日期字段校验 | +| 人员证书有效期校验 | 日期字段校验 | +| 重复入驻校验 | 机构统一社会信用代码唯一性校验 | +| 节点提交前校验 | 业务服务提供校验接口,流程节点提交时调用 | +| 到期提醒 | 定时任务扫描有效期并调用消息服务 | + +### 3.4 流程复用 + +流程能力复用 GBS 的 `jjb-saas-bpm` 和 `jjb-saas-process-layout`。 + +本项目落地内容: + +1. 入驻审核流程模板。 +2. 资料补正流程节点。 +3. 资质和人员变更审核流程模板。 +4. 审核意见、审核结论、材料状态与业务状态映射。 +5. 业务服务与 BPM 的流程启动、提交、退回、办结接口适配。 + +## 4. 当前需要开发的内容 + +### 4.1 P0:评价机构注册入驻与资料评审 + +| 功能 | 主要内容 | 依赖底座 | +| --- | --- | --- | +| 机构账号注册 | 机构管理员注册、账号登录、绑定机构 | login、auth、user | +| 机构基础核验 | 统一社会信用代码、机构名称、法人信息、联系人 | base、open-platform | +| 入驻申请 | 填写机构基本信息、业务范围、办公地址、联系方式 | formily、base | +| 资料清单配置 | 配置营业执照、资质证书、人员证书、制度文件、承诺书等材料项 | base、formily | +| 材料上传 | 多类型附件上传、预览、替换、版本记录 | attachment、MinIO | +| 材料完整性校验 | 提交前校验必填项、格式、有效期、重复机构 | safety-eval-service | +| 入驻审核流程 | 受理、资料审查、补正、复审、通过、驳回 | bpm、message | +| 补正管理 | 审核人员发起补正,机构重新提交,保留历史意见 | bpm、message、attachment | +| 审核意见记录 | 逐项材料审核意见、总体意见、附件留痕 | safety-eval-service | +| 机构档案 | 入驻通过后生成机构档案、资质档案、人员档案 | safety-eval-service | +| 入驻结果通知 | 站内信、短信、待办通知 | message | +| 机构公示 | 已入驻机构列表、详情、资质范围展示 | official 或业务前端 | + +### 4.2 P1:资质人员维护与变更 + +| 功能 | 主要内容 | 依赖底座 | +| --- | --- | --- | +| 机构信息维护 | 地址、联系人、法人、简介等信息维护 | user、base、attachment | +| 资质证书维护 | 资质范围、等级、有效期、证书附件 | attachment | +| 人员信息维护 | 专职人员、评价师、技术负责人、过程控制负责人 | user、base | +| 人员证书维护 | 证书类型、专业、有效期、附件 | attachment | +| 变更审核 | 重要信息变更走审核流程 | bpm、message | +| 到期提醒 | 资质和证书到期前提醒 | message、xxl-job | + +### 4.3 P2:项目与报告基础能力 + +| 功能 | 建设内容 | +| --- | --- | +| 项目登记 | 项目基本信息、服务企业、评价类型、合同附件 | +| 项目组 | 人员选择、项目角色、项目负责人 | +| 从业告知 | 告知信息提交、附件、状态记录 | +| 项目进度 | 业务状态和流程状态联动 | +| 报告上传 | 报告文件上传、版本记录、审核意见 | +| 报告归档 | 归档材料、归档状态、归档查询 | + +### 4.4 P3:监管统计与服务评价 + +| 功能 | 建设内容 | +| --- | --- | +| 现场作业 | 现场任务、签到记录、照片材料、作业记录 | +| 服务评价 | 企业评价、监管评价、评价汇总 | +| 监管统计 | 入驻数量、项目数量、审核效率、机构活跃度 | +| 风险提醒 | 证书到期、资料缺失、项目异常等固定提醒 | + +## 5. 系统架构 + +### 5.1 总体架构 + +```mermaid +flowchart TB + subgraph U["访问端"] + A1["评价机构端"] + A2["监管审核端"] + A3["公众公示端"] + A4["企业端/移动端扩展"] + end + + subgraph GBS["GBS 底座复用层"] + GW["gateway 网关
复用"] + AUTH["auth/login 认证
复用"] + USER["user/system 用户组织权限
复用"] + BASE["base 字典区域
复用"] + BPM["bpm/process-layout 流程
复用"] + FORM["formily/component 表单组件
复用"] + ATT["attachment/MinIO 附件
复用"] + MSG["message 消息待办
复用"] + OPEN["open-platform 外部接口
复用"] + DATA["data-center 数据中心
复用"] + end + + subgraph BIZ["新增业务层"] + SE["safety-eval-service
安全评价业务服务"] + DB["safety_eval_db
安评业务库"] + end + + A1 --> GW + A2 --> GW + A3 --> GW + A4 --> GW + GW --> AUTH + GW --> SE + SE --> USER + SE --> BASE + SE --> BPM + SE --> FORM + SE --> ATT + SE --> MSG + SE --> OPEN + SE --> DATA + SE --> DB +``` + +### 5.2 业务分层架构 + +```mermaid +flowchart LR + UI["前端页面
机构端/监管端/公示端"] --> API["业务接口
safety-eval-service"] + API --> APP["应用层
注册入驻/资料评审/档案维护"] + APP --> DOMAIN["领域层
机构/资质/人员/材料/审核"] + DOMAIN --> INFRA["基础设施适配层
GBS用户/流程/附件/消息/字典"] + DOMAIN --> DB["业务库"] + INFRA --> GBS["GBS基础服务"] +``` + +## 6. 核心业务流程 + +### 6.1 评价机构注册入驻主流程 + +```mermaid +flowchart TD + A["机构管理员注册账号"] --> B["登录机构端"] + B --> C["创建/绑定评价机构"] + C --> D["填写机构基础信息"] + D --> E["上传入驻资料"] + E --> F["提交前完整性校验"] + F -->|校验未通过| E + F -->|校验通过| G["启动入驻审核流程
复用 GBS BPM"] + G --> H["监管端受理"] + H --> I["资料逐项评审"] + I -->|需补正| J["发起补正
复用 BPM/消息"] + J --> K["机构补正材料"] + K --> I + I -->|驳回| L["结束并通知机构"] + I -->|通过| M["生成机构档案"] + M --> N["入驻结果通知"] + N --> O["机构公示/业务准入"] +``` + +### 6.2 资料评审流程 + +```mermaid +flowchart TD + A["审核人员打开待办"] --> B["查看机构申请信息"] + B --> C["查看材料清单"] + C --> D["逐项预览附件"] + D --> E{"材料是否符合要求"} + E -->|符合| F["标记材料通过"] + E -->|需补正| G["填写问题和补正要求"] + F --> H{"全部材料是否完成"} + G --> H + H -->|继续评审| C + H -->|提交补正| I["提交补正意见"] + H -->|审核通过| J["提交通过意见"] + I --> K["流程退回机构补正
复用 GBS BPM"] + J --> L["流程办结,生成机构档案"] +``` + +### 6.3 资质/人员变更流程 + +```mermaid +flowchart TD + A["机构发起信息变更"] --> B["选择变更类型"] + B --> C["修改信息并上传证明材料"] + C --> D["提交变更申请"] + D --> E["业务服务校验材料完整性"] + E -->|校验未通过| C + E -->|校验通过| F["启动变更审核流程
复用 GBS BPM"] + F --> G["监管审核"] + G -->|补正| H["机构补正"] + H --> G + G -->|驳回| I["保持原档案"] + G -->|通过| J["更新机构档案并记录版本"] +``` + +## 7. 时序图 + +### 7.1 机构提交入驻申请 + +```mermaid +sequenceDiagram + participant O as 机构用户 + participant FE as 机构端前端 + participant SE as safety-eval-service + participant U as GBS用户/权限 + participant A as GBS附件服务 + participant B as GBS流程BPM + participant M as GBS消息服务 + participant DB as 安评业务库 + + O->>FE: 填写入驻信息并上传材料 + FE->>A: 上传附件 + A-->>FE: 返回附件ID + FE->>SE: 提交入驻申请 + SE->>U: 校验用户与机构权限 + U-->>SE: 返回校验结果 + SE->>DB: 保存申请、材料清单、附件引用 + SE->>SE: 执行完整性和有效期校验 + SE->>B: 启动入驻审核流程(复用) + B-->>SE: 返回流程实例ID + SE->>DB: 更新申请状态为审核中 + SE->>M: 发送监管待办和通知(复用) + SE-->>FE: 返回提交成功 +``` + +### 7.2 监管人员资料评审 + +```mermaid +sequenceDiagram + participant R as 监管审核人员 + participant FE as 监管端前端 + participant B as GBS流程BPM + participant SE as safety-eval-service + participant A as GBS附件服务 + participant M as GBS消息服务 + participant DB as 安评业务库 + + R->>FE: 打开入驻审核待办 + FE->>B: 查询流程待办(复用) + B-->>FE: 返回待办信息 + FE->>SE: 查询申请详情和材料清单 + SE->>DB: 读取机构申请、材料、历史意见 + SE-->>FE: 返回详情 + FE->>A: 预览材料附件(复用) + R->>FE: 填写逐项审核意见 + FE->>SE: 保存审核意见 + SE->>DB: 保存材料审核结果 + R->>FE: 提交通过/补正/驳回 + FE->>SE: 提交流程动作 + SE->>B: 提交/退回流程(复用) + B-->>SE: 返回流程状态 + SE->>DB: 更新申请状态与机构档案 + SE->>M: 通知机构处理结果(复用) + SE-->>FE: 返回处理完成 +``` + +## 8. 数据流 + +### 8.1 入驻数据流 + +```mermaid +flowchart LR + A["机构端录入"] --> B["safety-eval-service"] + B --> C["安评业务库
机构/申请/材料/审核意见"] + A --> D["GBS附件服务"] + D --> E["MinIO对象存储"] + D --> B + B --> F["GBS BPM
流程实例/待办/轨迹"] + B --> G["GBS消息服务
通知/催办"] + B --> H["GBS用户权限
账号/角色/组织"] + B --> I["公示端/数据中心
入驻结果与统计数据"] +``` + +### 8.2 业务数据归属 + +| 数据 | 保存位置 | 说明 | +| --- | --- | --- | +| 登录账号、基础用户 | GBS user/auth | 底座复用 | +| 角色、菜单、数据权限 | GBS system/security | 底座复用 | +| 字典、行政区划 | GBS base | 底座复用 | +| 附件文件 | GBS attachment + MinIO | 底座复用 | +| 流程实例、待办、流转记录 | GBS bpm | 底座复用 | +| 消息通知 | GBS message | 底座复用 | +| 机构业务档案 | `safety_eval_db` | 新增 | +| 入驻申请 | `safety_eval_db` | 新增 | +| 材料清单和审核结果 | `safety_eval_db` | 新增 | +| 资质、人员、证书扩展信息 | `safety_eval_db` | 新增 | +| 公示信息 | `safety_eval_db` 或数据中心 | 业务查询与统计展示 | + +## 9. 建议业务数据模型 + +一期数据模型围绕机构入驻和资料评审设计。 + +| 表/对象 | 作用 | +| --- | --- | +| `se_institution` | 评价机构主档案 | +| `se_institution_apply` | 入驻/变更申请单 | +| `se_institution_qualification` | 机构资质证书 | +| `se_institution_personnel` | 机构人员 | +| `se_personnel_certificate` | 人员证书 | +| `se_material_item` | 材料清单配置 | +| `se_apply_material` | 申请材料与附件引用 | +| `se_material_review` | 材料逐项评审意见 | +| `se_apply_review_record` | 申请总体审核意见 | +| `se_institution_archive_version` | 机构档案版本 | +| `se_public_disclosure` | 入驻公示信息 | + +## 10. 接口边界 + +### 10.1 `safety-eval-service` 对前端提供 + +| 接口组 | 示例能力 | +| --- | --- | +| 机构注册入驻 | 创建机构、查询机构、提交入驻申请、撤回申请 | +| 材料管理 | 查询材料清单、上传后绑定材料、替换材料、查看材料状态 | +| 审核管理 | 查询待审核申请、保存材料意见、提交通过/补正/驳回 | +| 档案管理 | 查询机构档案、资质、人员、证书、档案版本 | +| 公示查询 | 查询已入驻机构列表与详情 | + +### 10.2 `safety-eval-service` 调用 GBS + +| GBS 服务 | 调用目的 | +| --- | --- | +| user/system/auth | 当前用户、角色、机构绑定、数据权限 | +| base | 字典、区域、材料类型 | +| attachment | 附件上传结果、预览、下载、删除权限 | +| bpm | 启动流程、提交节点、退回、查询流程状态 | +| message | 待办提醒、审核结果通知、补正提醒 | +| open-platform | 工商、证书等外部数据核验 | +| data-center | 统计分析 | + +## 11. 开发优先级 + +### 第一阶段:机构入驻闭环 + +目标:让评价机构能够进入平台,监管人员能够完成资料评审。 + +1. GBS 账号、角色、菜单、机构端/监管端权限配置。 +2. `safety-eval-service` 工程、数据库、基础字典。 +3. 机构注册、机构绑定、入驻申请。 +4. 材料清单配置、附件绑定、提交校验。 +5. 入驻审核 BPM 流程模板复用与适配。 +6. 监管端资料评审、补正、通过、驳回。 +7. 入驻通过后生成机构档案。 +8. 入驻结果通知与公示查询。 + +### 第二阶段:资质人员维护 + +目标:保证机构档案持续有效。 + +1. 资质证书维护。 +2. 人员及证书维护。 +3. 重要信息变更审核。 +4. 到期提醒。 +5. 档案版本记录。 + +### 第三阶段:项目与报告基础 + +目标:在机构档案基础上扩展业务办理。 + +1. 项目登记。 +2. 项目组维护。 +3. 从业告知。 +4. 报告上传与归档基础。 + +### 第四阶段:监管增强 + +目标:补充监管效率和服务质量能力。 + +1. 现场作业证据。 +2. 服务评价。 +3. 风险提醒。 +4. 统计分析。 + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0bab433 --- /dev/null +++ b/pom.xml @@ -0,0 +1,163 @@ + + + 4.0.0 + + com.jjb.saas + jjb-saas-parent + 2.2.0-SNAPSHOT + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + pom + + safety-eval-service + 安全评价业务服务 - 基于GBS底座DDD分层架构 + + + safety-eval-start + safety-eval-adapter + safety-eval-app + safety-eval-client + safety-eval-domain + safety-eval-infrastructure + + + + 1.8 + 1.8 + 1.8 + UTF-8 + UTF-8 + + + 2.7.18 + + + 3.2.9 + + + 3.5.5 + + + 1.6.14 + + + 1.18.30 + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + org.qinan + safety-eval-start + ${project.version} + + + org.qinan + safety-eval-adapter + ${project.version} + + + org.qinan + safety-eval-app + ${project.version} + + + org.qinan + safety-eval-client + ${project.version} + + + org.qinan + safety-eval-domain + ${project.version} + + + org.qinan + safety-eval-infrastructure + ${project.version} + + + + + org.apache.dubbo + dubbo + ${dubbo.version} + + + org.apache.dubbo + dubbo-spring-boot-starter + ${dubbo.version} + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + + io.swagger + swagger-annotations + ${swagger.version} + + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + gbs-snapshots + GBS Snapshots Repository + http://192.168.20.100:8578/repository/maven-snapshots/ + + true + always + + + + gbs-releases + GBS Releases Repository + http://192.168.20.100:8578/repository/maven-releases/ + + true + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + \ No newline at end of file diff --git a/safety-eval-adapter/pom.xml b/safety-eval-adapter/pom.xml new file mode 100644 index 0000000..991816d --- /dev/null +++ b/safety-eval-adapter/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + + + safety-eval-adapter + jar + safety-eval-adapter + 适配层 - 负责对前端展示的路由和适配(相当于MVC的Controller) + + + + + org.qinan + safety-eval-client + + + + + org.qinan + safety-eval-app + + + + io.swagger + swagger-annotations + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.apache.dubbo + dubbo + + + + + org.projectlombok + lombok + provided + + + \ No newline at end of file diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/InstitutionController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/InstitutionController.java new file mode 100644 index 0000000..96b950d --- /dev/null +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/InstitutionController.java @@ -0,0 +1,43 @@ +package org.qinan.safetyeval.adapter.web; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.qinan.safetyeval.client.api.InstitutionApi; +import org.qinan.safetyeval.client.co.InstitutionCO; +import org.qinan.safetyeval.client.dto.InstitutionAddCmd; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 评价机构适配层(Controller) + *

+ * Adapter层负责对前端展示的路由和适配 + * 接口权限使用注解: @PreAuthorize("@pms.hasPermission('*-*-*')") + *

+ * + * @author safety-eval + */ +@Api(tags = "评价机构管理") +@RestController +@RequestMapping("/institution") +public class InstitutionController { + + @Resource + private InstitutionApi institutionApi; + + @ApiOperation("新增评价机构") + @PostMapping("/save") + // @PreAuthorize("@pms.hasPermission('1-6-1')") // TODO: 配置实际权限编码 + public InstitutionCO add(@Validated @RequestBody InstitutionAddCmd cmd) { + return institutionApi.add(cmd); + } + + @ApiOperation("查询评价机构详情") + @GetMapping("/get") + // @PreAuthorize("@pms.hasPermission('1-6-2')") + public InstitutionCO get(@RequestParam Long id) { + return institutionApi.get(id); + } +} \ No newline at end of file diff --git a/safety-eval-app/pom.xml b/safety-eval-app/pom.xml new file mode 100644 index 0000000..ab00085 --- /dev/null +++ b/safety-eval-app/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + + + safety-eval-app + jar + safety-eval-app + 应用层 - 获取输入、组装上下文、参数校验、调用领域层做业务处理 + + + + + org.qinan + safety-eval-client + + + + + org.qinan + safety-eval-domain + + + + + org.qinan + safety-eval-infrastructure + + + + + org.projectlombok + lombok + provided + + + \ No newline at end of file diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/InstitutionExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/InstitutionExecutor.java new file mode 100644 index 0000000..6d1d3cd --- /dev/null +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/InstitutionExecutor.java @@ -0,0 +1,59 @@ +package org.qinan.safetyeval.app.executor; + +import org.qinan.safetyeval.client.api.InstitutionApi; +import org.qinan.safetyeval.client.co.InstitutionCO; +import org.qinan.safetyeval.client.dto.InstitutionAddCmd; +import org.qinan.safetyeval.domain.entity.InstitutionEntity; +import org.qinan.safetyeval.domain.gateway.InstitutionGateway; +import org.qinan.safetyeval.domain.service.InstitutionDomainService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 评价机构执行器(App层) + *

+ * 执行器通过domain调用基础设施层返回领域模型 + * 执行器也可直接调用基础设施层 + *

+ * + * @author safety-eval + */ +@Service +public class InstitutionExecutor implements InstitutionApi { + + @Resource + private InstitutionDomainService institutionDomainService; + + @Override + public InstitutionCO add(InstitutionAddCmd cmd) { + // Cmd -> Entity 转换 + InstitutionEntity entity = new InstitutionEntity(); + entity.setName(cmd.getName()); + entity.setCreditCode(cmd.getCreditCode()); + entity.setLegalPersonName(cmd.getLegalPersonName()); + entity.setContactName(cmd.getContactName()); + entity.setContactPhone(cmd.getContactPhone()); + + // 调用领域服务处理业务逻辑 + InstitutionEntity result = institutionDomainService.add(entity); + + // Entity -> CO 转换 + return toCO(result); + } + + @Override + public InstitutionCO get(Long id) { + InstitutionEntity entity = institutionDomainService.get(id); + return toCO(entity); + } + + private InstitutionCO toCO(InstitutionEntity entity) { + InstitutionCO co = new InstitutionCO(); + co.setId(entity.getId()); + co.setName(entity.getName()); + co.setCreditCode(entity.getCreditCode()); + co.setStatus(entity.getStatus()); + return co; + } +} \ No newline at end of file diff --git a/safety-eval-client/pom.xml b/safety-eval-client/pom.xml new file mode 100644 index 0000000..f2bd757 --- /dev/null +++ b/safety-eval-client/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + + + safety-eval-client + jar + safety-eval-client + Client层 - 对外暴露的接口定义、DTO、CO对象,供其他服务Dubbo调用 + + + + + org.qinan + safety-eval-domain + + + + + io.swagger + swagger-annotations + + + + + org.apache.dubbo + dubbo + + + + + org.projectlombok + lombok + provided + + + \ No newline at end of file diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/InstitutionApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/InstitutionApi.java new file mode 100644 index 0000000..1d487db --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/InstitutionApi.java @@ -0,0 +1,25 @@ +package org.qinan.safetyeval.client.api; + +import org.qinan.safetyeval.client.co.InstitutionCO; +import org.qinan.safetyeval.client.dto.InstitutionAddCmd; + +/** + * 评价机构接口定义(Client层) + *

+ * 对外暴露的接口,供Adapter层调用,也可供其他服务Dubbo调用 + *

+ * + * @author safety-eval + */ +public interface InstitutionApi { + + /** + * 新增评价机构 + */ + InstitutionCO add(InstitutionAddCmd cmd); + + /** + * 查询评价机构详情 + */ + InstitutionCO get(Long id); +} \ No newline at end of file diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/InstitutionCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/InstitutionCO.java new file mode 100644 index 0000000..21fb85f --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/InstitutionCO.java @@ -0,0 +1,27 @@ +package org.qinan.safetyeval.client.co; + +import lombok.Data; + +/** + * 评价机构CO(Client Object)- 对外返回的视图对象 + *

+ * Adapter层的返回值为Co对象 + *

+ * + * @author safety-eval + */ +@Data +public class InstitutionCO { + + /** 机构ID */ + private Long id; + + /** 机构名称 */ + private String name; + + /** 统一社会信用代码 */ + private String creditCode; + + /** 入驻状态 */ + private String status; +} \ No newline at end of file diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/InstitutionAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/InstitutionAddCmd.java new file mode 100644 index 0000000..35c4926 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/InstitutionAddCmd.java @@ -0,0 +1,31 @@ +package org.qinan.safetyeval.client.dto; + +import lombok.Data; + + +/** + * 评价机构新增命令对象 + *

+ * 新增、修改定义对应xxCmd类。配合@Validated注解实现接口校验参数 + *

+ * + * @author safety-eval + */ +@Data +public class InstitutionAddCmd { + + /** 机构名称 */ + private String name; + + /** 统一社会信用代码 */ + private String creditCode; + + /** 法人姓名 */ + private String legalPersonName; + + /** 联系人姓名 */ + private String contactName; + + /** 联系电话 */ + private String contactPhone; +} \ No newline at end of file diff --git a/safety-eval-domain/pom.xml b/safety-eval-domain/pom.xml new file mode 100644 index 0000000..c6218ab --- /dev/null +++ b/safety-eval-domain/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + + + safety-eval-domain + jar + safety-eval-domain + 领域层 - 核心业务逻辑,不依赖任何其他层次 + + + + + + org.projectlombok + lombok + provided + + + \ No newline at end of file diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/InstitutionEntity.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/InstitutionEntity.java new file mode 100644 index 0000000..f7eda65 --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/entity/InstitutionEntity.java @@ -0,0 +1,42 @@ +package org.qinan.safetyeval.domain.entity; + +import lombok.Data; + +/** + * 评价机构领域实体 + *

+ * 领域是应用的核心,不依赖任何其他层次 + *

+ * + * @author safety-eval + */ +@Data +public class InstitutionEntity { + + /** 机构ID */ + private Long id; + + /** 机构名称 */ + private String name; + + /** 统一社会信用代码 */ + private String creditCode; + + /** 法人姓名 */ + private String legalPersonName; + + /** 联系人姓名 */ + private String contactName; + + /** 联系电话 */ + private String contactPhone; + + /** 入驻状态 */ + private String status; + + /** 租户ID */ + private Long tenantId; + + /** 单位ID */ + private Long orgId; +} \ No newline at end of file diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/InstitutionGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/InstitutionGateway.java new file mode 100644 index 0000000..ea0f94b --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/InstitutionGateway.java @@ -0,0 +1,30 @@ +package org.qinan.safetyeval.domain.gateway; + +import org.qinan.safetyeval.domain.entity.InstitutionEntity; + +/** + * 评价机构Gateway接口(Domain层定义) + *

+ * Gateway接口在domain层定义,实现在infrastructure层 + * 防腐重任:外部依赖需通过gateway的转义处理,才能被App层和Domain层使用 + *

+ * + * @author safety-eval + */ +public interface InstitutionGateway { + + /** + * 保存机构 + */ + InstitutionEntity save(InstitutionEntity entity); + + /** + * 根据ID查询机构 + */ + InstitutionEntity get(Long id); + + /** + * 根据信用代码查询机构(重复入驻校验) + */ + InstitutionEntity getByCreditCode(String creditCode); +} \ No newline at end of file diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/InstitutionDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/InstitutionDomainService.java new file mode 100644 index 0000000..c90c88d --- /dev/null +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/InstitutionDomainService.java @@ -0,0 +1,44 @@ +package org.qinan.safetyeval.domain.service; + +import org.qinan.safetyeval.domain.entity.InstitutionEntity; +import org.qinan.safetyeval.domain.gateway.InstitutionGateway; + +import javax.annotation.Resource; + +/** + * 评价机构领域服务 + *

+ * 执行器一般不处理业务逻辑、在领域模型里处理业务逻辑 + * 领域模型禁止调用基础设施层接口 + *

+ * + * @author safety-eval + */ +public class InstitutionDomainService { + + @Resource + private InstitutionGateway institutionGateway; + + /** + * 新增机构 - 领域逻辑 + *

+ * 包含重复入驻校验(统一社会信用代码唯一性) + *

+ */ + public InstitutionEntity add(InstitutionEntity entity) { + // 重复入驻校验 + InstitutionEntity existing = institutionGateway.getByCreditCode(entity.getCreditCode()); + if (existing != null) { + throw new RuntimeException("该统一社会信用代码已注册机构,不可重复入驻"); + } + entity.setStatus("PENDING"); + return institutionGateway.save(entity); + } + + /** + * 查询机构详情 + */ + public InstitutionEntity get(Long id) { + return institutionGateway.get(id); + } +} \ No newline at end of file diff --git a/safety-eval-infrastructure/pom.xml b/safety-eval-infrastructure/pom.xml new file mode 100644 index 0000000..0d7f521 --- /dev/null +++ b/safety-eval-infrastructure/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + + + safety-eval-infrastructure + jar + safety-eval-infrastructure + 基础设施层 - 数据库CRUD、搜索引擎、分布式服务RPC等,领域防腐重任 + + + + + org.qinan + safety-eval-domain + + + + + com.baomidou + mybatis-plus-boot-starter + + + + + org.apache.dubbo + dubbo + + + + + org.springframework.boot + spring-boot-starter + + + + + org.projectlombok + lombok + provided + + + + + com.jjb.saas + jjb-saas-application-client + + + com.jjb.saas + jjb-saas-system-client + + + com.jjb.saas + jjb-saas-auth-client + + + com.jjb.saas + jjb-saas-framework-facade + + + \ No newline at end of file diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/config/MybatisPlusConfig.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/config/MybatisPlusConfig.java new file mode 100644 index 0000000..35f71c3 --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/config/MybatisPlusConfig.java @@ -0,0 +1,25 @@ +package org.qinan.safetyeval.infrastructure.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatis Plus配置 + * + * @author safety-eval + */ +@Configuration +@MapperScan("org.qinan.safetyeval.infrastructure.mapper") +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} \ No newline at end of file diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/InstitutionDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/InstitutionDO.java new file mode 100644 index 0000000..1e04f19 --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/dataobject/InstitutionDO.java @@ -0,0 +1,79 @@ +package org.qinan.safetyeval.infrastructure.dataobject; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 评价机构数据对象(Infrastructure层 - 与数据库表对应) + *

+ * GBS默认字段规范: + * delete_enum, remarks, create_name, update_name, tenant_id, org_id, + * version, create_time, update_time, create_id, update_id, env + *

+ * + * @author safety-eval + */ +@Data +@TableName("se_institution") +public class InstitutionDO { + + /** 主键ID */ + private Long id; + + /** 机构名称 */ + private String name; + + /** 统一社会信用代码 */ + private String creditCode; + + /** 法人姓名 */ + private String legalPersonName; + + /** 联系人姓名 */ + private String contactName; + + /** 联系电话 */ + private String contactPhone; + + /** 入驻状态 */ + private String status; + + // ---- GBS默认字段 ---- + /** 删除标识 */ + private String deleteEnum; + + /** 备注 */ + private String remarks; + + /** 创建人姓名 */ + private String createName; + + /** 更新人姓名 */ + private String updateName; + + /** 租户ID */ + private Long tenantId; + + /** 单位ID */ + private Long orgId; + + /** 版本 */ + private Integer version; + + /** 创建时间 */ + private LocalDateTime createTime; + + /** 修改时间 */ + private LocalDateTime updateTime; + + /** 创建人ID */ + private Long createId; + + /** 更新人ID */ + private Long updateId; + + /** 环境 */ + private String env; +} \ No newline at end of file diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/InstitutionGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/InstitutionGatewayImpl.java new file mode 100644 index 0000000..a6ef94b --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/InstitutionGatewayImpl.java @@ -0,0 +1,80 @@ +package org.qinan.safetyeval.infrastructure.gatewayimpl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.qinan.safetyeval.domain.entity.InstitutionEntity; +import org.qinan.safetyeval.domain.gateway.InstitutionGateway; +import org.qinan.safetyeval.infrastructure.dataobject.InstitutionDO; +import org.qinan.safetyeval.infrastructure.mapper.InstitutionMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 评价机构Gateway实现(Infrastructure层) + *

+ * Gateway接口在domain层定义,实现在infrastructure层 + * 负责领域防腐:外部依赖需通过gateway的转义处理 + *

+ * + * @author safety-eval + */ +@Component +public class InstitutionGatewayImpl implements InstitutionGateway { + + @Resource + private InstitutionMapper institutionMapper; + + @Override + public InstitutionEntity save(InstitutionEntity entity) { + InstitutionDO dataObject = toDO(entity); + institutionMapper.insert(dataObject); + entity.setId(dataObject.getId()); + return entity; + } + + @Override + public InstitutionEntity get(Long id) { + InstitutionDO dataObject = institutionMapper.selectById(id); + return toEntity(dataObject); + } + + @Override + public InstitutionEntity getByCreditCode(String creditCode) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(InstitutionDO::getCreditCode, creditCode); + wrapper.eq(InstitutionDO::getDeleteEnum, "false"); + InstitutionDO dataObject = institutionMapper.selectOne(wrapper); + return toEntity(dataObject); + } + + private InstitutionDO toDO(InstitutionEntity entity) { + InstitutionDO dataObject = new InstitutionDO(); + dataObject.setName(entity.getName()); + dataObject.setCreditCode(entity.getCreditCode()); + dataObject.setLegalPersonName(entity.getLegalPersonName()); + dataObject.setContactName(entity.getContactName()); + dataObject.setContactPhone(entity.getContactPhone()); + dataObject.setStatus(entity.getStatus()); + dataObject.setTenantId(entity.getTenantId()); + dataObject.setOrgId(entity.getOrgId()); + dataObject.setDeleteEnum("false"); + return dataObject; + } + + private InstitutionEntity toEntity(InstitutionDO dataObject) { + if (dataObject == null) { + return null; + } + InstitutionEntity entity = new InstitutionEntity(); + entity.setId(dataObject.getId()); + entity.setName(dataObject.getName()); + entity.setCreditCode(dataObject.getCreditCode()); + entity.setLegalPersonName(dataObject.getLegalPersonName()); + entity.setContactName(dataObject.getContactName()); + entity.setContactPhone(dataObject.getContactPhone()); + entity.setStatus(dataObject.getStatus()); + entity.setTenantId(dataObject.getTenantId()); + entity.setOrgId(dataObject.getOrgId()); + return entity; + } +} \ No newline at end of file diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/InstitutionMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/InstitutionMapper.java new file mode 100644 index 0000000..209092d --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/InstitutionMapper.java @@ -0,0 +1,14 @@ +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.InstitutionDO; + +/** + * 评价机构 Mapper(Infrastructure层) + * + * @author safety-eval + */ +@Mapper +public interface InstitutionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/safety-eval-start/pom.xml b/safety-eval-start/pom.xml new file mode 100644 index 0000000..dba9bf3 --- /dev/null +++ b/safety-eval-start/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + + org.qinan + safety-eval-service + 1.0-SNAPSHOT + + + safety-eval-start + jar + safety-eval-start + 启动模块 - Spring Boot启动类 + + + + + org.qinan + safety-eval-adapter + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.apache.dubbo + dubbo-spring-boot-starter + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2021.0.5.0 + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + 2021.0.5.0 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + \ No newline at end of file diff --git a/safety-eval-start/src/main/java/org/qinan/safetyeval/start/SafetyEvalApplication.java b/safety-eval-start/src/main/java/org/qinan/safetyeval/start/SafetyEvalApplication.java new file mode 100644 index 0000000..ad7bd92 --- /dev/null +++ b/safety-eval-start/src/main/java/org/qinan/safetyeval/start/SafetyEvalApplication.java @@ -0,0 +1,22 @@ +package org.qinan.safetyeval.start; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 安全评价业务服务启动类 + *

+ * 基于GBS底座,复用GBS基础能力,扩展安全评价业务 + *

+ * + * @author safety-eval + */ +@SpringBootApplication +@EnableDubbo +public class SafetyEvalApplication { + + public static void main(String[] args) { + SpringApplication.run(SafetyEvalApplication.class, args); + } +} \ No newline at end of file diff --git a/safety-eval-start/src/main/resources/application.yml b/safety-eval-start/src/main/resources/application.yml new file mode 100644 index 0000000..8dbe734 --- /dev/null +++ b/safety-eval-start/src/main/resources/application.yml @@ -0,0 +1,48 @@ +server: + port: 8095 + servlet: + context-path: /safety-eval + +spring: + application: + name: safety-eval-service + cloud: + nacos: + discovery: + server-addr: 192.168.20.100:8848 + namespace: public + config: + server-addr: 192.168.20.100:8848 + namespace: public + file-extension: yml + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://192.168.20.100:3306/safety_eval_db?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + username: root + password: root + +mybatis-plus: + mapper-locations: classpath*:mapper/**/*.xml + global-config: + db-config: + logic-delete-field: deleteEnum + logic-delete-value: "true" + logic-not-delete-value: "false" + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +dubbo: + application: + name: safety-eval-service + protocol: + name: dubbo + port: 20895 + registry: + address: nacos://192.168.20.100:8848 + scan: + base-packages: org.qinan.safetyeval + +logging: + level: + org.qinan.safetyeval: debug \ No newline at end of file diff --git a/safety-eval-start/src/main/resources/bootstrap.yml b/safety-eval-start/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..9b36a9c --- /dev/null +++ b/safety-eval-start/src/main/resources/bootstrap.yml @@ -0,0 +1,16 @@ +# ============================================= +# Bootstrap配置 - Nacos配置中心加载前的基础配置 +# ============================================= +spring: + application: + name: safety-eval-service + cloud: + nacos: + config: + server-addr: 192.168.20.100:8848 + namespace: public + file-extension: yml + shared-configs: + - data-id: common.yml + group: DEFAULT_GROUP + refresh: true \ No newline at end of file