Przeglądaj źródła

现场提出的临时修改点

刘洋 2 lat temu
rodzic
commit
89ec1d8854

+ 37 - 1
src/modules/admin-role/setting/index.vue

@@ -22,6 +22,7 @@ import { ROLE_OPTION } from '@/constants/dicts'
 import useFetch from '@/hooks/useFetch'
 import useMainLayoutStore from '@/store/layout'
 import BaseSelect from '@/components/element/BaseSelect.vue'
+import { cloneDeep } from 'lodash'
 
 import type { ExtractApiResponse } from '@/api/api'
 
@@ -43,6 +44,30 @@ const { fetch: getPrivilege, result: privilege } = useFetch('getRolePrivilege')
 
 const { fetch: setPrivilege, loading } = useFetch('setRolePrivilege')
 
+const getTreeList = (oldDataList: any[], sortField = false): any[] => {
+  if (!Array.isArray(oldDataList)) {
+    throw new TypeError(`${oldDataList}不是数组`)
+  }
+  const dataList: any[] = cloneDeep(oldDataList)
+  // 第一次是将全部的permissionId作为对象的key重组成一个对象
+  const formatObj: any = dataList.reduce((pre, cur) => {
+    return { ...pre, [cur['id']]: cur }
+  }, {})
+  // 排序
+  const sortArray = sortField ? dataList.sort((a: any, b: any) => a['sort'] - b['sort']) : dataList
+  const formatArray = sortArray.reduce((arr: any[], cur: any) => {
+    const pid = cur.parentId ? cur.parentId : 0
+    const parent = formatObj[pid]
+    if (parent) {
+      parent.children ? parent.children.push(cur) : (parent.children = [cur])
+    } else {
+      arr.push(cur)
+    }
+    return arr
+  }, [])
+  return formatArray
+}
+
 watch(
   role,
   () => {
@@ -52,8 +77,19 @@ watch(
 )
 
 watch(privilege, () => {
+  let treeData = getTreeList(privilege.value)
+  let pIds: any[] = []
+  for (let i = 0; i < treeData.length; i++) {
+    let item = treeData[i]
+    if (item.children && item.children.length) {
+      pIds.push(item.id)
+    }
+  }
+
   nextTick(() => {
-    treeRef?.value?.setCheckedKeys(privilege?.value?.filter((d) => d.hasPrivilege)?.map((d) => d.code))
+    treeRef?.value?.setCheckedKeys(
+      privilege?.value?.filter((d) => d.hasPrivilege && pIds.indexOf(d.id) == -1)?.map((d) => d.code)
+    )
   })
 })
 

+ 5 - 3
src/modules/analysis/personnel-statistics/components/StatisticsGroup.vue

@@ -15,7 +15,7 @@
     >
     </base-table>
   </div>
-  <div v-if="!!current" v-loading="loading1 || loading2" class="flex justify-between m-t-base charts-box">
+  <!-- <div v-if="!!current" v-loading="loading1 || loading2" class="flex justify-between m-t-base charts-box">
     <el-button type="primary" plain size="small" class="close-panel" @click="clearCheck">关闭</el-button>
     <div class="flex-1 p-mini radius-base fill-blank m-r-base chart-box">
       <vue-e-charts class="full" :option="groupSubjectiveChartsOption"></vue-e-charts>
@@ -23,7 +23,7 @@
     <div class="flex-1 p-mini radius-base fill-blank chart-box">
       <vue-e-charts class="full" :option="groupObjectiveChartsOption"></vue-e-charts>
     </div>
-  </div>
+  </div> -->
 </template>
 
 <script setup lang="ts" name="StatisticsGroup">
@@ -63,6 +63,7 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getStatistics
     label: '评卷员',
     prop: 'markerName',
     minWidth: 84,
+    fixed: 'left',
     slotName: 'marker',
     formatter(row: any) {
       return row.markingGroupNumber === 0 ? '全体' : `第${row.markingGroupNumber}组`
@@ -239,7 +240,8 @@ const getXAxisData = <K extends keyof ExtractArrayValue<StatisticObjectiveByGrou
   return data?.map((v) => getValue(field, v))
 }
 const tableHeight = computed(() => {
-  return !!current.value ? 'calc(100vh - 520px)' : 'calc(100vh - 219px)'
+  // return !!current.value ? 'calc(100vh - 520px)' : 'calc(100vh - 219px)'
+  return 'calc(100vh - 250px)'
 })
 const clearCheck = () => {
   ;(elTableRef as any).value!.setCurrentRow(undefined)

+ 23 - 13
src/modules/analysis/personnel-statistics/components/StatisticsPersonnel.vue

@@ -11,7 +11,7 @@
       :row-class-name="rowClassName"
       highlight-current-row
       @current-change="onCurrentChange"
-      @row-dblclick="onDbClick"
+      @row-dblclick="myDbClick"
       @row-contextmenu="rowContextmenu"
       @sort-change="sortChange"
     >
@@ -42,7 +42,7 @@
       </template>
     </base-table>
   </div>
-  <div
+  <!-- <div
     v-if="!!current && !!current?.markerId"
     v-loading="loading1 || loading2"
     class="flex justify-between m-t-base charts-box"
@@ -55,7 +55,7 @@
     <div class="flex-1 p-base radius-base fill-blank chart-box">
       <vue-e-charts class="full" :option="markerObjectiveChartsOption"></vue-e-charts>
     </div>
-  </div>
+  </div> -->
   <set-workload v-model="setWorkloadVisible" :data="setWorkloadData" />
   <right-key-menu
     v-show="visable"
@@ -113,7 +113,7 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getStatistics
       return row.markingGroupNumber === 0 ? '全部' : `第${row.markingGroupNumber}组`
     },
   },
-  { label: '评卷员', prop: 'markerName', minWidth: 84, slotName: 'marker' },
+  { label: '评卷员', prop: 'markerName', minWidth: 84, slotName: 'marker', fixed: 'left' },
 
   { align: 'center', label: '评卷份数', prop: 'markingPaperCount', minWidth: 92 },
   { align: 'center', label: '平均分', prop: 'avg', minWidth: 80 },
@@ -216,6 +216,15 @@ const data = computed(() => {
 })
 
 const { tableRef, tableData, current, onCurrentChange, onDbClick, currentView, elTableRef } = useTableCheck(data, false)
+const myDbClick = (row: any) => {
+  onDbClick(row)
+  if (currentView.value && !!currentView.value.markingGroupNumber) {
+    push({
+      name: 'AnalysisPersonnelStatisticsMarker',
+      query: { markerId: currentView.value.markerId, markerName: currentView.value.markerName },
+    })
+  }
+}
 const sortTableData = ref<any[]>([])
 const originalTableData = ref<any[]>([])
 const sortChange = (params: any) => {
@@ -273,14 +282,14 @@ watch(tableData, () => {
   initSortTableData()
 })
 
-watch(currentView, () => {
-  if (currentView.value && !!currentView.value.markingGroupNumber) {
-    push({
-      name: 'AnalysisPersonnelStatisticsMarker',
-      query: { markerId: currentView.value.markerId, markerName: currentView.value.markerName },
-    })
-  }
-})
+// watch(currentView, () => {
+//   if (currentView.value && !!currentView.value.markingGroupNumber) {
+//     push({
+//       name: 'AnalysisPersonnelStatisticsMarker',
+//       query: { markerId: currentView.value.markerId, markerName: currentView.value.markerName },
+//     })
+//   }
+// })
 
 const {
   fetch: getStatisticObjectiveByMarker,
@@ -445,7 +454,8 @@ const markerObjectiveChartsOption = computed<EChartsOption>(() => {
   }
 })
 const tableHeight = computed(() => {
-  return !!current.value && !!current.value?.markerId ? 'calc(100vh - 520px)' : 'calc(100vh - 219px)'
+  // return !!current.value && !!current.value?.markerId ? 'calc(100vh - 520px)' : 'calc(100vh - 219px)'
+  return 'calc(100vh - 250px)'
 })
 const clearCheck = () => {
   ;(elTableRef as any).value!.setCurrentRow(undefined)

+ 22 - 3
src/modules/analysis/view-marked-detail/index.vue

@@ -5,7 +5,10 @@
       :paper-path="current?.filePath"
       @click="onOperationClick"
     >
-      <el-button class="m-l-base m-r-auto" size="small" type="primary" @click="onEditScore">修改给分</el-button>
+      <el-button class="m-l-base" size="small" type="primary" @click="onEditScore">修改给分</el-button>
+      <el-button :disabled="!current?.taskId" class="m-l-base m-r-auto" size="small" type="primary" @click="onSendBack"
+        >打回</el-button
+      >
     </mark-header>
     <div class="flex flex-1 overflow-hidden p-base mark-container">
       <div
@@ -82,7 +85,12 @@
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="current?.filePath"></image-preview>
-
+  <send-back-mark
+    :id="current?.taskId"
+    v-model="sendBackVisible"
+    type="custom-check"
+    @rejected="onRejected"
+  ></send-back-mark>
   <mark-history-list
     :id="currentViewHistory?.taskId"
     v-model="visibleHistory"
@@ -109,6 +117,7 @@ import RightButton from '@/components/shared/RightButton.vue'
 import SvgIcon from '@/components/common/SvgIcon.vue'
 import ImagePreview from '@/components/shared/ImagePreview.vue'
 import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
+import SendBackMark from '@/components/shared/SendBackMark.vue'
 
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from '@/api/api'
@@ -121,7 +130,17 @@ const props = defineProps<{
 }>()
 
 const { query } = useRoute()
-
+/** 打回弹窗 */
+const sendBackVisible = ref<boolean>(false)
+/** 打回 */
+const onSendBack = () => {
+  sendBackVisible.value = true
+}
+/** 打回成功 */
+const onRejected = () => {
+  // onRefresh()
+  ElMessage.success('打回成功')
+}
 /** 给分板 */
 const editScoreVisible = ref<boolean>(false)