feat: 会议材料上传/发票OCR识别/用户管理增强 + 日志降噪 + 薪亿通接口规范

- 会议/劳务材料支持直接上传与提交审核 (BizMeetingMaterial 等)
- 发票 OCR 识别增强 (InvoiceOcrService)
- 现场照片/证书批量导入覆盖式回填 (ExcelUtil/AttendeeImportVo/CameraQrUpload)
- 用户管理增强、超级管理员校验与权限拒绝处理 (SuperManagerChecker/AccessDeniedHandlerImpl)
- 日志级别调整为 info/warn (生产降噪)
- 新增薪亿通·个人票税接口规范文档 (自然人开票服务分册 + 轻量化对接分册)
- .gitignore 排除 key.txt/*.rdb/*.key/tmp/opt 等敏感与本地文件

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-11-12 01:13:17 +00:00
co-authored by Claude Code
parent 44d4920777
commit 3f587fbd9f
39 changed files with 1544 additions and 192 deletions
+8 -2
View File
@@ -35,7 +35,7 @@
</div>
<div class="file-actions">
<el-link :underline="false" v-if="!readonly" type="danger" class="remove-btn" @click.stop="onRemoveAt(i)">移除</el-link>
<a class="download-btn" :href="u" target="_blank" rel="noopener" @click.stop>下载</a>
<a v-if="downloadable" class="download-btn" :href="u" target="_blank" rel="noopener" @click.stop>下载</a>
</div>
</div>
<div v-if="!readonly && modelList.length" class="ht-file-add" @click.stop="handleClick">
@@ -66,7 +66,7 @@
</div>
<div class="file-actions">
<el-link :underline="false" v-if="!readonly" type="danger" class="remove-btn" @click.stop="onRemove">移除</el-link>
<a class="download-btn" :href="modelValue" target="_blank" rel="noopener" @click.stop>下载</a>
<a v-if="downloadable" class="download-btn" :href="modelValue" target="_blank" rel="noopener" @click.stop>下载</a>
</div>
<!-- 右侧预览框 (图片用 el-image, 其他用 icon + 点击新窗口打开) -->
<div v-if="showPreview" class="preview-box">
@@ -105,6 +105,8 @@ const props = defineProps({
maxSize: { type: Number, default: 200 }, // MB
block: { type: Boolean, default: false },
readonly: { type: Boolean, default: false },
downloadable: { type: Boolean, default: true }, // 是否显示"下载"按钮 (如 sponsor 只读查看时不显示)
maxCount: { type: Number, default: 0 }, // 多文件模式最多文件数 (0 = 不限制)
showPreview: { type: Boolean, default: true }, // 右侧预览框 (图片/PDF/其他)
multiple: { type: Boolean, default: false } // 多文件模式: 一次选多个文件, modelValue 存 JSON 数组字符串
})
@@ -232,6 +234,10 @@ async function onFileChange(e) {
const list = [...modelList.value]
let added = 0
for (const file of files) {
if (props.maxCount && list.length >= props.maxCount) {
ElMessage.warning(`最多上传 ${props.maxCount} 个文件`)
break
}
if (!validateFile(file)) continue
uploading.value = true
progress.value = 0