Ver código fonte

Merge branch 'feat/production-safety-evaluation' into feat/production-safety

xiaweibo 3 meses atrás
pai
commit
e4c2ced280

+ 2 - 5
src/api/evaluationSystem/index.ts

@@ -438,14 +438,11 @@ export function updateSecurityExamineIssueReviewAgree(params: UpdateSecurityExam
 /**
  * 管理员端复核不通过
  */
-export function updateSecurityExamineIssueReviewDisagree(id: number, reviewRejectReson?: string) {
+export function updateSecurityExamineIssueReviewDisagree(data: { id: number; reviewRejectReson?: string }) {
   return http.request({
     url: '/securityExamine/admin/updateSecurityExamineIssueReviewDisagree',
     method: 'put',
-    data: {
-      id,
-      reviewRejectReson,
-    },
+    data,
   });
 }
 

+ 2 - 2
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanManagement/components/areaCheckPlanManagementDetail.vue

@@ -5,7 +5,7 @@
       <div class="view-summary__title">一级危险点:{{ viewDetail.checkVenue || '-' }}</div>
       <div class="view-summary__meta">
         <span>检查类别:{{ viewDetail.venueCategoryName || '-' }}</span>
-        <span>创建人:{{ viewDetail.createdBy || '-' }}</span>
+        <span>创建人:{{ viewDetail. createdPersonName || '-' }}</span>
         <span>创建时间:{{ viewDetail.createdAt || '-' }}</span>
       </div>
     </section>
@@ -651,7 +651,7 @@
       needInspectedSign: d?.needInspectedSign ?? ruleFormData.needInspectedSign,
       planStartTime: d?.planStartTime ?? ruleFormData.planStartTime ?? '-',
       planEndTime: d?.planEndTime ?? ruleFormData.planEndTime ?? '-',
-      createdBy: d?.createdBy ?? '-',
+       createdPersonName: d?. createdPersonName ?? '-',
       createdAt: d?.createdAt ?? '-',
       businessWork: d?.businessWork ?? '-',
     };

+ 2 - 2
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanManagementDept/components/areaCheckPlanManagementDeptDetail.vue

@@ -5,7 +5,7 @@
       <div class="view-summary__title">一级危险点:{{ viewDetail.checkVenue || '-' }}</div>
       <div class="view-summary__meta">
         <span>检查类别:{{ viewDetail.venueCategoryName || '-' }}</span>
-        <span>创建人:{{ viewDetail.createdBy || '李小红' }}</span>
+        <span>创建人:{{ viewDetail. createdPersonName || '李小红' }}</span>
         <span>创建时间:{{ viewDetail.createdAt || '2026-01-06 12:20:30' }}</span>
       </div>
     </section>
@@ -381,7 +381,7 @@
       needInspectedSign: d?.needInspectedSign,
       planStartTime: d?.planStartTime ?? '-',
       planEndTime: d?.planEndTime ?? '-',
-      createdBy: d?.createdBy ?? '李小红',
+      createdPersonName: d?. createdPersonName ?? '李小红',
       createdAt: d?.createdAt ?? '2026-01-06 12:20:30',
       businessWork: d?.businessWork ?? '动火作业',
     };

+ 4 - 1
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanManagementDept/components/areaCheckPlanRecordDetailDept.vue

