浏览代码

每日进度、组长监控增加时间控件查询

刘洋 1 年之前
父节点
当前提交
cec7ca1aea

+ 3 - 0
src/api/api-types/statistics.d.ts

@@ -165,6 +165,7 @@ export namespace Statistics {
     finishCount: number
     finishCount: number
     finishRate: number
     finishRate: number
     markingGroupNumber: number | string
     markingGroupNumber: number | string
+    dayProgresses?: any
   }
   }
 
 
   type GetMarkProgressByGroup = BaseDefine<
   type GetMarkProgressByGroup = BaseDefine<
@@ -501,6 +502,7 @@ export namespace Statistics {
 
 
   type GetSystemCheckLevel = BaseDefine<null, any>
   type GetSystemCheckLevel = BaseDefine<null, any>
   type GetDayList = BaseDefine<any, any>
   type GetDayList = BaseDefine<any, any>
+  type getDayListInGroup = BaseDefine<any, any>
   type GetRecoveryTaskCount = BaseDefine<any, any>
   type GetRecoveryTaskCount = BaseDefine<any, any>
 
 
   /** 系统抽查卷打分 */
   /** 系统抽查卷打分 */
@@ -649,6 +651,7 @@ export namespace Statistics {
     getProvinceProcess: GetProvinceProcess
     getProvinceProcess: GetProvinceProcess
     getCompareList: GetCompareList
     getCompareList: GetCompareList
     getDayList: GetDayList
     getDayList: GetDayList
+    getDayListInGroup: getDayListInGroup
     getRecoveryTaskCount: GetRecoveryTaskCount
     getRecoveryTaskCount: GetRecoveryTaskCount
   }
   }
 }
 }

+ 6 - 0
src/api/statistics.ts

@@ -171,6 +171,12 @@ const StatisticsApi: DefineApiModule<Statistics.ApiMap> = {
     },
     },
   },
   },
   getDayList: '/api/statistic/mark/day/list',
   getDayList: '/api/statistic/mark/day/list',
+  getDayListInGroup: {
+    url: '/api/statistic/monitor/for/group/day/list',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+  },
   getRecoveryTaskCount: '/api/statistic/marking/progress/check/for/allow/mark/count',
   getRecoveryTaskCount: '/api/statistic/marking/progress/check/for/allow/mark/count',
 }
 }
 
 

+ 25 - 0
src/hooks/useDayListInGroup.ts

@@ -0,0 +1,25 @@
+import { ref, computed, watch } from 'vue'
+import useFetch from './useFetch'
+
+const useDayOptions = (dataModel: any) => {
+  const dayList = ref([])
+  function fetchDayList() {
+    if (dataModel.subject && dataModel.question) {
+      useFetch('getDayListInGroup')
+        .fetch({ subjectCode: dataModel.subject, questionMainNumber: dataModel.question })
+        .then((res: any) => {
+          dayList.value = res.map((item: any) => ({ label: item.value, value: item.key }))
+        })
+    }
+  }
+  watch([() => dataModel.subject, () => dataModel.question], (a: any, b: any) => {
+    fetchDayList()
+  })
+  fetchDayList()
+
+  const dayOptions = computed<any>(() => [{ label: '全部', value: '' }, ...dayList.value].filter((v) => !!v))
+  return {
+    dayOptions,
+  }
+}
+export default useDayOptions

+ 22 - 1
src/modules/analysis/group-monitoring/hooks/useFormFilter.ts

@@ -3,6 +3,8 @@ import useForm from '@/hooks/useForm'
 import useOptions from '@/hooks/useOptions'
 import useOptions from '@/hooks/useOptions'
 import useVW from '@/hooks/useVW'
 import useVW from '@/hooks/useVW'
 import useFetch from '@/hooks/useFetch'
 import useFetch from '@/hooks/useFetch'
+import { getTodayByDay } from '@/utils/common'
+import useDayListInGroup from '@/hooks/useDayListInGroup'
 import type { EpFormItem } from 'global-type'
 import type { EpFormItem } from 'global-type'
 import type { ExtractApiParams } from '@/api/api'
 import type { ExtractApiParams } from '@/api/api'
 
 
