Просмотр исходного кода

Merge branch 'feat/production-safety' of http://192.168.6.110/product-group-fe/sfy-safety-group/sfy-safety into feat/production-safety

sunqijun 1 месяц назад
Родитель
Сommit
47fa39ed76
12 измененных файлов с 170 добавлено и 37 удалено
  1. 7 1
      src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/configs/tables.ts
  2. 8 3
      src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/oneByOneManagement.vue
  3. 32 11
      src/views/production-safety/safety-culture/safetyCultureActivityManagement/components/activityRegistrationManagement.vue
  4. 84 4
      src/views/production-safety/safety-culture/safetyCultureActivityManagement/components/safetyCultureActivityManagementDetail.vue
  5. 2 2
      src/views/production-safety/safety-culture/safetyCultureActivityManagement/configs/activityTargetTables.ts
  6. 6 0
      src/views/production-safety/safety-culture/safetyCultureActivityManagement/configs/form.ts
  7. 1 1
      src/views/production-safety/safety-culture/safetyCultureActivityManagement/configs/tables.ts
  8. 25 10
      src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/components/activityRegistrationManagement.vue
  9. 1 1
      src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/components/safetyCultureActivityManagementDetail.vue
  10. 2 2
      src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/configs/activityTargetTables.ts
  11. 1 1
      src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/configs/tables.ts
  12. 1 1
      src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/safetyCultureActivityManagementExecutor.vue

+ 7 - 1
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/configs/tables.ts

@@ -38,7 +38,7 @@ export const DRAW_LESSONS_TABLE_COLUMNS: TableColumnProps[] = [
     minWidth: '100px',
   },
   {
-    label: '部门名称',
+    label: '责任部门',
     prop: 'associationOtObligationDeptName',
     align: 'left',
     minWidth: '140px',
@@ -121,6 +121,12 @@ export const DRAW_LESSONS_TABLE_COLUMNS_TOW: TableColumnProps[] = [
     align: 'left',
     minWidth: '140px',
     showOverflowTooltip: true,
+  },{
+    label: '责任人',
+    prop: 'deptUserByName',
+    align: 'left',
+    minWidth: '140px',
+    showOverflowTooltip: true,
   },
   {
     label: '举一反三要求',

+ 8 - 3
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/oneByOneManagement.vue

@@ -69,13 +69,15 @@
             @update:pageNumber="handleCurrentChange"
           >
             <template #status="scope">
-              <span>{{ scope.row.statusName || '0' }}</span>
+              <span>{{ scope.row.statusName || '-' }}</span>
             </template>
             <template #issueCount="scope">
-              <span>{{ scope.row.issueCount || '0' }}</span>
+              <span v-if="scope.row.statusId == 2">-</span>
+              <span v-else> {{ scope.row.issueCount || '0' }}</span>
             </template>
             <template #feedbackCount="scope">
-              <span>{{ scope.row.feedbackCount || '0' }}</span>
+              <span v-if="scope.row.statusId == 2">-</span>
+              <span v-else> {{ scope.row.feedbackCount || '0' }}</span>
             </template>
             <template #feedbackRatio="scope">
               <span>{{ scope.row.feedbackRatio ?? (scope.row.issueCount ? `${scope.row.feedbackCount ?? 0}/${scope.row.issueCount}` : '-') }}</span>
@@ -394,6 +396,9 @@
       name: 'oneByOneManagementItem',
       query: {
         id: String(row.id),
+        problem: row.problem,
+        creatorName: row.creatorName,
+        createdAt: row.createdAt,
         operate: 'one-by-one-notify-target',
       },
     });

+ 32 - 11
src/views/production-safety/safety-culture/safetyCultureActivityManagement/components/activityRegistrationManagement.vue

@@ -4,7 +4,7 @@
       <div class="evaluation-header">
         <h1 class="evaluation-title">{{ activityRegistrationDetail.planName || '' }}</h1>
         <div class="evaluation-meta">
