xiaweibo 3 месяцев назад
Родитель
Сommit
cffa112436

+ 20 - 14
src/api/drawLessons/index.ts

@@ -160,30 +160,37 @@ export function issueDrawLessons(data: IssueDrawLessonsRequest) {
 }
 }
 
 
 /**
 /**
- * 2.7 反馈(管理端 / 部门端)
- * POST /api/drawLessons/admin/feedback 或 /api/drawLessons/dept/feedback
+ * 2.7 反馈
+ * POST /api/drawLessons/admin/feedback
+ * id:下发记录 ID(举一反三下发表 id)
+ * feedbackHasIssue:是否存在问题,1 是 / 0 否
+ * feedbackResult:反馈结果/整改情况说明
+ * feedbackTime:反馈时间(Date,传字符串如 YYYY-MM-DD HH:mm:ss)
+ * attachments:反馈附件(JSON 或逗号分隔 URL,允许为空)
  */
  */
 export interface DrawLessonsFeedbackRequest {
 export interface DrawLessonsFeedbackRequest {
-  id: number; // 下发记录ID(举一反三下发表 id)
-  /** 部门端反馈时用下发记录 id,提交时与 id 二选一 */
-  issueId?: number;
-  feedbackHasIssue?: number; // 是否存在问题:1-是 0-否
+  /** 下发记录 ID(举一反三下发表 id) */
+  id: number;
+  /** 是否存在问题:1-是 0-否 */
+  feedbackHasIssue: number;
+  /** 反馈结果/整改情况说明 */
   feedbackResult?: string;
   feedbackResult?: string;
+  /** 反馈时间 */
   feedbackTime?: string;
   feedbackTime?: string;
+  /** 反馈附件(JSON 或逗号分隔 URL,允许为空) */
   attachments?: string;
   attachments?: string;
 }
 }
 
 
 export function submitDrawLessonsAdminFeedback(data: DrawLessonsFeedbackRequest) {
 export function submitDrawLessonsAdminFeedback(data: DrawLessonsFeedbackRequest) {
-  const id = data.id ?? data.issueId;
   return http.request({
   return http.request({
     url: '/drawLessons/admin/feedback',
     url: '/drawLessons/admin/feedback',
     method: 'post',
     method: 'post',
     data: {
     data: {
-      id,
+      id: data.id,
       feedbackHasIssue: data.feedbackHasIssue,
       feedbackHasIssue: data.feedbackHasIssue,
       feedbackResult: data.feedbackResult,
       feedbackResult: data.feedbackResult,
       feedbackTime: data.feedbackTime,
       feedbackTime: data.feedbackTime,
-      attachments: data.attachments,
+      attachments: data.attachments ?? '',
     },
     },
   });
   });
 }
 }
@@ -249,25 +256,24 @@ export function getDrawLessonsDeptDetail(id: number) {
 }
 }
 
 
 /**
 /**
- * 部门端:反馈
+ * 部门端:反馈(与 admin/feedback 参数一致,若后端统一则可用 submitDrawLessonsAdminFeedback)
  * POST /api/drawLessons/dept/feedback
  * POST /api/drawLessons/dept/feedback
  */
  */
 export function submitDrawLessonsDeptFeedback(data: DrawLessonsFeedbackRequest) {
 export function submitDrawLessonsDeptFeedback(data: DrawLessonsFeedbackRequest) {
-  const id = data.id ?? data.issueId;
   return http.request({
   return http.request({
     url: '/drawLessons/dept/feedback',
     url: '/drawLessons/dept/feedback',
     method: 'post',
     method: 'post',
     data: {
     data: {
-      id,
+      id: data.id,
       feedbackHasIssue: data.feedbackHasIssue,
       feedbackHasIssue: data.feedbackHasIssue,
       feedbackResult: data.feedbackResult,
       feedbackResult: data.feedbackResult,
       feedbackTime: data.feedbackTime,
       feedbackTime: data.feedbackTime,
-      attachments: data.attachments,
+      attachments: data.attachments ?? '',
     },
     },
   });
   });
 }
 }
 
 