@@ -42,12 +44,22 @@ const useFormFilter = () => {
 
 
   const model = reactive<
   const model = reactive<
     // Omit<ExtractApiParams<'getGroupMonitor'>, 'markingGroupNumber'> & { markingGroupNumber?: number | string }
     // Omit<ExtractApiParams<'getGroupMonitor'>, 'markingGroupNumber'> & { markingGroupNumber?: number | string }
-    Omit<ExtractApiParams<'getGroupMonitor'>, 'markingGroupNumbers'> & { markingGroupNumbers?: any; roles?: any }
+    Omit<ExtractApiParams<'getGroupMonitor'>, 'markingGroupNumbers'> & {
+      markingGroupNumbers?: any
+      roles?: any
+      day?: any
+    }
   >({
   >({
     subjectCode: dataModel.subject || '',
     subjectCode: dataModel.subject || '',
     markingGroupNumbers: dataModel.group,
     markingGroupNumbers: dataModel.group,
     questionMainNumber: dataModel.question,
     questionMainNumber: dataModel.question,
     roles: [],
     roles: [],
+    day: '',
+  })
+
+  const { dayOptions } = useDayListInGroup(dataModel)
+  watch(dayOptions, () => {
+    model.day = ''
   })
   })
 
 
   const formModel = computed<any>(() => {
   const formModel = computed<any>(() => {
@@ -58,6 +70,7 @@ const useFormFilter = () => {
       markingGroupNumbers: model.markingGroupNumbers,
       markingGroupNumbers: model.markingGroupNumbers,
       questionMainNumber: model.questionMainNumber,
       questionMainNumber: model.questionMainNumber,
       roles: model.roles,
       roles: model.roles,
+      day: model.day,
     }
     }
   })
   })
 
 
@@ -134,6 +147,14 @@ const useFormFilter = () => {
         multiple: true,
         multiple: true,
       },
       },
     }),
     }),
