feat: OA(ecology)项目拉取 + 会议邀请函PDF/微信分享 + 参会人/执行意向增强

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 + 供应商/招标接口切生产域名
This commit is contained in:
郭庆泰
2026-09-03 20:12:15 +08:00
parent beb9799a06
commit 56615f9806
55 changed files with 3296 additions and 516 deletions
+13 -2
View File
@@ -38,7 +38,7 @@
不用 el-input-number: 移动端其 +/- 按钮 absolute 定位在容器最右,
容器 100% 后按钮飘到行尾. 改用 type="number" 原生 input, 浏览器自带步进按钮在 input 内右贴边
-->
<el-input v-model.number="form.periodNo" type="number" :min="1" :max="totalSessionsNum" placeholder="请输入期数" />
<el-input v-model.number="form.periodNo" type="number" step="1" :min="1" :max="totalSessionsNum" placeholder="请输入期数" />
</el-form-item>
<el-form-item label="会议开始时间" prop="startTime">
<el-date-picker v-model="form.startTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择开始时间" />
@@ -134,8 +134,19 @@ const form = reactive({
remark: ''
})
// 期数必须是正整数 (第几期), 小数/负数会触发后端 Long 反序列化报错
function validatePeriodNo(_rule, value, cb) {
if (value === null || value === undefined || value === '') { cb(); return }
const n = Number(value)
if (!Number.isInteger(n) || n < 1) { cb(new Error('期数必须为正整数')); return }
cb()
}
const rules = {
periodNo: [{ required: true, message: '请填写期数', trigger: 'blur' }],
periodNo: [
{ required: true, message: '请填写期数', trigger: 'blur' },
{ validator: validatePeriodNo, trigger: 'blur' }
],
startTime: [{ required: true, message: '请选择会议开始时间', trigger: 'change' }],
endTime: [{ required: true, message: '请选择会议结束时间', trigger: 'change' }],
address: [{ required: true, message: '请填写会议地点', trigger: 'blur' }]