刘洋 2 жил өмнө
parent
commit
04833975a2

+ 2 - 2
server.config.ts

@@ -3,11 +3,11 @@ import type { ServerOptions } from 'vite'
 const server: ServerOptions = {
 const server: ServerOptions = {
   proxy: {
   proxy: {
     '^/?(api|file)/': {
     '^/?(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.178:8200',
       // target: 'http://192.168.10.108:8200',
       // target: 'http://192.168.10.108:8200',
       // target: 'http://cet-test.markingtool.cn',
       // 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',
       // target: 'http://cet-dev.markingtool.cn:8200',
     },
     },
   },
   },

+ 23 - 6
src/components/shared/SendBackMark.vue

@@ -1,8 +1,17 @@
 <template>
 <template>
   <base-dialog v-model="visible" title="提示" :footer="false" destroy-on-close :width="300">
   <base-dialog v-model="visible" title="提示" :footer="false" destroy-on-close :width="300">
-    <!-- <base-form ref="formRef" :model="model" :items="items" :rules="rules" :label-width="useVW(72)"> -->
     <h3 style="margin-bottom: 20px">确定打回吗?</h3>
     <h3 style="margin-bottom: 20px">确定打回吗?</h3>
-    <el-form-item>
+
+    <template v-if="needRejectReason">
+      <base-form ref="formRef" :model="model" :items="items" :rules="rules" label-width="72px">
+        <el-form-item>
+          <confirm-button @confirm="onSendBack" @cancel="onCancel"></confirm-button>
+        </el-form-item>
+      </base-form>
+    </template>
+
+    <!-- <base-form ref="formRef" :model="model" :items="items" :rules="rules" :label-width="useVW(72)"> -->
+    <el-form-item v-else>
       <confirm-button @confirm="onSendBack" @cancel="onCancel"></confirm-button>
       <confirm-button @confirm="onSendBack" @cancel="onCancel"></confirm-button>
     </el-form-item>
     </el-form-item>
     <!-- </base-form> -->
     <!-- </base-form> -->
@@ -11,7 +20,7 @@
 
 
 <script setup lang="ts" name="SendBackMark">
 <script setup lang="ts" name="SendBackMark">
 /** 打回弹窗 */
 /** 打回弹窗 */
-import { reactive, withDefaults, watch } from 'vue'
+import { reactive, withDefaults, watch, ref } from 'vue'
 import { ElFormItem, ElMessage } from 'element-plus'
 import { ElFormItem, ElMessage } from 'element-plus'
 import BaseDialog from '@/components/element/BaseDialog.vue'
 import BaseDialog from '@/components/element/BaseDialog.vue'
 import BaseForm from '../element/BaseForm.vue'
 import BaseForm from '../element/BaseForm.vue'
@@ -20,9 +29,11 @@ import useVModel from '@/hooks/useVModel'
 import useForm from '@/hooks/useForm'
 import useForm from '@/hooks/useForm'
 import useFetch from '@/hooks/useFetch'
 import useFetch from '@/hooks/useFetch'
 import useVW from '@/hooks/useVW'
 import useVW from '@/hooks/useVW'
+import useMainStore from '@/store/main'
 
 
 import type { EpFormItem, EpFormRules } from 'global-type'
 import type { EpFormItem, EpFormRules } from 'global-type'
-
+const mainStore = useMainStore()
+const needRejectReason = ref(false)
 const emits = defineEmits<{
 const emits = defineEmits<{
   (e: 'rejected'): void
   (e: 'rejected'): void
 }>()
 }>()
@@ -45,10 +56,15 @@ const model = reactive({
   reason: '',
   reason: '',
   description: '',
   description: '',
 })
 })
+const { fetch: getExamInfo } = useFetch('getExamInfo')
 
 
 watch(visible, () => {
 watch(visible, () => {
   if (!visible.value) {
   if (!visible.value) {
     elFormRef?.value?.resetFields()
     elFormRef?.value?.resetFields()
+  } else {
+    getExamInfo({ id: mainStore.myUserInfo?.examId as number }).then((result: any) => {
+      needRejectReason.value = result.rejectReason
+    })
   }
   }
 })
 })
 
 