+    OneRowSpan5({
+      label: '时间',
+      slotType: 'select',
+      prop: 'day',
+      slot: {
+        options: dayOptions.value,
+      },
+    }),
     OneRowSpan5({
     OneRowSpan5({
       labelWidth: '20px',
       labelWidth: '20px',
       slotName: 'button-group',
       slotName: 'button-group',

+ 26 - 3
src/modules/analysis/group-monitoring/index.vue

@@ -9,7 +9,23 @@
     </div>
     </div>
     <div class="flex-1 p-base">
     <div class="flex-1 p-base">
       <div class="radius-base p-l-base p-r-base p-t-mini fill-blank p-b-mini">
       <div class="radius-base p-l-base p-r-base p-t-mini fill-blank p-b-mini">
-        <base-table border stripe size="small" :columns="columns" :data="result"></base-table>
+        <base-table border stripe size="small" :columns="columns" :data="result">
+          <template #column-leader="{ row }">
+            <div style="text-align: left; overflow: hidden; white-space: nowrap; text-overflow: ellipsis">
+              <span
+                :style="{
+                  backgroundColor: row.online ? '#00B42A' : '#ddd',
+                  display: 'inline-block',
+                  width: '10px',
+                  height: '10px',
+                  marginRight: '4px',
+                  borderRadius: '2px',
+                }"
+              ></span>
+              <span>{{ row.markingGroupLeader }}</span>
+            </div>
+          </template>
+        </base-table>
       </div>
       </div>
     </div>
     </div>
   </div>
   </div>
@@ -37,8 +53,15 @@ const { model, formModel, items, onOptionInit } = useFormFilter()
 
 
 const { loading, fetch: getGroupMonitor, result } = useFetch('getGroupMonitor')
 const { loading, fetch: getGroupMonitor, result } = useFetch('getGroupMonitor')
 
 
-const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getGroupMonitor'>>>[] = [
-  { label: '组长', prop: 'markingGroupLeader', fixed: 'left' },
+const columns: any = [
+  {
+    label: '组长',
+    prop: 'markingGroupLeader',
+    width: 150,
+    fixed: 'left',
+    slotName: 'leader',
+    align: 'left',
+  },
   {
   {
     label: '已浏览试卷总数',
     label: '已浏览试卷总数',
     prop: 'totalCount',
     prop: 'totalCount',

+ 77 - 23
src/modules/analysis/marking-progress/components/TotalProgress.vue

@@ -34,28 +34,43 @@
   <div class="p-base radius-base fill-blank group-progress-box">
   <div class="p-base radius-base fill-blank group-progress-box">
     <div class="flex direction-column p-r-base">
     <div class="flex direction-column p-r-base">
       <div class="flex justify-between">
       <div class="flex justify-between">
-        <span class="table-title p-t-small p-b-extra-small">小组进度</span>
+        <!-- <span class="table-title p-t-small p-b-extra-small">小组进度</span> -->
+        <el-radio-group v-model="tabValue">
+          <el-radio-button label="每日进度" />
+          <el-radio-button label="小组进度" />
+        </el-radio-group>
         <span v-show="currentMainName" class="flex items-center current-main-name">
         <span v-show="currentMainName" class="flex items-center current-main-name">
           <svg-icon class="m-r-medium-mini" name="question"></svg-icon>
           <svg-icon class="m-r-medium-mini" name="question"></svg-icon>
           <span>{{ currentMainName }}</span>
           <span>{{ currentMainName }}</span>
         </span>
         </span>
       </div>
       </div>
-      <div class="flex-1 overflow-hidden">
-        <base-table border stripe size="small" height="100%" :columns="groupColumns" :data="groupProgressData">
+      <div class="flex-1 overflow-hidden p-t-base">
+        <base-table
+          v-if="tabValue === '小组进度'"
+          border
+          stripe
+          size="small"
+          height="100%"
+          :columns="groupColumns"
+          :data="groupProgressData"
+        >
+          <template #empty>暂无数据</template>
+        </base-table>
+        <base-table v-else border stripe size="small" height="100%" :columns="dayColumns" :data="groupProgressData">
           <template #empty>暂无数据</template>
           <template #empty>暂无数据</template>
         </base-table>
         </base-table>
       </div>
       </div>
     </div>
     </div>
-    <div class="chart-info m-t-base" style="height: 300px">
+    <div v-if="tabValue === '小组进度'" class="chart-info m-t-base" style="height: 300px">
       <vue-e-charts v-if="currentMainName" class="full" :option="groupChartsOption" autoresize></vue-e-charts>
       <vue-e-charts v-if="currentMainName" class="full" :option="groupChartsOption" autoresize></vue-e-charts>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
 
 
-<script setup lang="ts" name="TotalProgress">
+<script setup lang="tsx" name="TotalProgress">
 /** 评卷进度 */
 /** 评卷进度 */
 import { reactive, watch, computed, ref, nextTick } from 'vue'
 import { reactive, watch, computed, ref, nextTick } from 'vue'
-import { ElButton } from 'element-plus'
+import { ElButton, ElRadioButton, ElRadioGroup } from 'element-plus'
 import VueECharts from 'vue-echarts'
 import VueECharts from 'vue-echarts'
 import { minus } from '@/utils/common'
 import { minus } from '@/utils/common'
 import BaseForm from '@/components/element/BaseForm.vue'
 import BaseForm from '@/components/element/BaseForm.vue'
@@ -71,7 +86,7 @@ import type { ExtractApiResponse } from '@/api/api'
 import type { EpFormItem, EpTableColumn } from 'global-type'
 import type { EpFormItem, EpTableColumn } from 'global-type'
 
 
 const { provideInitOption } = useVueECharts()
 const { provideInitOption } = useVueECharts()
-
+const tabValue = ref('每日进度')
 provideInitOption({ renderer: 'svg' })
 provideInitOption({ renderer: 'svg' })
 const canLoadTopChart = ref(false)
 const canLoadTopChart = ref(false)
 // const { subjectList, dataModel, changeModelValue } = useOptions(['subject'])
 // const { subjectList, dataModel, changeModelValue } = useOptions(['subject'])
@@ -284,7 +299,8 @@ const totalChartsOption = computed<EChartsOption>(() => {
       right: 0,
       right: 0,
       top: 0,
       top: 0,
       itemWidth: 14,
       itemWidth: 14,
-      data: ['试卷总量', '已完成', '完成比'],
+      // data: ['试卷总量', '已完成', '完成比'],
+      data: ['试卷总量', '已完成'],
     },
     },
     yAxis: {
     yAxis: {
       axisLine: { show: false },
       axisLine: { show: false },
@@ -333,29 +349,38 @@ const totalChartsOption = computed<EChartsOption>(() => {
           color: '#3AD500',
           color: '#3AD500',
         },
         },
         data: getYAxisData('finishCount', markProgressResult?.value),
         data: getYAxisData('finishCount', markProgressResult?.value),
-      },
-      {
-        name: '完成比',
-        type: 'bar',
-        // barWidth: 44,
-        barWidth: 11,
-        barGap: '-200%',
-        showBackground: true,
-        xAxisIndex: 1,
-        itemStyle: {
-          color: 'rgba(0, 186, 151,0.3)',
-        },
         label: {
         label: {
           show: true,
           show: true,
           color: '#444',
           color: '#444',
           fontSize: 10,
           fontSize: 10,
           formatter({ value }) {
           formatter({ value }) {
-            return value > 0 ? `${value}%` : ''
+            return getRateLabel(value)
           },
           },
-          position: 'insideTopRight',
+          position: 'right',
         },
         },
-        data: getYAxisData('finishRate', markProgressResult?.value),
       },
       },
+      // {
+      //   name: '完成比',
+      //   type: 'bar',
+      //   // barWidth: 44,
+      //   barWidth: 11,
+      //   barGap: '-200%',
+      //   showBackground: true,
+      //   xAxisIndex: 1,
+      //   itemStyle: {
+      //     color: 'rgba(0, 186, 151,0.3)',
+      //   },
+      //   label: {
+      //     show: true,
+      //     color: '#444',
+      //     fontSize: 10,
+      //     formatter({ value }) {
+      //       return value > 0 ? `${value}%` : ''
+      //     },
+      //     position: 'insideTopRight',
+      //   },
+      //   data: getYAxisData('finishRate', markProgressResult?.value),
+      // },
     ],
     ],
   }
   }
 })
 })
