feat: 邀请函邮件发送 + 首次设密/密码为空 + 姓名单一可信源
邀请发送 (菜单暂隐藏, 待确认参数见 发送邀请-待确认参数.md): - 后端: BizInvite / BizInviteRecipient + Controller/Service/Mapper/XML - 邮件: InviteMailSender (spring-boot-starter-mail SMTP) + application*.yml 邮件配置 - 上传进度: UploadProgressRegistry + UploadProgressController - 前端: InviteList / InviteNew / InviteDetail / InviteView + api/business/invite.js - 原型: proto/html/components/invite-detail / new-invitation / send-invitation 登录/账号: - 首次设密: /getInfo 返回 isPasswordEmpty, SysProfileController 密码为空时跳过旧密码校验, ForcePasswordDialog 强制弹窗 - 姓名单一可信源 resolveDisplayName: doctor→biz_expert.name, sponsor/executor→biz_person.name, 其余回退 nick_name - OA compliance 门禁改为按手机号查 ecology 视图 (不再限定 manager/leader) 其它: - OSS zip 在线查看 (列清单+取单文件, 公开只读) + SecurityConfig permitAll - doctor 项目详情 ProjectDetail.vue - 数据库/测试/设计文档 (md) 入库
This commit is contained in:
+32
-6
@@ -71,24 +71,27 @@ async function uploadBase64ToOss(apiBase: string, base64: string, dir: string):
|
||||
return sign.host + '/' + key
|
||||
}
|
||||
|
||||
/** 回传 OSS URL 到后端 (POST /business/meetingMaterial/cameraUpload) */
|
||||
/** 回传 OSS URL 数组到后端 (POST /business/meetingMaterial/cameraUpload) */
|
||||
async function cameraUpload(
|
||||
apiBase: string,
|
||||
meetingId: string,
|
||||
subType: string,
|
||||
ossUrl: string,
|
||||
extraOssUrl: string
|
||||
ossUrls: string[],
|
||||
extraOssUrls: string[]
|
||||
): Promise<void> {
|
||||
const resp = await fetch(`${apiBase}/business/meetingMaterial/cameraUpload`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ meetingId: Number(meetingId), subType, ossUrl, extraOssUrl }),
|
||||
body: JSON.stringify({ meetingId: Number(meetingId), subType, ossUrls, extraOssUrls }),
|
||||
})
|
||||
const data = (await resp.json()) as { code: number; msg: string }
|
||||
if (data.code !== 200) throw new Error(data.msg || '照片回传失败')
|
||||
}
|
||||
|
||||
/** 拍照后调用: 直传 OSS + 回传 URL 存库. 签到表额外上传高斯模糊版作为 extraOssUrl. */
|
||||
/** 连拍多张: 每张 sharp + 可选高斯模糊版 (签到表). 批量直传 OSS 后一次性回传数组存库. */
|
||||
export type CameraShot = { sharp: string; blurred: string }
|
||||
|
||||
/** 拍照后调用 (单张): 直传 OSS + 回传 URL 存库. 签到表额外上传高斯模糊版作为 extraOssUrl. */
|
||||
export async function uploadCameraPhoto(base64: string, blurredBase64: string): Promise<void> {
|
||||
const p = getCameraParams()
|
||||
if (!p.apiBase) throw new Error('缺少 apiBase 参数')
|
||||
@@ -104,5 +107,28 @@ export async function uploadCameraPhoto(base64: string, blurredBase64: string):
|
||||
extraOssUrl = await uploadBase64ToOss(p.apiBase, blurredBase64, dir + 'masked/')
|
||||
}
|
||||
|
||||
await cameraUpload(p.apiBase, p.meetingId, p.subType, ossUrl, extraOssUrl)
|
||||
await cameraUpload(p.apiBase, p.meetingId, p.subType, [ossUrl], extraOssUrl ? [extraOssUrl] : [])
|
||||
}
|
||||
|
||||
/** 拍照后调用 (连拍多张): 每张直传 OSS + 签到表额外上传高斯模糊版, 一次性回传数组存库. */
|
||||
export async function uploadCameraPhotos(list: CameraShot[]): Promise<void> {
|
||||
const p = getCameraParams()
|
||||
if (!p.apiBase) throw new Error('缺少 apiBase 参数')
|
||||
if (!p.meetingId) throw new Error('缺少 meetingId 参数')
|
||||
if (!p.subType) throw new Error('缺少 subType 参数')
|
||||
if (!list || !list.length) throw new Error('没有可上传的照片')
|
||||
|
||||
const dir = `ry8080/meeting/${p.meetingId}/camera/`
|
||||
const ossUrls: string[] = []
|
||||
const extraOssUrls: string[] = []
|
||||
for (const s of list) {
|
||||
ossUrls.push(await uploadBase64ToOss(p.apiBase, s.sharp, dir))
|
||||
if (p.subType === 'L_SIGN_IN' && s.blurred) {
|
||||
extraOssUrls.push(await uploadBase64ToOss(p.apiBase, s.blurred, dir + 'masked/'))
|
||||
} else {
|
||||
extraOssUrls.push('')
|
||||
}
|
||||
}
|
||||
|
||||
await cameraUpload(p.apiBase, p.meetingId, p.subType, ossUrls, extraOssUrls)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user