-/** 兼容旧调用:部门反馈请求(与 DrawLessonsFeedbackRequest 一致,feedbackForm 用 issueId 时需映射为 id) */
+/** 部门反馈请求(与 DrawLessonsFeedbackRequest 一致) */
 export type DeptFeedbackRequest = DrawLessonsFeedbackRequest;
 export type DeptFeedbackRequest = DrawLessonsFeedbackRequest;
 
 
 /**
 /**

+ 16 - 4
src/api/production-safety-system/index.ts

@@ -664,6 +664,9 @@ interface ChecklistTemplatePageRes {
   records: ChecklistTemplatePageItem[];
   records: ChecklistTemplatePageItem[];
 }
 }
 
 
+/** 检查单模版实体(用于名称下拉等场景,后端返回 WebResult<List<ChecklistTemplate>>) */
+export type ChecklistTemplate = ChecklistTemplatePageItem;
+
 /** 一、查询检查单模版管理列表 */
 /** 一、查询检查单模版管理列表 */
 export function queryChecklistTemplateList(query: ChecklistTemplatePageQuery) {
 export function queryChecklistTemplateList(query: ChecklistTemplatePageQuery) {
   return http.request<ChecklistTemplatePageRes>({
   return http.request<ChecklistTemplatePageRes>({
@@ -673,6 +676,17 @@ export function queryChecklistTemplateList(query: ChecklistTemplatePageQuery) {
   });
   });
 }
 }
 
 
+/** 查询检查单模版名称列表(区域检查计划管理-管理员-详情检查单模版名称下拉) */
+export function queryCheckListTemplateNameList() {
+  // 后端说明:请求体空对象,请求方式 POST,返回 WebResult<List<ChecklistTemplate>>
+  // 经过 http 拦截器转换后,这里拿到的就是 List<ChecklistTemplate>
+  return http.request<ChecklistTemplate[]>({
+    url: `${ADMIN_BASE}/queryCheckListTemplateNameList`,
+    method: 'post',
+    data: {},
+  });
+}
+
 /** 二、删除检查单模版管理 */
 /** 二、删除检查单模版管理 */
 export function deleteChecklistTemplate(id: number) {
 export function deleteChecklistTemplate(id: number) {
   return http.request({
   return http.request({
@@ -1028,18 +1042,16 @@ export function queryAreaCheckPlanManageDeptPage(query: Parameters<typeof queryA
 /** 删除区域检查计划(管理员) */
 /** 删除区域检查计划(管理员) */
 export function deleteAreaCheckPlanManage(id: number) {
 export function deleteAreaCheckPlanManage(id: number) {
   return http.request({
   return http.request({
-    url: `${ADMIN_BASE}/deleteAreaCheckPlanManage`,
+    url: `${ADMIN_BASE}/deleteAreaCheckPlanManage?id=${id}`,
     method: 'delete',
     method: 'delete',
-    params: { id },
   });
   });
 }
 }
 
 
 /** 删除区域检查计划(部门)- 若部门无此接口则复用管理员 */
 /** 删除区域检查计划(部门)- 若部门无此接口则复用管理员 */
 export function deleteAreaCheckPlanManageDept(id: number) {
 export function deleteAreaCheckPlanManageDept(id: number) {
   return http.request({
   return http.request({
-    url: `${DEPT_BASE}/deleteAreaCheckPlanManage`,
+    url: `${DEPT_BASE}/deleteAreaCheckPlanManage?id=${id}`,
     method: 'delete',
     method: 'delete',
-    params: { id },
   });
   });
 }
 }
 
 

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

@@ -328,6 +328,8 @@
     deleteAreaCheckPlanDetail,
     deleteAreaCheckPlanDetail,
     queryAreaCheckRecord,
     queryAreaCheckRecord,
     mapAreaCheckPlanApiRecordToUi,
     mapAreaCheckPlanApiRecordToUi,
+    queryCheckListTemplateNameList,
+    type ChecklistTemplate,
   } from '@/api/production-safety-system';
   } from '@/api/production-safety-system';
 
 
   const router = useRouter();
   const router = useRouter();
@@ -343,7 +345,7 @@
   const AREA_CHECK_PLAN_FORM_DATA = AREA_CHECK_PLAN_FORM_DATA_IMPORT ?? {};
   const AREA_CHECK_PLAN_FORM_DATA = AREA_CHECK_PLAN_FORM_DATA_IMPORT ?? {};
   const AREA_CHECK_PLAN_FORM_RULES = AREA_CHECK_PLAN_FORM_RULES_IMPORT ?? {};
   const AREA_CHECK_PLAN_FORM_RULES = AREA_CHECK_PLAN_FORM_RULES_IMPORT ?? {};
   const CHECK_FREQUENCY_OPTIONS = CHECK_FREQUENCY_OPTIONS_IMPORT ?? [];
   const CHECK_FREQUENCY_OPTIONS = CHECK_FREQUENCY_OPTIONS_IMPORT ?? [];
-  const checklistCategoryOptionsSource = Array.isArray(CHECKLIST_CATEGORY_OPTIONS_IMPORT)
+  const CHECKLIST_CATEGORY_OPTIONS = Array.isArray(CHECKLIST_CATEGORY_OPTIONS_IMPORT)
     ? CHECKLIST_CATEGORY_OPTIONS_IMPORT
     ? CHECKLIST_CATEGORY_OPTIONS_IMPORT
     : [];
     : [];
 
 
@@ -402,9 +404,38 @@
     setDeptNameFromCascader(hospitalLeaderDeptCascaderRef.value, 'hospitalLeaderDeptName');
     setDeptNameFromCascader(hospitalLeaderDeptCascaderRef.value, 'hospitalLeaderDeptName');
   };
   };
 
 
-  // 检查单模版选项(检查单模版类别与模版名称选项一致)
-  const checklistCategoryOptions = ref<Array<{ label: string; value: string }>>(checklistCategoryOptionsSource);
-  const checklistTemplateOptions = ref<Array<{ label: string; value: string }>>([...checklistCategoryOptionsSource]);
+  // 检查单模版类别:使用 form 静态选项,不请求接口
+  // 检查单模版名称:来自接口,可按类别筛选
+  const checklistTemplateOptions = ref<Array<{ label: string; value: string }>>([]);
+  const allChecklistTemplates = ref<ChecklistTemplate[]>([]);
+
+  /** 根据类别名称(form 静态选项的 value)筛选模版下拉 */
+  const updateChecklistTemplateOptionsByCategory = (categoryName?: string) => {
+    const list = allChecklistTemplates.value || [];
+    const filtered = categoryName
+      ? list.filter((item) => (item.categoryName as string) === categoryName)
+      : list;
+    checklistTemplateOptions.value = filtered
+      .filter((item) => !!item.templateName)
+      .map((item) => ({
+        label: item.templateName as string,
+        value: item.templateName as string,
+      }));
+  };
+
+  /** 加载检查单模版名称列表(仅模版名称下拉用,类别用 form 静态数据) */
+  const loadChecklistTemplateOptions = async () => {
+    try {
+      const res = await queryCheckListTemplateNameList();
+      const list = ((res as { data?: ChecklistTemplate[] })?.data ?? (res as ChecklistTemplate[] | undefined)) || [];
+      allChecklistTemplates.value = list;
+      const currentCategoryName = ruleFormData.checklistCategoryName as string | undefined;
+      updateChecklistTemplateOptionsByCategory(currentCategoryName);
+    } catch (e) {
+      console.error('获取检查单模版名称列表失败:', e);
+      checklistTemplateOptions.value = [];
+    }
+  };
 
 
   const viewFormConfig = ref(
   const viewFormConfig = ref(
     AREA_CHECK_PLAN_FORM_CONFIG.map((item) => ({
     AREA_CHECK_PLAN_FORM_CONFIG.map((item) => ({
@@ -420,10 +451,28 @@
     const base = isViewMode.value ? viewFormConfig.value : cloneDeep(AREA_CHECK_PLAN_FORM_CONFIG);
     const base = isViewMode.value ? viewFormConfig.value : cloneDeep(AREA_CHECK_PLAN_FORM_CONFIG);
     return base.map((item) => {
     return base.map((item) => {
       if (item.prop === 'checklistCategoryName') {
       if (item.prop === 'checklistCategoryName') {
-        return { ...item, selectOptions: checklistCategoryOptions.value };
+        return {
+          ...item,
+          selectOptions: CHECKLIST_CATEGORY_OPTIONS,
+          componentProps: {
+            ...(item.componentProps || {}),
+            onChange: (val: string) => {
+              ruleFormData.checklistCategoryName = val;
+              (ruleFormData as Record<string, unknown>).checklistCategoryCode = val;
+              ruleFormData.checklistTemplateName = '';
+              updateChecklistTemplateOptionsByCategory(val);
+            },
+          },
+        };
       }
       }
       if (item.prop === 'checklistTemplateName') {
       if (item.prop === 'checklistTemplateName') {
-        return { ...item, selectOptions: checklistTemplateOptions.value };
+        return {
+          ...item,
+          selectOptions: checklistTemplateOptions.value,
+          componentProps: {
+            ...(item.componentProps || {}),
+          },
+        };
       }
       }
       return item;
       return item;
     });
     });
@@ -636,9 +685,11 @@
       ruleFormData.hospitalLeaderDeptName = detail.hospitalLeaderDeptName ?? '';
       ruleFormData.hospitalLeaderDeptName = detail.hospitalLeaderDeptName ?? '';
       ruleFormData.hospitalLeaderDeptId = findDeptIdByName(deptTree.value, ruleFormData.hospitalLeaderDeptName as string) ?? null;
       ruleFormData.hospitalLeaderDeptId = findDeptIdByName(deptTree.value, ruleFormData.hospitalLeaderDeptName as string) ?? null;
       ruleFormData.hospitalLeaderCheckFrequency = detail.hospitalLeaderCheckFrequency ?? '';
       ruleFormData.hospitalLeaderCheckFrequency = detail.hospitalLeaderCheckFrequency ?? '';
+      (ruleFormData as Record<string, unknown>).checklistCategoryCode = detail.checklistCategoryCode ?? '';
       ruleFormData.checklistCategoryName = detail.checklistCategoryName ?? '';
       ruleFormData.checklistCategoryName = detail.checklistCategoryName ?? '';
       ruleFormData.checklistTemplateName = detail.checklistTemplateName ?? '';
       ruleFormData.checklistTemplateName = detail.checklistTemplateName ?? '';
       ruleFormData.checkKeyContent = detail.checkKeyContent ?? '';
       ruleFormData.checkKeyContent = detail.checkKeyContent ?? '';
+      updateChecklistTemplateOptionsByCategory(ruleFormData.checklistCategoryName as string | undefined);
       cloneRuleFormData();
       cloneRuleFormData();
       if (isViewMode.value) {
       if (isViewMode.value) {
         loadRecordList();
         loadRecordList();
@@ -669,6 +720,7 @@
     cloneRuleFormData();
     cloneRuleFormData();
     beforeRouteLeave();
     beforeRouteLeave();
     await getDeptTreeData();
     await getDeptTreeData();
+    await loadChecklistTemplateOptions();
     if (isEditMode.value || isViewMode.value) {
     if (isEditMode.value || isViewMode.value) {
       getDetail();
       getDetail();
     }
     }

+ 11 - 12
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/components/OneByOneAuditDetail.vue

@@ -20,8 +20,8 @@
               <div class="value">{{ detailData?.problem || '-' }}</div>
               <div class="value">{{ detailData?.problem || '-' }}</div>
             </div>
             </div>
             <div class="col">
             <div class="col">
-              <div class="label">等级:</div>
-              <div class="value">{{ detailData?.levelName || '-' }}</div>
+              <div class="label">状态:</div>
+              <div class="value">{{ detailData?.statusName || '-' }}</div>
             </div>
             </div>
           </div>
           </div>
           <div class="row">
           <div class="row">
@@ -30,14 +30,14 @@
               <div class="value">{{ detailData?.issueCount ?? '-' }}</div>
               <div class="value">{{ detailData?.issueCount ?? '-' }}</div>
             </div>
             </div>
             <div class="col">
             <div class="col">
-              <div class="label">审核数:</div>
-              <div class="value">{{ detailData?.auditCount ?? '-' }}</div>
+              <div class="label">反馈数:</div>
+              <div class="value">{{ detailData?.feedbackCount ?? '-' }}</div>
             </div>
             </div>
           </div>
           </div>
           <div class="row">
           <div class="row">
             <div class="col">
             <div class="col">
               <div class="label">计划开始日期:</div>
               <div class="label">计划开始日期:</div>
-              <div class="value">{{ detailData?.dangerProposeDate || '-' }}</div>
+              <div class="value">{{ detailData?.planStartDate || detailData?.dangerProposeDate || '-' }}</div>
             </div>
             </div>
             <div class="col">
             <div class="col">
               <div class="label">计划完成日期:</div>
               <div class="label">计划完成日期:</div>
@@ -134,10 +134,10 @@
     problem?: string;
     problem?: string;
     creatorName?: string;
     creatorName?: string;
     createdAt?: string;
     createdAt?: string;
-    dangerCategoryName?: string;
-    levelName?: string;
+    statusName?: string;
     issueCount?: number;
     issueCount?: number;
-    auditCount?: number;
+    feedbackCount?: number;
+    planStartDate?: string;
     dangerProposeDate?: string;
     dangerProposeDate?: string;
     associationOtTimeLimit?: string;
     associationOtTimeLimit?: string;
     associationOneThree?: string;
     associationOneThree?: string;
@@ -170,15 +170,14 @@
       const data = (res as any)?.data ?? res;
       const data = (res as any)?.data ?? res;
       if (data && typeof data === 'object') {
       if (data && typeof data === 'object') {
         const records = Array.isArray(data.issueRecords) ? data.issueRecords : [];
         const records = Array.isArray(data.issueRecords) ? data.issueRecords : [];
-        const auditCount = records.filter((r: any) => r.statusId === 5 || r.statusName === '已完成').length;
         detailData.value = {
         detailData.value = {
           problem: data.problem,
           problem: data.problem,
           creatorName: data.creatorName,
           creatorName: data.creatorName,
           createdAt: data.createdAt,
           createdAt: data.createdAt,
-          dangerCategoryName: data.dangerCategoryName,
-          levelName: data.levelName,
+          statusName: data.statusName,
           issueCount: records.length ?? data.issueCount,
           issueCount: records.length ?? data.issueCount,
-          auditCount: data.auditCount ?? auditCount,
+          feedbackCount: data.feedbackCount ?? records.filter((r: any) => r.statusId === 5 || r.statusName === '已完成' || r.feedbackAt).length,
+          planStartDate: data.planStartDate,
           dangerProposeDate: data.dangerProposeDate,
           dangerProposeDate: data.dangerProposeDate,
           associationOtTimeLimit: data.associationOtTimeLimit,
           associationOtTimeLimit: data.associationOtTimeLimit,
           associationOneThree: data.associationOneThree,
           associationOneThree: data.associationOneThree,

+ 10 - 13
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagementDept/components/oneByOneManagementDeptDetail.vue

@@ -137,7 +137,7 @@
     </main>
     </main>
     <footer class="safety-platform-container__footer">
     <footer class="safety-platform-container__footer">
       <el-button @click="router.back()">返回</el-button>
       <el-button @click="router.back()">返回</el-button>
-      <el-button type="primary" :disabled="!pendingFeedbackRow" @click="handleSubmit">
+      <el-button type="primary" @click="handleSubmit">
         提交
         提交
       </el-button>
       </el-button>
     </footer>
     </footer>
@@ -231,14 +231,7 @@
     }>;
     }>;
   } | null>(null);
   } | null>(null);
 
 
-  /** 上传附件展示用示例数据(无接口数据时展示几条示例) */
-  const MOCK_ATTACHMENTS = [
-    { fileName: '2025年上飞院院领导安全责任通知.docx', fileUrl: '', fileNameOrUrl: '2025年上飞院院领导安全责任通知.docx' },
-    { fileName: '举一反三整改说明.pdf', fileUrl: '', fileNameOrUrl: '举一反三整改说明.pdf' },
-    { fileName: '现场检查记录表.xlsx', fileUrl: '', fileNameOrUrl: '现场检查记录表.xlsx' },
-  ];
-
-  /** 附件列表(从详情 attachments / attachmentList 解析,无数据时用示例) */
+  /** 附件列表(从详情 attachments / attachmentList 解析,无数据时为空) */
   const attachmentList = computed(() => {
   const attachmentList = computed(() => {
     const d = detailData.value;
     const d = detailData.value;
     if (!d) return [];
     if (!d) return [];
@@ -252,7 +245,7 @@
         if (list.length) return list;
         if (list.length) return list;
       }
       }
     }
     }
-    return MOCK_ATTACHMENTS;
+    return [];
   });
   });
 
 
   function handlePreview(item: { fileUrl?: string; url?: string }) {
   function handlePreview(item: { fileUrl?: string; url?: string }) {
@@ -303,9 +296,11 @@
   // ---------- 部门反馈 ----------
   // ---------- 部门反馈 ----------
   const showFeedbackDialog = ref(false);
   const showFeedbackDialog = ref(false);
   const feedbackFormRef = ref<FormInstance>();
   const feedbackFormRef = ref<FormInstance>();
+  /** 当前操作的下发记录 ID(举一反三下发表 id) */
   const currentIssueId = ref<number>(0);
   const currentIssueId = ref<number>(0);
   const feedbackForm = ref<DeptFeedbackRequest>({
   const feedbackForm = ref<DeptFeedbackRequest>({
-    issueId: 0,
+    id: 0,
+    feedbackHasIssue: 0,
     feedbackResult: '',
     feedbackResult: '',
     feedbackTime: '',
     feedbackTime: '',
     attachments: '',
     attachments: '',
@@ -316,7 +311,8 @@
 
 
   function resetFeedbackForm() {
   function resetFeedbackForm() {
     feedbackForm.value = {
     feedbackForm.value = {
-      issueId: currentIssueId.value,
+      id: currentIssueId.value,
+      feedbackHasIssue: hasProblem.value ? 1 : 0,
       feedbackResult: '',
       feedbackResult: '',
       feedbackTime: '',
       feedbackTime: '',
       attachments: '',
       attachments: '',
@@ -341,7 +337,8 @@
   async function handleFeedbackSubmit() {
   async function handleFeedbackSubmit() {
     await feedbackFormRef.value?.validate?.().catch(() => {});
     await feedbackFormRef.value?.validate?.().catch(() => {});
     try {
     try {
-      feedbackForm.value.issueId = currentIssueId.value;
+      feedbackForm.value.id = currentIssueId.value;
+      feedbackForm.value.feedbackHasIssue = hasProblem.value ? 1 : 0;
       // 若有「选择附件」且未在 openFeedbackDialog 中写入,这里再带一次
       // 若有「选择附件」且未在 openFeedbackDialog 中写入,这里再带一次
       if (hasProblem.value && materialAttachmentList.value.length && !feedbackForm.value.attachments) {
       if (hasProblem.value && materialAttachmentList.value.length && !feedbackForm.value.attachments) {
         const formatted = await formatAttachmentList(materialAttachmentList.value);
         const formatted = await formatAttachmentList(materialAttachmentList.value);

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

@@ -96,7 +96,7 @@
                 </template>
                 </template>
                 <!-- 已完成(1):显示反馈和先进个人申报 -->
                 <!-- 已完成(1):显示反馈和先进个人申报 -->
                 <template v-else-if="Number(scope.row.status) === 1">
                 <template v-else-if="Number(scope.row.status) === 1">
-                  <ActionButton text="反馈" @click="handleFeedback(scope.row.id)" />
+                  <!-- <ActionButton text="反馈" @click="handleFeedback(scope.row.id)" /> -->
                   <ActionButton text="先进个人申报" @click="handleAdvancedPerson(scope.row.id)" />
                   <ActionButton text="先进个人申报" @click="handleAdvancedPerson(scope.row.id)" />
                 </template>
                 </template>
                 <!-- 已作废(5):显示反馈 -->
                 <!-- 已作废(5):显示反馈 -->