Procházet zdrojové kódy

bug fix和界面优化

刘洋 před 2 roky
rodič
revize
fde5f3145c

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

@@ -567,12 +567,14 @@ export namespace Statistics {
     subjectProgressEnd: SubjectProgressEnd
     /** 质量统计-收尾检查-评卷员未评卷列表(分页) */
     unMarkPaperList: UnMarkPaperList
+    unMarkBackPaperList: UnMarkPaperList
     /** 质量统计-收尾检查-未处理雷同卷列表 */
     unProcessSimilarList: UnProcessSimilarList
     /** 质量统计-收尾检查-未处理问题卷列表 */
     unProcessProblemList: UnProcessProblemList
     /** 任务指定新评卷员 */
     changeTaskMarker: ChangeTaskMarker
+    changeBackTaskMarker: ChangeTaskMarker
     /** 决策分析-小组监控 */
     getGroupMonitor: GetGroupMonitor
     /** 决策分析-小组监控-抽查详情 */

+ 4 - 1
src/api/statistics.ts

@@ -48,12 +48,15 @@ const StatisticsApi: DefineApiModule<Statistics.ApiMap> = {
   subjectProgressEnd: '/api/statistic/marking/progress/ending',
   /** 质量统计-收尾检查-评卷员未评卷列表(分页) */
   unMarkPaperList: '/api/statistic/marking/progress/check/for/unmark/list',
+  unMarkBackPaperList: '/api/statistic/marking/progress/check/for/unmark/list',
   /** 质量统计-收尾检查-未处理雷同卷列表 */
   unProcessSimilarList: '/api/statistic/marking/progress/check/for/same/paper/list',
   /** 质量统计-收尾检查-未处理问题卷列表 */
   unProcessProblemList: '/api/statistic/marking/progress/check/for/problem/paper/list',
   /** 任务指定新评卷员 */
-  changeTaskMarker: '/api/mark/task/assign',
+  // changeTaskMarker: '/api/mark/task/assign',
+  changeTaskMarker: '/api/mark/package/assign',
+  changeBackTaskMarker: '/api/mark/task/assign',
   /** 决策分析-小组监控 */
   getGroupMonitor: {
     url: '/api/statistic/monitor/for/group',

+ 21 - 6
src/components/shared/message/Message.vue

@@ -4,7 +4,7 @@
       <span v-show="unReadMessages?.newCount" class="un-read-num">
         {{ (unReadMessages?.newCount || 0) > 99 ? '99+' : unReadMessages?.newCount }}
       </span>
-      <svg-icon name="message"></svg-icon>
+      <svg-icon name="message" class="bell"></svg-icon>
     </div>
     <el-popover
       placement="bottom-start"
@@ -22,16 +22,18 @@
         </div>
         <div class="message-list">
           <div
-            v-for="message in unReadMessages?.messages"
+            v-for="message in unReadMessages?.messages?.slice(0, 2)"
             :key="message.sendUserId"
             class="message-row"
             @click="onReceiveMessage"
           >
-            <div class="message-send-user">
+            <!-- <div class="message-send-user">
               <div class="user-name" :title="message.sendUserName">{{ message.sendUserName }}</div>
               <div class="message-time">{{ dayjs(message.sendTime).format('HH:mm') }}</div>
             </div>
-            <pre class="flex-1 message-content" v-html="message.content"></pre>
+            <pre class="flex-1 message-content" v-html="message.content"></pre> -->
+            <div class="send-user truncate">{{ message.sendUserName }}</div>
+            <div class="send-content truncate">{{ message.content }}</div>
           </div>
         </div>
         <confirm-button
@@ -103,7 +105,8 @@ watch(
       if (!newMsgs.length) {
         return
       }
-      if (!lastMsgs.messages.length) {
+      let hasRecentSixSecondsMsg = new Date(newMsgs[0].sendTime).getTime() > Date.now() - 6000
+      if (!lastMsgs.messages.length && hasRecentSixSecondsMsg) {
         messageWindowType.value = 'view'
         visibleMessageWindow.value = true
         return
@@ -120,7 +123,7 @@ watch(
           return new Date(item.sendTime).getTime()
         })
       )
-      if (newMsgTime > recentMsgTime) {
+      if (newMsgTime > recentMsgTime && hasRecentSixSecondsMsg) {
         messageWindowType.value = 'view'
         visibleMessageWindow.value = true
       }
@@ -174,6 +177,9 @@ const onSendMessage = () => {
   place-items: center;
   font-size: $LargeFont;
   position: relative;
+  .bell {
+    cursor: pointer;
+  }
   .un-read-num {
     position: absolute;
     width: 24px;
@@ -212,6 +218,15 @@ const onSendMessage = () => {
       overflow: hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .send-user {
+        width: 60px;
+      }
+      .send-content {
+        width: calc(100% - 70px);
+      }
       &:hover {
         background-color: #f5f5f5;
       }

+ 2 - 2
src/modules/analysis/marker-statistics/index.vue

@@ -82,8 +82,8 @@ const formItems: EpFormItem[] = [
       ],
     },
     colProp: {
-      span: 3,
-      offset: 19,
+      span: 4,
+      offset: 18,
     },
   },
   {

+ 2 - 2
src/modules/analysis/marking-progress/components/GroupProgress.vue

@@ -48,7 +48,7 @@ const onExport = () => {
   exportStatistics(model)
 }
 const provinceExport = () => {
-  exportProvince({ subjectCode: model.subjectCode })
+  exportProvince({ subjectCode: model.subjectCode, questionMainNumber: model.questionMainNumber })
 }
 
 watch(dataModel, () => {
@@ -61,7 +61,7 @@ onOptionInit(onSearch)
 
 const { defineColumn, _ } = useForm()
 
-const OneRow = defineColumn(_, 'row-1', { span: 5 })
+const OneRow = defineColumn(_, 'row-1', { span: 8 })
 
 const items = computed<EpFormItem[]>(() => [
   OneRow({

+ 12 - 6
src/modules/analysis/monitoring/index.vue

@@ -1,11 +1,11 @@
 <template>
-  <div class="flex direction-column full analysis-monitor-view">
+  <div class="analysis-monitor-view">
     <div class="flex items-center justify-end p-l-base p-r-base fill-blank view-header">
       <div class="pointer circle-button" custom-1 @click="toggleSetting(true)"><svg-icon name="setting" /></div>
       <el-button type="primary" :loading="loading" @click="onRefresh">刷新</el-button>
     </div>
-    <div class="flex flex-1 p-base scroll-y-auto">
-      <div class="flex justify-between data-card-view">
+    <div class="content-wrap p-base flex">
+      <div class="data-card-view">
         <div
           v-for="card in cards"
           :key="card.dataField"
@@ -337,6 +337,9 @@ watch([interval, initFinish], () => {
 
 <style scoped lang="scss">
 .analysis-monitor-view {
+  .content-wrapper {
+    height: 784px;
+  }
   .view-header {
     height: 52px;
     .circle-button {
@@ -352,12 +355,15 @@ watch([interval, initFinish], () => {
   }
   .data-card-view {
     // width: 1118px;
-    width: calc(100% - 291px);
+    width: calc(((100% - 40px) / 5) * 4 + 30px);
+    height: 100%;
     flex-wrap: wrap;
     align-content: flex-start;
+    display: flex;
+    justify-content: space-between;
     .data-card {
       // width: 272px;
-      width: 24%;
+      width: calc((100% - 30px) / 4);
       height: 337px;
       padding-top: 2px;
       &.active {
@@ -369,7 +375,7 @@ watch([interval, initFinish], () => {
     }
   }
   .data-detail-view {
-    width: 276px;
+    width: calc((100% - 40px) / 5);
   }
 
   .card-title {

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

@@ -108,7 +108,15 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getStatistics
   { align: 'center', label: '客观题0分量', prop: 'objectiveZero', width: 120 },
   { align: 'center', label: '客观平均分', prop: 'objectiveAvg', width: 110 },
   { align: 'center', label: '客观标准差', prop: 'objectiveStd', width: 104 },
-  { align: 'center', label: '重评/待确认', prop: 'reMarkUnConfirmCount', width: 120 },
+  {
+    align: 'center',
+    label: '重评/待确认',
+    prop: 'reMarkUnConfirmCount',
+    width: 120,
+    formatter(row: any) {
+      return `${row.reMarkCount}/${row.reMarkUnConfirmCount}`
+    },
+  },
   { align: 'center', label: '抽查量', prop: 'checkCount', width: 90 },
   { align: 'center', label: '抽查改正量', prop: 'checkCorrectCount', width: 110 },
   { align: 'center', label: '相关系数', prop: 'xyRelate', width: 90 },

+ 1 - 0
src/modules/marking/problem/index.vue

@@ -262,6 +262,7 @@ const onSubmit = async () => {
     await markProblemPaper({ id: currentProblem.value.id, scores: modelScore.value })
     currentProblem.value.markScore = add(...modelScore.value)
     ElMessage.success('修改成功')
+    onSearch()
   }
 }
 

+ 8 - 1
src/modules/monitor/training-monitoring/index.vue

@@ -56,7 +56,7 @@
 
 <script setup lang="tsx" name="TrainingMonitoring">
 /** 培训监控 */
-import { computed } from 'vue'
+import { computed, onBeforeUnmount } from 'vue'
 import { useRouter } from 'vue-router'
 import { ElButton, ElMessage } from 'element-plus'
 import { minus, isDefine } from '@/utils/common'
@@ -166,6 +166,13 @@ const onDbClick = (row: TableDataType) => {
 }
 
 onOptionInit(onSearch)
+let timer: any = setInterval(() => {
+  onSearch()
+}, 30000)
+onBeforeUnmount(() => {
+  clearInterval(timer)
+  timer = null
+})
 </script>
 
 <style scoped lang="scss">

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

@@ -25,6 +25,23 @@
           @current-change="onCheckTask"
         ></base-table>
       </div>
+      <div class="radius-base fill-blank p-base overflow-hidden flex-1">
+        <div class="flex items-center m-b-base table-title">
+          <span class="label">打回在评卷员手中</span>
+          <span class="data-count">{{ unMarkBackPaperList?.result?.length }}</span>
+          <el-button type="primary" size="small" @click="onTaskChangeMarker2">任务指定评卷员</el-button>
+        </div>
+        <base-table
+          v-loading="loading4"
+          border
+          stripe
+          size="small"
+          :columns="columns1"
+          :data="unMarkBackPaperList?.result"
+          highlight-current-row
+          @current-change="onCheckTask2"
+        ></base-table>
+      </div>
       <div class="radius-base fill-blank p-base overflow-hidden m-l-base flex-1">
         <div class="flex items-center m-b-base table-title">
           <span class="label">未处理问题卷</span>
@@ -67,6 +84,18 @@
       <confirm-button around @confirm="onSubmitChangeMarker" @cancel="visibleChangeMarker = false"></confirm-button>
     </template>
   </base-dialog>
+  <base-dialog v-model="visibleChangeMarker2" title="任务指定评卷员" destroy-on-close>
+    <base-form
+      ref="formRef"
+      size="small"
+      :rules="rules"
+      :model="changeMarkerModel2"
+      :items="changeMarkerItems2"
+    ></base-form>
+    <template #footer>
+      <confirm-button around @confirm="onSubmitChangeMarker" @cancel="visibleChangeMarker2 = false"></confirm-button>
+    </template>
+  </base-dialog>
 </template>
 
 <script setup lang="ts" name="EndCheck">
@@ -87,12 +116,15 @@ import type { EpFormItem, EpTableColumn, EpFormRules } from 'global-type'
 
 /** 指定评卷员 */
 const visibleChangeMarker = ref<boolean>(false)
+const visibleChangeMarker2 = ref<boolean>(false)
 
 const changeMarkerModel = reactive({ loginName: '' })
+const changeMarkerModel2 = reactive({ loginName: '' })
 
 const { formRef, elFormRef } = useForm()
 
 const changeMarkerItems: EpFormItem[] = [{ label: '请输入指定评卷员账号', prop: 'loginName', slotType: 'input' }]
+const changeMarkerItems2: EpFormItem[] = [{ label: '请输入指定评卷员账号', prop: 'loginName', slotType: 'input' }]
 
 const rules: EpFormRules = {
   loginName: [{ required: true, message: '请输入指定评卷员账号' }],
@@ -111,6 +143,11 @@ const model = reactive<ExtractApiParams<'unProcessProblemList'>>({
 })
 
 const { fetch: getUnMarkPaperList, result: unMarkPaperList, loading: loading1 } = useFetch('unMarkPaperList')
+const {
+  fetch: getUnMarkBackPaperList,
+  result: unMarkBackPaperList,
+  loading: loading4,
+} = useFetch('unMarkBackPaperList')
 const {
   fetch: getUnProcessProblemList,
   result: unProcessProblemList,
@@ -178,21 +215,28 @@ const columns3: EpTableColumn[] = [
 /** 开始检查 */
 const onStartCheck = () => {
   getUnMarkPaperList({ pageNumber: 1, pageSize: 20, ...model })
+  getUnMarkBackPaperList({ pageNumber: 1, pageSize: 20, ...model })
   getUnProcessProblemList(model)
   getUnProcessSimilarList(model)
 }
 
 const currentTask = ref<ExtractMultipleApiResponse<'unMarkPaperList'>>()
+const currentTask2 = ref<ExtractMultipleApiResponse<'unMarkPaperList'>>()
 
 const onCheckTask = (row: ExtractMultipleApiResponse<'unMarkPaperList'>) => {
   currentTask.value = row
 }
+const onCheckTask2 = (row: ExtractMultipleApiResponse<'unMarkPaperList'>) => {
+  currentTask2.value = row
+}
 
 /** 任务指定评卷员 */
 const onTaskChangeMarker = () => {
   visibleChangeMarker.value = true
 }
-
+const onTaskChangeMarker2 = () => {
+  visibleChangeMarker2.value = true
+}
 const onSubmitChangeMarker = async () => {
   try {
     if (!currentTask.value) {
@@ -211,6 +255,24 @@ const onSubmitChangeMarker = async () => {
     console.error(error)
   }
 }
+const onSubmitChangeMarker2 = async () => {
+  try {
+    if (!currentTask2.value) {
+      return ElMessage.error('点击表格行选择评卷任务')
+    }
+    const valid = await elFormRef?.value?.validate()
+    if (valid) {
+      await useFetch('changeBackTaskMarker').fetch({
+        taskId: currentTask2.value.taskId,
+        loginName: changeMarkerModel2.loginName,
+      })
+      visibleChangeMarker2.value = false
+      onStartCheck()
+    }
+  } catch (error) {
+    console.error(error)
+  }
+}
 
 onOptionInit(onStartCheck)
 </script>

+ 12 - 11
src/modules/quality/self-check-detail/index.vue

@@ -45,17 +45,18 @@
         </div>
       </div>
     </div>
+    <scoring-panel-with-confirm
+      :id="current?.taskId"
+      v-model:visible="editScoreVisible"
+      v-model:score="modelScore"
+      :main-number="current?.mainNumber"
+      modal
+      :toggle-modal="false"
+      :auto-visible="false"
+      @submit="onSubmit"
+    ></scoring-panel-with-confirm>
   </div>
-  <scoring-panel-with-confirm
-    :id="current?.taskId"
-    v-model:visible="editScoreVisible"
-    v-model:score="modelScore"
-    :main-number="current?.mainNumber"
-    modal
-    :toggle-modal="false"
-    :auto-visible="false"
-    @submit="onSubmit"
-  ></scoring-panel-with-confirm>
+
   <image-preview v-model="previewModalVisible" :url="current?.filePath"></image-preview>
   <mark-history-list :id="currentViewHistory?.taskId" v-model="visibleHistory"></mark-history-list>
   <send-back-mark
@@ -190,7 +191,7 @@ const { fetch: markSelfCheckData } = useFetch('markSelfCheckData')
 const onSubmit = async () => {
   if (current.value) {
     await markSelfCheckData({ taskId: current.value.taskId, scores: modelScore.value })
-    current.value.markerScore = add(...modelScore.value)
+    // current.value.markerScore = add(...modelScore.value)
     ElMessage.success('修改成功')
   }
 }