-          <span>考核部门: {{ activityRegistrationDetail.responsibleDeptName || '-' }}</span>
+          <span>分类名称: {{ activityRegistrationDetail.categoryName || '-' }}</span>
           <span>创建人: {{ activityRegistrationDetail.createdByName || '-' }}</span>
           <span>创建时间: {{ formatDateTime(activityRegistrationDetail.createdAt) || '-' }}</span>
         </div>
@@ -16,14 +16,27 @@
           <div class="act-search">
             <section class="select-box">
               <div class="select-box--item">
-                <span>员工工号/名称:</span>
-                <el-input v-model="tableQuery.queryParam.keyword" placeholder="搜索员工工号或名称" class="act-search-input" />
+                <span>部门名称:</span>
+                <el-cascader
+                  v-model="tableQuery.queryParam.responsibleDepartmentId"
+                  style="width: 170px"
+                  ref="cascaderRef"
+                  :options="firstLevelDepts"
+                  :props="cascaderProp"
+                  :show-all-levels="false"
+                  filterable
+                  @change="(val) => handleChangeDept(val, 'responsibleDepartmentId')"
+                />
               </div>
               <div class="select-box--item">
                 <span>报名日期:</span>
                 <el-date-picker v-model="tableQuery.queryParam.dateRange" type="daterange" range-separator="至"
                   start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
               </div>
+              <div class="select-box--item">
+                <span>员工工号/名称:</span>
+                <el-input v-model="tableQuery.queryParam.keyword" placeholder="搜索员工工号或名称" class="act-search-input" />
+              </div>
             </section>
             <section class="search-btn">
               <el-button type="primary" @click="handleSearch">查询</el-button>
@@ -74,8 +87,8 @@
             <el-input v-model="normalForm.employeeContact" placeholder="请输入11位手机号码" maxlength="11"
               @input="handlePhoneInput" />
           </el-form-item>
-          <el-form-item label="个人先进描述:" prop="remark">
-            <el-input v-model="normalForm.remark" type="textarea" :rows="4" placeholder="请填写个人先进获取内容描述。" maxlength="300"
+          <el-form-item label="备注:" prop="remark">
+            <el-input v-model="normalForm.remark" type="textarea" :rows="4" placeholder="请填写备注。" maxlength="300"
               show-word-limit />
           </el-form-item>
         </el-form>
@@ -135,6 +148,8 @@ const tableQuery = reactive<QueryPageRequest<any>>({
     dateRange: null as any,
     startTime: '',
     endTime: '',
+    responsibleDepartmentId: '',
+    deptName: '',
   },
 });
 
@@ -179,16 +194,16 @@ const normalFormRules: FormRules = {
     { required: true, message: '请输入员工联系方式', trigger: 'blur' },
     { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的11位手机号码', trigger: 'blur' },
   ],
-  remark: [
-    { required: true, message: '请输入个人先进描述', trigger: 'blur' },
-    { max: 300, message: '最多输入300个字符', trigger: 'blur' },
-  ],
+  // remark: [
+  //   { required: true, message: '请输入备注', trigger: 'blur' },
+  //   { max: 300, message: '最多输入300个字符', trigger: 'blur' },
+  // ],
 };
 
 const cascaderProp = {
   expandTrigger: 'click',
   checkStrictly: true,
-  // emitPath: false,
+  emitPath: false,
   value: 'id',
   label: 'deptName',
 };
@@ -217,6 +232,9 @@ async function getTableData() {
         keyword: tableQuery.queryParam.keyword,
         startDate: tableQuery.queryParam.startTime,
         endDate: tableQuery.queryParam.endTime,
+        deptId: tableQuery.queryParam.responsibleDepartmentId,
+        deptName: tableQuery.queryParam.deptName,
+        activityId: activityRegistrationId.value,
       },
     };
 