@@ -398,6 +423,35 @@ const groupProgressData = computed(() => {
   arr.push(total)
   arr.push(total)
   return arr
   return arr
 })
 })
+const getRateLabel = (value: any) => {
+  if (markProgressResult.value?.length) {
+    let rate = markProgressResult.value.find((v) => v.finishCount == value)?.finishRate
+    return rate ? rate + '%' : ''
+  } else {
+    return ''
+  }
+}
+
+const dayColumns = computed(() => {
+  let dateArr =
+    groupProgressResult?.value?.[0]?.dayProgresses?.map((item: any) => {
+      return {
+        label: item.date,
+        formatter(row: any) {
+          let dayProgresses = row.dayProgresses
+          let col = dayProgresses.find((v: any) => v.date == item.date)
+          // return '444'
+          return <span>{`${col.count} / ${col.rate}%`}</span>
+        },
+      }
+    }) || []
+
+  return [
+    { label: '小组', formatter: (row: any) => (row.markingGroupNumber ? `第${row.markingGroupNumber}组` : '全体') },
+    { label: '完成总量', prop: 'finishCount', align: 'center', sortable: true },
+    ...dateArr,
+  ]
+})
 
 
 watch(
 watch(
   currentMainQuestion,
   currentMainQuestion,

+ 2 - 1
src/modules/analysis/monitoring/index.vue

@@ -15,7 +15,8 @@
         >
         >
           <div class="flex direction-column radius-base full fill-blank data-card-content">
           <div class="flex direction-column radius-base full fill-blank data-card-content">
             <div class="p-base card-title flex items-center justify-between">
             <div class="p-base card-title flex items-center justify-between">
-              <span>{{ card.title }}</span>
+              <!-- <span>{{ card.title }}</span> -->
+              <el-button type="primary" size="small">{{ card.title }}</el-button>
               <el-button size="small" type="primary" link @click="toMore(card.key)">更多&gt;&gt; </el-button>
               <el-button size="small" type="primary" link @click="toMore(card.key)">更多&gt;&gt; </el-button>
             </div>
             </div>
             <div class="p-l-extra-base p-r-mini p-b-extra-small flex-1 overflow-hidden">
             <div class="p-l-extra-base p-r-mini p-b-extra-small flex-1 overflow-hidden">

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

@@ -46,7 +46,7 @@
               display: 'inline-block',
               display: 'inline-block',
               width: '10px',
               width: '10px',
               height: '10px',
               height: '10px',
-              marginRight: '3px',
+              marginRight: '4px',
               borderRadius: '2px',
               borderRadius: '2px',
             }"
             }"
           ></span>
           ></span>

+ 2 - 2
src/modules/quality/ending-check/components/EndCheck.vue

@@ -389,7 +389,7 @@ const columns1 = computed(() => {
                 display: 'inline-block',
                 display: 'inline-block',
                 width: '10px',
                 width: '10px',
                 height: '10px',
                 height: '10px',
-                marginRight: '3px',
+                marginRight: '4px',
                 borderRadius: '2px',
                 borderRadius: '2px',
               }}
               }}
             ></span>
             ></span>
@@ -447,7 +447,7 @@ const columns11 = computed(() => {
                 display: 'inline-block',
                 display: 'inline-block',
                 width: '10px',
                 width: '10px',
                 height: '10px',
                 height: '10px',
-                marginRight: '3px',
+                marginRight: '4px',
                 borderRadius: '2px',
                 borderRadius: '2px',
               }}
               }}
             ></span>
             ></span>

+ 1 - 1
src/modules/quality/ending-check/components/SubjectProgress.vue

@@ -126,7 +126,7 @@ const getMainName = (row?: SubjectProgress) => {
   return [number, name].filter(Boolean).join('-')
   return [number, name].filter(Boolean).join('-')
 }
 }
 
 
-const getRateLabel = (value: number) => {
+const getRateLabel = (value: any) => {
   if (subjectProgressEndList.value?.length) {
   if (subjectProgressEndList.value?.length) {
     let rate = subjectProgressEndList.value.find((v) => v.finishCount == value)?.finishRate
     let rate = subjectProgressEndList.value.find((v) => v.finishCount == value)?.finishRate
     return rate ? rate + '%' : ''
     return rate ? rate + '%' : ''