Преглед изворни кода

fix(inspection): 修扫码开关状态丢失 + 打卡项目 itemType→itemCategory + 拍照回显写死

yangjingjing пре 1 дан
родитељ
комит
fa6ebd5aeb
2 измењених фајлова са 49 додато и 20 уклоњено
  1. 24 8
      src/views/risk/inspectionTask/index.vue
  2. 25 12
      src/views/risk/qualityInspectionTask/index.vue

+ 24 - 8
src/views/risk/inspectionTask/index.vue

@@ -281,7 +281,7 @@
           </el-table-column>
           <el-table-column label="项目大类" align="center" width="160">
             <template #default="scope">
-              <el-select v-model="scope.row.itemType" placeholder="请选择" size="small" style="width: 100%">
+              <el-select v-model="scope.row.itemCategory" placeholder="请选择" size="small" style="width: 100%">
                 <el-option v-for="dict in inspection_item_type_dict" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </template>
@@ -503,7 +503,7 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 interface InspectionItemForm {
   id?: number;
-  itemType: string;
+  itemCategory: string;
   itemContent: string;
   itemStandard: string;
   needPhoto: boolean;
@@ -757,7 +757,7 @@ const removeTimeSlot = (idx: number) => {
 
 const addInspectionItem = () => {
   form.value.itemList.push({
-    itemType: '',
+    itemCategory: '',
     itemContent: '',
     itemStandard: '',
     needPhoto: false
@@ -793,6 +793,10 @@ const handleUpdate = async (row: RiskInspectionTaskVo) => {
       form.value.storeName = opt.label;
     }
   }
+  // scanEnabled 后端返 '1'/'0' 字符串,el-switch 严格 boolean,统一转
+  if (form.value.scanEnabled !== undefined && form.value.scanEnabled !== null) {
+    form.value.scanEnabled = form.value.scanEnabled === '1' || form.value.scanEnabled === true;
+  }
   // 恢复时间配置
   if (res.data?.timeSlot) {
     timeSlotList.value = res.data.timeSlot.split(',').filter((s: string) => s);
@@ -808,10 +812,10 @@ const handleUpdate = async (row: RiskInspectionTaskVo) => {
     const itemRes = await listInspectionItemByTask(row.id);
     form.value.itemList = (itemRes.data || []).map((it: RiskInspectionItemVo) => ({
       id: it.id,
-      itemType: it.itemType,
+      itemCategory: it.itemCategory || it.itemType || '',
       itemContent: it.itemContent,
       itemStandard: it.itemStandard,
-      needPhoto: false
+      needPhoto: it.needPhoto === '1' || it.needPhoto === true
     }));
   } catch (e) {
     form.value.itemList = [];
@@ -959,13 +963,25 @@ const submitForm = () => {
       form.value.timeSlot = '';
       form.value.dayOfWeek = '';
     }
-    form.value.scanEnabled = form.value.scanEnabled ? '1' : '0';
+    // 构造提交 payload(把 boolean scanEnabled 转 '1'/'0',但不改 form.value 本身,
+    // 避免下次打开弹窗时状态不一致)
+    const payload: any = {
+      ...form.value,
+      scanEnabled: form.value.scanEnabled ? '1' : '0',
+      itemList: (form.value.itemList || []).map((it: any) => ({
+        ...it,
+        // 后端 entity 字段是 itemCategory
+        itemCategory: it.itemCategory || it.itemType || '',
+        // needPhoto 归一化:boolean true → '1', false → '0'
+        needPhoto: it.needPhoto ? '1' : '0'
+      }))
+    };
 
     if (form.value.id) {
-      await updateInspectionTask(form.value as RiskInspectionTaskBo);
+      await updateInspectionTask(payload as RiskInspectionTaskBo);
       proxy?.$modal.msgSuccess('修改成功');
     } else {
-      await addInspectionTask(form.value as RiskInspectionTaskBo);
+      await addInspectionTask(payload as RiskInspectionTaskBo);
       proxy?.$modal.msgSuccess('新增成功');
     }
     dialog.visible = false;

+ 25 - 12
src/views/risk/qualityInspectionTask/index.vue

@@ -282,7 +282,7 @@
           </el-table-column>
           <el-table-column label="项目大类" align="center" width="160">
             <template #default="scope">
-              <el-select v-model="scope.row.itemType" placeholder="请选择" size="small" style="width: 100%">
+              <el-select v-model="scope.row.itemCategory" placeholder="请选择" size="small" style="width: 100%">
                 <el-option v-for="dict in inspection_item_type_dict" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </template>
@@ -505,7 +505,7 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 interface InspectionItemForm {
   id?: number;
-  itemType: string;
+  itemCategory: string;
   itemContent: string;
   itemStandard: string;
   needPhoto: boolean;
@@ -758,7 +758,7 @@ const removeTimeSlot = (idx: number) => {
 
 const addInspectionItem = () => {
   form.value.itemList.push({
-    itemType: '',
+    itemCategory: '',
     itemContent: '',
     itemStandard: '',
     needPhoto: false
@@ -786,14 +786,18 @@ const handleUpdate = async (row: RiskInspectionTaskVo) => {
   }
   const res = await getQualityInspectionTask(row.id);
   Object.assign(form.value, res.data);
-  // 后端返回的 storeId 可能是 string(JSON 序列化大数防精度丢失),统一转 number 匹配 storeOptions
+  // 后端返回的 storeId 可能是 string(JSON 序列化大数防精度丢失),统一转 string 匹配 storeOptions
   if (form.value.storeId !== undefined && form.value.storeId !== null) {
-    form.value.storeId = Number(form.value.storeId);
+    form.value.storeId = String(form.value.storeId);
     const opt = storeOptions.value.find((s) => s.value === form.value.storeId);
     if (opt && !form.value.storeName) {
       form.value.storeName = opt.label;
     }
   }
+  // scanEnabled 后端返 '1'/'0' 字符串,el-switch 严格 boolean,统一转
+  if (form.value.scanEnabled !== undefined && form.value.scanEnabled !== null) {
+    form.value.scanEnabled = form.value.scanEnabled === '1' || form.value.scanEnabled === true;
+  }
   // 恢复时间配置
   if (res.data?.timeSlot) {
     timeSlotList.value = res.data.timeSlot.split(',').filter((s: string) => s);
@@ -809,10 +813,10 @@ const handleUpdate = async (row: RiskInspectionTaskVo) => {
     const itemRes = await listInspectionItemByTask(row.id);
     form.value.itemList = (itemRes.data || []).map((it: RiskInspectionItemVo) => ({
       id: it.id,
-      itemType: it.itemType,
+      itemCategory: it.itemCategory || it.itemType || '',
       itemContent: it.itemContent,
       itemStandard: it.itemStandard,
-      needPhoto: false
+      needPhoto: it.needPhoto === '1' || it.needPhoto === true
     }));
   } catch (e) {
     form.value.itemList = [];
@@ -946,13 +950,22 @@ const submitForm = () => {
       form.value.timeSlot = '';
       form.value.dayOfWeek = '';
     }
-    form.value.scanEnabled = form.value.scanEnabled ? '1' : '0';
+    // 构造提交 payload(不破坏 form.value 本身,避免下次打开状态不一致)
+    const payload: any = {
+      ...form.value,
+      scanEnabled: form.value.scanEnabled ? '1' : '0',
+      itemList: (form.value.itemList || []).map((it: any) => ({
+        ...it,
+        itemCategory: it.itemCategory || it.itemType || '',
+        needPhoto: it.needPhoto ? '1' : '0'
+      }))
+    };
 
     if (form.value.id) {
-      await updateQualityInspectionTask(form.value as RiskInspectionTaskBo);
+      await updateQualityInspectionTask(payload as RiskInspectionTaskBo);
       proxy?.$modal.msgSuccess('修改成功');
     } else {
-      await addQualityInspectionTask(form.value as RiskInspectionTaskBo);
+      await addQualityInspectionTask(payload as RiskInspectionTaskBo);
       proxy?.$modal.msgSuccess('新增成功');
     }
     dialog.visible = false;
@@ -1009,8 +1022,8 @@ const loadStores = async () => {
     storeOptions.value = list
       .filter((d: any) => d.deptCategory === '门店' || d.deptId === 100)
       .filter((d: any) => d.status === '0' || d.status === undefined || d.status === null)
-      .map((d: any) => ({ label: d.deptName, value: d.deptId }))
-      .sort((a, b) => a.value - b.value);
+      .map((d: any) => ({ label: d.deptName, value: String(d.deptId) }))
+      .sort((a, b) => Number(a.value) - Number(b.value));
   } catch (e) {
     console.error('加载门店列表失败', e);
     storeOptions.value = [];