@@ -249,6 +267,8 @@ function handleSearch() {
 const handleReset = () => {
   tableQuery.queryParam.keyword = '';
   tableQuery.queryParam.dateRange = null;
+  tableQuery.queryParam.responsibleDepartmentId = '';
+  tableQuery.queryParam.deptName = '';
   handleSearch();
 };
 
@@ -423,7 +443,8 @@ const handleChangeDept = (val, prop) => {
   const deptInfo = cascader?.getCheckedNodes();
   if (deptInfo && deptInfo.length > 0) {
     normalForm.employeeDeptName = deptInfo[0].label;
-    normalForm.deptId = val[val.length - 1]
+    normalForm.deptId = val[val.length - 1];
+    // normalForm.deptName = deptInfo[0].label;
   } else {
     normalForm.employeeDeptName = '';
   }

+ 84 - 4
src/views/production-safety/safety-culture/safetyCultureActivityManagement/components/safetyCultureActivityManagementDetail.vue

@@ -53,7 +53,50 @@
           />
         </el-select>
       </template>
+      <template #specificDeptName>
+        <el-input v-model="ruleFormData.specificDeptName" placeholder="暂无内容" :disabled="isViewMode" />
+      </template>
+      <template #specificPersonName>
+        <el-input v-model="ruleFormData.specificPersonName" placeholder="暂无内容" :disabled="isViewMode" />
+      </template>
+      <template #startTime>
+        <el-date-picker
+          v-model="ruleFormData.startTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="暂无内容"
+          :disabled="isViewMode"
+        />
+      </template>
+      <template #endTime>
+        <el-date-picker
+          v-model="ruleFormData.endTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="暂无内容"
+          :disabled="isViewMode"
+        />
+      </template>
+      <template #attachmentUrl>
+        <div class="file-list" v-if="ruleFormData.attachmentUrl && ruleFormData.attachmentUrl.length != 0">
+          <div class="file-item" v-for="file in ruleFormData.attachmentUrl" :key="file.fileId">
+            <span class="file-item--name">{{ file.fileName }}</span>
+            <div class="file-item--footer">
+              <el-button link type="primary" @click="previewOnline(file.fileUrl, file.fileType)"
+                >预览</el-button
+              >
+              <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)"
+                >下载</el-button
+              >
+            </div>
+          </div>
+        </div>
+        <div v-else>
+          暂无附件
+        </div>
+      </template>
     </BasicForm>
+    <PreviewOnline ref="previewOnlineRef" />
   </main>
   <footer class="safety-platform-container__footer">
     <el-button @click="router.back()">返回</el-button>
@@ -82,9 +125,12 @@
   import { queryAvailableUserList } from '@/api/system/person-group';
   import type { addSafetyCultureFilePageQuery } from '@/api/safety-culture';
   import type { DeptTree } from '@/types/dept/type';
+  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
+  import { downloadFile } from '@/views/disaster/utils';
 
   const router = useRouter();
   const route = useRoute();
+  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
 
   const operate = computed(() => (route.query.operate as string) || 'safety-culture-material-create');
   const currentId = computed(() => Number(route.query.id));
@@ -99,15 +145,38 @@
     ACADEMY_FILE_FORM_RULES,
   );
 
