Browse Source

v1.1.0 coding...

刘洋 1 year ago
parent
commit
0c33b90dc4

+ 2 - 0
src/api/api-types/forceCheck.d.ts

@@ -47,6 +47,7 @@ export namespace ForceCheck {
     { mainNumber?: number | string; subjectCode: string; forceGroupNumber?: number },
     HandOutProgress[]
   >
+  type GetDispenseRound = BaseDefine<any, any>
   export interface ApiMap {
     /** 分发考核卷 */
     handOutForceCheck: HandOutForceCheck
@@ -54,5 +55,6 @@ export namespace ForceCheck {
     getForceCheckGroupList: GetForceCheckGroupList
     /** 获取分发进度 */
     getHandOutProgressList: GetHandOutProgressList
+    getDispenseRound: GetDispenseRound
   }
 }

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

@@ -381,6 +381,7 @@ export namespace Statistics {
     markingGroupNumber?: number | string
     markStage: 'SAMPLE_A' | 'SAMPLE_B' | 'FORCE'
     forceGroupNumber?: number
+    dispenseRound?: number
   }
   interface TrainingMonitorResponse {
     /** 平均分 */

+ 3 - 0
src/api/check.ts

@@ -17,6 +17,9 @@ const ForceCheckApi: DefineApiModule<ForceCheck.ApiMap> = {
       'Content-Type': 'application/json',
     },
   },
+  getDispenseRound: {
+    url: '/api/force/group/dispense/round',
+  },
 }
 
 export default ForceCheckApi

+ 13 - 2
src/hooks/useTableCheck.ts

@@ -25,7 +25,7 @@ function isMultipleData(data: any): data is MultipleResultType {
   return isDefine(data?.result) && isDefine(data?.totalCount)
 }
 
