ソースを参照

1.1.0需求开发

刘洋 1 年間 前
コミット
98bb850c07

+ 2 - 2
server.config.ts

@@ -3,11 +3,11 @@ import type { ServerOptions } from 'vite'
 const server: ServerOptions = {
   proxy: {
     '^/?(api|file)/': {
-      // target: 'http://192.168.10.41:8200',
+      target: 'http://192.168.10.41:8200',
       // target: 'http://192.168.10.178:8200',
       // target: 'http://192.168.10.108:8200',
       // target: 'http://cet-test.markingtool.cn',
-      target: 'http://192.168.10.136:80',
+      // target: 'http://192.168.10.136:80',
       // target: 'http://cet-dev.markingtool.cn:8200',
     },
   },

+ 1 - 1
src/api/api-types/statistics.d.ts

@@ -16,7 +16,7 @@ export namespace Statistics {
     /** 结束时间,格式:yyyyMMddHHmmss */
     endTime: string
     /** 小组号 */
-    markingGroupNumber?: number | string
+    markingGroupNumbers?: number | string
     /** 大题号 */
     questionMainNumber?: number | string
     /** 开始时间,格式:yyyyMMddHHmmss */

+ 9 - 0
src/assets/styles/element/custom.scss

@@ -355,4 +355,13 @@ body {
 }
 .el-scrollbar__thumb{
   background-color:#555 !important;
+}
+
+.el-select{
+  .el-select__tags{
+    overflow:auto;
+    &>span.el-select-tags-wrapper{
+      display:flex;
+    }
+  }
 }

+ 9 - 2
src/hooks/useDayList.ts

@@ -2,7 +2,7 @@ import { ref, computed, watch } from 'vue'
 import useFetch from './useFetch'
 import { getTodayByDay } from '@/utils/common'
 
-const useDayOptions = (dataModel: any) => {
+const useDayOptions = (dataModel: any, notIncludeCurDay?: any) => {
   const dayList = ref([])
   const today = getTodayByDay()
   function fetchDayList() {
@@ -21,7 +21,14 @@ const useDayOptions = (dataModel: any) => {
   })
   fetchDayList()
 
-  const dayOptions = computed(() => [{ label: '当天', value: today }, { label: '全部', value: '' }, ...dayList.value])
+  const dayOptions = computed<any>(() =>
+    [
+      { label: '当天', value: today },
+      { label: '全部', value: '' },
+      notIncludeCurDay ? { label: '全部(不含当天)', value: 'notIncludeCurDay' } : null,
+      ...dayList.value,
+    ].filter((v) => !!v)
+  )
   return {
     dayOptions,
   }

+ 29 - 7
src/hooks/useOptions.ts

@@ -7,12 +7,12 @@ import type { Ref } from 'vue'
 export interface DataModel {
   subject?: string
   question?: number | string
-  group?: number | string
+  group?: any
 }
 
 interface Group {
   label: string
-  value: number
+  value: any
 }
 
 type QuestionList = ExtractApiResponse<'getMainQuestionList'>[0] & {
@@ -24,7 +24,8 @@ const useOptions = (
   types: (keyof DataModel)[],
   initModel?: DataModel | Ref<DataModel>,
   autoFill = true,
-  subjectEnable: boolean | null = true
+  subjectEnable: boolean | null = true,
+  multGroup = false
 ) => {
   const mainStore = useMainStore()
   const isChooseAllOptionMap = reactive<any>({
@@ -152,7 +153,11 @@ const useOptions = (
       }
 
       if (!dataModel.group && userInfo.value?.markingGroupNumber && !(isAdmin.value || isChief.value)) {
-        dataModel.group = userInfo.value.markingGroupNumber
+        dataModel.group = multGroup
+          ? userInfo.value.markingGroupNumber
+            ? [userInfo.value.markingGroupNumber]
+            : []
+          : userInfo.value.markingGroupNumber
       }
       // if (isExpert.value || isLeader.value) {
       //   dataModel.question = void 0
@@ -189,7 +194,7 @@ const useOptions = (
           // if (!userInfo.value?.markingGroupNumber && res && res[0]) {
           //   changeModelValue('group')(res[0])
           // }
-          changeModelValue('group')(void 0)
+          changeModelValue('group')(multGroup ? [] : void 0)
         })
       }
     },
@@ -233,7 +238,13 @@ const useOptions = (
       [groupList, userInfo, isAdmin, isChief],
       () => {
         if (userInfo.value?.markingGroupNumber && !dataModel.question && !(isAdmin.value || isChief.value)) {
-          changeModelValue('group')(userInfo.value?.markingGroupNumber)
+          changeModelValue('group')(
+            multGroup
+              ? userInfo.value?.markingGroupNumber
+                ? [userInfo.value?.markingGroupNumber]
+                : []
+              : userInfo.value?.markingGroupNumber
+          )
         }
       },
       { deep: true }
@@ -252,7 +263,18 @@ const useOptions = (
           //   (!dataModel[t] && isChooseAllOptionMap[t]) ||
           //   (t === 'group' && (isAdmin.value || isChief.value))
           // (t) => dataModel[t] || (t === 'group' && (isAdmin.value || isChief.value))
-          (t) => dataModel[t] || (t === 'group' && (isAdmin.value || isChief.value || isExpert || isLeader))
+
+          (t) => {
+            console.log(t, dataModel[t])
+            console.log(
+              Array.isArray(dataModel[t]) ? dataModel[t].length > 0 : !!dataModel[t],
+              t === 'group' && (isAdmin.value || isChief.value || isExpert.value || isLeader.value)
+            )
+            return (
+              (Array.isArray(dataModel[t]) ? dataModel[t].length > 0 : !!dataModel[t]) ||
+              (t === 'group' && (isAdmin.value || isChief.value || isExpert.value || isLeader.value))
+            )
+          }
         )
       ) {
         nextTick(() => {

+ 1 - 1
src/modules/admin-user/manage/hooks/useUserManageTable.ts

@@ -3,7 +3,7 @@ import useTable, { ModelType, MultipleResponseType } from '@/hooks/useTable'
 import type { EpTableColumn } from 'global-type'
 
 const useUserManageTable = (model?: ModelType<'getUserList'>) => {
-  const { data, ...other } = useTable('getUserList', model)
+  const { data, ...other } = useTable('getUserList', model, { pageSize: 20 })
 
   const columns: EpTableColumn<MultipleResponseType<'getUserList'>>[] = [
     { type: 'selection', width: 60 },

+ 19 - 6
src/modules/admin-user/manage/index.vue

@@ -46,12 +46,25 @@
             </template>
           </el-popconfirm> -->
           <el-button size="small" type="primary" @click="checkSelected('reset', 'mult')">重置密码</el-button>
+          <el-popconfirm
+            v-if="hasSelected"
+            :width="'220px'"
+            hide-icon
+            title="是否启用选中用户?"
+            @confirm="handleDisableUsers(true)"
+          >
+            <template #reference>
+              <el-button size="small" type="primary">启用</el-button>
+            </template>
+          </el-popconfirm>
+          <el-button v-else size="small" type="primary" @click="checkSelected('enable')">启用</el-button>
+
           <el-popconfirm
             v-if="hasSelected"
             :width="'220px'"
             hide-icon
             title="是否禁用选中用户?"
-            @confirm="handleDisableUsers"
+            @confirm="handleDisableUsers(false)"
           >
             <template #reference>
               <el-button size="small" type="primary">禁用</el-button>
@@ -229,9 +242,9 @@ function onBulkAddUser() {
 const showResetPwdDialog = ref(false)
 const resetPwdType = ref<any>('')
 
-function checkSelected(type: 'reset' | 'disabled', resetType?: string) {
+function checkSelected(type: 'reset' | 'disabled' | 'enable', resetType?: string) {
   if (!selectedList.length) {
-    return ElMessage.warning(`请选择需要${type === 'reset' ? '重置密码' : '禁用'}的用户`)
+    return ElMessage.warning(`请选择需要${type === 'reset' ? '重置密码' : type === 'enable' ? '启用' : '禁用'}的用户`)
   }
   if (type === 'reset') {
     showResetPwdDialog.value = true
@@ -262,14 +275,14 @@ async function handleResetPwd() {
 }
 
 /** 禁用用户 */
-async function handleDisableUsers() {
+async function handleDisableUsers(bool: boolean) {
   if (!selectedList.length) {
     return void ElMessage.warning(`请选择需要禁用的用户`)
   }
   /** submit */
   try {
-    await toggleFetch({ ids: selectedList.map((d) => d.id), enable: false })
-    ElMessage.success(`禁用成功`)
+    await toggleFetch({ ids: selectedList.map((d) => d.id), enable: bool })
+    ElMessage.success(`${bool ? '启用' : '禁用'}成功`)
     fetchTable()
   } catch (error) {
     console.error(error)

+ 33 - 8
src/modules/analysis/group-monitoring/hooks/useFormFilter.ts

@@ -1,8 +1,8 @@
-import { reactive, computed, watch } from 'vue'
+import { reactive, computed, watch, ref } from 'vue'
 import useForm from '@/hooks/useForm'
 import useOptions from '@/hooks/useOptions'
 import useVW from '@/hooks/useVW'
-
+import useFetch from '@/hooks/useFetch'
 import type { EpFormItem } from 'global-type'
 import type { ExtractApiParams } from '@/api/api'
 
@@ -17,14 +17,27 @@ const useFormFilter = () => {
     isExpert,
     isLeader,
   } = useOptions(['subject', 'question', 'group'])
+  const ROLE_OPTION = ref<any[]>([])
+  useFetch('getRoleList')
+    .fetch()
+    .then((res: any) => {
+      ROLE_OPTION.value = res.map((item: any) => {
+        return {
+          value: item.code,
+          label: item.roleName,
+        }
+      })
+    })
   const { formRef, elFormRef, defineColumn, _ } = useForm()
 
   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 }
   >({
     subjectCode: dataModel.subject || '',
-    markingGroupNumber: dataModel.group,
+    markingGroupNumbers: dataModel.group,
     questionMainNumber: dataModel.question,
+    roles: [],
   })
 
   const formModel = computed<any>(() => {
@@ -32,18 +45,19 @@ const useFormFilter = () => {
       subjectCode: model.subjectCode,
       // markingGroupNumber:
       //   typeof model.markingGroupNumber === 'number' ? [model.markingGroupNumber] : model.markingGroupNumber,
-      markingGroupNumber: model.markingGroupNumber,
+      markingGroupNumbers: model.markingGroupNumbers,
       questionMainNumber: model.questionMainNumber,
+      roles: model.roles,
     }
   })
 
   watch(dataModel, () => {
     model.subjectCode = dataModel.subject || ''
     model.questionMainNumber = dataModel.question
-    model.markingGroupNumber = dataModel.group
+    model.markingGroupNumbers = dataModel.group
   })
 
-  const OneRowSpan5 = defineColumn(_, 'row-1', { span: 5 })
+  const OneRowSpan5 = defineColumn(_, 'row-1', { span: 4 })
 
   const items = computed<EpFormItem[]>(() => [
     OneRowSpan5({
@@ -67,12 +81,23 @@ const useFormFilter = () => {
       },
     }),
     OneRowSpan5({
-      prop: 'markingGroupNumber',
+      prop: 'markingGroupNumbers',
       label: '小组',
       slotType: 'select',
       slot: {
         options: groupListWithAll.value,
         onChange: changeModelValue('group'),
+        multiple: true,
+      },
+    }),
+    OneRowSpan5({
+      label: '角色',
+      slotType: 'select',
+      prop: 'roles',
+      slot: {
+        options: ROLE_OPTION.value,
+        placeholder: '角色',
+        multiple: true,
       },
     }),
     OneRowSpan5({

+ 18 - 11
src/modules/analysis/group-monitoring/index.vue

@@ -39,16 +39,6 @@ const { loading, fetch: getGroupMonitor, result } = useFetch('getGroupMonitor')
 
 const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getGroupMonitor'>>>[] = [
   { label: '组长', prop: 'markingGroupLeader', fixed: 'left' },
-  { label: '已浏览系统抽查卷数', prop: 'sysCheckCount', minWidth: 160, sortable: true },
-  { label: '已给分系统抽查卷数', prop: 'sysCheckReScoreCount', minWidth: 160, sortable: true },
-  { label: '打回量', prop: 'rejectCount', minWidth: 85, sortable: true },
-  { label: '主动抽查次数', prop: 'initiativeCheckCount', minWidth: 120, sortable: true },
-  { label: '主动抽查给分次数', prop: 'initiativeCheckReScoreCount', minWidth: 150, sortable: true },
-
-  { label: '已浏览问题卷数', prop: 'problemCount', minWidth: 138, sortable: true },
-  { label: '已给分问题卷数', prop: 'problemReScoreCount', minWidth: 138, sortable: true },
-  { label: '已浏览自定义抽查卷数', prop: 'customCheckCount', minWidth: 178, sortable: true },
-  { label: '已给分自定义抽查卷数', prop: 'customCheckReScoreCount', minWidth: 178, sortable: true },
   {
     label: '已浏览试卷总数',
     prop: 'totalCount',
@@ -75,11 +65,28 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getGroupMonit
       )
     },
   },
+  { label: '已浏览系统抽查卷数', prop: 'sysCheckCount', minWidth: 160, sortable: true },
+  { label: '已给分系统抽查卷数', prop: 'sysCheckReScoreCount', minWidth: 160, sortable: true },
+  { label: '打回量', prop: 'rejectCount', minWidth: 85, sortable: true },
+  { label: '主动抽查次数', prop: 'initiativeCheckCount', minWidth: 120, sortable: true },
+  { label: '主动抽查给分次数', prop: 'initiativeCheckReScoreCount', minWidth: 150, sortable: true },
+
+  { label: '已浏览问题卷数', prop: 'problemCount', minWidth: 138, sortable: true },
+  { label: '已给分问题卷数', prop: 'problemReScoreCount', minWidth: 138, sortable: true },
+  { label: '已浏览自定义抽查卷数', prop: 'customCheckCount', minWidth: 178, sortable: true },
+  { label: '已给分自定义抽查卷数', prop: 'customCheckReScoreCount', minWidth: 178, sortable: true },
 ]
 
 /** 刷新按钮 */
 function onSearch() {
-  getGroupMonitor(formModel.value).then(() => {
+  let markingGroupNumbers: any = formModel.value.markingGroupNumbers
+  if (
+    !markingGroupNumbers ||
+    (Array.isArray(markingGroupNumbers) && markingGroupNumbers.length !== markingGroupNumbers.filter((v) => !!v).length)
+  ) {
+    markingGroupNumbers = []
+  }
+  getGroupMonitor({ ...formModel.value, markingGroupNumbers }).then(() => {
     jumpParams.subjectCode = formModel.value.subjectCode
     jumpParams.questionMainNumber = formModel.value.questionMainNumber
   })

+ 2 - 1
src/modules/analysis/personnel-compare/hooks/useCompareFilter.ts

@@ -14,7 +14,7 @@ const useCompareFilter = () => {
     onOptionInit,
     isExpert,
     isLeader,
-  } = useOptions(['subject', 'question', 'group'])
+  } = useOptions(['subject', 'question', 'group'], undefined, true, true, true)
   const curDayRange = getCurDayRange()
   const model = reactive({
     subjectCode: dataModel.subject || '',
@@ -85,6 +85,7 @@ const useCompareFilter = () => {
       slot: {
         options: groupListWithAll.value,
         onChange: changeModelValue('group'),
+        multiple: true,
       },
     }),
 

+ 13 - 2
src/modules/analysis/personnel-compare/index.vue

@@ -96,7 +96,18 @@ const dataTypeLabelMap = reactive<any>({
 const multLineXdatas = ref([])
 const { model, fetchModel, items, onOptionInit } = useCompareFilter()
 
-const { fetch, result, loading } = useFetch('getCompareList')
+const { fetch, result: allResult, loading } = useFetch('getCompareList')
+const result = (allResult?.value || []).filter((item) => {
+  if (
+    !fetchModel.value.markingGroupNumber ||
+    fetchModel.value.markingGroupNumber?.length === 0 ||
+    (Array.isArray(fetchModel.value.markingGroupNumber) && fetchModel.value.markingGroupNumber.includes(undefined))
+  ) {
+    return item
+  } else {
+    return fetchModel.value.markingGroupNumber.includes(item.markingGroupNumber)
+  }
+})
 const averageDatas = computed(() => {
   if (result.value) {
     let data = result.value.groups.map((item: any) => {
@@ -393,7 +404,7 @@ const multLineChartOptions = computed(() => {
 })
 const onSearch = () => {
   console.log('search')
-  fetch(fetchModel.value).then((res) => {
+  fetch({ ...fetchModel.value, markingGroupNumber: undefined }).then((res) => {
     console.log('rrr', result.value)
   })
 }

+ 19 - 4
src/modules/analysis/personnel-statistics/hooks/useStatisticsFilter.ts

@@ -31,7 +31,7 @@ const useStatisticsFilter = () => {
     onOptionInit,
     isExpert,
     isLeader,
-  } = useOptions(['subject', 'question', 'group'])
+  } = useOptions(['subject', 'question', 'group'], undefined, true, true, true)
 
   const curDayRange = getCurDayRange()
   const model = reactive<any>({
@@ -46,12 +46,26 @@ const useStatisticsFilter = () => {
     markerId: '',
     online: '',
   })
-  const { dayOptions } = useDayList(dataModel)
+  const { dayOptions } = useDayList(dataModel, true)
   watch(dayOptions, () => {
     model.curDay = getTodayByDay()
   })
 
-  const { fetch: getMarkerList, result: markerList } = useFetch('getMarkerList')
+  // const { fetch: getMarkerList, result: markerList } = useFetch('getMarkerList')
+  const { fetch: getMarkerList, result: allMarkerList } = useFetch('getMarkerList')
+  const markerList = computed(() => {
+    let mgn = model.markingGroupNumber
+    if (typeof mgn == 'number') {
+      mgn = [mgn]
+    }
+    if ((mgn || []).includes(undefined) || typeof mgn === 'undefined') {
+      return allMarkerList?.value || []
+    } else {
+      return (allMarkerList?.value || []).filter((item) => {
+        return (mgn || []).includes(item.markingGroupNumber)
+      })
+    }
+  })
   watch(
     () => [model.subjectCode, model.questionMainNumber, model.markingGroupNumber],
     () => {
@@ -59,7 +73,7 @@ const useStatisticsFilter = () => {
         getMarkerList({
           subjectCode: model.subjectCode,
           mainNumber: model.questionMainNumber,
-          markingGroupNumber: model.markingGroupNumber,
+          // markingGroupNumber: model.markingGroupNumber,
         })
         model.markerId = ''
       }
@@ -136,6 +150,7 @@ const useStatisticsFilter = () => {
       slot: {
         options: groupListWithAll.value,
         onChange: changeModelValue('group'),
+        multiple: true,
       },
     }),
     OneRowSpan4({

+ 33 - 14
src/modules/analysis/personnel-statistics/index.vue

@@ -129,7 +129,8 @@ watch(groupListWithAll, () => {
   if (mainStore.myUserInfo && mainStore.myUserInfo.role === 'DEPUTY') {
     setTimeout(() => {
       deputyHasInit.value = true
-      changeModelValue('group')(mainStore.myUserInfo?.markingGroupNumber)
+      changeModelValue('group')([mainStore.myUserInfo?.markingGroupNumber])
+      onSearch()
     }, 0)
   }
 })
@@ -140,7 +141,18 @@ onMounted(() => {
   }
 })
 
-const { fetch, result, loading } = useFetch('getStatisticsByGroup')
+const { fetch, result: allResult, loading } = useFetch('getStatisticsByGroup')
+const result = (allResult?.value || []).filter((item) => {
+  if (
+    !fetchModel.value.markingGroupNumber ||
+    fetchModel.value.markingGroupNumber?.length === 0 ||
+    (Array.isArray(fetchModel.value.markingGroupNumber) && fetchModel.value.markingGroupNumber.includes(undefined))
+  ) {
+    return item
+  } else {
+    return fetchModel.value.markingGroupNumber.includes(item.markingGroupNumber)
+  }
+})
 
 const data = computed<ExtractApiResponse<'getStatisticsByGroup'>>(() => {
   let arr = cloneDeep(result?.value || [])
@@ -194,20 +206,27 @@ const data = computed<ExtractApiResponse<'getStatisticsByGroup'>>(() => {
 
 /** 刷新按钮 */
 function onSearch() {
-  if (mainStore.myUserInfo?.role !== 'DEPUTY') {
-    deputyHasInit.value = true
-  }
-  searchMarkerId.value = model.markerId
-  searchOnline.value = model.online
-  if (deputyHasInit.value) {
-    fetch(omit(fetchModel.value, 'expand', 'markerId', 'online'))
-  }
+  setTimeout(() => {
+    if (mainStore.myUserInfo?.role !== 'DEPUTY') {
+      deputyHasInit.value = true
+    }
+    searchMarkerId.value = model.markerId
+    searchOnline.value = model.online
+    if (deputyHasInit.value) {
+      let params: any = { ...omit(fetchModel.value, 'expand', 'markerId', 'online'), markingGroupNumber: '' }
+      if (fetchModel.value.curDay == 'notIncludeCurDay') {
+        params.curDay = ''
+        params.includeCurDay = false
+      }
+      fetch(params)
+    }
+  }, 1)
 }
 
-onOptionInit(onSearch)
-watch([() => fetchModel.value.markingGroupNumber], () => {
-  onSearch()
-})
+// onOptionInit(onSearch)
+// watch([() => fetchModel.value.markingGroupNumber], () => {
+//   onSearch()
+// })
 const { fetch: exportStatisticsByGroup, loading: exporting } = useFetch('exportStatisticsByGroup', 'get')
 /**导出 */
 function onExport() {

+ 17 - 5
src/modules/quality/self-check/index.vue

@@ -81,13 +81,13 @@ const model = reactive<FormModel & { time: string }>({
   time: '',
   subjectCode: dataModel.subject || '',
   questionMainNumber: dataModel.question,
-  markingGroupNumber: dataModel.group,
+  markingGroupNumbers: dataModel.group,
 })
 
 watch(dataModel, () => {
   model.subjectCode = dataModel.subject || ''
   model.questionMainNumber = dataModel.question
-  model.markingGroupNumber = dataModel.group
+  model.markingGroupNumbers = dataModel.group
 })
 
 const { defineColumn, _ } = useForm()
@@ -116,8 +116,8 @@ const items = computed<EpFormItem[]>(() => {
     OneRowSpan4({
       label: '小组',
       slotType: 'select',
-      prop: 'markingGroupNumber',
-      slot: { options: groupListWithAll.value, onChange: changeModelValue('group') },
+      prop: 'markingGroupNumbers',
+      slot: { options: groupListWithAll.value, onChange: changeModelValue('group'), multiple: true },
     }),
     OneRowSpan6({
       label: '时间',
@@ -187,7 +187,19 @@ watch(currentSelfCheckAnalysis, () => {
 })
 
 function onSearch() {
-  selfCheckAnalysis({ ...omit(model, 'time'), startTime: model.time?.[0], endTime: model.time?.[1] })
+  let markingGroupNumbers: any = model.markingGroupNumbers
+  if (
+    !markingGroupNumbers ||
+    (Array.isArray(markingGroupNumbers) && markingGroupNumbers.length !== markingGroupNumbers.filter((v) => !!v).length)
+  ) {
+    markingGroupNumbers = []
+  }
+  selfCheckAnalysis({
+    ...omit(model, 'time'),
+    startTime: model.time?.[0],
+    endTime: model.time?.[1],
+    markingGroupNumbers,
+  })
 }
 
 /** 自查一致性列表双击 */