瀏覽代碼

隐患排查修改以及月报

yanghao 2 天之前
父節點
當前提交
cbfcc55cc3

+ 54 - 18
src/views/pms/iotrydailyreport/components/equipment-form.vue

@@ -6,7 +6,7 @@ import { Close, Delete, Plus } from '@element-plus/icons-vue'
 
 defineOptions({ name: 'IotRyEquipmentReportForm' })
 
-type FormMode = 'create' | 'edit' | 'detail' | 'approval'
+type FormMode = 'create' | 'edit' | 'detail' | 'approval' | 'modify'
 
 interface EquipmentReportForm {
   id?: number
@@ -19,9 +19,11 @@ interface EquipmentReportForm {
   personnel: string
   auditStatus?: 0 | 10 | 20 | 30 | 40
   opinion?: string
+  modifyFlag?: 'Y'
 }
 
 interface ImproveReportDetail {
+  detailKey?: string
   projectName: string
   constructionDetail: string
   nextPlan: string
@@ -69,6 +71,8 @@ const auditStatusMap = {
   40: { label: '已取消', type: 'info' }
 } as const
 
+let detailKeySeed = 0
+
 const rules: FormRules = {
   title: [{ required: true, message: '请输入标题', trigger: ['blur', 'change'] }],
   createTime: [{ required: true, message: '请选择汇报时间', trigger: ['blur', 'change'] }],
@@ -83,7 +87,8 @@ const drawerTitle = computed(() => {
     create: '新建设备汇报',
     edit: '编辑设备汇报',
     detail: '查看设备汇报',
-    approval: '审批设备汇报'
+    approval: '审批设备汇报',
+    modify: '修改设备汇报'
   }
 
   return titleMap[formMode.value]
@@ -101,12 +106,18 @@ function getAuditStatus(status?: number) {
 
 function createDefaultDetail(): ImproveReportDetail {
   return {
+    detailKey: createDetailKey(),
     projectName: '',
     constructionDetail: '',
     nextPlan: ''
   }
 }
 
+function createDetailKey() {
+  detailKeySeed += 1
+  return `detail-${Date.now()}-${detailKeySeed}`
+}
+
 function getDefaultDetails() {
   return [createDefaultDetail()]
 }
@@ -117,12 +128,32 @@ function normalizeDetails(details?: ImproveReportDetail[]) {
   }
 
   return details.map((item) => ({
+    detailKey: item.detailKey || createDetailKey(),
     projectName: item.projectName || '',
     constructionDetail: item.constructionDetail || '',
     nextPlan: item.nextPlan || ''
   }))
 }
 
+function resolveDetailIndex(row: ImproveReportDetail) {
+  const index = form.value.improveReportDetails.findIndex(
+    (item) => item.detailKey === row.detailKey
+  )
+  return index >= 0 ? index : 0
+}
+
+function getDetailFieldProp(row: ImproveReportDetail, field: keyof ImproveReportDetail) {
+  return `improveReportDetails.${resolveDetailIndex(row)}.${field}`
+}
+
+function getDetailRowKey(row: ImproveReportDetail) {
+  return row.detailKey || ''
+}
+
+function getSubmitDetails(details: ImproveReportDetail[]) {
+  return details.map(({ detailKey: _detailKey, ...item }) => item)
+}
+
 function toFormData(row?: any): EquipmentReportForm {
   if (!row) return { ...defaultForm, improveReportDetails: getDefaultDetails() }
 
@@ -171,13 +202,12 @@ function addImproveReportDetail() {
   form.value.improveReportDetails.push(createDefaultDetail())
 }
 
-function removeImproveReportDetail(index: number) {
+function removeImproveReportDetail(row: ImproveReportDetail) {
   if (form.value.improveReportDetails.length <= 1) {
-    form.value.improveReportDetails = getDefaultDetails()
     return
   }
 
-  form.value.improveReportDetails.splice(index, 1)
+  form.value.improveReportDetails.splice(resolveDetailIndex(row), 1)
 }
 
 async function submitForm() {
@@ -187,7 +217,11 @@ async function submitForm() {
     formLoading.value = true
     await formRef.value.validate()
 
-    const data = { ...form.value, createTime: Number(form.value.createTime) }
+    const data = {
+      ...form.value,
+      createTime: Number(form.value.createTime),
+      improveReportDetails: getSubmitDetails(form.value.improveReportDetails)
+    }
 
     if (data.id) {
       await IotRyImproveDailyReportApi.updateIotRyImproveDailyReport({
@@ -198,9 +232,10 @@ async function submitForm() {
         workPurpose: data.workPurpose,
         relocationDays: Number(data.relocationDays),
         personnel: data.personnel,
-        improveReportDetails: data.improveReportDetails
+        improveReportDetails: data.improveReportDetails,
+        ...(formMode.value === 'modify' ? { modifyFlag: 'Y' as const } : {})
       })
-      message.success('编辑成功')
+      message.success(formMode.value === 'modify' ? '修改成功' : '编辑成功')
       await props.loadList()
     } else {
       await IotRyImproveDailyReportApi.createIotRyImproveDailyReport({
@@ -353,14 +388,15 @@ defineExpose({ handleOpenForm })
               :data="form.improveReportDetails"
               :loading="false"
               class="detail-table"
+              :row-key="getDetailRowKey"
               :show-border="true"
               :show-overflow-tooltip="false">
               <ZmTableColumn label="项目名称" prop="projectName" :width="220">
-                <template #default="{ row, $index }">
+                <template #default="{ row }">
                   <el-form-item
                     class="mb-0!"
                     :show-message="false"
-                    :prop="`improveReportDetails.${$index}.projectName`"
+                    :prop="getDetailFieldProp(row, 'projectName')"
                     :rules="{
                       required: true,
                       message: '请输入项目名称',
@@ -376,11 +412,11 @@ defineExpose({ handleOpenForm })
               </ZmTableColumn>
 
               <ZmTableColumn label="施工动态" min-width="280">
-                <template #default="{ row, $index }">
+                <template #default="{ row }">
                   <el-form-item
                     class="mb-0!"
                     :show-message="false"
-                    :prop="`improveReportDetails.${$index}.constructionDetail`"
+                    :prop="getDetailFieldProp(row, 'constructionDetail')"
                     :rules="{
                       required: true,
                       message: '请输入施工动态',
@@ -399,11 +435,11 @@ defineExpose({ handleOpenForm })
               </ZmTableColumn>
 
               <ZmTableColumn label="下步计划" min-width="240">
-                <template #default="{ row, $index }">
+                <template #default="{ row }">
                   <el-form-item
                     class="mb-0!"
                     :show-message="false"
-                    :prop="`improveReportDetails.${$index}.nextPlan`"
+                    :prop="getDetailFieldProp(row, 'nextPlan')"
                     :rules="{
                       required: true,
                       message: '请输入下步计划',
@@ -422,13 +458,13 @@ defineExpose({ handleOpenForm })
               </ZmTableColumn>
 
               <ZmTableColumn label="操作" width="90" fixed="right">
-                <template #default="{ $index }">
+                <template #default="{ row }">
                   <el-button
                     link
                     type="danger"
                     :icon="Delete"
-                    @click="removeImproveReportDetail($index)"
-                    :disabled="mainFieldDisabled">
+                    @click="removeImproveReportDetail(row)"
+                    :disabled="mainFieldDisabled || form.improveReportDetails.length <= 1">
                     删除
                   </el-button>
                 </template>
@@ -453,7 +489,7 @@ defineExpose({ handleOpenForm })
 
     <template #footer>
       <el-button
-        v-if="formMode === 'create' || formMode === 'edit'"
+        v-if="formMode === 'create' || formMode === 'edit' || formMode === 'modify'"
         size="default"
         type="primary"
         @click="submitForm"

+ 12 - 2
src/views/pms/iotrydailyreport/equipment.vue

@@ -90,7 +90,10 @@ function getAuditStatus(status?: number) {
   return auditStatusMap[status as keyof typeof auditStatusMap] || auditStatusMap[0]
 }
 
-function handleOpenForm(type: 'create' | 'edit' | 'detail' | 'approval', row?: ReportRow) {
+function handleOpenForm(
+  type: 'create' | 'edit' | 'detail' | 'approval' | 'modify',
+  row?: ReportRow
+) {
   formRef.value?.handleOpenForm(type, row)
 }
 
@@ -182,11 +185,18 @@ onMounted(() => {
                   </el-tag>
                 </template>
               </zm-table-column>
-              <zm-table-column label="操作" width="160" fixed="right" action>
+              <zm-table-column label="操作" width="200" fixed="right" action>
                 <template #default="{ row }">
                   <el-button link type="primary" @click="handleOpenForm('detail', row)">
                     查看
                   </el-button>
+                  <el-button
+                    link
+                    type="primary"
+                    @click="handleOpenForm('modify', row)"
+                    v-hasPermi="['pms:iot-ry-improve-daily-report:modify']">
+                    修改
+                  </el-button>
                   <el-button
                     v-if="row.status === 0"
                     link