-const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = true) => {
+const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = true, queryPosition = null) => {
   const tableRef = ref<InstanceTable>()
 
   const elTableRef = computed(() => {
@@ -75,8 +75,19 @@ const useTableCheck = <T extends TableDataType<InputDataType>>(data: T, auto = t
       current.value = void 0
       currentView.value = void 0
       if (tableData?.value?.length && auto) {
+        let positionIndex = 0
+        if (!!queryPosition) {
+          const key = Object.keys(queryPosition)[0]
+          const fIndex = tableData.value.findIndex((item: any) => {
+            return item[key] == queryPosition?.[key]
+          })
+          if (fIndex > -1) {
+            positionIndex = fIndex
+            queryPosition = null
+          }
+        }
         nextTick(() => {
-          elTableRef?.value?.setCurrentRow(tableData.value[0])
+          elTableRef?.value?.setCurrentRow(tableData.value[positionIndex])
         })
       }
     },

+ 21 - 8
src/modules/analysis/monitoring/index.vue

@@ -172,6 +172,11 @@ interface Card {
   valueLabel: string
   hasAll: boolean
 }
+const needPositionCardFields: any = {
+  scoreTopLowList: 'markScore',
+  objSubRateList: 'markerRatio',
+  objSubAvgRateList: 'markerRatio',
+}
 
 const cards: Card[] = [
   {
@@ -225,18 +230,23 @@ const cards: Card[] = [
 ]
 
 /** 跳转抽查详情 */
-const viewMarkDetail = (row: ExtractArrayValue<ExtractRecordValue<ExtractApiResponse<'getStatistics'>>>) => {
+const viewMarkDetail = (row: any) => {
+  console.log('row:', row)
+  let query: any = {
+    markerName: row.markerName,
+    subjectCode: model.subjectCode,
+    questionMainNumber: model.questionMainNumber,
+    source: '监控',
+  }
+  if (row._field in needPositionCardFields) {
+    query[needPositionCardFields[row._field]] = row.value
+  }
   push({
     name: 'AnalysisViewMarked',
     params: {
       markerId: row.markerId,
     },
-    query: {
-      markerName: row.markerName,
-      subjectCode: model.subjectCode,
-      questionMainNumber: model.questionMainNumber,
-      source: '监控',
-    },
+    query,
   })
 }
 
@@ -324,7 +334,10 @@ const sortableResult = computed<typeof result.value>(() => {
       const [total] = arr.splice(totalIndex, 1)
       total && arr.unshift(total)
     }
-    final[dataField] = arr
+    final[dataField] = arr.map((item: any) => {
+      item._field = dataField
+      return item
+    })
     return final
   }, {} as typeof result.value)
 })

+ 13 - 5
src/modules/analysis/view-marked-detail/index.vue

@@ -56,16 +56,18 @@
           :size="100 - paneSize"
           class="flex direction-column p-base radius-base fill-blank table-view"
         >
-          <div class="flex items-center p-b-base m-b-base marker-name">
+          <!-- <div class="flex items-center p-b-base m-b-base marker-name">
             <span>评卷员</span>
             <span>{{ query.markerName }}</span>
-          </div>
+          </div> -->
           <div class="flex items-center justify-between detail-info-table-header">
             <el-button custom-1 size="small" class="detail-info-label">
               <span class="">总数:</span>
               <span class="m-l-extra-small detail-info-label-num">{{ pagination.total }}</span>
             </el-button>
-            <el-pagination
+
+            <btn-pagination v-model="currentPage" :pagination="pagination"></btn-pagination>
+            <!-- <el-pagination
               v-bind="pagination"
               v-model:current-page="currentPage"
               size="small"
@@ -75,7 +77,7 @@
               hide-on-single-page
               :pager-count="3"
               small
-            ></el-pagination>
+            ></el-pagination> -->
           </div>
           <div class="flex-1 scroll-auto m-t-mini">
             <base-table
@@ -138,6 +140,7 @@ import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
 import { Splitpanes, Pane } from 'splitpanes'
 import { setPaneSize } from '@/utils/common'
 import useMainStore from '@/store/main'
+import BtnPagination from '@/components/common/BtnPagination'
 type RowType = ExtractMultipleApiResponse<'getPersonalMarkDetail'> & { index: number }
 const mainStore = useMainStore()
 const paneSize = computed(() => {
@@ -251,6 +254,11 @@ const { pagination, currentPage, data, fetchTable } = useTable('getPersonalMarkD
   mainNumber: query.questionMainNumber as string,
 })
 
+const queryPosition: any = query.markScore
+  ? { markScore: query.markScore }
+  : query.markerRatio
+  ? { markerRatio: query.markerRatio }
+  : null
 const {
   tableRef,
   tableData,
@@ -261,7 +269,7 @@ const {
   onDbClick,
   onCurrentChange,
   nextRow,
-} = useTableCheck(data)
+} = useTableCheck(data, true, queryPosition)
 
 /** 确定给分 */
 const { fetch: updatePersonalMarkDetailScore } = useFetch('updatePersonalMarkDetailScore')

+ 46 - 7
src/modules/marking/assess/index.vue

@@ -10,7 +10,26 @@
           :rules="rules"
           :items="items"
           :model="model"
-        ></base-form>
+        >
+          <template #form-item-paperTable>
+            <base-table
+              ref="tableRef"
+              v-loading="paperLoading"
+              style="width: 240px"
+              border
+              stripe
+              size="small"
+              :data="paperTableData"
+              :columns="[
+                { label: '密号', prop: 'secretNumber', width: 120 },
+                { label: '分数', prop: 'score' },
+              ]"
+              max-height="180"
+              :cell-style="{ padding: '3px 0' }"
+              :header-cell-style="{ padding: '3px 0' }"
+            ></base-table>
+          </template>
+        </base-form>
       </div>
       <div class="flex-1 radius-base fill-blank tree-card">
         <div class="flex items-center justify-between">
@@ -93,7 +112,7 @@
 <script setup lang="ts" name="MarkingAssess">
 /** 强制考核分发 */
 import { reactive, ref, computed, watch } from 'vue'
-import { ElButton, ElInput, ElTree, ElMessage } from 'element-plus'
+import { ElButton, ElInput, ElTree, ElMessage, ElTable } from 'element-plus'
 import BaseForm from '@/components/element/BaseForm.vue'
 import BaseTable from '@/components/element/BaseTable.vue'
 import BaseDialog from '@/components/element/BaseDialog.vue'
@@ -130,19 +149,31 @@ const model = reactive<ExtractApiParams<'handOutForceCheck'>>({
 
 const { fetch: handOutForceCheck, loading } = useFetch('handOutForceCheck')
 const { fetch: getForceCheckGroupList, result: forceCheckGroupList } = useFetch('getForceCheckGroupList')
-
+const { fetch: getExpertAssessList, result: rfSampleList, loading: paperLoading } = useFetch('getExpertAssessList')
 const { fetch: getMarkerTree, result: markerTree } = useFetch('getMarkerTree')
 const paperCount = computed(() => {
   return (forceCheckGroupList.value || []).find((item) => {
     return item.forceGroupNumber == model.forceGroupNumber
   })?.paperCount
 })
+const paperTableData = computed<any>(() => {
+  return rfSampleList.value?.result || []
+})
 watch(
   model,
   () => {
     if ((model.subjectCode, model.mainNumber)) {
       getForceCheckGroupList({ subjectCode: model.subjectCode, mainNumber: model.mainNumber })
       getMarkerTree({ subjectCode: model.subjectCode, mainNumber: model.mainNumber, name: '' })
+      if (model.forceGroupNumber) {
+        getExpertAssessList({
+          subjectCode: model.subjectCode,
+          mainNumber: model.mainNumber,
+          pageNumber: 1,
+          pageSize: 9999999,
+          forceGroupNumber: model.forceGroupNumber,
+        })
+      }
     }
   },
   { immediate: true }
@@ -162,6 +193,8 @@ watch(dataModel, () => {
 const { formRef, elFormRef, defineColumn, _ } = useForm()
 
 const Span12 = defineColumn(_, '', { span: 12 })
+const Span6 = defineColumn(_, '', { span: 6 })
+const Span18 = defineColumn(_, '', { span: 18 })
 
 const rules: EpFormRules = {
   subjectCode: [{ required: true, message: '请选择科目' }],
@@ -203,7 +236,7 @@ const items = computed<EpFormItem[]>(() => {
         disabled: !isExpert.value && !isLeader.value,
       },
     }),
-    {
+    Span6({
       rowKey: 'row-3',
       prop: 'forceGroupNumber',
       slotType: 'radio',
@@ -213,7 +246,11 @@ const items = computed<EpFormItem[]>(() => {
           slotLabel: `第${v.forceGroupNumber}组`,
         })),
       },
-    },
+    }),
+    Span18({
+      rowKey: 'row-3',
+      slotName: 'paperTable',
+    }),
   ]
 })
 
@@ -370,14 +407,16 @@ const sendHandler = () => {
   }
 }
 .top-box {
-  height: 395px;
+  // height: 395px;
+  height: 420px;
   .form-card {
     padding: 16px 20px 20px 20px;
   }
   .tree-card {
     padding: 10px 20px 20px 20px;
     .tree-box {
-      height: 320px;
+      // height: 320px;
+      height: 345px;
       margin-top: 10px;
     }
   }

+ 40 - 1
src/modules/marking/inquiry-result/index.vue

@@ -108,6 +108,24 @@
 
   <base-dialog v-model="setExpertPaperVisible" title="设置专家卷" :footer="false" :width="540">
     <base-form size="small" :model="setExpertModel" :items="items" :label-width="'130px'">
+      <template v-if="paperTableData.length > 0" #form-item-paperTable>
+        <base-table
+          ref="tableRef"
+          v-loading="paperLoading"
+          style="width: 240px"
+          border
+          stripe
+          size="small"
+          :data="paperTableData"
+          :columns="[
+            { label: '密号', prop: 'secretNumber', width: 120 },
+            { label: '分数', prop: 'score' },
+          ]"
+          max-height="120"
+          :cell-style="{ padding: '3px 0' }"
+          :header-cell-style="{ padding: '3px 0' }"
+        ></base-table>
+      </template>
       <template #form-item-confirm>
         <confirm-button
           class="m-t-base"
@@ -154,7 +172,10 @@ const paneSize = computed(() => {
   return mainStore.paneSizeConfig[location.pathname] || 60
 })
 type RowType = ExtractMultipleApiResponse<'getCustomQueryTasks'> & { index: number }
-
+const { fetch: getExpertAssessList, result: rfSampleList, loading: paperLoading } = useFetch('getExpertAssessList')
+const paperTableData = computed<any>(() => {
+  return rfSampleList.value?.result || []
+})
 const { query } = useRoute()
 /** 打回弹窗 */
 const sendBackVisible = ref<boolean>(false)
@@ -323,6 +344,20 @@ const setExpertModel = reactive<SetExpertModel>({
   forceGroupNumber: 'A',
 })
 
+watch(
+  () => setExpertModel.forceGroupNumber,
+  () => {
+    if (setExpertModel.forceGroupNumber !== 'A' && setExpertModel.forceGroupNumber !== 'B')
+      getExpertAssessList({
+        subjectCode: query.subjectCode as string,
+        mainNumber: query.mainNumber as string,
+        pageNumber: 1,
+        pageSize: 9999999,
+        forceGroupNumber: setExpertModel.forceGroupNumber as any,
+      })
+  }
+)
+
 const items = computed<EpFormItem[]>(() => {
   let paperTypeItems: EpFormItem[] = [
     {
@@ -359,6 +394,10 @@ const items = computed<EpFormItem[]>(() => {
         ],
       },
     },
+    {
+      label: '',
+      slotName: 'paperTable',
+    },
   ]
   return paperTypeItems
     .concat(setExpertModel.paperType === 'FORCE' ? forceGroupNumberItems : [])

+ 29 - 3
src/modules/monitor/training-monitoring/hooks/useFormFilter.ts

@@ -28,6 +28,7 @@ const useFormFilter = () => {
     markStage: 'SAMPLE_A',
     forceGroupNumber: void 0,
     diffShow: [],
+    dispenseRound: void 0,
   })
 
   const diffShow = computed(() => {
@@ -42,6 +43,7 @@ const useFormFilter = () => {
   })
 
   const { fetch: getForceCheckGroupList, result: forceCheckGroupListResult } = useFetch('getForceCheckGroupList')
+  const { fetch: getDispenseRound, result: roundList } = useFetch('getDispenseRound')
 
   const forceCheckGroup = computed(() =>
     forceCheckGroupListResult?.value?.map((group) => {
@@ -79,6 +81,17 @@ const useFormFilter = () => {
     { deep: true, immediate: true }
   )
 
+  watch(
+    () => model.forceGroupNumber,
+    () => {
+      getDispenseRound({
+        forceGroupNumber: model.forceGroupNumber,
+        subjectCode: model.subjectCode,
+        mainNumber: model.mainNumber,
+      })
+    }
+  )
+
   const rules = computed<EpFormRules>(() => {
     return {
       forceGroupNumber: model.markStage === 'FORCE' ? [{ required: true, message: '请选择强制考核组' }] : [],
@@ -106,7 +119,7 @@ const useFormFilter = () => {
           disabled: !isExpert.value,
         },
       }),
-      OneRowSpan4({
+      OneRowSpan3({
         prop: 'mainNumber',
         label: '大题',
         slotType: 'select',
@@ -117,7 +130,7 @@ const useFormFilter = () => {
           disabled: !isExpert.value && !isLeader.value,
         },
       }),
-      OneRowSpan4({
+      OneRowSpan3({
         prop: 'markingGroupNumber',
         label: '小组',
         slotType: 'select',
@@ -143,7 +156,7 @@ const useFormFilter = () => {
         },
       }),
       model.markStage === 'FORCE'
-        ? OneRowSpan5({
+        ? OneRowSpan4({
             label: '强制考核组',
             slotType: 'select',
             prop: 'forceGroupNumber',
@@ -154,6 +167,19 @@ const useFormFilter = () => {
             },
           })
         : null,
+      model.markStage === 'FORCE' && !isNaN(model.forceGroupNumber as number)
+        ? OneRowSpan3({
+            label: '',
+            labelWidth: '5px',
+            slotType: 'select',
+            prop: 'dispenseRound',
+            slot: {
+              placeholder: '考核轮次',
+              options: roundList.value,
+              valueKey: 'round',
+            },
+          })
+        : null,
       OneRowSpan2({
         label: '差值展示',
         slotType: 'checkbox',