hookehuyr

feat(打卡): 改进感恩表单数据复用逻辑

自动选中上次使用的感恩对象并优化选中逻辑
移除不再需要的gratitude_form_list处理代码
添加调试日志帮助追踪表单初始化过程
/*
* @Date: 2025-06-06 09:26:16
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-17 10:31:54
* @LastEditTime: 2025-12-17 10:59:17
* @FilePath: /mlaj/src/api/checkin.js
* @Description: 签到模块相关接口
*/
......@@ -195,6 +195,6 @@ export const getCheckinTeacherCheckedDatesAPI = (params) => fn(fetch.get(Api.CH
/**
* @description: 复用感恩表单数据
* @param subtask_id 小作业ID
* @returns
* @returns data: { gratitude_form_list 感恩表单数据 [{id,name,city,unit,其他信息字段}], last_used_list 最近使用的表单数据 [{id,name,city,unit,其他信息字段}] }
*/
export const reuseGratitudeFormAPI = (params) => fn(fetch.post(Api.CHECKIN_TEACHER_REUSE_GRATITUDE_FORM, params))
......
......@@ -70,9 +70,14 @@ const localFields = ref([])
// 监听弹窗显示状态、字段配置和初始值的变化
watch([() => props.show, () => props.fields, () => props.initialValues], ([showVal, fieldsVal, initialValuesVal]) => {
if (showVal) {
console.log('AddTargetDialog open:', {
fields: fieldsVal,
initialValues: initialValuesVal
})
// 初始化字段,添加 value 属性
localFields.value = fieldsVal.map(field => {
const val = (initialValuesVal && initialValuesVal[field.id]);
console.log(`Field ${field.id} init value:`, val);
return {
...field,
value: val || ''
......
<!--
* @Date: 2025-12-16 11:44:27
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-16 23:26:18
* @LastEditTime: 2025-12-17 11:27:12
* @FilePath: /mlaj/src/components/count/CheckinTargetList.vue
* @Description: 打卡动态对象列表组件
-->
......@@ -25,7 +25,7 @@
<div v-for="(item, index) in targetList" :key="index"
class="px-4 py-1.5 rounded-full text-sm transition-colors duration-200 border cursor-pointer select-none relative"
:style="[
selectedTargets.some(t => t.id === item.id) ? {
selectedTargets.some(t => (t.id && item.id && t.id == item.id) || (!t.id && t.name === item.name)) ? {
backgroundColor: '#4caf50',
color: '#ffffff',
borderColor: '#4caf50'
......
......@@ -398,9 +398,9 @@ export function useCheckin() {
if (data?.gratitude_count) {
gratitudeCount.value = data.gratitude_count
}
if (data?.gratitude_form_list && Array.isArray(data.gratitude_form_list)) {
gratitudeFormList.value = data.gratitude_form_list
}
// if (data?.gratitude_form_list && Array.isArray(data.gratitude_form_list)) {
// gratitudeFormList.value = data.gratitude_form_list
// }
// 更新选中的任务显示
if (subTaskId.value) {
......@@ -422,9 +422,9 @@ export function useCheckin() {
}
// 2. 恢复选中的对象
if (gratitudeFormList.value.length > 0 && handlers.setTargets) {
handlers.setTargets(gratitudeFormList.value)
}
// if (gratitudeFormList.value.length > 0 && handlers.setTargets) {
// handlers.setTargets(gratitudeFormList.value)
// }
// 3. 恢复次数
if (gratitudeCount.value && handlers.setCount) {
......
......@@ -224,11 +224,44 @@ const taskType = computed(() => route.query.task_type)
// 作业选择相关
const showTaskPicker = ref(false)
const taskOptions = ref([])
// 上次打卡的感恩表单数据
const lastUsedTargetList = ref([])
const fetchTargetList = async (subtask_id) => {
const { code, data } = await reuseGratitudeFormAPI({ subtask_id })
if (code) {
targetList.value = data || []
targetList.value = data.gratitude_form_list || []
lastUsedTargetList.value = data.last_used_list || []
// 自动选中上次使用的对象
if (lastUsedTargetList.value.length > 0) {
// 找出 lastUsedTargetList 中存在于 targetList 的项(并获取 targetList 中的完整对象引用)
const validTargets = []
lastUsedTargetList.value.forEach(lastItem => {
const targetItem = targetList.value.find(t =>
(lastItem.id && t.id && t.id == lastItem.id) ||
(!lastItem.id && lastItem.name === t.name)
)
if (targetItem) {
// 标记为已确认,避免再次弹出确认框
targetItem.has_confirmed = true
validTargets.push(targetItem)
}
})
// 将这些项加入 selectedTargets(去重)
validTargets.forEach(item => {
const exists = selectedTargets.value.some(t =>
(item.id && t.id && t.id == item.id) ||
(!item.id && t.name === item.name)
)
if (!exists) {
selectedTargets.value.push(item)
}
})
}
}
}
......@@ -293,6 +326,8 @@ const onConfirmTask = async ({ selectedOptions }) => {
// 如果是计数打卡,根据选中的作业ID查询计数对象
if (taskType.value === 'count') {
// 切换作业时,清空之前选中的对象,避免混淆
selectedTargets.value = []
await fetchTargetList(selectedTaskValue.value[0])
}
}
......@@ -953,15 +988,19 @@ onMounted(async () => {
await fetchTargetList(id)
}
},
setTargets: (list) => {
selectedTargets.value = list
},
// setTargets: (list) => {
// // 只有当 list 不为空时才覆盖,避免覆盖掉 fetchTargetList 中设置的默认选中项
// if (list && list.length > 0) {
// selectedTargets.value = list
// }
// },
setCount: (val) => {
countValue.value = val
}
})
console.warn(selectedTaskValue.value);
console.warn(selectedTargets.value);
})
</script>
......