-  const viewFormConfig = ref(
-    ACADEMY_FILE_FORM_CONFIG.map((item) => ({
+  const viewFormConfig = ref([
+    // 原有的表单配置
+    ...ACADEMY_FILE_FORM_CONFIG.map((item) => ({
       ...item,
       componentProps: {
         ...item.componentProps,
         disabled: true,
       },
     })),
-  );
+    {
+      prop: 'specificDeptName',
+      label: '具体负责部门:',
+      slot: 'specificDeptName'
+    },
+    {
+      prop: 'specificPersonName',
+      label: '具体负责人:',
+      slot: 'specificPersonName'
+    },{
+      prop: 'startTime',
+      label: '计划开始日期:',
+      slot: 'startTime'
+    },{
+      prop: 'endTime',
+      label: '计划结束时间:',
+      slot: 'endTime'
+    },{
+      prop: 'attachmentUrl',
+      label: '附件:',
+      slot: 'attachmentUrl'
+    }
+  ]);
 
   const computedFormConfig = computed(() => {
     if (isViewMode.value) {
@@ -215,8 +284,13 @@
         ruleFormData.categoryName = res.categoryName != null ? String(res.categoryName) : '';
         ruleFormData.responsibleDeptId = res.responsibleDeptId != null ? Number(res.responsibleDeptId) : undefined;
         ruleFormData.responsiblePersonId =
-          res.responsiblePersonId != null ? Number(res.responsiblePersonId) : undefined;
+        res.responsiblePersonId != null ? Number(res.responsiblePersonId) : undefined;
         ruleFormData.cooperateDeptIds = normalizeToNumberArray(res.cooperateDeptIds);
+        ruleFormData.specificDeptName = res.specificDeptName || '';
+        ruleFormData.specificPersonName = res.specificPersonName || '';
+        ruleFormData.startTime = res.startTime || undefined;
+        ruleFormData.endTime = res.endTime || undefined;
+        ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || '[]');
       }
       cloneRuleFormData();
     } catch (e) {
@@ -250,6 +324,12 @@
     }
   };
 
+  const previewOnline = (url: string | undefined, type) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
+  };
+
   onMounted(() => {
     cloneRuleFormData();
     loadDeptTreeData();

+ 2 - 2
src/views/production-safety/safety-culture/safetyCultureActivityManagement/configs/activityTargetTables.ts

@@ -160,13 +160,13 @@ export const ACTIVITY_REGISTRATION_ADVANCED_PERSON_TABLE_COLUMNS: TableColumnPro
   //   minWidth: '140px',
   // },
   {
-    label: '先进个人描述',
+    label: '备注',
     prop: 'remark',
     align: 'left',
     minWidth: '160px',
   },
   {
-    label: '报日期',
+    label: '报日期',
     prop: 'createdAt',
     align: 'left',
     minWidth: '150px',

+ 6 - 0
src/views/production-safety/safety-culture/safetyCultureActivityManagement/configs/form.ts

@@ -1,4 +1,5 @@
 import { FormConfig } from '@/types/basic-form';
+import { any } from 'vue-types';
 
 export const ACADEMY_FILE_FORM_CONFIG: FormConfig[] = [
   {
@@ -46,6 +47,11 @@ export const ACADEMY_FILE_FORM_DATA = {
   responsibleDeptId: undefined as number | undefined,
   responsiblePersonId: undefined as number | undefined,
   cooperateDeptIds: [] as number[],
+  specificDeptName: '',
+  specificPersonName: '',
+  startTime: undefined as string | undefined,
+  endTime: undefined as string | undefined,
+  attachmentUrl: any,
 };
 
 export const ACADEMY_FILE_FORM_RULES = {

+ 1 - 1
src/views/production-safety/safety-culture/safetyCultureActivityManagement/configs/tables.ts

@@ -60,7 +60,7 @@ export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
   },
   {
     label: '计划完成时间',
-    prop: 'createdAt',
+    prop: 'endTime',
     align: 'left',
     minWidth: '160px',
   },

+ 25 - 10
src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/components/activityRegistrationManagement.vue

@@ -4,7 +4,7 @@
       <div class="evaluation-header">
         <h1 class="evaluation-title">{{ activityRegistrationDetail.planName || '' }}</h1>
         <div class="evaluation-meta">
-          <span>考核部门: {{ activityRegistrationDetail.responsibleDeptName || '-' }}</span>
+          <span>分类名称: {{ activityRegistrationDetail.categoryName || '-' }}</span>
           <span>创建人: {{ activityRegistrationDetail.createdByName || '-' }}</span>
           <span>创建时间: {{ formatDateTime(activityRegistrationDetail.createdAt) || '-' }}</span>
         </div>
@@ -16,14 +16,27 @@
           <div class="act-search">
             <section class="select-box">
               <div class="select-box--item">
-                <span>员工工号/名称:</span>
-                <el-input v-model="tableQuery.queryParam.keyword" placeholder="搜索员工工号或名称" class="act-search-input" />
+                <span>部门名称:</span>
+                <el-cascader
+                  v-model="tableQuery.queryParam.responsibleDepartmentId"
+                  style="width: 170px"
+                  ref="cascaderRef"
+                  :options="firstLevelDepts"
+                  :props="cascaderProp"
+                  :show-all-levels="false"
+                  filterable
+                  @change="(val) => handleChangeDept(val, 'responsibleDepartmentId')"
+                />
               </div>
               <div class="select-box--item">
                 <span>报名日期:</span>
                 <el-date-picker v-model="tableQuery.queryParam.dateRange" type="daterange" range-separator="至"
                   start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
               </div>
+              <div class="select-box--item">
+                <span>员工工号/名称:</span>
+                <el-input v-model="tableQuery.queryParam.keyword" placeholder="搜索员工工号或名称" class="act-search-input" />
+              </div>
             </section>
             <section class="search-btn">
               <el-button type="primary" @click="handleSearch">查询</el-button>
@@ -74,8 +87,8 @@
             <el-input v-model="normalForm.employeeContact" placeholder="请输入11位手机号码" maxlength="11"
               @input="handlePhoneInput" />
           </el-form-item>
-          <el-form-item label="个人先进描述:" prop="remark">
-            <el-input v-model="normalForm.remark" type="textarea" :rows="4" placeholder="请填写个人先进获取内容描述。" maxlength="300"
+          <el-form-item label="备注:" prop="remark">
+            <el-input v-model="normalForm.remark" type="textarea" :rows="4" placeholder="请填写备注。" maxlength="300"
               show-word-limit />
           </el-form-item>
         </el-form>
@@ -135,6 +148,7 @@ const tableQuery = reactive<QueryPageRequest<any>>({
     dateRange: null as any,
     startTime: '',
     endTime: '',
+    responsibleDepartmentId: null as any,
   },
 });
 
@@ -179,16 +193,16 @@ const normalFormRules: FormRules = {
     { required: true, message: '请输入员工联系方式', trigger: 'blur' },
     { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的11位手机号码', trigger: 'blur' },
   ],
-  remark: [
-    { required: true, message: '请输入个人先进描述', trigger: 'blur' },
-    { max: 300, message: '最多输入300个字符', trigger: 'blur' },
-  ],
+  // remark: [
+  //   { required: true, message: '请输入个人先进描述', trigger: 'blur' },
+  //   { max: 300, message: '最多输入300个字符', trigger: 'blur' },
+  // ],
 };
 
 const cascaderProp = {
   expandTrigger: 'click',
   checkStrictly: true,
-  // emitPath: false,
+  emitPath: false,
   value: 'id',
   label: 'deptName',
 };
@@ -218,6 +232,7 @@ async function getTableData() {
         startDate: tableQuery.queryParam.startTime,
         endDate: tableQuery.queryParam.endTime,
         activityId: activityRegistrationId.value,
+        deptId: tableQuery.queryParam.responsibleDepartmentId,
       },
     };
 

+ 1 - 1
src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/components/safetyCultureActivityManagementDetail.vue

@@ -57,7 +57,7 @@
         <UploadFiles
           v-if="isFeedbackMode"
           label="上传文件"
-          :maxCount="1"
+          :maxCount="10"
           :file-list="ruleFormData.fileUrlList"
           :allow-all-file-types="true"
           @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"

+ 2 - 2
src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/configs/activityTargetTables.ts

@@ -160,13 +160,13 @@ export const ACTIVITY_REGISTRATION_ADVANCED_PERSON_TABLE_COLUMNS: TableColumnPro
   //   minWidth: '140px',
   // },
   {
-    label: '先进个人描述',
+    label: '备注',
     prop: 'remark',
     align: 'left',
     minWidth: '160px',
   },
   {
-    label: '报日期',
+    label: '报日期',
     prop: 'createdAt',
     align: 'left',
     minWidth: '150px',

+ 1 - 1
src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/configs/tables.ts

@@ -60,7 +60,7 @@ export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
   },
   {
     label: '计划完成时间',
-    prop: 'createdAt',
+    prop: 'endTime',
     align: 'left',
     minWidth: '160px',
   },

+ 1 - 1
src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/safetyCultureActivityManagementExecutor.vue

@@ -27,7 +27,7 @@
               <div class="select-box--item">
                 <span>状态:</span>
                 <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
-                  <el-option label="未下发" :value="1" />
+                  <!-- <el-option label="未下发" :value="1" /> -->
                   <el-option label="待反馈" :value="2" />
                   <el-option label="已完成" :value="3" />
                 </el-select>