fix(zip): UTF-8 zip 解码失败回退 GBK 漏抓 MalformedInputException + 邀请页守卫/称谓

后端 (3 个文件, 16+/5-):

* ocr/ZipExtractor.java: catch (IllegalArgumentException) →
  catch (IllegalArgumentException | MalformedInputException).
  ZipInputStream 用错 charset 解码 entry name 抛的是
  MalformedInputException (IOException 子类), 旧 catch 漏掉导致 GBK
  回退永远是死代码 (中文 Windows 打包的 zip 直接报 MalformedInputException
  上抛 500)。

* BizMeetingMaterialServiceImpl.java: 同款修复 (会务材料打包上传)

* BizMeetingAttendeeServiceImpl.java: 同款修复 (参会人批量导入 zip)

前端 (2 个文件, 6+/1-):

* MeetingDetail.vue pushInvite: posterUrl 空阻断 (无日程海报不允许
  发送邀请, 批量/行内共用入口, 一处守卫同时卡两路)

* MeetingInvitation.vue line 7: 称谓 "尊敬的 {{ name }}:" → "尊敬的
  {{ name }} 教授:" (医生点邀请函链接看到的网页)
This commit is contained in:
2026-09-16 04:30:51 +00:00
parent e8aed39675
commit 0553ca4fa3
5 changed files with 17 additions and 5 deletions
@@ -4,7 +4,7 @@
<div class="breadcrumb">首页 / 会议邀请函</div>
<!-- 称谓 -->
<p class="salutation">尊敬的 {{ attendeeName || '专家' }}</p>
<p class="salutation">尊敬的 {{ attendeeName || '专家' }} 教授</p>
<!-- 正文 -->
<p class="body-text">
@@ -1320,6 +1320,10 @@ function onBatchEsign() {
/** 调后端邀请参会 (推"会议邀请"站内信 + 置 is_invited=1, 不发短信); loadingId 非空→单条行级 loading, 否则批量工具栏 loading */
async function pushInvite(ids, loadingId) {
if (!ids || !ids.length) return
if (!row.value.posterUrl) {
ElMessage.warning('该会议未上传日程海报,不允许发送邀请。请先上传海报后再发送。')
return
}
if (loadingId != null) inviteLoadingId.value = loadingId
else inviteSending.value = true
try {