From 56615f9806516cae33f2a8518a5445f9b56de86f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=83=AD=E5=BA=86=E6=B3=B0?=
<12369755+htcloud1@user.noreply.gitee.com>
Date: Thu, 3 Sep 2026 20:12:15 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20OA(ecology)=E9=A1=B9=E7=9B=AE=E6=8B=89?=
=?UTF-8?q?=E5=8F=96=20+=20=E4=BC=9A=E8=AE=AE=E9=82=80=E8=AF=B7=E5=87=BDPD?=
=?UTF-8?q?F/=E5=BE=AE=E4=BF=A1=E5=88=86=E4=BA=AB=20+=20=E5=8F=82=E4=BC=9A?=
=?UTF-8?q?=E4=BA=BA/=E6=89=A7=E8=A1=8C=E6=84=8F=E5=90=91=E5=A2=9E?=
=?UTF-8?q?=E5=BC=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
OA ecology:
- BizEcologyController + EcologyProjectService: 项目编号搜索/详情回填, 负责人静默建档
- ComplianceLoginService: 合规/负责人登录校验 + 视图 role 匹配
- application-prod/test.yml: ecology 只读库数据源
会议邀请函/分享:
- InvitationPdfService + WxShareService: 邀请函 PDF 生成 + 微信分享
- PdfViewer.vue (pdfjs-dist) + MeetingInvitation.vue: PDF 预览 + 邀请函页
参会人/执行意向:
- BizMeetingAttendee*: 参会人模块增强
- BizExecutionIntent*: 执行意向增强
签到/劳务/导入:
- BizSignServiceImpl + SignFill.vue: 签到劳务
- FieldMismatch/ImportMismatch: 导入校验 VO
公示/会议详情:
- PublicityDetail.vue / MeetingDetail.vue 等前端增强
配置:
- test 短信 mock + 供应商/招标接口切生产域名
---
.../src/main/resources/application-prod.yml | 2 +
.../src/main/resources/application-test.yml | 8 +-
.../src/main/resources/application.yml | 187 +++---
.../controller/BizEcologyController.java | 55 ++
.../BizExecutionIntentController.java | 11 +-
.../BizMeetingAttendeeController.java | 73 ++-
.../controller/BizProjectController.java | 16 +-
.../controller/BizPublicController.java | 16 +
.../business/domain/BizExecutionIntent.java | 4 +
.../business/domain/BizMeetingAttendee.java | 4 +
.../domain/vo/BizSignupExpertExportVo.java | 51 +-
.../business/domain/vo/FieldMismatch.java | 32 +
.../business/domain/vo/ImportMismatch.java | 28 +
.../mapper/BizExecutionIntentMapper.java | 7 +
.../mapper/BizMeetingAttendeeMapper.java | 2 +
.../business/notify/BizNotifyService.java | 13 +-
.../service/ComplianceLoginService.java | 41 ++
.../service/EcologyProjectService.java | 230 +++++++
.../service/IBizExecutionIntentService.java | 14 +
.../service/IBizMeetingAttendeeService.java | 36 +-
.../service/InvitationPdfService.java | 292 +++++++++
.../ruoyi/business/service/SysSmsService.java | 22 +-
.../business/service/WxShareService.java | 153 +++++
.../impl/BizExecutionIntentServiceImpl.java | 51 ++
.../impl/BizMeetingAttendeeServiceImpl.java | 443 +++++++++----
.../impl/BizProjectPlanServiceImpl.java | 4 +
.../service/impl/BizSignServiceImpl.java | 22 +
.../business/BizExecutionIntentMapper.xml | 39 +-
.../business/BizMeetingAttendeeMapper.xml | 15 +-
ry-vue3/package-lock.json | 588 +++++++++++++++++-
ry-vue3/package.json | 1 +
ry-vue3/src/api/business/meetingAttendee.js | 10 +
ry-vue3/src/api/public.js | 10 +
ry-vue3/src/components/NoticeList.vue | 36 +-
ry-vue3/src/components/PdfViewer.vue | 130 ++++
ry-vue3/src/components/Preview.vue | 12 +-
ry-vue3/src/router/index.js | 6 +-
ry-vue3/src/utils/meetingStage.js | 7 +-
ry-vue3/src/views/auth/Login.vue | 19 +-
.../src/views/doctor/MeetingInvitation.vue | 267 ++++++++
ry-vue3/src/views/doctor/Meetings.vue | 7 +-
ry-vue3/src/views/doctor/SignFill.vue | 27 +-
ry-vue3/src/views/doctor/SubmissionNew.vue | 22 +-
.../views/executor-people/ExecutorPeople.vue | 5 +-
ry-vue3/src/views/executor/Meetings.vue | 18 +-
.../views/manager/ManagerProjectDetail.vue | 3 +-
.../views/manager/ManagerProjectsAssign.vue | 49 +-
ry-vue3/src/views/manager/Projects.vue | 27 +-
ry-vue3/src/views/manager/ProjectsNew.vue | 76 ++-
ry-vue3/src/views/meetings/MeetingDetail.vue | 332 +++++++---
ry-vue3/src/views/meetings/MeetingNew.vue | 15 +-
ry-vue3/src/views/meetings/Meetings.vue | 39 +-
ry-vue3/src/views/portal/PublicityDetail.vue | 194 +++++-
.../src/views/portal/SpecialPlanDetail.vue | 10 +-
ry-vue3/src/views/sponsor/SponsorProjects.vue | 31 +-
55 files changed, 3296 insertions(+), 516 deletions(-)
create mode 100644 ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizEcologyController.java
create mode 100644 ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/vo/FieldMismatch.java
create mode 100644 ry-api/ruoyi-business/src/main/java/com/ruoyi/business/domain/vo/ImportMismatch.java
create mode 100644 ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/EcologyProjectService.java
create mode 100644 ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/InvitationPdfService.java
create mode 100644 ry-api/ruoyi-business/src/main/java/com/ruoyi/business/service/WxShareService.java
create mode 100644 ry-vue3/src/components/PdfViewer.vue
create mode 100644 ry-vue3/src/views/doctor/MeetingInvitation.vue
diff --git a/ry-api/ruoyi-admin/src/main/resources/application-prod.yml b/ry-api/ruoyi-admin/src/main/resources/application-prod.yml
index 6c3343a..9e32349 100644
--- a/ry-api/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ry-api/ruoyi-admin/src/main/resources/application-prod.yml
@@ -20,6 +20,8 @@ spring:
# 生产环境外部接口地址
ruoyi:
sms:
+ # 生产环境: aliyun 真发短信
+ mock-enabled: false
esignBaseUrl: https://hegui.bahim.org.cn
# 扫码拍照 (ry-h5 相机网页地址, 前端二维码目标 URL)
camera:
diff --git a/ry-api/ruoyi-admin/src/main/resources/application-test.yml b/ry-api/ruoyi-admin/src/main/resources/application-test.yml
index 9e936a2..37ff0f8 100644
--- a/ry-api/ruoyi-admin/src/main/resources/application-test.yml
+++ b/ry-api/ruoyi-admin/src/main/resources/application-test.yml
@@ -16,18 +16,20 @@ spring:
# 测试环境外部接口地址
ruoyi:
sms:
+ # 测试环境: 验证码固定 1234 且不真发短信
+ mock-enabled: true
esignBaseUrl: https://risingdoctor.com/hg
# 扫码拍照 (ry-h5 相机网页地址, 前端二维码目标 URL)
camera:
base-url: https://risingdoctor.com/camera/
supplier-account-api:
- base-url: https://zbsuppliertest.guojustar.com/supplier-api/bidding/supplier/openapi/accounts
+ base-url: https://zbsupplier.guojustar.com/supplier-api/bidding/supplier/openapi/accounts
supplier-account-api-aes:
key-id: supplier-api-key
key: 'kY0+oIO/laeaaaYDd+9TCYbCQR0b/vqMeJ9sUnSVd9U='
bidding-api:
- notice-list-url: https://zbpublictest.guojustar.com/portal-api/bidding/public/notice/list
- detail-url: https://zbpublictest.guojustar.com/#/detail/
+ notice-list-url: https://zbpublic.guojustar.com/portal-api/bidding/public/notice/list
+ detail-url: https://zbpublic.guojustar.com/#/detail/
diff --git a/ry-api/ruoyi-admin/src/main/resources/application.yml b/ry-api/ruoyi-admin/src/main/resources/application.yml
index 257c176..66c520b 100644
--- a/ry-api/ruoyi-admin/src/main/resources/application.yml
+++ b/ry-api/ruoyi-admin/src/main/resources/application.yml
@@ -1,93 +1,3 @@
-# 项目相关配置
-ruoyi:
- # 名称
- name: RuoYi
- # 版本
- version: 3.9.2
- # 版权年份
- copyrightYear: 2026
- # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
- profile: D:/ruoyi/uploadPath
- # 医生劳务协议签署 — token 签名密钥 (HMAC-SHA1)
- sign-token-secret: hwt-sign-secret-2026
- # 获取ip地址开关
- addressEnabled: false
- # 验证码类型 math 数字计算 char 字符验证
- captchaType: math
- # OSS 配置 (前端直传签名, secretKey 仅后端使用)
- oss:
- enabled: true
- endpoint: https://hwtossbamlorgcn.oss-cn-beijing.aliyuncs.com
- bucket: hwtossbamlorgcn
- accessKeyId: LTAI5tQKWWu96ihmg2VChQsY
- accessKeySecret: gA0fTFa8arUYaYA5Us2ClPKVSM1Ypv
- dirPrefix: ry8080/
- expireSeconds: 3600
- # 阿里云函数计算 (FC) 打 zip 端点 (与 hwt-serve 共用同一 bucket, 参考 OssApi.ossDownload)
- zip-func-url: https://zip-oss-func-zip-oss-swqpembfsl.cn-beijing.fcapp.run
- # 阿里云短信配置 (hwt-code ali.sms 模式)
- # dev/prod 区分走代码: phone 以 "10" 开头视为 dev 测试 (固定码 1234), 其它走 aliyun 真发
- sms:
- accessKeyId: LTAI5tAgeAUviVdPSsxYCkPY
- accessKeySecret: 556LX6mXnJIPZgf0vFXcl4mKCzzgKq
- signName: 北京整合医学学会
- template: SMS_291440833
- esignTemplate: SMS_512040098
- endpoint: dysmsapi.aliyuncs.com
- regionId: cn-hangzhou
- # 发票 OCR (本地 Java 识别, PaddleOCR ONNX Runtime, 替代原 ry-ocr Python 微服务)
- ocr:
- version: 0.1.0
- # 模型目录: 绝对路径 → 直读; 相对路径 → 相对进程工作目录 (java -jar 启动目录 = jar 同目录, 部署时 models/ 与 jar 同级)
- models-dir: models
- # 模型版本: v5_mobile (H=48, 20MB, 推荐) / v5_server (90MB+) / v4_mobile (15MB, 最快)
- model-version: v5_mobile
- # 单页 OCR 超时 / 整流程超时 (秒)
- page-timeout-s: 15
- total-timeout-s: 60
- # QR 命中后是否继续跑全量 OCR (false = 快路径只返回 QR 3 字段)
- qr-full-ocr: false
- lang: ch
- # PDF 优先抽内嵌文本层 (电子发票秒出, 扫描件自动回退 ONNX)
- use-pdf-text-first: true
- pdf-text-min-chars: 30
- upload:
- max-mb: 20
- pdf-dpi: 150
-# 供应商账号接口 (拉取/解密) 配置 (base-url 按环境拆分到 application-test/prod.yml)
-supplier-account-api:
- # 每页条数
- page-size: 20
- # 每次拉取最近 N 分钟更新的数据
- pull-minutes: 5
-# 供应商账号接口 AES 密钥 (supplier-account-api-aes.key 按环境拆分到 application-test/prod.yml)
-
-# 招标公告查询接口 (notice-list-url / detail-url 按环境拆分到 application-test/prod.yml)
-
-# 开发环境配置
-server:
- # 服务器的HTTP端口,默认为8080
- port: 8080
- servlet:
- # 应用的访问路径
- context-path: /
- tomcat:
- # tomcat的URI编码
- uri-encoding: UTF-8
- # 连接数满后的排队数,默认为100
- accept-count: 1000
- threads:
- # tomcat最大线程数,默认为200
- max: 800
- # Tomcat启动初始化的线程数,默认值10
- min-spare: 100
-
-# 日志配置
-logging:
- level:
- com.ruoyi: debug
- org.springframework: debug
- com.ruoyi.business: debug
# Spring配置
spring:
@@ -192,4 +102,99 @@ xss:
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
- urlPatterns: /system/*,/monitor/*,/tool/*
\ No newline at end of file
+ urlPatterns: /system/*,/monitor/*,/tool/*
+# 项目相关配置
+ruoyi:
+ # 名称
+ name: RuoYi
+ # 版本
+ version: 3.9.2
+ # 版权年份
+ copyrightYear: 2026
+ # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
+ profile: D:/ruoyi/uploadPath
+ # 医生劳务协议签署 — token 签名密钥 (HMAC-SHA1)
+ sign-token-secret: hwt-sign-secret-2026
+ # 获取ip地址开关
+ addressEnabled: false
+ # 验证码类型 math 数字计算 char 字符验证
+ captchaType: math
+ # OSS 配置 (前端直传签名, secretKey 仅后端使用)
+ oss:
+ enabled: true
+ endpoint: https://hwtossbamlorgcn.oss-cn-beijing.aliyuncs.com
+ bucket: hwtossbamlorgcn
+ accessKeyId: LTAI5tQKWWu96ihmg2VChQsY
+ accessKeySecret: gA0fTFa8arUYaYA5Us2ClPKVSM1Ypv
+ dirPrefix: ry8080/
+ expireSeconds: 3600
+ # 阿里云函数计算 (FC) 打 zip 端点 (与 hwt-serve 共用同一 bucket, 参考 OssApi.ossDownload)
+ zip-func-url: https://zip-oss-func-zip-oss-swqpembfsl.cn-beijing.fcapp.run
+ # 阿里云短信配置 (hwt-code ali.sms 模式)
+ # mock-enabled 按环境拆分到 application-test/prod.yml: test=true 固定码 1234 不真发, prod=false aliyun 真发
+ sms:
+ accessKeyId: LTAI5tAgeAUviVdPSsxYCkPY
+ accessKeySecret: 556LX6mXnJIPZgf0vFXcl4mKCzzgKq
+ signName: 北京整合医学学会
+ template: SMS_291440833
+ esignTemplate: SMS_512040098
+ endpoint: dysmsapi.aliyuncs.com
+ regionId: cn-hangzhou
+ # 发票 OCR (本地 Java 识别, PaddleOCR ONNX Runtime, 替代原 ry-ocr Python 微服务)
+ ocr:
+ version: 0.1.0
+ # 模型目录: 绝对路径 → 直读; 相对路径 → 相对进程工作目录 (java -jar 启动目录 = jar 同目录, 部署时 models/ 与 jar 同级)
+ models-dir: models
+ # 模型版本: v5_mobile (H=48, 20MB, 推荐) / v5_server (90MB+) / v4_mobile (15MB, 最快)
+ model-version: v5_mobile
+ # 单页 OCR 超时 / 整流程超时 (秒)
+ page-timeout-s: 15
+ total-timeout-s: 60
+ # QR 命中后是否继续跑全量 OCR (false = 快路径只返回 QR 3 字段)
+ qr-full-ocr: false
+ lang: ch
+ # PDF 优先抽内嵌文本层 (电子发票秒出, 扫描件自动回退 ONNX)
+ use-pdf-text-first: true
+ pdf-text-min-chars: 30
+ upload:
+ max-mb: 20
+ pdf-dpi: 150
+# 供应商账号接口 (拉取/解密) 配置 (base-url 按环境拆分到 application-test/prod.yml)
+supplier-account-api:
+ # 每页条数
+ page-size: 20
+ # 每次拉取最近 N 分钟更新的数据
+ pull-minutes: 5
+# 供应商账号接口 AES 密钥 (supplier-account-api-aes.key 按环境拆分到 application-test/prod.yml)
+
+# 招标公告查询接口 (notice-list-url / detail-url 按环境拆分到 application-test/prod.yml)
+
+# 公众号 JS-SDK 分享签名 (appId/appSecret 与 hwt-serve biz_conf 表一致)
+wx:
+ app-id: wx2414cddf4bd56092
+ app-secret: 792300428a4998da9294e263ec55e71a
+
+# 开发环境配置
+server:
+ # 服务器的HTTP端口,默认为8080
+ port: 8080
+ servlet:
+ # 应用的访问路径
+ context-path: /
+ tomcat:
+ # tomcat的URI编码
+ uri-encoding: UTF-8
+ # 连接数满后的排队数,默认为100
+ accept-count: 1000
+ threads:
+ # tomcat最大线程数,默认为200
+ max: 800
+ # Tomcat启动初始化的线程数,默认值10
+ min-spare: 100
+
+# 日志配置
+logging:
+ level:
+ com.ruoyi: debug
+ org.springframework: debug
+ com.ruoyi.business: debug
diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizEcologyController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizEcologyController.java
new file mode 100644
index 0000000..b06afda
--- /dev/null
+++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizEcologyController.java
@@ -0,0 +1,55 @@
+package com.ruoyi.business.controller;
+
+import java.util.List;
+import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.business.service.EcologyProjectService;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.exception.ServiceException;
+
+/**
+ * ecology 项目信息拉取 (admin/projects/new 按项目编号自动回填).
+ *
+ * 读接口开放给已登录用户 (admin/manager 新建项目用), 与 /business/org/*Options 下拉一致, 不加 @PreAuthorize.
+ */
+@RestController
+@RequestMapping("/business/ecology")
+public class BizEcologyController extends BaseController
+{
+ @Autowired
+ private EcologyProjectService ecologyProjectService;
+
+ /**
+ * 项目编号模糊搜索 (下拉选项): GET /business/ecology/project/search?xmbh=xxx
+ * 返回 [{projectNo, projectName}].
+ */
+ @GetMapping("/project/search")
+ public AjaxResult searchProjects(@RequestParam(value = "xmbh", required = false) String xmbh)
+ {
+ List