feat: 生产部署 + 会议全链路 (执行方分配/费用结算/签到脱敏/H5相机)

- 生产 nginx 三路径: ry-vue3 /hg/, ry-h5 /camera/, API /hg-api, .env 分环境
- 签约链接/摄像头 base-url 走 yml, 不再硬编码 /hg 与 localhost
- 新增 biz_project_executor_assign (镜像 sponsor_assign) 执行方项目级分配
- 会议费用后台汇总 FeeCalcScheduler + 结算回写项目金额 + 状态流转调度
- 签到表拍照高斯模糊脱敏 extra_oss_url, 新增 PosterService/StageDeriver
- 清理 biz_support_intent 旧表 (6 Java/XML 删除)
- ry-h5 相机黑屏修复: 显式 video.play() + 动态 apiBase 上传
- 资源: simhei 字体 / logo.png / qrcode_1.png / favicon.ico

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-24 01:00:09 +08:00
co-authored by Claude
parent 80a276e661
commit 904e28710f
123 changed files with 6008 additions and 1706 deletions
@@ -33,6 +33,9 @@ public class RuoYiConfig
/** OSS 配置 (可选) */
private OssProperties oss = new OssProperties();
/** 扫码拍照相机网页配置 (可选) */
private CameraProperties camera = new CameraProperties();
public String getName()
{
return name;
@@ -133,6 +136,28 @@ public class RuoYiConfig
this.oss = oss;
}
public CameraProperties getCamera()
{
return camera;
}
public void setCamera(CameraProperties camera)
{
this.camera = camera;
}
/**
* 扫码拍照相机网页配置 (前端二维码目标 URL)
*/
public static class CameraProperties
{
/** 相机 H5 网页基础地址, 例如 http://localhost:8090/camera/ */
private String baseUrl;
public String getBaseUrl() { return baseUrl; }
public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; }
}
/**
* OSS 配置 (前端直传签名用)
*/
@@ -0,0 +1,109 @@
package com.ruoyi.common.enums;
/**
* 会议 当前阶段 (biz_meeting.current_stage)
* <p>
* 10 值统一物理状态机 (单一可信源). 每个角色看到的是它的一个显示投影, 见前端 stageLabel(role, code):
* <pre>
* NOT_STARTED 未执行 会议开始时间前
* ↓ (过 startTime, scheduler)
* RUNNING 执行中 已开始, 执行方未提交材料
* ↓ (执行方提交材料)
* AWAITING_COMPLIANCE 待合规审核 执行方已提交, 等合规人员审核 (支持方此时只读, 不能审)
* ↓ (合规审通过) ↘ (合规退回)
* AWAITING_SUPERVISION 待支持方审核 合规审通过, 等支持方审核(填监管意见)
* ↓ (支持方审通过) ↘ (支持方退回)
* SUPERVISION_APPROVED 审核通过 支持方审通过, 等 1 自然日 → 待结算
* ↓ (过 1 自然日, scheduler)
* AWAITING_SETTLEMENT 待结算 支持方审通过 + 1 自然日, 等合规结算 + 上传付款凭证
* ↓ (合规结算 + 上传凭证)
* SETTLED 已结算 材料+凭证均通过, 已结算
* ↓ (合规/管理员手动完结)
* FINISHED 已完结 流程终止
*
* RECTIFYING 待整改 合规或支持方退回, 执行方整改后重新提交 → AWAITING_COMPLIANCE
* FROZEN 冻结中 过期未提交, 不可再提交
* </pre>
*
* <p>code 用英文单词而非数字, 原因:
* <ol>
* <li>B-tree 索引比较更快 (ASCII 7-19B vs UTF-8 中文 9B/字符)</li>
* <li>日志/SQL 直接可读, 不需要 decode</li>
* <li>URL 查询参数无需 URL-encode (解决 ?currentStage=执行中 编码乱问题)</li>
* </ol>
*
* <p>前端 dropdown / KPI 卡 / 列表筛选: value 用 code, 显示用 info (中文 label).
*
* @author guoju
*/
public enum BizMeetingStageEnum
{
/** 会议开始时间前 */
NOT_STARTED("NOT_STARTED", "未执行", "会议开始时间前"),
/** 已开始, 执行方未提交材料 */
RUNNING("RUNNING", "执行中", "已开始, 执行方未提交"),
/** 执行方已提交, 等合规人员审核 (支持方此阶段只读, 不可审) */
AWAITING_COMPLIANCE("AWAITING_COMPLIANCE", "待合规审核", "执行方提交, 等合规审"),
/** 合规审通过, 等支持方审核 (填监管意见) */
AWAITING_SUPERVISION("AWAITING_SUPERVISION", "待支持方审核", "合规审通过, 等支持方审"),
/** 支持方审通过, 等 1 自然日 → 待结算 */
SUPERVISION_APPROVED("SUPERVISION_APPROVED", "审核通过", "支持方审通过, 等结算"),
/** 合规或支持方退回, 执行方整改后重新提交 */
RECTIFYING("RECTIFYING", "待整改", "审核退回, 执行方整改"),
/** 支持方审通过 + 1 自然日, 等合规结算 + 上传付款凭证 */
AWAITING_SETTLEMENT("AWAITING_SETTLEMENT", "待结算", "支持方审通过, 等结算"),
/** 合规点击结算 + 上传付款凭证, 全部完成 */
SETTLED("SETTLED", "已结算", "已结算 + 凭证已上传"),
/** 已结算后, 合规/管理员手动完结, 流程终止 */
FINISHED("FINISHED", "已完结", "已结算后手动完结"),
/** 会议结束后逾期未提交, 冻结 (不可再提交) */
FROZEN("FROZEN", "冻结中", "过期未提交, 不可再提交");
private final String code;
private final String info;
private final String description;
BizMeetingStageEnum(String code, String info, String description)
{
this.code = code;
this.info = info;
this.description = description;
}
public String getCode()
{
return code;
}
public String getInfo()
{
return info;
}
public String getDescription()
{
return description;
}
/**
* 根据 code 解析枚举 (找不到返回 null, 调用方自行 fallback)
*/
public static BizMeetingStageEnum of(String code)
{
if (code == null) return null;
for (BizMeetingStageEnum e : values())
{
if (e.code.equals(code)) return e;
}
return null;
}
}
@@ -0,0 +1,59 @@
package com.ruoyi.common.enums;
/**
* 材料/凭证 审核阶段 (biz_meeting.material_audit_stage / voucher_audit_stage)
* <p>
* 4 值 (用户拍板「已提交/待审核」合并): 提交后进入 SUBMITTED, 两级审核(合规先-支持方后)
* 用 material_compliance_approved / voucher_compliance_approved 布尔区分「合规审中 vs 支持方审中」.
* <pre>
* NOT_SUBMITTED 未提交 执行方还没交
* ↓ (执行方提交)
* SUBMITTED 已提交 已提交, 在审 (合规审中=compliance_approved=0, 支持方审中=1)
* ↓ (支持方审通过)
* APPROVED 审核通过 支持方已通过
*
* REJECTED 审核驳回 被合规/支持方退回 (执行方重提 → SUBMITTED)
* </pre>
*
* @author guoju
*/
public enum MeetingAuditStageEnum
{
/** 未提交 */
NOT_SUBMITTED("NOT_SUBMITTED", "未提交"),
/** 已提交 (含两级审核中, 层级由 compliance_approved 区分) */
SUBMITTED("SUBMITTED", "已提交"),
/** 审核通过 (支持方已通过) */
APPROVED("APPROVED", "审核通过"),
/** 审核驳回 (退回) */
REJECTED("REJECTED", "审核驳回");
private final String code;
private final String info;
MeetingAuditStageEnum(String code, String info)
{
this.code = code;
this.info = info;
}
public String getCode()
{
return code;
}
public String getInfo()
{
return info;
}
public static MeetingAuditStageEnum of(String code)
{
if (code == null) return null;
for (MeetingAuditStageEnum e : values())
{
if (e.code.equals(code)) return e;
}
return null;
}
}