@@ -153,7 +153,10 @@
 
   const handleUploadSuccess = (files: FileItem[]) => {
     signFileList.value = files;
-    formData.value.signFile = files.map((f) => f.fileName || f.fileUrl).filter(Boolean).join(',');
+    formData.value.signFile = files
+      .map((f) => f.fileUrl || f.fileName)
+      .filter(Boolean)
+      .join(',');
   };
 
   const handleBack = () => {

+ 58 - 47
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/components/OneByOneAuditDetail.vue

@@ -63,24 +63,31 @@
             <div class="col">
               <div class="label">上传附件:</div>
               <div class="value value--attachment">
-                <div class="attachment-list">
+                <template v-if="attachmentFileList.length">
                   <div
-                    v-for="(item, index) in attachmentList"
-                    :key="index"
-                    class="attachment-item"
+                    class="file-container--div"
+                    v-for="item in attachmentFileList"
+                    :key="item.fileUrl || item.fileName"
                   >
-                    <span class="attachment-item--name">{{ item.fileName || item.fileNameOrUrl }}</span>
-                    <el-button
-                      v-if="item.fileUrl || item.url"
-                      type="primary"
-                      link
-                      @click="handlePreview(item)"
+                    <img
+                      class="file-container--div__icon"
+                      :src="FILE_TYPE_ICON[item.fileType]"
+                      @click="previewOnline(item.fileUrl, item.fileType)"
+                    />
+                    <span
+                      class="file-container--div__name"
+                      @click="previewOnline(item.fileUrl, item.fileType)"
                     >
-                      预览
-                    </el-button>
+                      {{ item.fileName }}
+                    </span>
+                    <img
+                      class="file-container--div__download"
+                      :src="DownloadIcon"
+                      @click="downloadFile(item.fileUrl, item.fileName)"
+                    />
                   </div>
-                </div>
-                <span v-if="!attachmentList.length" class="empty-text">-</span>
+                </template>
+                <span v-else class="empty-text">-</span>
               </div>
             </div>
           </div>
@@ -125,6 +132,9 @@
   import { Document } from '@element-plus/icons-vue';
   import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
   import { getDrawLessonsAdminDetail, approveDrawLessons } from '@/api/drawLessons';
+  import { FILE_TYPE_ICON } from '@/components/UploadFiles/constants';
+  import DownloadIcon from '@/views/disaster/disaster-control/src/svg/download.svg';
+  import { downloadFile } from '@/views/disaster/utils';
 
   const router = useRouter();
   const route = useRoute();
@@ -150,17 +160,44 @@
   const submitting = ref(false);
   const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
 
-  const attachmentList = computed(() => {
+  const attachmentFileList = computed(() => {
     const d = detailData.value;
     if (!d) return [];
-    if (Array.isArray(d.attachmentList) && d.attachmentList.length) return d.attachmentList;
+    const normalize = (items: Array<{ fileUrl?: string; url?: string; fileName?: string; fileNameOrUrl?: string }>) => {
+      return items.map((raw, index) => {
+        const url = raw.fileUrl || raw.url || raw.fileNameOrUrl || '';
+        const nameFromData = raw.fileName || raw.fileNameOrUrl;
+        const fileName = nameFromData || (url ? url.split('/').pop() || `附件${index + 1}` : `附件${index + 1}`);
+        const ext = fileName.split('.').pop()?.toLowerCase() || '';
+        let fileType: 'pdf' | 'word' | 'excel' | 'ppt' = 'pdf';
+        if (ext === 'doc' || ext === 'docx') fileType = 'word';
+        else if (ext === 'xls' || ext === 'xlsx') fileType = 'excel';
+        else if (ext === 'ppt' || ext === 'pptx') fileType = 'ppt';
+        return {
+          fileUrl: url,
+          fileName,
+          fileType,
+        };
+      });
+    };
+    if (Array.isArray(d.attachmentList) && d.attachmentList.length) {
+      return normalize(d.attachmentList);
+    }
     if (!d.attachments) return [];
     try {
       const parsed = JSON.parse(d.attachments);
-      return Array.isArray(parsed) ? parsed : [];
+      if (Array.isArray(parsed) && parsed.length) {
+        return normalize(parsed as Array<{ fileUrl?: string; url?: string; fileName?: string; fileNameOrUrl?: string }>);
+      }
     } catch {
-      return d.attachments.split(',').filter(Boolean).map((s) => ({ fileNameOrUrl: s.trim(), fileUrl: s.trim() }));
+      const list = d.attachments
+        .split(',')
+        .map((s) => s.trim())
+        .filter(Boolean)
+        .map((s) => ({ fileNameOrUrl: s, fileUrl: s }));
+      if (list.length) return normalize(list);
     }
+    return [];
   });
 
   const getDetail = async () => {
@@ -191,9 +228,8 @@
     }
   };
 
-  const handlePreview = (item: { fileUrl?: string; url?: string }) => {
-    const url = item.fileUrl || item.url;
-    if (url) previewOnlineRef.value?.open(url, 'pdf');
+  const previewOnline = (url: string | undefined, type: string) => {
+    if (url) previewOnlineRef.value?.open(url, type);
   };
 
   const handleReject = () => {
@@ -253,6 +289,7 @@
 <style scoped lang="scss">
   @use '@/styles/page-details-layout.scss' as *;
   @use '@/styles/page-main-layout.scss' as *;
+  @use '@/styles/basic-table-file.scss' as *;
 
   .detail-content {
     display: flex;
@@ -357,32 +394,6 @@
         flex-wrap: wrap;
         align-items: flex-start;
 
-        .attachment-list {
-          display: grid;
-          grid-template-columns: 1fr 1fr;
-          gap: 12px 24px;
-          width: 100%;
-        }
-
-        .attachment-item {
-          display: flex;
-          align-items: center;
-          gap: 8px;
-          font-size: 14px;
-
-          .attachment-item--name {
-            color: #333;
-            flex: 1;
-            min-width: 0;
-            overflow: hidden;
-            text-overflow: ellipsis;
-          }
-
-          .el-button--primary.is-link {
-            flex-shrink: 0;
-          }
-        }
-
         .empty-text {
           color: #999;
         }

+ 59 - 46
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagementDept/components/oneByOneManagementDeptDetail.vue

@@ -81,24 +81,31 @@
             <div class="col">
               <div class="label">上传附件:</div>
               <div class="value value--attachment">
-                <div class="attachment-list">
+                <template v-if="attachmentFileList.length">
                   <div
-                    v-for="(item, index) in attachmentList"
-                    :key="index"
-                    class="attachment-item"
+                    class="file-container--div"
+                    v-for="item in attachmentFileList"
+                    :key="item.fileUrl || item.fileName"
                   >
-                    <span class="attachment-item--name">{{ item.fileName || item.fileNameOrUrl }}</span>
-                    <el-button
-                      v-if="item.fileUrl || item.url"
-                      type="primary"
-                      link
-                      @click="handlePreview(item)"
+                    <img
+                      class="file-container--div__icon"
+                      :src="FILE_TYPE_ICON[item.fileType]"
+                      @click="previewOnline(item.fileUrl, item.fileType)"
+                    />
+                    <span
+                      class="file-container--div__name"
+                      @click="previewOnline(item.fileUrl, item.fileType)"
                     >
-                      预览
-                    </el-button>
+                      {{ item.fileName }}
+                    </span>
+                    <img
+                      class="file-container--div__download"
+                      :src="DownloadIcon"
+                      @click="downloadFile(item.fileUrl, item.fileName)"
+                    />
                   </div>
-                </div>
-                <span v-if="!attachmentList.length" class="empty-text">-</span>
+                </template>
+                <span v-else class="empty-text">-</span>
               </div>
             </div>
           </div>
@@ -199,6 +206,9 @@
   import { formatAttachmentList } from '@/components/UploadFiles/utils';
   import { getDrawLessonsAdminDetail } from '@/api/drawLessons';
   import { submitDrawLessonsDeptFeedback, type DeptFeedbackRequest } from '@/api/drawLessons';
+  import { FILE_TYPE_ICON } from '@/components/UploadFiles/constants';
+  import DownloadIcon from '@/views/disaster/disaster-control/src/svg/download.svg';
+  import { downloadFile } from '@/views/disaster/utils';
 
   const router = useRouter();
   const route = useRoute();
@@ -240,27 +250,51 @@
     }>;
   } | null>(null);
 
-  /** 附件列表(从详情 attachments / attachmentList 解析,无数据时为空) */
-  const attachmentList = computed(() => {
+  /** 附件列表(从详情 attachments / attachmentList 解析,无数据时为空),样式与安全考核管理列表「考核文档」一致 */
+  const attachmentFileList = computed(() => {
     const d = detailData.value;
     if (!d) return [];
-    if (Array.isArray(d.attachmentList) && d.attachmentList.length) return d.attachmentList;
+    const normalize = (items: Array<{ fileUrl?: string; url?: string; fileName?: string; fileNameOrUrl?: string }>) => {
+      return items.map((raw, index) => {
+        const url = raw.fileUrl || raw.url || raw.fileNameOrUrl || '';
+        const nameFromData = raw.fileName || raw.fileNameOrUrl;
+        const fileName = nameFromData || (url ? url.split('/').pop() || `附件${index + 1}` : `附件${index + 1}`);
+        const ext = fileName.split('.').pop()?.toLowerCase() || '';
+        let fileType: 'pdf' | 'word' | 'excel' | 'ppt' = 'pdf';
+        if (ext === 'doc' || ext === 'docx') fileType = 'word';
+        else if (ext === 'xls' || ext === 'xlsx') fileType = 'excel';
+        else if (ext === 'ppt' || ext === 'pptx') fileType = 'ppt';
+        return {
+          fileUrl: url,
+          fileName,
+          fileType,
+        };
+      });
+    };
+    if (Array.isArray(d.attachmentList) && d.attachmentList.length) {
+      return normalize(d.attachmentList);
+    }
     if (d.attachments) {
       try {
         const parsed = JSON.parse(d.attachments);
-        if (Array.isArray(parsed) && parsed.length) return parsed;
+        if (Array.isArray(parsed) && parsed.length) {
+          return normalize(parsed as Array<{ fileUrl?: string; url?: string; fileName?: string; fileNameOrUrl?: string }>);
+        }
       } catch {
-        const list = d.attachments.split(',').filter(Boolean).map((s) => ({ fileNameOrUrl: s.trim(), fileUrl: s.trim() }));
-        if (list.length) return list;
+        const list = d.attachments
+          .split(',')
+          .map((s) => s.trim())
+          .filter(Boolean)
+          .map((s) => ({ fileNameOrUrl: s, fileUrl: s }));
+        if (list.length) return normalize(list);
       }
     }
     return [];
   });
 
-  function handlePreview(item: { fileUrl?: string; url?: string }) {
-    const url = item.fileUrl || item.url;
-    if (url) previewOnlineRef.value?.open(url, 'pdf');
-  }
+  const previewOnline = (url: string | undefined, type: string) => {
+    if (url) previewOnlineRef.value?.open(url, type);
+  };
 
   function handleMaterialUploadSuccess(fileList: FileItem[]) {
     materialAttachmentList.value = fileList;
@@ -383,6 +417,7 @@
 <style scoped lang="scss">
   @use '@/styles/page-details-layout.scss' as *;
   @use '@/styles/page-main-layout.scss' as *;
+  @use '@/styles/basic-table-file.scss' as *;
 
   .detail-content {
     display: flex;
@@ -507,28 +542,6 @@
           flex-wrap: wrap;
           align-items: flex-start;
 
-          .attachment-list {
-            display: grid;
-            grid-template-columns: 1fr 1fr;
-            gap: 12px 24px;
-            width: 100%;
-          }
-
-          .attachment-item {
-            display: flex;
-            align-items: center;
-            gap: 8px;
-            font-size: 14px;
-
-            .attachment-item--name {
-              color: #333;
-              flex: 1;
-              min-width: 0;
-              overflow: hidden;
-              text-overflow: ellipsis;
-            }
-          }
-
           .empty-text {
             color: #999;
           }

+ 3 - 1
src/views/production-safety/safetyAssessment/evaluationDepartment/components/EvaluationDepartmentFeedback.vue

@@ -64,6 +64,7 @@
               />
             </template>
           </el-table-column>
+          <el-table-column label="复核不通过原因" prop="reviewRejectReson" min-width="220"></el-table-column>
         </el-table>
       </div>
     </div>
@@ -282,7 +283,7 @@
       // 映射表单字段
       ruleFormData.value.evaluationTitle = detail.exName || ''; // 考核表名称
       ruleFormData.value.attachmentDocument = parseAttachmentsToFileList(detail.attachments); // 附件文档
-      ruleFormData.value.scoringDescription = ''; // 评分说明(接口暂无此字段,留空)
+      ruleFormData.value.scoringDescription = detail.ratingDescribe; // 评分说明(接口暂无此字段,留空)
 
       // 映射考核项目列表(scores 数组)
       if (detail.scores && detail.scores.length > 0) {
@@ -296,6 +297,7 @@
           scoringMethod: score.scoringWay || '', // 评分方式
           selfScore: score.selfScore || 0, // 自评得分
           materialDescription: score.attachments || '', // 资料说明(使用附件字段,字符串)
+          reviewRejectReson: score.reviewRejectReson || '', // 复核不通过原因
           attachmentFileList: parseAttachmentsToFileList(score.attachments || ''), // 对应的附件文件列表
         }));
       } else {

+ 34 - 5
src/views/production-safety/safetyAssessment/evaluationSystem/components/EvaluationSystemFeedback.vue

@@ -14,7 +14,11 @@
       </el-form-item>
       <el-form-item label="上传附件文档:" prop="attachmentDocument">
         <div class="upload-files-disabled">
-          <UploadFiles label="上传附件" :file-list="ruleFormData.attachmentDocument" @uploadSuccess="handleUploadSuccess" />
+          <UploadFiles
+            label="上传附件"
+            :file-list="ruleFormData.attachmentDocument"
+            @uploadSuccess="handleUploadSuccess"
+          />
         </div>
       </el-form-item>
       <el-form-item label="评分说明:" prop="scoringDescription">
@@ -84,6 +88,18 @@
               <span v-else>{{ scope.row.reviewScore || 0 }}</span>
             </template>
           </el-table-column>
+          <el-table-column label="复核不通过原因" prop="reviewRejectReson" min-width="220">
+            <template #default="scope">
+              <el-input
+                v-if="scope.row.isReviewInput"
+                v-model="scope.row.reviewRejectReson"
+                type="textarea"
+                :rows="2"
+                placeholder="请输入复核不通过原因"
+              />
+              <span v-else>{{ scope.row.reviewRejectReson || '-' }}</span>
+            </template>
+          </el-table-column>
         </el-table>
       </div>
     </div>
@@ -122,6 +138,7 @@
   import { useRouter, useRoute } from 'vue-router';
   import { ElMessage } from 'element-plus';
   import type { FormInstance } from 'element-plus';
+  import UploadFiles from '@/components/UploadFiles/UploadFiles.vue';
   import {
     querySecurityExamineIssueDetail,
     updateSecurityExamineIssueReviewSubmit,
@@ -162,7 +179,7 @@
     }
     // 如果是评分模式,根据 isSelfApproveButton 决定按钮文字
     if (isSelfApproveButton.value) {
-      return '复核同意';
+      return '提交';
     }
     return '复核提交';
   });
@@ -282,6 +299,7 @@
   };
 
   const handleUploadSuccess = (files: any[]) => {
+    // 评分页顶部附件只读展示,这里仅保持与 UploadFiles 事件兼容
     ruleFormData.value.attachmentDocument = files;
   };
 
@@ -446,7 +464,7 @@
       // 映射表单字段
       ruleFormData.value.evaluationTitle = detail.exName || ''; // 考核表名称
       ruleFormData.value.attachmentDocument = parseAttachmentsToFileList(detail.attachments); // 附件文档
-      ruleFormData.value.scoringDescription = ''; // 评分说明(接口暂无此字段,留空)
+      ruleFormData.value.scoringDescription =  detail.ratingDescribe; // 评分说明(接口暂无此字段,留空)
 
       // 映射考核项目列表(scores 数组)
       if (detail.scores && detail.scores.length > 0) {
@@ -461,9 +479,10 @@
           selfScore: score.selfScore || 0, // 自评得分
           reviewUserName: score.reviewUserName || '-', // 复核人姓名(从详情顶层获取)
           reviewScore: score.reviewScore || 0, // 复核得分
+          reviewRejectReson: score.reviewRejectReson || '', // 复核不通过原因
           materialDescription: score.attachments || '', // 资料说明(使用附件字段,字符串)
           attachmentFileList: parseAttachmentsToFileList(score.attachments || ''), // 资料说明对应的附件文件列表
-          isReviewInput: score.isReviewInput == true, // 是否显示复核得分输入框
+          isReviewInput: detail.isSelfApproveButton == true, // 是否显示复核得分输入框
         }));
       } else {
         evaluationItems.value = [];
@@ -517,6 +536,7 @@
             return {
               ...score,
               reviewScore: item ? Number(item.reviewScore) || 0 : score.reviewScore || 0,
+              reviewRejectReson: item ? item.reviewRejectReson || '' : score.reviewRejectReson || '',
               isAdd: item
                 ? item.isAdd !== undefined
                   ? item.isAdd
@@ -569,7 +589,12 @@
 
     try {
       if (rejectType.value === 'review') {
-        await updateSecurityExamineIssueReviewDisagree(props.id, rejectReason.value.trim());
+        const submitData = {
+          id: props.id,
+          reviewRejectReson: rejectReason.value.trim(),
+          scores: evaluationItems.value,
+        };
+        await updateSecurityExamineIssueReviewDisagree(submitData);
         ElMessage.success('复核不通过操作成功');
       } else {
         await updateSecurityExamineIssueApproveDisagree(props.id, rejectReason.value.trim());
@@ -632,6 +657,10 @@
     width: 100%;
   }
 
+  .upload-files-wrapper {
+    width: 100%;
+  }
+
   .upload-files-disabled {
     pointer-events: none;
     opacity: 0.6;

+ 6 - 6
src/views/production-safety/safetyAssessment/evaluationSystem/evaluationSystem.vue

@@ -212,19 +212,19 @@
               <el-option v-for="item in userGroupOptions" :key="item.id" :label="item.name" :value="item.id" />
             </el-select>
           </el-form-item>
-          <el-form-item label="部门自评审核人:">
+          <el-form-item label="部门核人:">
             <el-select
               v-model="issueForm.deptSelfApproveUserId"
-              placeholder="请选择部门自评审核人"
+              placeholder="请选择部门核人"
               filterable
               clearable
               style="width: 100%"
             >
               <el-option
                 v-for="user in deptSelfApproveUserList"
-                :key="user.id"
-                :label="user.realname"
-                :value="user.id"
+                :key="user.value"
+                :label="user.label"
+                :value="user.value"
               />
             </el-select>
           </el-form-item>
@@ -488,7 +488,7 @@
     }
   };
 
-  // 下发
+  // 下发考核表
   const handleIssue = async (id: number) => {
     currentIssueId.value = id;
     issueForm.departmentName = '';

+ 10 - 1
src/views/production-safety/safetyAssessment/inventory/components/InventoryDetail.vue

@@ -5,7 +5,14 @@
       :formData="ruleFormData"
       :formRules="isViewMode ? undefined : formRules"
       :formConfig="computedFormConfig"
-    />
+    >
+      <template #status>
+        <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
+          <el-radio label="ENABLE">启用</el-radio>
+          <el-radio label="DISABLE">禁用</el-radio>
+        </el-radio-group>
+      </template>
+    </BasicForm>
   </main>
   <footer class="safety-platform-container__footer">
     <el-button @click="router.back()">返回</el-button>
@@ -72,6 +79,7 @@
         ruleFormData.itemName = res.stuffName; // 物品名称
         ruleFormData.warehouseDate = res.inStoreTime ? res.inStoreTime.split('T')[0] : ''; // 入库日期(YYYY-MM-DD)
         ruleFormData.itemQuantity = res.stuffQty; // 物品数量
+        ruleFormData.status = res.status ? 'ENABLE' : 'DISABLE'; // 状态
         ruleFormData.remarks = res.remark || ''; // 备注
       }
       cloneRuleFormData();
@@ -91,6 +99,7 @@
           ? new Date(ruleFormData.warehouseDate).toISOString()
           : '',
         stuffQty: ruleFormData.itemQuantity,
+        status: ruleFormData.status === 'ENABLE',
         remark: ruleFormData.remarks || '',
       };
 

+ 8 - 0
src/views/production-safety/safetyAssessment/inventory/configs/form.ts

@@ -40,9 +40,15 @@ export const INVENTORY_FORM_CONFIG: FormConfig[] = [
       placeholder: '请输入备注',
     },
   },
+  {
+    prop: 'status',
+    label: '状态:',
+    slot: 'status',
+  },
 ];
 
 export const INVENTORY_FORM_DATA = {
+  status: 'ENABLE',
   itemName: '',
   warehouseDate: '',
   itemQuantity: 1, // 最小值为1
@@ -50,6 +56,7 @@ export const INVENTORY_FORM_DATA = {
 };
 
 export const INVENTORY_FORM_RULES = {
+  status: [{ required: true, message: '请选择状态', trigger: 'change' }],
   itemName: [{ required: true, message: '请输入物品名称', trigger: 'blur' }],
   warehouseDate: [{ required: true, message: '请选择入库日期', trigger: 'change' }],
   itemQuantity: [
@@ -57,4 +64,5 @@ export const INVENTORY_FORM_RULES = {
     { type: 'number', min: 1, message: '物品数量不能小于1', trigger: 'blur' },
     { type: 'number', max: 99999, message: '物品数量不能大于99999', trigger: 'blur' },
   ],
+  status: [{ required: true, message: '请选择状态', trigger: 'change' }],
 };