@@ -91,12 +107,13 @@ const onSendBack = async () => {
     // if (valid) {
     // if (valid) {
     // await ApiMap[props.type]({ description: model.description, reason: model.reason, id: props.id })
     // await ApiMap[props.type]({ description: model.description, reason: model.reason, id: props.id })
     if (props.type === 'custom-check') {
     if (props.type === 'custom-check') {
-      await rejectCustomCheckData({ description: '', reason: '', taskId: props.id })
+      await rejectCustomCheckData({ description: model.description, reason: model.reason, taskId: props.id })
     } else {
     } else {
-      await ApiMap[props.type]({ description: '', reason: '', id: props.id })
+      await ApiMap[props.type]({ description: model.description, reason: model.reason, id: props.id })
     }
     }
     // }
     // }
     visible.value = false
     visible.value = false
+    ElMessage.success('操作成功')
     emits('rejected')
     emits('rejected')
   } catch (error) {
   } catch (error) {
     console.error(error)
     console.error(error)

+ 60 - 5
src/components/shared/StandardDialog.vue

@@ -8,20 +8,71 @@
     </div>
     </div>
     <div class="standard-body">
     <div class="standard-body">
       <div id="my-iframe-mask"></div>
       <div id="my-iframe-mask"></div>
-      <iframe v-if="iframeSrc" style="width: 100%; height: 100%; prevent-events: pointer" :src="iframeSrc"></iframe>
+      <base-form class="p-t-base" size="small" :model="formModel" :items="formItems" :label-width="'78px'">
+        <template #form-item-search>
+          <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
+        </template>
+      </base-form>
+      <iframe
+        v-if="iframeSrc"
+        style="width: 100%; height: calc(100% - 60px); prevent-events: pointer"
+        :src="iframeSrc"
+      ></iframe>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
 
 
 <script setup lang="ts" name="StandardDialog">
 <script setup lang="ts" name="StandardDialog">
 import useVModel from '@/hooks/useVModel'
 import useVModel from '@/hooks/useVModel'
-import { ref, computed } from 'vue'
+import { ref, computed, reactive, watch } from 'vue'
 import { Close } from '@element-plus/icons-vue'
 import { Close } from '@element-plus/icons-vue'
-import { ElIcon } from 'element-plus'
+import { ElIcon, ElButton } from 'element-plus'
 import useFetch from '@/hooks/useFetch'
 import useFetch from '@/hooks/useFetch'
 import useMainStore from '@/store/main'
 import useMainStore from '@/store/main'
+import useOptions from '@/hooks/useOptions'
+import useForm from '@/hooks/useForm'
+import BaseForm from '@/components/element/BaseForm.vue'
 
 
 const mainStore = useMainStore()
 const mainStore = useMainStore()
+const { subjectList, mainQuestionList, dataModel, changeModelValue, onOptionInit, isExpert, isLeader } = useOptions([
+  'subject',
+  'question',
+])
+const formModel = reactive<any>({
+  mainNumber: dataModel.question,
+  subjectCode: dataModel.subject,
+})
+watch(dataModel, () => {
+  formModel.mainNumber = dataModel.question
+  formModel.subjectCode = dataModel.subject
+})
+const { defineColumn, _ } = useForm()
+
+const span10 = defineColumn(_, '', { span: 10 })
+
+const formItems = computed<any[]>(() => [
+  span10({
+    rowKey: 'row-1',
+    label: '科目',
+    prop: 'subjectCode',
+    slotType: 'select',
+    labelWidth: '46px',
+    slot: { options: subjectList.value, onChange: changeModelValue('subject'), disabled: !isExpert.value },
+  }),
+  span10({
+    rowKey: 'row-1',
+    label: '大题',
+    prop: 'mainNumber',
+    labelWidth: '46px',
+    slotType: 'select',
+    slot: {
+      options: mainQuestionList.value,
+      onChange: changeModelValue('question'),
+      disabled: !isExpert.value && !isLeader.value,
+    },
+  }),
+  { rowKey: 'row-1', slotName: 'search', labelWidth: '10px', colProp: { span: 4 } },
+])
 
 
 const props = defineProps<{
 const props = defineProps<{
   modelValue: boolean
   modelValue: boolean
@@ -32,13 +83,17 @@ const closeDialog = () => {
   visible.value = false
   visible.value = false
 }
 }
 
 
-const { fetch: fetchStandard, result: standardRes } = useFetch('getMarkingStandard')
-fetchStandard({ subjectCode: mainStore?.myUserInfo?.subjectCode, mainNumber: mainStore?.myUserInfo?.mainNumber })
+const { fetch: fetchStandard, result: standardRes, loading } = useFetch('getMarkingStandard')
 const iframeSrc = computed(() => {
 const iframeSrc = computed(() => {
   return standardRes.value?.url
   return standardRes.value?.url
     ? standardRes.value?.url + '#view=FitH&scrollbar=0&toolbar=0&statusbar=0&messages=0&navpanes=0'
     ? standardRes.value?.url + '#view=FitH&scrollbar=0&toolbar=0&statusbar=0&messages=0&navpanes=0'
     : ''
     : ''
 })
 })
+const onSearch = () => {
+  // fetchStandard({ subjectCode: mainStore?.myUserInfo?.subjectCode, mainNumber: mainStore?.myUserInfo?.mainNumber })
+  fetchStandard({ subjectCode: formModel.subjectCode, mainNumber: formModel.mainNumber })
+}
+onOptionInit(onSearch)
 </script>
 </script>
 //
 //
 <style scoped lang="scss">
 <style scoped lang="scss">

+ 39 - 2
src/components/shared/message/MessageList.vue

@@ -36,7 +36,7 @@
             <el-icon><close /></el-icon>
             <el-icon><close /></el-icon>
           </div> -->
           </div> -->
         </div>
         </div>
-        <div class="flex-1 p-base">
+        <div class="p-base" style="height: calc(100% - 221px)">
           <!-- <pre
           <!-- <pre
             class="full-h radius-base p-extra-base scroll-y-auto message-info-content"
             class="full-h radius-base p-extra-base scroll-y-auto message-info-content"
             @click="onContentClick"
             @click="onContentClick"
@@ -65,9 +65,11 @@
             <div class="limit-tip">{{ messageContent.length }} / 2000</div>
             <div class="limit-tip">{{ messageContent.length }} / 2000</div>
           </div>
           </div>
         </div>
         </div>
-        <div class="p-base flex items-center justify-end">
+        <div class="p-base flex items-center justify-between">
           <!-- <el-button size="small" type="primary" :disabled="!currentMessage" @click="onReply">回复</el-button> -->
           <!-- <el-button size="small" type="primary" :disabled="!currentMessage" @click="onReply">回复</el-button> -->
           <!-- <el-button size="small" plain :disabled="!currentMessage" @click="toggleHistory">历史消息</el-button> -->
           <!-- <el-button size="small" plain :disabled="!currentMessage" @click="toggleHistory">历史消息</el-button> -->
+          <el-button v-if="showSendPaper" size="small" plain @click="sendCurrentPaper">发送当前试卷</el-button>
+          <span v-else></span>
           <el-button size="small" type="primary" :disabled="!allowSend" :loading="sendLoading" @click="onSendMessage"
           <el-button size="small" type="primary" :disabled="!allowSend" :loading="sendLoading" @click="onSendMessage"
             >发送</el-button
             >发送</el-button
           >
           >
@@ -100,6 +102,12 @@ import ContentEditAble from '@/components/common/ContentEditAble.vue'
 type MessageType = ExtractArrayValue<ExtractApiResponse<'getMessageList'>>
 type MessageType = ExtractArrayValue<ExtractApiResponse<'getMessageList'>>
 const historyMsgWrap = ref()
 const historyMsgWrap = ref()
 const mainStore = useMainStore()
 const mainStore = useMainStore()
+const props = defineProps<{
+  replyUserId?: number | null
+  paperPath?: string | null
+  replyUserName?: string | null
+}>()
+
 const emits = defineEmits(['close', 'change-type', 'reply'])
 const emits = defineEmits(['close', 'change-type', 'reply'])
 const { fetch: getMessageHistory, result: history, loading } = useFetch('getMessageHistory')
 const { fetch: getMessageHistory, result: history, loading } = useFetch('getMessageHistory')
 const historyReverse = computed(() => {
 const historyReverse = computed(() => {
@@ -107,8 +115,37 @@ const historyReverse = computed(() => {
 })
 })
 /** 图片预览 */
 /** 图片预览 */
 const previewModalVisible = ref<boolean>(false)
 const previewModalVisible = ref<boolean>(false)
+/** 是否已发送试卷 */
+const sendedPaper = ref<boolean>(false)
+
+/** 显示发送试卷按钮 */
+const showSendPaper = computed<boolean>(() => {
+  // return !!props.paperPath && !sendedPaper.value
+  return !!props.paperPath
+})
+/** 发送当前试卷 */
+const sendCurrentPaper = () => {
+  if (props.paperPath) {
+    messageContent.value += `<span class="pointer inline link-button" contenteditable="false" data-path="${props.paperPath}">查看试卷</span>`
+  }
+}
+
 /** 消息内容 */
 /** 消息内容 */
 const messageContent = ref<string>('')
 const messageContent = ref<string>('')
+watch(messageContent, () => {
+  // let reg = /<span class=\"pointer inline link-button\" contenteditable=\"false\" data-path=.*>查看试卷<\/span>/g
+  // let arr = messageContent.value.match(reg)
+  // let text = messageContent.value.replace(reg, '【查看试卷临时替换字符】')
+  // text = transHtmlContent(text)
+  // if (arr && arr.length) {
+  //   text = text.replace('【查看试卷临时替换字符】', arr[0])
+  // }
+  // messageContent.value = text
+  nextTick(() => {
+    const paperButton = document.querySelector(`.content-edit-able [data-path="${props.paperPath}"]`)
+    sendedPaper.value = !!paperButton
+  })
+})
 /** 图片路径 */
 /** 图片路径 */
 const paperPath = ref<string>('')
 const paperPath = ref<string>('')
 
 

+ 1 - 0
src/constants/dicts.ts

@@ -44,4 +44,5 @@ export const TaskTypeOption = [
   { label: '全部', value: '' },
   { label: '全部', value: '' },
   { label: 'CET成绩导出', value: 'CET_SCORE_EXPORT' },
   { label: 'CET成绩导出', value: 'CET_SCORE_EXPORT' },
   { label: '考生导入', value: 'STUDENT_IMPORT' },
   { label: '考生导入', value: 'STUDENT_IMPORT' },
+  { label: '用户姓名导入', value: 'USER_NAME_IMPORT' },
 ]
 ]

+ 2 - 2
src/directives/dragDialog.ts

@@ -54,8 +54,8 @@ export const dragDialog = {
       dragDom.style.left = JSON.parse(keyboardPositions).left || 0
       dragDom.style.left = JSON.parse(keyboardPositions).left || 0
       dragDom.style.top = JSON.parse(keyboardPositions).top || 0
       dragDom.style.top = JSON.parse(keyboardPositions).top || 0
     } else {
     } else {
-      dragDom.style.left = winWidth / 2 - minWidth / 2
-      dragDom.style.top = winHeight / 2 - minHeight / 2
+      dragDom.style.left = winWidth / 2 - minWidth / 2 + 'px'
+      dragDom.style.top = winHeight / 2 - minHeight / 2 + 'px'
     }
     }
     if (keyboardResize) {
     if (keyboardResize) {
       const localW = JSON.parse(keyboardResize).width
       const localW = JSON.parse(keyboardResize).width

+ 2 - 1
src/hooks/useOptions.ts

@@ -243,7 +243,8 @@ const useOptions = (
           //   dataModel[t] ||
           //   dataModel[t] ||
           //   (!dataModel[t] && isChooseAllOptionMap[t]) ||
           //   (!dataModel[t] && isChooseAllOptionMap[t]) ||
           //   (t === 'group' && (isAdmin.value || isChief.value))
           //   (t === 'group' && (isAdmin.value || isChief.value))
-          (t) => dataModel[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))
         )
         )
       ) {
       ) {
         nextTick(() => {
         nextTick(() => {

+ 9 - 2
src/layout/main/LeftMenu.vue

@@ -10,7 +10,7 @@
     @open="onOpen"
     @open="onOpen"
   >
   >
     <menu-item
     <menu-item
-      v-for="menu in mainLayoutStore.renderMenus"
+      v-for="menu in renderMenus"
       :key="menu.index"
       :key="menu.index"
       :current-index="activeIndex"
       :current-index="activeIndex"
       :menu="menu"
       :menu="menu"
@@ -25,10 +25,17 @@ import { useRoute } from 'vue-router'
 import { ElMenu } from 'element-plus'
 import { ElMenu } from 'element-plus'
 import useMainLayoutStore from '@/store/layout'
 import useMainLayoutStore from '@/store/layout'
 import MenuItem from '@/layout/main/MenuItem.vue'
 import MenuItem from '@/layout/main/MenuItem.vue'
-
+import useMainStore from '@/store/main'
 const route = useRoute()
 const route = useRoute()
 const mainLayoutStore = useMainLayoutStore()
 const mainLayoutStore = useMainLayoutStore()
+const mainStore = useMainStore()
+const renderMenus = computed(() => {
+  let isHiddenAnalysis = mainStore?.myUserInfo?.role === 'ADMIN' || mainStore?.myUserInfo?.role === 'MARKER'
 
 
+  return mainLayoutStore.renderMenus.filter((item: any) => {
+    return !(item.index === 'analysis' && isHiddenAnalysis)
+  })
+})
 const menuRef = ref<InstanceType<typeof ElMenu> & { close: (index: string) => void }>()
 const menuRef = ref<InstanceType<typeof ElMenu> & { close: (index: string) => void }>()
 const key = ref('' + new Date().getTime())
 const key = ref('' + new Date().getTime())
 onActivated(() => {
 onActivated(() => {

+ 15 - 4
src/modules/analysis/monitoring/index.vue

@@ -78,8 +78,17 @@ import type { ExtractApiParams, ExtractApiResponse } from '@/api/api'
 
 
 const { push } = useRouter()
 const { push } = useRouter()
 
 
-const { subjectList, mainQuestionList, groupListWithAll, dataModel, changeModelValue, initFinish, onOptionInit } =
-  useOptions(['subject', 'question', 'group'])
+const {
+  subjectList,
+  mainQuestionList,
+  groupListWithAll,
+  dataModel,
+  changeModelValue,
+  initFinish,
+  onOptionInit,
+  isExpert,
+  isLeader,
+} = useOptions(['subject', 'question', 'group'])
 
 
 const model = reactive<
 const model = reactive<
   Omit<ExtractApiParams<'getStatistics'>, 'markingGroupNumbers'> & {
   Omit<ExtractApiParams<'getStatistics'>, 'markingGroupNumbers'> & {
@@ -123,7 +132,7 @@ const formItems = computed<EpFormItem[]>(() => [
     prop: 'subjectCode',
     prop: 'subjectCode',
     slot: {
     slot: {
       options: subjectList.value,
       options: subjectList.value,
-      disabled: true,
+      disabled: !isExpert.value,
     },
     },
   },
   },
   {
   {
@@ -132,7 +141,7 @@ const formItems = computed<EpFormItem[]>(() => [
     prop: 'questionMainNumber',
     prop: 'questionMainNumber',
     slot: {
     slot: {
       options: mainQuestionList.value,
       options: mainQuestionList.value,
-      disabled: true,
+      disabled: !isExpert.value && !isLeader.value,
     },
     },
   },
   },
   {
   {
@@ -221,6 +230,8 @@ const viewMarkDetail = (row: ExtractArrayValue<ExtractRecordValue<ExtractApiResp
     },
     },
     query: {
     query: {
       markerName: row.markerName,
       markerName: row.markerName,
+      subjectCode: model.subjectCode,
+      questionMainNumber: model.questionMainNumber,
     },
     },
   })
   })
 }
 }

+ 21 - 13
src/modules/bootstrap/login/index.vue

@@ -122,6 +122,12 @@ function loginSuccess(loginInfo: ExtractApiResponse<'userLogin'>) {
   mainStore.getUserMarkConfig()
   mainStore.getUserMarkConfig()
 
 
   mainLayoutStore.getRenderMenuList().then((renderMenus: any) => {
   mainLayoutStore.getRenderMenuList().then((renderMenus: any) => {
+    console.log('renderMenus::::::', renderMenus)
+    let path = '/analysis'
+    let find = renderMenus.find((item: any) => item.index === 'analysis')
+    if (find && (find.children || []).find((v: any) => v.index === 'analysis-monitoring')) {
+      path = '/analysis/monitoring'
+    }
     /**
     /**
      * 超级管理员每次登录完成之后需要选择考试批次
      * 超级管理员每次登录完成之后需要选择考试批次
      * 其它角色如果是首次登录,需要去设置名称.
      * 其它角色如果是首次登录,需要去设置名称.
@@ -131,19 +137,21 @@ function loginSuccess(loginInfo: ExtractApiResponse<'userLogin'>) {
       if (!loginInfo.needRealName) {
       if (!loginInfo.needRealName) {
         mainStore.getMyUserInfo()
         mainStore.getMyUserInfo()
       }
       }
-      // let next = loginInfo.needRealName
-      //   ? { name: 'InitUserName' }
-      //   : loginInfo.role === 'MARKER'
-      //   ? { name: 'MarkingMark' }
-      //   : { path: renderMenus[0].path || '/' }
-      // replace(next)
-      replace({
-        name: loginInfo.needRealName
-          ? 'InitUserName'
-          : loginInfo.role === 'MARKER'
-          ? 'MarkingMark'
-          : 'AnalysisMonitoring',
-      })
+      let next = loginInfo.needRealName
+        ? { name: 'InitUserName' }
+        : loginInfo.role === 'MARKER'
+        ? { name: 'MarkingMark' }
+        : { path: path }
+      // : { path: renderMenus[0].path || '/' }
+
+      replace(next)
+      // replace({
+      //   name: loginInfo.needRealName
+      //     ? 'InitUserName'
+      //     : loginInfo.role === 'MARKER'
+      //     ? 'MarkingMark'
+      //     : 'AnalysisMonitoring',
+      // })
     } else {
     } else {
       replace({ name: 'CheckExam' })
       replace({ name: 'CheckExam' })
     }
     }

+ 18 - 2
src/modules/marking/inquiry-result/index.vue

@@ -109,7 +109,7 @@
   </base-dialog>
   </base-dialog>
 </template>
 </template>
 
 
-<script setup lang="ts" name="MarkingInquiryResult">
+<script setup lang="tsx" name="MarkingInquiryResult">
 /** 自定义查询结果 */
 /** 自定义查询结果 */
 import { ref, computed, watch, reactive } from 'vue'
 import { ref, computed, watch, reactive } from 'vue'
 import { useRoute } from 'vue-router'
 import { useRoute } from 'vue-router'
@@ -132,6 +132,8 @@ import SvgIcon from '@/components/common/SvgIcon.vue'
 import ImagePreview from '@/components/shared/ImagePreview.vue'
 import ImagePreview from '@/components/shared/ImagePreview.vue'
 import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 import SendBackMark from '@/components/shared/SendBackMark.vue'
 import SendBackMark from '@/components/shared/SendBackMark.vue'
+import SecNumberStatus from '@/components/common/secNumberStatus.vue'
+
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { ExtractMultipleApiResponse, ExtractApiParams } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn, EpFormItem } from 'global-type'
 import type { MarkHeaderInstance, EpTableColumn, EpFormItem } from 'global-type'
@@ -219,7 +221,21 @@ const onOperationClick: OperationClick = ({ type, value }) => {
 }
 }
 
 
 const columns: EpTableColumn<RowType>[] = [
 const columns: EpTableColumn<RowType>[] = [
-  { label: '密号', prop: 'secretNumber', minWidth: 100, fixed: 'left' },
+  {
+    label: '密号',
+    prop: 'secretNumber',
+    minWidth: 100,
+    fixed: 'left',
+    formatter(row: any) {
+      return (
+        <SecNumberStatus
+          secretNumber={row.secretNumber}
+          checked={row.checked}
+          corrected={row.corrected}
+        ></SecNumberStatus>
+      )
+    },
+  },
   { label: '评卷员', prop: 'markerName', minWidth: 90 },
   { label: '评卷员', prop: 'markerName', minWidth: 90 },
   { label: '评卷员给分', prop: 'markerScore', minWidth: 88 },
   { label: '评卷员给分', prop: 'markerScore', minWidth: 88 },
   { label: '组长给分', prop: 'headerScore', minWidth: 70 },
   { label: '组长给分', prop: 'headerScore', minWidth: 70 },

+ 14 - 21
src/store/layout.ts

@@ -103,7 +103,6 @@ const useMainLayoutStore = defineStore<
     async getRenderMenuList() {
     async getRenderMenuList() {
       try {
       try {
         const privilege = await useFetch('getUserPrivilege').fetch()
         const privilege = await useFetch('getUserPrivilege').fetch()
-        console.log('privilege:', privilege)
         // privilege.forEach((node: any) => {
         // privilege.forEach((node: any) => {
         //   if (node.code === 'analysis') {
         //   if (node.code === 'analysis') {
         //     node.privilegeUri = '/analysis/monitoring'
         //     node.privilegeUri = '/analysis/monitoring'
@@ -114,31 +113,25 @@ const useMainLayoutStore = defineStore<
         //     })
         //     })
         //   }
         //   }
         // })
         // })
-        // if (!privilege.find((item) => item.code === 'analysis')) {
-        //   privilege.push({
-        //     code: 'analysis',
-        //     id: 1000,
-        //     name: '决策分析',
-        //     nodeCode: 'analysis',
-        //     nodeId: '1000',
-        //     nodeName: '决策分析',
-        //     parentId: -1,
-        //     parentNodeId: '-1',
-        //     privilegeType: 'MENU',
-        //     privilegeUri: '/analysis/nav',
-        //   })
-        //   this.menuList.forEach((item: any) => {
-        //     if (item.index === 'analysis') {
-        //       item.path = '/analysis/nav'
-        //     }
-        //   })
-        // }
+        if (!privilege.find((item) => item.code === 'analysis')) {
+          privilege.push({
+            code: 'analysis',
+            id: 1000,
+            name: '决策分析',
+            nodeCode: 'analysis',
+            nodeId: '1000',
+            nodeName: '决策分析',
+            parentId: -1,
+            parentNodeId: '-1',
+            privilegeType: 'MENU',
+            privilegeUri: '/analysis',
+          })
+        }
         this.permBtnCodes = privilege
         this.permBtnCodes = privilege
           .filter((node) => {
           .filter((node) => {
             return node.privilegeType === 'BUTTON'
             return node.privilegeType === 'BUTTON'
           })
           })
           .map((item) => item.code)
           .map((item) => item.code)
-        console.log('this.menuList:', this.menuList)
 
 
         this.renderMenus = this.menuList.reduce((menus, menu) => {
         this.renderMenus = this.menuList.reduce((menus, menu) => {
           return menus.concat(filterPrivilege(menu, privilege) || [])
           return menus.concat(filterPrivilege(menu, privilege) || [])