weicw
|
3c2e8b082c
|
fix(sql): 回填脚本 LIKE 显式 COLLATE(MySQL 8 上业务表 general_ci 与组织表 0900_ai_ci 混用会报错)
|
2026-11-04 00:04:26 +08:00 |
|
weicw
|
7696a56740
|
fix(sql): 注册表不登记 gxmu_tygl(只是前端别名,无业务表,会让启动期一致性校验失败)
|
2026-11-04 00:01:24 +08:00 |
|
weicw
|
70213ab783
|
refactor(gxmu): 审批链层级校验下沉到 Service,删除路径也校验剩余链
- ReviewFlowController 里约 115 行的 validateLevels / validateUpdate /
validateBatchUpdate / validateRemaining / merge 下沉为
ReviewFlowService.validateLevelsOnSave / OnUpdate / OnBatchUpdate / OnRemove,
controller 只在写操作前调用一次
- remove / removeBatch 新增删除后剩余链连续性校验;删除前就已不连续的链跳过校验,
避免存量脏数据变成「永远删不掉」
- 顺手修掉一个真缺陷:merge 会就地改 existing,导致「改名后原链剩余校验」永远不触发
(批量路径同样先取旧标题再合并)
- 模块标题回退三份收敛成 ModuleRegistryService.titleOf(Map, module) 一处,
ReviewFlowConfigServiceImpl / ReviewListServiceImpl 直接调用
- ReviewFlowLevelValidator 的手写 join 换成 Collectors.joining(", ")
- 回填脚本头部补「表名 → 学院文本列」对照表,注明新增表按此表同步 4 处
refs #58
|
2026-11-03 23:14:24 +08:00 |
|
weicw
|
37cc8ee0d5
|
fix(gxmu): 注册表补 has_college 与团员管理种子,接口返回 DTO 并支持 all=true
- gxmu_module_registry 增加 has_college(4 张在跑表置 1,含已有库补列与补数据语句)
- 种子补 gxmu_tygl_form / gxmu_tygl(enabled=0,团员管理,sort 11/12),
同步修正末尾「执行后校验」:12 行未删除、5 行启用、has_college 4 行
- GET /api/gxmu/module-registry/list 支持 all=true(默认只返回启用),
改为返回 ModuleRegistryDTO,不再外泄 tenantId / userId / 时间戳
- ModuleRegistryService:删掉无生产调用的 titleOf(String)/allModules,
标题回退收敛成唯一的静态 titleOf(Map, module);getByModule 改由 hasCollege 使用
- listAll 只保留 SQL 排序(sort_number 升序,NULL 排最前,与 MySQL ASC 口径一致),
删掉内存二次排序
- ModuleRegistryIntegrityChecker 增加反向告警:review_flow_config 里有、注册表里没有的
module 打 warn,不阻断启动
refs #58
|
2026-11-03 23:13:29 +08:00 |
|
weicw
|
9c4476a395
|
fix(sql): 注册表种子启用稿件模块(cms_manuscript 有在跑的审核链)
|
2026-11-03 22:36:52 +08:00 |
|
weicw
|
5b7ddd48c7
|
feat(spec58): 4 张业务表 college_id 一次性回填脚本
以学生档案 gxmu_student.college_id 为准,按 user_id 回填 sjqn / tzbcy_form /
qmgc_form / wxxzx_project 的 college_id;仍为空的行再用表单里的学院文本
按组织名 LIKE 兜底,只有唯一命中才写入,无法匹配留空。
- A 段学生档案主路径,优先取在校记录的学院,档案学院不唯一时留空不猜
- B 段文本兜底,候选学院 = 有平台单位号的节点 ∪ 学生档案引用过的节点
- 只填空不覆盖,可重复执行;不接定时任务
- 附回填率、空值清单、未匹配文本一览与一致性抽查(3a-3d),供人工核对
|
2026-11-03 22:28:49 +08:00 |
|
weicw
|
fa7633b35e
|
feat(spec58): 审批人规则列、学院标识列与模块注册表
- gxmu_review_flow 增加 reviewer_rule(为空回退 review_user_id)
- 4 张在跑业务表增加可空 college_id,供按学院解析审批人
- 新建 gxmu_module_registry 并写入 10 个模块,仅 4 个在跑模块启用
- information_schema 判存 + INSERT IGNORE,脚本可重复执行
|
2026-11-03 22:21:22 +08:00 |
|
weicw
|
0e4986330a
|
feat(declare): 同一申报项目进行中只允许一条申报
- 新增 DeclareGuardService:按已通过/未处理驳回/待审核数判重,申报项目行加锁防连点
- 9 张申报表补 declare_id / declare_status / declare_remark,提交时写入并随审核结果回写
- 新增撤回、作废(强制放行)接口;挑战杯团队成员按手机号判重
- 申报项目支持配置允许重复提交与最多同时条数
- 迁移脚本 sql/20261102_add_declare_uniqueness.sql(含存量回填与重复清单)
|
2026-11-02 19:28:56 +08:00 |
|
weicw
|
9e88c53052
|
fix: 数据源会话时区强制 +08:00,修复创建时间早 8 小时
生产数据库容器(1Panel-mariadb-ZOpD)的 system_time_zone 是 UTC,而数据源 URL 写着
serverTimezone=Asia/Shanghai:JDBC 会话时区是 UTC、驱动却按 +08 解析服务端返回的字面量,
于是 timestamp 列(分类管理、文章、系统日志、审核流、AI 对话等)读出来整体早 8 小时。
数据源 URL 增加 connectionTimeZone=%2B08:00&forceConnectionTimeZoneToSession=true,
连接建立时把会话时区设为 +08:00,与 JVM 默认时区、spring.jackson.time-zone 保持一致。
用偏移量而非命名时区,避免 MariaDB 容器未加载时区表时报 Unknown or incorrect time zone。
附 sql/20261026_timezone_8h_check.sql:部署后的时区自检、分类管理核对,
以及 datetime 列历史 UTC 字面量与教师建号行的时间回填模板(默认注释未执行)。
|
2026-10-26 11:09:15 +08:00 |
|
weicw
|
4c2a787d81
|
feat(ai): 写作/生图/创意/活动策划也保存历史记录
- ai_chat_list 新增 chat_type / params,旧数据默认 chat
- 新增 AiGenerationRecorder:成功后同事务写 list + history,末帧回传 chatId
- 聊天改为成功收尾才建行,失败/中止不再留下空记录
- 写作(含自由创作)、生图、创意助手、活动策划四处接入,软失败与断流不入库
- 历史列表只取最近 30 条(SQL LIMIT),并强制按登录用户过滤
- 修复历史排序用了不存在的 sort_number 列(多行会 NPE)
- 新增 4 个测试类:记录器规则、排序回归、创意成功/软失败、30 条上限
|
2026-10-24 17:37:39 +08:00 |
|
weicw-dshsa
|
1ae2ab580d
|
feat(manuscript): 稿件正文增加 content_format 格式标记
- cms_manuscript 新增 content_format(html/markdown/text),默认 html
- Manuscript 实体加 contentFormat;保存与修改时缺省按 html 落库,下游不再靠猜
- 迁移脚本幂等,并把明显是 markdown 的历史行标出来
|
2026-10-22 14:37:34 +08:00 |
|
weicw-dshsa
|
cbbe3b87b4
|
修改端口号
|
2026-09-22 20:35:21 +08:00 |
|
weicw-dshsa
|
853f3c3f5b
|
新增教师名册只读接口
教师名册来自开放平台全量同步,只用于检索与选人(教师不建登录账号,ADR-0001),
因此不提供认领类接口,也没有可写字段。
- GET /api/gxmu/teacher/page:学院/教工号/姓名/状态筛选,默认只返回启用
- POST /api/gxmu/teacher/export:导出用列表,带操作日志
- 权限拆成 gxmu:teacher:list 与 gxmu:teacher:export
- 手机号按 spec §5.2 落盘但不进任何列表接口,返回前一律清空(hideSensitive)
- 菜单与按钮权限见 sql/20260915_add_teacher_roster_menu.sql,可重复执行
|
2026-09-15 17:21:32 +08:00 |
|
weicw-dshsa
|
582d7dfbcb
|
学生同步稳态只写变更行
实测写入才是大头,不是平台拉取:9.8 万行的表上 800 行/批 upsert 要 716ms,
123 批共 88 秒;而窄读全部 (xh, row_hash) 只要 2.1 秒。
做法:
- gxmu_student 增列 row_hash,存放「平台权威字段」的 MD5 指纹
(迁移 sql/20260915_add_student_row_hash.sql,可重复执行)
- 同步时先窄读现有指纹,只 upsert 指纹变化的行
- 窄读同时服务于停用差集,省掉原先单独的一次 selectAllXh
- deactivateByXh 顺带把 row_hash 置空,保证停用行以后重新出现时一定被重新写入
指纹规则单独成类 StudentFingerprint:它必须与 mapper 的
ON DUPLICATE KEY UPDATE 子句严格对应——往 UPDATE 里加字段却忘了加进指纹,
那一列就会静默地不再更新,这类 bug 不报错、只产生过期数据。
因此附有逐字段的测试,并由 MapperFieldWhitelistTest 守住 UPDATE 子句本身。
附带收益:未变更的行不再刷新 update_time,该字段恢复「最后变更时间」的含义;
码表修正后 nation/politics 变化会触发自动重算,正是 ADR-0006 承诺的行为。
预期学生同步 170 秒 -> 约 85 秒,其中写库 88 秒 -> 约 2 秒。
现有 98187 行 row_hash 为空,部署后第一次仍会全量写一次。
离线单测 50 个。
|
2026-09-15 16:14:05 +08:00 |
|
weicw-dshsa
|
cd54039f28
|
接入医科大开放平台数据同步
新增 com.gxwebsoft.gxmu.openplat:开放平台客户端(oauth 鉴权、token 缓存与失效
重取、分页拉取)、部门/教师/班级/学生四段同步、异步编排与手动同步接口、学生认领、
学生名册查询与导出、每天 03:30 的定时任务、同步记录。
关键设计:
- 名册与登录账号分离,学生通过「认领」(手机号自动 / 学号姓名自助)关联 sys_user
- 组织数据以 sys_organization 为唯一载体,gxmu_college 废弃
- 平台无可用增量字段,只做全量拉取 + 幂等 upsert
- 上游消失只停用不删除,且只作用于同步来源的记录(避免误停用人工维护的研究生班)
- 平台权威字段按白名单覆盖,人工字段不触碰
- 码表可配置并保留原始码,码值实测存在两套编码混用,不做硬编码
- 手动同步为异步:提交返回批次号,前端轮询 /status 看分段进度
性能:
- 班级/部门由逐条 update 改为多行 upsert,班级 1584 条 41s -> 0.19s
- 码表解析加进程内缓存,学生同步由 >17 分钟不完成 -> 170 秒完成 98187 行
迁移脚本需手动执行(可重复执行):
sql/20260912_create_openplat_sync_tables.sql
sql/20260912_add_openplat_menu.sql
离线单测 43 个;另有联网集成测试 OpenPlatformClientIT(需 -Dopenplat.it=true)。
|
2026-09-15 15:54:49 +08:00 |
|
b2894lxlx
|
f379291e4f
|
260720
|
2026-07-20 11:48:06 +08:00 |
|