hookehuyr

fix(checkin): 修复提交任务时接口兼容性问题

当新结构提交失败时,回退到旧结构参数格式重试
处理混合类型附件的错误提示
将editUploadTaskInfoAPI的HTTP方法从GET改为POST
......@@ -130,7 +130,7 @@ export const getUploadTaskInfoAPI = (params) => fn(fetch.get(Api.TASK_UPLOAD_IN
* @param gratitude_form_list 感恩表单数据 [{id,name,city,unit,其他信息字段}]
* @returns
*/
export const editUploadTaskInfoAPI = (params) => fn(fetch.get(Api.TASK_UPLOAD_EDIT, params))
export const editUploadTaskInfoAPI = (params) => fn(fetch.post(Api.TASK_UPLOAD_EDIT, params))
/**
* @description: 删除打卡动态详情
......
import { describe, expect, it, vi, beforeEach } from 'vitest'
vi.mock('vue-router', () => {
const router = {
push: vi.fn(),
back: vi.fn()
}
return {
useRoute: () => ({
query: {}
}),
useRouter: () => ({
push: vi.fn()
})
useRouter: () => router
}
})
......@@ -51,10 +53,22 @@ vi.mock('@/contexts/auth', async () => {
import { useCheckin } from '../useCheckin'
import { showToast } from 'vant'
import { addUploadTaskAPI } from '@/api/checkin'
describe('useCheckin 上传大小限制', () => {
beforeEach(() => {
vi.clearAllMocks()
if (!globalThis.sessionStorage) {
let store = {}
globalThis.sessionStorage = {
getItem: (key) => store[key] ?? null,
setItem: (key, value) => { store[key] = String(value) },
removeItem: (key) => { delete store[key] },
clear: () => { store = {} },
}
} else {
sessionStorage.clear()
}
})
it('setMaxFileSizeMbMap 能更新并保留其他类型默认值', () => {
......@@ -119,3 +133,49 @@ describe('useCheckin 上传大小限制', () => {
})
})
describe('useCheckin 提交兼容', () => {
beforeEach(() => {
vi.clearAllMocks()
if (globalThis.sessionStorage?.clear) sessionStorage.clear()
})
it('新结构失败会回退旧结构提交', async () => {
addUploadTaskAPI
.mockResolvedValueOnce({ code: 0, msg: '参数错误' })
.mockResolvedValueOnce({ code: 1, data: { id: 1 } })
const { activeType, fileList, message, onSubmit } = useCheckin()
activeType.value = 'audio'
message.value = '随便写点内容'
fileList.value = [
{ status: 'done', meta_id: 11, file_type: 'audio' }
]
await onSubmit({ subtask_id: 's1' })
expect(addUploadTaskAPI).toHaveBeenCalledTimes(2)
expect(addUploadTaskAPI.mock.calls[0][0]).toHaveProperty('files')
expect(addUploadTaskAPI.mock.calls[1][0]).toHaveProperty('meta_id')
expect(addUploadTaskAPI.mock.calls[1][0]).not.toHaveProperty('files')
expect(showToast).toHaveBeenCalledWith('提交成功')
})
it('混合附件且新结构失败时会提示分别提交', async () => {
addUploadTaskAPI.mockResolvedValueOnce({ code: 0, msg: '参数错误' })
const { activeType, fileList, message, onSubmit } = useCheckin()
activeType.value = 'image'
message.value = '随便写点内容'
fileList.value = [
{ status: 'done', meta_id: 11, file_type: 'image' },
{ status: 'done', meta_id: 12, file_type: 'audio' },
]
await onSubmit({ subtask_id: 's1' })
expect(addUploadTaskAPI).toHaveBeenCalledTimes(1)
expect(showToast).toHaveBeenCalledWith('当前接口暂不支持多类型附件,请分别提交')
})
})
......
......@@ -510,7 +510,42 @@ export function useCheckin() {
result = await addUploadTaskAPI(submitData)
}
if (result.code === 1) {
if (result?.code !== 1) {
const types = new Set((files || []).map(f => f.file_type).filter(Boolean))
const hasMixedTypes = types.size > 1
if (hasMixedTypes) {
showToast('当前接口暂不支持多类型附件,请分别提交')
return
}
const legacy_type = files?.[0]?.file_type || submitData.file_type || activeType.value
const legacy_meta_id = (files || []).filter(f => f.file_type === legacy_type).map(f => f.meta_id)
const legacy_payload = {
...extraData,
note: submitData.note,
file_type: legacy_type,
meta_id: legacy_meta_id,
makeup_time: submitData.makeup_time,
}
if (route.query.status === 'edit') {
result = await editUploadTaskInfoAPI({
i: route.query.post_id,
subtask_id: legacy_payload.subtask_id || route.query.subtask_id,
note: legacy_payload.note,
meta_id: legacy_payload.meta_id,
file_type: legacy_payload.file_type,
gratitude_form_list: legacy_payload.gratitude_form_list,
gratitude_count: legacy_payload.gratitude_count,
})
} else {
result = await addUploadTaskAPI(legacy_payload)
}
}
if (result?.code === 1) {
showToast('提交成功')
// 设置刷新标记,用于列表页更新数据
......@@ -524,6 +559,8 @@ export function useCheckin() {
}
router.back()
} else {
showToast(result?.msg || '提交失败,请重试')
}
} catch (error) {
showToast('提交失败,请重试')
......