hookehuyr

feat(打卡): 重构计数打卡功能,支持表单数据复用

- 修改计数对象为列表项,增加确认模式
- 重构动态表单字段处理逻辑
- 更新API接口参数为gratitude_form_list
- 优化计数打卡的提交逻辑
/*
* @Date: 2025-06-06 09:26:16
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-16 11:52:53
* @LastEditTime: 2025-12-16 17:54:43
* @FilePath: /mlaj/src/api/checkin.js
* @Description: 签到模块相关接口
*/
......@@ -22,6 +22,7 @@ const Api = {
CHECKIN_TEACHER_LIST: '/srv/?a=checkin&t=teacher_list',
CHECKIN_TEACHER_REVIEW: '/srv/?a=checkin&t=teacher_review',
CHECKIN_TEACHER_CHECKED_DATES: '/srv/?a=checkin&t=teacher_checked_dates',
CHECKIN_TEACHER_REUSE_GRATITUDE_FORM: '/srv/?a=checkin&t=reuse_gratitude_form',
}
/**
......@@ -75,7 +76,7 @@ export const checkinTaskAPI = (params) => fn(fetch.post(Api.TASK_CHECKIN, param
* @param file_type 上传附件的类型 image=上传图片,video=视频,audio=音频
* @param makeup_time 补卡时间
* @param gratitude_count 感恩次数
* @param gratitude_people_ids 感恩对象ID数组 [id1,id2,id3]
* @param gratitude_form_list 感恩表单数据 [{id,name,city,unit,其他信息字段}]
* @returns
*/
export const addUploadTaskAPI = (params) => fn(fetch.post(Api.TASK_UPLOAD_ADD, params))
......@@ -106,7 +107,7 @@ export const getUploadTaskListAPI = (params) => fn(fetch.post(Api.TASK_UPLOAD_L
* avatar 打卡人头像, created_time 打卡时间, created_time_desc 打卡时间描述, note 打卡内容, files[{meta_id,name,value,extension}] 附件列表,
* file_type 上传附件的类型 image=上传图片,video=视频,audio=音频, like_count 点赞数, is_my 是不是我的打卡, is_like 我是否已经点赞, is_makeup 是否补卡
* gratitude_count 感恩次数
* gratitude_people 感恩对象列表 [{id,name,city,unit}]
* gratitude_form_list 感恩表单数据 [{id,name,city,unit,其他信息字段}]
* }
*/
export const getUploadTaskInfoAPI = (params) => fn(fetch.get(Api.TASK_UPLOAD_INFO, params))
......@@ -118,7 +119,7 @@ export const getUploadTaskInfoAPI = (params) => fn(fetch.get(Api.TASK_UPLOAD_IN
* @param meta_id[] 附件ID列表
* @param file_type 上传附件的类型 image=上传图片,video=视频,audio=音频
* @param gratitude_count 感恩次数
* @param gratitude_people_ids 感恩对象ID数组 [id1,id2,id3]
* @param gratitude_form_list 感恩表单数据 [{id,name,city,unit,其他信息字段}]
* @returns
*/
export const editUploadTaskInfoAPI = (params) => fn(fetch.get(Api.TASK_UPLOAD_EDIT, params))
......@@ -183,3 +184,10 @@ export const checkinTaskReviewAPI = (params) => fn(fetch.post(Api.CHECKIN_TEACH
* @returns data: { my_checkin_dates 已打卡日期列表 }
*/
export const getCheckinTeacherCheckedDatesAPI = (params) => fn(fetch.get(Api.CHECKIN_TEACHER_CHECKED_DATES, params))
/**
* @description: 复用感恩表单数据
* @param subtask_id 小作业ID
* @returns
*/
export const reuseGratitudeFormAPI = (params) => fn(fetch.post(Api.CHECKIN_TEACHER_REUSE_GRATITUDE_FORM, params))
......
/*
* @Date: 2025-06-06 09:26:16
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-16 13:59:55
* @LastEditTime: 2025-12-16 17:52:19
* @FilePath: /mlaj/src/api/gratitude.js
* @Description: 计数模块相关接口
*/
......
......@@ -12,7 +12,7 @@
<div v-for="field in localFields" :key="field.id">
<van-field
v-model="field.value"
label-width="4rem"
label-width="5rem"
:label="field.label"
:placeholder="'请输入' + field.label"
:type="field.type === 'textarea' ? 'textarea' : 'text'"
......@@ -43,7 +43,7 @@ const props = defineProps({
*/
title: {
type: String,
default: '添加对象'
default: '添加列表项'
},
/**
* 表单字段配置
......@@ -101,14 +101,8 @@ const onBeforeClose = (action) => {
}
}
// 收集表单数据
const formData = localFields.value.reduce((acc, field) => {
acc[field.id] = field.value
return acc
}, {})
// 触发确认事件,传递表单数据
emit('confirm', formData)
// 触发确认事件,传递表单数据 (保持与 fields 结构一致)
emit('confirm', localFields.value)
return true // 允许关闭
}
return true // 取消时允许关闭
......
<!--
* @Date: 2025-12-16 11:44:27
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-16 14:17:38
* @LastEditTime: 2025-12-16 17:59:29
* @FilePath: /mlaj/src/components/count/CheckinTargetList.vue
* @Description: 打卡动态对象列表组件
-->
......@@ -9,7 +9,7 @@
<div class="mb-4">
<div class="flex justify-between items-center mb-2 mx-2">
<div class="flex items-center gap-2">
<div class="text-sm font-bold text-gray-700">{{ dynamicFieldText }}对象</div>
<div class="text-sm font-bold text-gray-700">{{ dynamicFieldText }}列表</div>
<div class="text-xs text-gray-400 font-normal scale-90 origin-left">(长按可编辑/删除)</div>
</div>
<van-button size="small" type="primary" plain icon="plus" @click="onAdd" class="!h-7">添加</van-button>
......@@ -49,7 +49,7 @@
</div>
</template>
<div v-else class="w-full text-center py-4 text-gray-400 text-sm">
暂无{{ dynamicFieldText }}对象,请点击上方添加按钮
暂无{{ dynamicFieldText }}列表,请点击上方添加按钮
</div>
</div>
</div>
......
......@@ -307,13 +307,20 @@ export function useCheckin() {
let result
if (route.query.status === 'edit') {
// 编辑打卡
result = await editUploadTaskInfoAPI({
const editData = {
i: route.query.post_id,
subtask_id: submitData.subtask_id || route.query.subtask_id,
note: submitData.note,
meta_id: submitData.meta_id,
file_type: submitData.file_type,
})
}
// 如果有计数对象列表,也需要传递
if (submitData.gratitude_form_list) {
editData.gratitude_form_list = submitData.gratitude_form_list
}
result = await editUploadTaskInfoAPI(editData)
} else {
// 新增打卡
result = await addUploadTaskAPI(submitData)
......
This diff is collapsed. Click to expand it.