Prechádzať zdrojové kódy

专家和科组长的下拉框交互变更和联动

刘洋 2 rokov pred
rodič
commit
7aa8a596f7

+ 1 - 1
server.config.ts

@@ -5,7 +5,7 @@ const server: ServerOptions = {
     '^/?(api|file)/': {
       target: 'http://192.168.10.41:8200',
       // target: 'http://192.168.10.178:8200',
-      // target: 'http://192.168.10.107:8200',
+      // target: 'http://192.168.10.108:8200',
       // target: 'http://cet-test.markingtool.cn',
       // target: 'http://192.168.10.136:80',
       // target: 'http://cet-dev.markingtool.cn:8200',

+ 10 - 10
src/api/api-types/expert.d.ts

@@ -9,14 +9,14 @@ export namespace Expert {
     fileName: string
     filePath: string
     id: number
-    mainNumber: number
+    mainNumber: number | string
     paperType: string
     score: number
     secretNumber: number
     type: string
   }
   type GetSampleList = BaseDefine<
-    MultipleQuery<{ mainNumber?: number; paperType: 'SAMPLE_A' | 'SAMPLE_B' }>,
+    MultipleQuery<{ mainNumber?: number | string; paperType: 'SAMPLE_A' | 'SAMPLE_B' }>,
     MultipleResult<SamplePaperListItem>
   >
 
@@ -26,13 +26,13 @@ export namespace Expert {
     filePath: string
     id: number
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     score: number
     scoreLevel: string
     secretNumber: number
   }
 
-  type GetRfSampleList = BaseDefine<MultipleQuery<{ mainNumber?: number }>, MultipleResult<RfSampleListItem>>
+  type GetRfSampleList = BaseDefine<MultipleQuery<{ mainNumber?: number | string }>, MultipleResult<RfSampleListItem>>
 
   type UpdateMarkScore = BaseDefine<{ id?: number; scores: number[] }>
 
@@ -42,7 +42,7 @@ export namespace Expert {
     fileName: string
     filePath: string
     id: number
-    mainNumber: number
+    mainNumber: number | string
     score: number
     secretNumber: number
     taskId: number
@@ -50,7 +50,7 @@ export namespace Expert {
 
   type GetStandardList = BaseDefine<
     MultipleQuery<{
-      mainNumber?: number
+      mainNumber?: number | string
       dispensed: boolean | ''
       scoreStart?: number | string
       scoreEnd?: number | string
@@ -67,14 +67,14 @@ export namespace Expert {
     forceGroupNumber: number
     id: number
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     score: number
     secretNumber: number
   }
 
   type GetExpertAssessList = BaseDefine<
     MultipleQuery<{
-      mainNumber?: number
+      mainNumber?: number | string
       forceGroupNumber?: number
     }>,
     MultipleResult<ExpertAssessListItem>
@@ -87,7 +87,7 @@ export namespace Expert {
     forceGroupNumber: number
     id: number
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     role: string
     roleName: string
     score: number
@@ -96,7 +96,7 @@ export namespace Expert {
 
   type GetExpertPickList = BaseDefine<
     MultipleQuery<{
-      mainNumber?: number
+      mainNumber?: number | string
       forceGroupNumber?: number
       paperType: ExpertPickType
       role: Exclude<ROLE, 'ADMIN'>

+ 5 - 5
src/api/api-types/forceCheck.d.ts

@@ -5,7 +5,7 @@ export namespace ForceCheck {
   /** 分发考核卷 */
   type HandOutForceCheck = BaseDefine<{
     forceGroupNumber?: number
-    mainNumber?: number
+    mainNumber?: number | string
     markerIds: number[]
     subjectCode: string
     paperCount?: number
@@ -17,13 +17,13 @@ export namespace ForceCheck {
     examId: number
     forceGroupNumber: number
     id: number
-    mainNumber: number
+    mainNumber: number | string
     subjectCode: string
     updateTime: string
     updaterId: number
     paperCount?: number
   }
-  type GetForceCheckGroupList = BaseDefine<{ mainNumber?: number; subjectCode: string }, ForceCheckGroup[]>
+  type GetForceCheckGroupList = BaseDefine<{ mainNumber?: number | string; subjectCode: string }, ForceCheckGroup[]>
   /** 获取分发进度 */
   interface HandOutProgress {
     /** 已评量 */
@@ -35,7 +35,7 @@ export namespace ForceCheck {
     /** 评卷员 */
     marker: string
     /** 小组号 */
-    markingGroupNumber: number
+    markingGroupNumber: number | string
     /** 未评量 */
     pendingCount: number
     /** 科目 */
@@ -44,7 +44,7 @@ export namespace ForceCheck {
     totalCount: number
   }
   type GetHandOutProgressList = BaseDefine<
-    { mainNumber?: number; subjectCode: string; forceGroupNumber?: number },
+    { mainNumber?: number | string; subjectCode: string; forceGroupNumber?: number },
     HandOutProgress[]
   >
   export interface ApiMap {

+ 19 - 16
src/api/api-types/marking.d.ts

@@ -11,11 +11,11 @@ export namespace Marking {
     /** 是否已抽查 */
     checked?: boolean
     /** 大题号 */
-    mainNumber?: number
+    mainNumber?: number | string
     /** 评卷员id */
     markerId?: number
     /** 小组号 */
-    markingGroupNumber?: number
+    markingGroupNumber?: number | string
     /** 分数截止 */
     scoreEnd?: number
     /** 分数开始 */
@@ -35,7 +35,7 @@ export namespace Marking {
     customCheckNumber: number
     examNumber: string
     filePath: string
-    mainNumber: number
+    mainNumber: number | string
     markTime: string
     markerName: string
     headerScore: number
@@ -65,7 +65,10 @@ export namespace Marking {
     scores: number[]
   }>
 
-  type GetMarkingStandard = BaseDefine<null, { examId: number; mainNumber: number; subjectCode: string; url: string }>
+  type GetMarkingStandard = BaseDefine<
+    null,
+    { examId: number; mainNumber: number | string; subjectCode: string; url: string }
+  >
 
   interface Question {
     intervalScore: number
@@ -74,7 +77,7 @@ export namespace Marking {
   }
   interface Task {
     /** 大题号 */
-    mainNumber: number
+    mainNumber: number | string
     /** 大题名称 */
     mainTitle: string
     /** 小题列表 */
@@ -120,7 +123,7 @@ export namespace Marking {
   type SubmitMarkTask = BaseDefine<SubmitMark, { refresh: boolean }>
 
   interface HistoryTask {
-    mainNumber: number
+    mainNumber: number | string
     mainTitle: number
     markScore: number
     markTime: string
@@ -136,7 +139,7 @@ export namespace Marking {
   type GetMarkHistory = BaseDefine<null, { enableRemark: boolean; markHistoryList: HistoryTask[] }>
 
   interface ProblemListParams {
-    mainNumber?: number
+    mainNumber?: number | string
     problemType: ProblemType | ''
     status: '' | 'INITIAL' | 'PROCESSED'
   }
@@ -149,7 +152,7 @@ export namespace Marking {
     headerScore: number
     headerScores: number[]
     id: number
-    mainNumber: number
+    mainNumber: number | string
     mainName: string
     markerName: string
     markRatio: string
@@ -201,7 +204,7 @@ export namespace Marking {
     groupLeaderScore: number
     id: number
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     markerName: string
     markerRatio: string
     markerScore: number
@@ -215,7 +218,7 @@ export namespace Marking {
   }
 
   type GetArbitrationList = BaseDefine<
-    MultipleQuery<{ mainNumber?: number; status: ArbitrationStatus | '' }>,
+    MultipleQuery<{ mainNumber?: number | string; status: ArbitrationStatus | '' }>,
     MultipleResult<ArbitrationListItem>
   >
 
@@ -228,7 +231,7 @@ export namespace Marking {
     confirmScore: number
     filePath: string
     id: number
-    mainNumber: number
+    mainNumber: number | string
     mainName: string
     markerName: string
     markerScore: number
@@ -238,7 +241,7 @@ export namespace Marking {
   }
 
   type GetReMarkPaperList = BaseDefine<
-    MultipleQuery<{ mainNumber?: number; confirm: boolean }>,
+    MultipleQuery<{ mainNumber?: number | string; confirm: boolean }>,
     MultipleResult<ReMarkPaperListItem>
   >
 
@@ -263,7 +266,7 @@ export namespace Marking {
     description: string
     examId: number
     id: number
-    mainNumber: number
+    mainNumber: number | string
     mainTitle: string
     markTime: string
     markerName: string
@@ -279,7 +282,7 @@ export namespace Marking {
     examNumber: string
     filePath: string
     id: number
-    mainNumber: number
+    mainNumber: number | string
     markerName: string
     sameExamNumber: string
     sameFilePath: string
@@ -291,7 +294,7 @@ export namespace Marking {
 
   type GetSimilarPaperList = BaseDefine<
     MultipleQuery<{
-      mainNumber?: number
+      mainNumber?: number | string
       status: 'INITIAL' | 'NOT_SAME' | 'SAME' | '' | null
     }>,
     MultipleResult<SamePaperListItem>
@@ -301,7 +304,7 @@ export namespace Marking {
 
   type ExportSimilarPaper = BaseDefine<
     MultipleQuery<{
-      mainNumber?: number
+      mainNumber?: number | string
       status: 'INITIAL' | 'NOT_SAME' | 'SAME' | '' | null
     }>
   >

+ 7 - 7
src/api/api-types/question.d.ts

@@ -18,7 +18,7 @@ export namespace Question {
   interface SubQuestionInfo {
     id: number
     intervalScore: number
-    mainNumber: number
+    mainNumber: number | string
     mainTitle: string
     subNumber: number
     totalScore: number
@@ -34,7 +34,7 @@ export namespace Question {
     groupNumber: number
     id: number
     levelRange: number[]
-    mainNumber: number
+    mainNumber: number | string
     minMarkTime: number
     remarkNumber: number
     remarkType: string
@@ -52,7 +52,7 @@ export namespace Question {
   type GetMainQuestionList = BaseDefine<{ subjectCode: string }, MainQuestionListItem[]>
 
   /** 获取小组列表 */
-  type GetQuestionGroupList = BaseDefine<{ subjectCode?: string; mainNumber?: number }, number[]>
+  type GetQuestionGroupList = BaseDefine<{ subjectCode?: string; mainNumber?: number | string }, number[]>
 
   interface SubQuestionStruct {
     intervalScore: number
@@ -62,14 +62,14 @@ export namespace Question {
   }
   /** 获取大题评卷结构 */
   type GetQuestionStruct = BaseDefine<
-    { mainNumber?: number },
-    { mainNumber: number; mainTitle: string; questionList: SubQuestionStruct[] }
+    { mainNumber?: number | string },
+    { mainNumber: number | string; mainTitle: string; questionList: SubQuestionStruct[] }
   >
 
   /** 大题设置 (新增/编辑) */
   interface MainQuestionMeta {
     /** 大题号 */
-    mainNumber?: number
+    mainNumber?: number | string
     /** 大题名称 */
     mainTitle: string
     /** 分组数量 */
@@ -110,7 +110,7 @@ export namespace Question {
 
   /** 获取大题信息 */
   type GetMainQuestionInfo = BaseDefine<
-    { mainNumber: number; subjectCode: string },
+    { mainNumber: number | string; subjectCode: string },
     MainQuestionMeta & { examId: number }
   >
 

+ 42 - 37
src/api/api-types/statistics.d.ts

@@ -4,7 +4,7 @@ import { BaseDefine, MultipleQuery, MultipleResult } from './base'
 export namespace Statistics {
   interface BaseFilterOption {
     subjectCode?: string
-    questionMainNumber?: number
+    questionMainNumber?: number | string
     markingGroupNumbers?: number[]
     startTime?: string
     endTime?: string
@@ -15,9 +15,9 @@ export namespace Statistics {
     /** 结束时间,格式:yyyyMMddHHmmss */
     endTime: string
     /** 小组号 */
-    markingGroupNumber?: number
+    markingGroupNumber?: number | string
     /** 大题号 */
-    questionMainNumber?: number
+    questionMainNumber?: number | string
     /** 开始时间,格式:yyyyMMddHHmmss */
     startTime: string
     /** 科目代码 */
@@ -53,7 +53,7 @@ export namespace Statistics {
   type SelfCheckAnalysisDiffList = BaseDefine<
     {
       markerId?: number
-      questionMainNumber?: number
+      questionMainNumber?: number | string
       subjectCode: string
     },
     SelfCheckAnalysisDiffListItem[]
@@ -64,7 +64,7 @@ export namespace Statistics {
     diff: number
     filePath: string
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     markTime: string
     markerName: string
     markerScore: number
@@ -97,7 +97,7 @@ export namespace Statistics {
     markerId: number
     markerName: string
     questionMainName: string
-    questionMainNumber: number
+    questionMainNumber: number | string
     rejectCount: number
     sysCheckCount: number
     sysCheckReScoreCount: number
@@ -105,7 +105,7 @@ export namespace Statistics {
 
   type StatisticCheckOverview = BaseDefine<
     {
-      questionMainNumber?: number
+      questionMainNumber?: number | string
       subjectCode: string
       markingGroupLeaderId?: number
     },
@@ -117,7 +117,7 @@ export namespace Statistics {
     headerName: string
     headerScore: number
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     markScore: number
     secretNumber: number
     status: string
@@ -128,7 +128,7 @@ export namespace Statistics {
   type GetSubjectiveCheckList = BaseDefine<
     MultipleQuery<{
       subjectCode: string
-      mainNumber?: number
+      mainNumber?: number | string
       checked?: boolean
       rule: 'RULE1' | 'RULE2' | 'RULE3' | 'RULE4'
     }>,
@@ -148,7 +148,7 @@ export namespace Statistics {
     /** 大题名称 */
     questionMainName: string
     /** 大题号 */
-    questionMainNumber: number
+    questionMainNumber: number | string
     /** 预计耗时(秒) */
     takeTime: number
     /** 试卷总量 */
@@ -163,28 +163,31 @@ export namespace Statistics {
     dayFinishRate: number
     finishCount: number
     finishRate: number
-    markingGroupNumber: number
+    markingGroupNumber: number | string
   }
 
-  type GetMarkProgressByGroup = BaseDefine<{ subjectCode: string; questionMainNumber?: number }, MarkProgressByGroup[]>
+  type GetMarkProgressByGroup = BaseDefine<
+    { subjectCode: string; questionMainNumber?: number | string },
+    MarkProgressByGroup[]
+  >
 
   /** 决策分析-评卷进度统计(按评卷员) */
   interface MarkProgressByMarker {
     dayFinishCounts: { count: number; date: string }[]
     markerId: number
     markerName: string
-    markingGroupNumber: number
+    markingGroupNumber: number | string
     totalFinishCount: number
   }
   type GetMarkProgressByMarker = BaseDefine<
-    { subjectCode: string; questionMainNumber?: number; markingGroupNumber?: number },
+    { subjectCode: string; questionMainNumber?: number | string; markingGroupNumber?: number | string },
     MarkProgressByMarker[]
   >
 
   type ExportMarkProgressByMarker = BaseDefine<{
     subjectCode: string
-    questionMainNumber?: number
-    markingGroupNumber?: number
+    questionMainNumber?: number | string
+    markingGroupNumber?: number | string
   }>
 
   /** 科目进度收尾 */
@@ -195,7 +198,7 @@ export namespace Statistics {
     finishCount: number
     finishRate: number
     questionMainName: string
-    questionMainNumber: number
+    questionMainNumber: number | string
     subjectiveUnVerifyPaperCount: number
     todoArbitrationPaperCount: number
     todoProblemPaperCount: number
@@ -207,8 +210,8 @@ export namespace Statistics {
 
   interface BaseParams {
     subjectCode: string
-    questionMainNumber?: number
-    markingGroupNumber?: number
+    questionMainNumber?: number | string
+    markingGroupNumber?: number | string
   }
 
   /** 质量统计-收尾检查-评卷员未评卷列表(分页) */
@@ -217,7 +220,7 @@ export namespace Statistics {
     markerId: number
     markerName: string
     questionMainName: string
-    questionMainNumber: number
+    questionMainNumber: number | string
     secretNumber: string
     taskId: number
   }
@@ -225,7 +228,7 @@ export namespace Statistics {
   /** 质量统计-收尾检查-未处理雷同卷列表 */
   interface UnProcessSimilar {
     questionMainName: string
-    questionMainNumber: number
+    questionMainNumber: number | string
     sameSecretNumber: string
     secretNumber: string
   }
@@ -233,7 +236,7 @@ export namespace Statistics {
   /** 质量统计-收尾检查-未处理问题卷列表 */
   interface UnProcessProblem {
     questionMainName: string
-    questionMainNumber: number
+    questionMainNumber: number | string
     secretNumber: string
   }
   type UnProcessProblemList = BaseDefine<BaseParams, UnProcessProblem[]>
@@ -253,7 +256,7 @@ export namespace Statistics {
     /** 组长ID */
     markingGroupLeaderId: string
     /** 小组号 */
-    markingGroupNumber: number
+    markingGroupNumber: number | string
     /** 已给分自定义抽查卷数 */
     customCheckReScoreCount: number
     /** 已给分问题卷数 */
@@ -273,7 +276,7 @@ export namespace Statistics {
     headerRatio: string
     headerScore: number
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     markTime: string
     markerId: number
     markerName: string
@@ -306,7 +309,7 @@ export namespace Statistics {
     hasJudge?: boolean
     markerId?: number
     markingGroupNumbers?: number[]
-    questionMainNumber?: number
+    questionMainNumber?: number | string
     startTime?: string
     subjectCode: string
   }
@@ -325,7 +328,7 @@ export namespace Statistics {
     /** 评卷员名称 */
     markerName: string
     /** 小组号 */
-    markingGroupNumber: number
+    markingGroupNumber: number | string
     /** 评卷份数 */
     markingPaperCount: number
     /** 评卷速度(n秒每个) */
@@ -362,16 +365,18 @@ export namespace Statistics {
     markerDetails: GetStatisticsByGroupResponseItem[] | null
   }
 
-  type GetStatisticsByGroup = BaseDefine<GetStatisticsByGroupParams, GetStatisticsByGroupResponseItem[]>
+  // type GetStatisticsByGroup = BaseDefine<GetStatisticsByGroupParams, GetStatisticsByGroupResponseItem[]>
+  type GetStatisticsByGroup = BaseDefine<any, GetStatisticsByGroupResponseItem[]>
 
   /** 决策分析-监控统计导出(按小组) */
-  type ExportStatisticsByGroup = BaseDefine<GetStatisticsByGroupParams>
+  // type ExportStatisticsByGroup = BaseDefine<GetStatisticsByGroupParams>
+  type ExportStatisticsByGroup = BaseDefine<any>
 
   /** 培训监控 */
   interface TrainingMonitorParams {
     subjectCode: string
-    mainNumber?: number
-    markingGroupNumber?: number
+    mainNumber?: number | string
+    markingGroupNumber?: number | string
     markStage: 'SAMPLE_A' | 'SAMPLE_B' | 'FORCE'
     forceGroupNumber?: number
   }
@@ -404,7 +409,7 @@ export namespace Statistics {
     filePath: string
     forceGroupNumber: number
     group: string
-    mainNumber: number
+    mainNumber: number | string
     markTime: string
     markerName: string
     markScore: number
@@ -433,7 +438,7 @@ export namespace Statistics {
     markingPaperCount: number
     markingRate: number
     questionMainName: string
-    questionMainNumber: number
+    questionMainNumber: number | string
   }
   type GetPersonalStatistic = BaseDefine<{ startTime: string; endTime: string; markerId?: number }, PersonalStatistic>
 
@@ -441,7 +446,7 @@ export namespace Statistics {
   interface PersonalMarkDetail {
     filePath: string
     mainName: string
-    mainNumber: number
+    mainNumber: number | string
     markTime: string
     markerName: string
     markerRatio: string
@@ -468,7 +473,7 @@ export namespace Statistics {
     filePath: string
     headerScore: number
     id: number
-    mainNumber: number
+    mainNumber: number | string
     markScore: number
     markTime: string
     markerName: string
@@ -481,7 +486,7 @@ export namespace Statistics {
     MultipleQuery<{
       level: 'LEVEL_1' | 'LEVEL_2' | 'LEVEL_3' | 'LEVEL_4' | 'LEVEL_5' | ''
       status: 'INITIAL' | 'VIEWED' | 'GRADED' | 'REJECT'
-      mainNumber?: number
+      mainNumber?: number | string
     }>,
     MultipleResult<SystemSpotListItem>
   >
@@ -499,8 +504,8 @@ export namespace Statistics {
 
   interface StatisticByGroup {
     subjectCode: string
-    questionMainNumber?: number
-    markingGroupNumber?: number
+    questionMainNumber?: number | string
+    markingGroupNumber?: number | string
     startTime: string
     endTime: string
   }

+ 12 - 12
src/api/api-types/system.d.ts

@@ -6,7 +6,7 @@ export namespace System {
   interface MarkingDataImport {
     dayNumber?: number
     file?: File
-    mainNumber?: number
+    mainNumber?: number | string
     packageTaskCount?: number
     separator: string
     subjectCode: string
@@ -14,13 +14,13 @@ export namespace System {
 
   type ImportMarkingData = BaseDefine<MarkingDataImport>
 
-  type ExportStudentTask = BaseDefine<{ subjectCode: string; mainNumber: number; dayNumber: number }>
+  type ExportStudentTask = BaseDefine<{ subjectCode: string; mainNumber: number | string; dayNumber: number }>
 
   /** 获取导入文件路径 */
   type GetImportFilePath = BaseDefine<
     {
       filePathType: 'SLICE' | 'SAMPLE_A' | 'SAMPLE_B' | 'RF' | 'MARK_STANDARD'
-      mainNumber?: number
+      mainNumber?: number | string
       subjectCode: string
     },
     { rfPath: string; sampleAPath: string; sampleBPath: string; markStandardPath: string }
@@ -29,7 +29,7 @@ export namespace System {
   interface SamplePaperImport {
     file?: File
     /** 大题号 */
-    mainNumber?: number
+    mainNumber?: number | string
     /** 试卷类型 */
     paperType?: SamplePaperType
     /** 试卷密码前缀 */
@@ -48,7 +48,7 @@ export namespace System {
     /** 试卷密码前缀 */
     prefix: string
     /** 大题号 */
-    mainNumber?: number
+    mainNumber?: number | string
     /** 科目代码 */
     subjectCode: string
     /** 分隔符 */
@@ -107,8 +107,8 @@ export namespace System {
   /** 任务设置 - 按小组追加 */
   type MarkGroupUpdateCount = BaseDefine<{
     markCount?: number
-    markingGroupNumber?: number
-    mainNumber?: number
+    markingGroupNumber?: number | string
+    mainNumber?: number | string
     subjectCode?: string
   }>
 
@@ -116,12 +116,12 @@ export namespace System {
   interface TaskDetail {
     finishCount: number
     markCount: number
-    markingGroupNumber: number
+    markingGroupNumber: number | string
   }
   type GetTaskDetail = BaseDefine<
     {
-      mainNumber?: number
-      markingGroupNumber?: number
+      mainNumber?: number | string
+      markingGroupNumber?: number | string
       subjectCode?: string
     },
     TaskDetail[]
@@ -129,8 +129,8 @@ export namespace System {
   /** 任务设置-获取剩余任务 */
   type GetUnMarkTasks = BaseDefine<
     {
-      mainNumber?: number
-      markingGroupNumber?: number
+      mainNumber?: number | string
+      markingGroupNumber?: number | string
       subjectCode?: string
     },
     {

+ 23 - 15
src/api/api-types/user.d.ts

@@ -21,7 +21,7 @@ export namespace User {
     /** 考试批次ID */
     examId: number
     /** 大题ID */
-    mainNumber: number
+    mainNumber: number | string
     /** 评卷员状态 */
     stage: STAGE
     /** 科目代码 */
@@ -43,7 +43,7 @@ export namespace User {
     role?: ROLE
     loginName?: string
     name?: string
-    mainNumber?: number
+    mainNumber?: number | string
     subjectCode?: string
   }>
 
@@ -51,8 +51,8 @@ export namespace User {
     examId?: number
     examName?: string
     loginName: string
-    mainNumber?: number
-    markingGroupNumber?: number
+    mainNumber?: number | string
+    markingGroupNumber?: number | string
     name?: string
     role: ROLE
     subjectCode: string
@@ -87,11 +87,11 @@ export namespace User {
     /** 账号位数 */
     loginNameLength: number
     /** 大题ID */
-    mainNumber?: number
+    mainNumber?: number | string
     /** 分组账号数量 */
     markingGroupAccounts?: number
     /** 小组号 */
-    markingGroupNumber?: number
+    markingGroupNumber?: number | string
     /** 密码 */
     password: string
     /** 自定义前缀 */
@@ -120,7 +120,7 @@ export namespace User {
       role?: ROLE
       loginName?: string
       name?: string
-      mainNumber?: number
+      mainNumber?: number | string
       subjectCode?: string
     }>,
     MultipleResult<ResponseUserInfo>
@@ -160,8 +160,8 @@ export namespace User {
     examName: string
     id: number
     loginName: string
-    mainNumber: number
-    markingGroupNumber: number
+    mainNumber: number | string
+    markingGroupNumber: number | string
     name: string
     role: string
     roleName: string
@@ -171,11 +171,14 @@ export namespace User {
   }
 
   type GetMarkerTree = BaseDefine<
-    { subjectCode: string; mainNumber?: number; name: string },
-    { markers: Marker[]; markingGroupNumber: number }[]
+    { subjectCode: string; mainNumber?: number | string; name: string },
+    { markers: Marker[]; markingGroupNumber: number | string }[]
   >
 
-  type GetMarkerList = BaseDefine<{ subjectCode: string; mainNumber?: number; markingGroupNumber?: number }, Marker[]>
+  type GetMarkerList = BaseDefine<
+    { subjectCode: string; mainNumber?: number | string; markingGroupNumber?: number | string },
+    Marker[]
+  >
 
   interface UserInfo {
     config: string
@@ -185,10 +188,10 @@ export namespace User {
     examName: string
     id: number
     loginName: string
-    mainNumber: number
+    mainNumber: number | string
     markDayCount: number
     markTotalCount: number
-    markingGroupNumber: number
+    markingGroupNumber: number | string
     name: string
     role: string
     roleName: string
@@ -207,7 +210,7 @@ export namespace User {
       deputyGroup: UserInfo[]
       /** 评卷小组 */
       markerGroup: {
-        markingGroupNumber: number
+        markingGroupNumber: number | string
         markers: UserInfo[]
       }[]
     }
@@ -227,6 +230,9 @@ export namespace User {
   /** 获取试卷配置信息 */
   type GetUserMarkConfig = BaseDefine<null, Record<string, MarkConfig>>
 
+  type ImportUsersTemplate = BaseDefine<any, any>
+  type ImportUsersFile = BaseDefine<any, any>
+
   type UnlockScreen = BaseDefine<{ password: string }, any>
 
   /** >>> user api end <<< */
@@ -254,5 +260,7 @@ export namespace User {
     /** 获取试卷配置信息 */
     getUserMarkConfig: GetUserMarkConfig
     unLockScreen: UnlockScreen
+    importUsersTemplate: ImportUsersTemplate
+    importUsersFile: ImportUsersFile
   }
 }

+ 13 - 0
src/api/user.ts

@@ -48,6 +48,19 @@ const UserApi: DefineApiModule<User.ApiMap> = {
   /** 获取试卷配置信息 */
   getUserMarkConfig: '/api/user/config/get',
   unLockScreen: '/api/user/unlock',
+  importUsersTemplate: {
+    url: '/api/user/name/import/template',
+    download: true,
+    timeout: 0,
+  },
+  /** 用户导入 */
+  importUsersFile: {
+    url: '/api/user/name/import',
+    headers: {
+      'Content-Type': 'multipart/form-data',
+    },
+    timeout: 0,
+  },
 }
 
 export default UserApi

+ 2 - 1
src/components/shared/ScoringPanel.vue

@@ -58,7 +58,8 @@ const props = withDefaults(
     visible?: boolean
     /** 分值 */
     score: (number | string)[]
-    mainNumber?: number | null
+    // mainNumber?: number | null
+    mainNumber?: any
     id?: number | null
     autoVisible?: boolean | undefined
     large?: boolean

+ 1 - 1
src/components/shared/ScoringPanelItem.vue

@@ -94,7 +94,7 @@ const isMarkerPage = computed(() => {
 })
 
 interface QuestionInfo {
-  mainNumber: number
+  mainNumber: number | string
   mainTitle: string
   subNumber: number
   totalScore: number

+ 1 - 1
src/components/shared/ScoringPanelWithConfirm.vue

@@ -52,7 +52,7 @@ const props = defineProps<{
   /** 分值 */
   score: number[]
   /** 大题号 */
-  mainNumber?: number
+  mainNumber?: number | string
   large?: boolean
 }>()
 

+ 2 - 0
src/constants/dicts.ts

@@ -4,6 +4,8 @@ export const ROLE: Record<Exclude<ROLE, 'ADMIN'>, string> = {
   CHIEF: '大组长',
   DEPUTY: '小组长',
   MARKER: '评卷员',
+  SECTION_LEADER: '科组长',
+  EXPERT: '专家',
 }
 
 export const ROLE_OPTION = Object.entries(ROLE).map(([value, label]) => ({ value, label }))

+ 4 - 4
src/hooks/useOptions.ts

@@ -6,8 +6,8 @@ import type { Ref } from 'vue'
 
 export interface DataModel {
   subject?: string
-  question?: number
-  group?: number
+  question?: number | string
+  group?: number | string
 }
 
 interface Group {
@@ -80,9 +80,9 @@ const useOptions = (
     )
   })
 
-  const mainQuestionList = computed<QuestionList[]>(() => {
+  const mainQuestionList = computed<any[]>(() => {
     return (
-      mainQuestionListResult.value?.map<QuestionList>((v) => {
+      mainQuestionListResult.value?.map((v: any) => {
         return {
           ...v,
           label: `${v.mainNumber}-${v.title}`,

+ 1 - 1
src/modules/admin-data/paper/components/standard.vue

@@ -23,7 +23,7 @@ const { subjectList, mainQuestionList, dataModel, changeModelValue } = useOption
 
 const { fetch: getImportFilePath, result: filePath } = useFetch('getImportFilePath')
 
-const model = reactive<{ subjectCode: string; mainNumber?: number }>({
+const model = reactive<{ subjectCode: string; mainNumber?: number | string }>({
   subjectCode: dataModel.subject || '',
   mainNumber: dataModel.question,
 })

+ 2 - 2
src/modules/admin-data/task-setting/components/GroupSetting.vue

@@ -11,8 +11,8 @@ import BaseTable from '@/components/element/BaseTable.vue'
 import type { EpTableColumn } from 'global-type'
 
 const props = defineProps<{
-  mainNumber?: number
-  markingGroupNumber?: number
+  mainNumber?: number | string
+  markingGroupNumber?: number | string
   subjectCode?: string
 }>()
 

+ 1 - 1
src/modules/admin-data/task-setting/components/MarkerSetting.vue

@@ -12,7 +12,7 @@ import type { EpTableColumn } from 'global-type'
 import type { ExtractMultipleApiResponse } from '@/api/api'
 
 const props = defineProps<{
-  mainNumber?: number
+  mainNumber?: number | string
   markingGroupNumber?: number
   subjectCode?: string
 }>()

+ 2 - 2
src/modules/admin-subject/struct/index.vue

@@ -70,8 +70,8 @@ const { fetch: getSubQuestionList, result: subQuestionList } = useFetch('getSubQ
 
 type SubQuestion = ExtractArrayValue<ExtractApiResponse<'getSubQuestionList'>>
 type WithFirstMainTag = SubQuestion & { firstMain: boolean }
-const tableData = computed<Array<WithFirstMainTag>>(() => {
-  const MainMap: Record<number, boolean> = {}
+const tableData = computed<any>(() => {
+  const MainMap: Record<number | string, boolean> = {}
   return subQuestionList.value?.map((sub) => {
     const mainHas = !!MainMap[sub.mainNumber]
     if (!mainHas) {

+ 56 - 18
src/modules/admin-user/bulk-add-user/index.vue

@@ -60,7 +60,7 @@ const initModel: ExtractApiParams<'bulkSaveUser'> = {
   start: 1,
 }
 
-const model = reactive<ExtractApiParams<'bulkSaveUser'>>(initModel)
+const model = reactive<any>(initModel)
 
 const { formRef, elFormRef, defineColumn, _ } = useForm()
 
@@ -96,10 +96,30 @@ const rules = computed<EpFormRules>(() => {
 })
 
 watch(dataModel, () => {
-  model.subjectCode = dataModel.subject || ''
-  model.mainNumber = dataModel.question
-  model.markingGroupNumber = dataModel.group
+  if (model.role !== 'EXPERT' && model.role !== 'SECTION_LEADER') {
+    model.subjectCode = dataModel.subject || ''
+    model.mainNumber = dataModel.question
+    model.markingGroupNumber = dataModel.group
+  }
 })
+watch(
+  () => model.role,
+  () => {
+    if (model.role === 'EXPERT') {
+      model.subjectCode = '全部'
+      model.mainNumber = '全部'
+      model.markingGroupNumber = '全部'
+    } else if (model.role === 'SECTION_LEADER') {
+      model.subjectCode = ''
+      model.mainNumber = '全部'
+      model.markingGroupNumber = '全部'
+    } else {
+      model.subjectCode = ''
+      model.mainNumber = void 0
+      model.markingGroupNumber = void 0
+    }
+  }
+)
 
 const groups: FormGroup[] = [
   {
@@ -126,6 +146,15 @@ const items = computed<EpFormItem[]>(() => {
         span: 6,
       },
     },
+    span7({
+      label: '用户角色',
+      slotType: 'select',
+      prop: 'role',
+      slot: {
+        options: ROLE_OPTION.value,
+        placeholder: '设置用户角色',
+      },
+    }),
     span7({
       label: '科目',
       slotType: 'select',
@@ -133,7 +162,8 @@ const items = computed<EpFormItem[]>(() => {
       slot: {
         placeholder: '请选择科目',
         onChange: changeModelValue('subject'),
-        options: subjectList.value,
+        options: model.role === 'EXPERT' ? [{ value: '全部', label: '全部' }, ...subjectList.value] : subjectList.value,
+        disabled: model.role === 'EXPERT',
       },
     }),
     span7({
@@ -143,18 +173,15 @@ const items = computed<EpFormItem[]>(() => {
       slot: {
         placeholder: '大题号-大题名称',
         onChange: changeModelValue('question'),
-        options: mainQuestionList.value,
-      },
-    }),
-    span7({
-      label: '用户角色',
-      slotType: 'select',
-      prop: 'role',
-      slot: {
-        options: ROLE_OPTION.value,
-        placeholder: '设置用户角色',
+        // options: mainQuestionList.value,
+        options:
+          model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
+            ? [{ label: '全部', value: '全部' }, ...mainQuestionList.value]
+            : mainQuestionList.value,
+        disabled: model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
       },
     }),
+
     model.role !== 'CHIEF'
       ? span7({
           label: '小组',
@@ -162,8 +189,13 @@ const items = computed<EpFormItem[]>(() => {
           prop: 'markingGroupNumber',
           slot: {
             placeholder: '用户所在小组',
-            options: groupList.value,
+            // options: groupList.value,
             onChange: changeModelValue('group'),
+            options:
+              model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
+                ? [{ label: '全部', value: '全部' }, ...groupList.value]
+                : groupList.value,
+            disabled: model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
           },
         })
       : null,
@@ -238,8 +270,14 @@ const { fetch, loading } = useFetch('bulkSaveUser')
 async function onSubmit() {
   try {
     await unref(elFormRef)?.validate()
-    await fetch(model)
-    unref(elFormRef)?.resetFields()
+    let data: any = {}
+    for (let k in model) {
+      if (model[k] !== '全部') {
+        data[k] = model[k]
+      }
+    }
+    await fetch(data)
+    // unref(elFormRef)?.resetFields()
     ElMessage.success({
       message: `创建用户成功`,
       duration: 1000,

+ 56 - 22
src/modules/admin-user/edit-user/index.vue

@@ -56,7 +56,7 @@ const initModel: ExtractApiParams<'saveUserInfo'> = {
   enable: true,
 }
 
-const model = reactive<ExtractApiParams<'saveUserInfo'>>(initModel)
+const model = reactive<any>(initModel)
 
 const { formRef, elFormRef } = useForm()
 
@@ -86,10 +86,30 @@ const { subjectList, mainQuestionList, groupList, dataModel, changeModelValue }
 ])
 
 watch(dataModel, () => {
-  model.subjectCode = dataModel.subject || ''
-  model.mainNumber = dataModel.question
-  model.markingGroupNumber = dataModel.group
+  if (model.role !== 'EXPERT' && model.role !== 'SECTION_LEADER') {
+    model.subjectCode = dataModel.subject || ''
+    model.mainNumber = dataModel.question
+    model.markingGroupNumber = dataModel.group
+  }
 })
+watch(
+  () => model.role,
+  () => {
+    if (model.role === 'EXPERT') {
+      model.subjectCode = '全部'
+      model.mainNumber = '全部'
+      model.markingGroupNumber = '全部'
+    } else if (model.role === 'SECTION_LEADER') {
+      model.subjectCode = ''
+      model.mainNumber = '全部'
+      model.markingGroupNumber = '全部'
+    } else {
+      model.subjectCode = ''
+      model.mainNumber = void 0
+      model.markingGroupNumber = void 0
+    }
+  }
+)
 
 const items = computed<EpFormItem[]>(() => {
   return [
@@ -101,6 +121,16 @@ const items = computed<EpFormItem[]>(() => {
         value: mainStore.myUserInfo?.examName,
       },
     },
+    {
+      label: '用户角色',
+      slotType: 'select',
+      prop: 'role',
+      slot: {
+        options: ROLE_OPTION.value,
+        placeholder: '设置用户角色',
+        disabled: isEdit,
+      },
+    },
     {
       label: '科目',
       slotType: 'select',
@@ -108,8 +138,8 @@ const items = computed<EpFormItem[]>(() => {
       slot: {
         placeholder: '请选择科目',
         onChange: changeModelValue('subject'),
-        options: subjectList.value,
-        disabled: isEdit,
+        options: model.role === 'EXPERT' ? [{ value: '全部', label: '全部' }, ...subjectList.value] : subjectList.value,
+        disabled: isEdit || model.role === 'EXPERT',
       },
     },
     {
@@ -119,20 +149,14 @@ const items = computed<EpFormItem[]>(() => {
       slot: {
         placeholder: '大题号-大题名称',
         onChange: changeModelValue('question'),
-        options: mainQuestionList.value,
-        disabled: isEdit,
-      },
-    },
-    {
-      label: '用户角色',
-      slotType: 'select',
-      prop: 'role',
-      slot: {
-        options: ROLE_OPTION.value,
-        placeholder: '设置用户角色',
-        disabled: isEdit,
+        options:
+          model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
+            ? [{ label: '全部', value: '全部' }, ...mainQuestionList.value]
+            : mainQuestionList.value,
+        disabled: isEdit || model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
       },
     },
+
     model.role !== 'CHIEF'
       ? {
           label: '小组',
@@ -140,9 +164,12 @@ const items = computed<EpFormItem[]>(() => {
           prop: 'markingGroupNumber',
           slot: {
             placeholder: '用户所在小组',
-            options: groupList.value,
+            options:
+              model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
+                ? [{ label: '全部', value: '全部' }, ...groupList.value]
+                : groupList.value,
             onChange: changeModelValue('group'),
-            disabled: isEdit,
+            disabled: isEdit || model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
           },
         }
       : null,
@@ -207,13 +234,20 @@ const { fetch, loading } = useFetch('saveUserInfo')
 async function onSubmit() {
   try {
     await unref(elFormRef)?.validate()
-    await fetch(model)
-    unref(elFormRef)?.resetFields()
+    let data: any = {}
+    for (let k in model) {
+      if (model[k] !== '全部') {
+        data[k] = model[k]
+      }
+    }
+    await fetch(data)
+    // unref(elFormRef)?.resetFields()   //移到下面去了
     ElMessage.success({
       message: `${isEdit ? '修改' : '创建'}用户成功`,
       duration: 1000,
     })
     back()
+    // unref(elFormRef)?.resetFields()
   } catch (error) {
     console.error(error)
   }

+ 46 - 3
src/modules/admin-user/manage/index.vue

@@ -59,6 +59,17 @@
           </el-popconfirm>
           <el-button v-else size="small" type="primary" @click="checkSelected('disabled')">禁用</el-button>
           <el-button size="small" custom-1 @click="onExportUsers">导出</el-button>
+          <el-upload
+            ref="upload"
+            v-model:file-list="fileList"
+            :limit="1"
+            :show-file-list="false"
+            :on-exceed="onExceed"
+            :auto-upload="false"
+          >
+            <el-button size="small" custom-1 class="m-l-base" :loading="importUsersLoading">导入姓名</el-button>
+          </el-upload>
+          <el-link class="m-l-base" type="primary" @click="downTpl">导入姓名模板下载</el-link>
         </div>
         <base-table
           ref="tableRef"
@@ -123,8 +134,18 @@
 
 <script setup lang="ts" name="UserManage">
 /** 用户管理 */
-import { ref } from 'vue'
-import { ElButton, ElPopconfirm, ElCard, ElIcon, ElPagination, ElMessage, ElInput } from 'element-plus'
+import { ref, reactive, watch } from 'vue'
+import {
+  ElButton,
+  ElPopconfirm,
+  ElCard,
+  ElIcon,
+  ElPagination,
+  ElMessage,
+  ElInput,
+  ElLink,
+  ElUpload,
+} from 'element-plus'
 import { ArrowRight } from '@element-plus/icons-vue'
 import { useRouter } from 'vue-router'
 import BaseDialog from '@/components/element/BaseDialog.vue'
@@ -134,12 +155,28 @@ import ConfirmButton from '@/components/common/ConfirmButton.vue'
 import useFetch from '@/hooks/useFetch'
 import useUserManageFilter from './hooks/useUserManageFilter'
 import useUserManageTable from './hooks/useUserManageTable'
+import useUploadFile from '@/hooks/useUploadFile'
+
 import useVW from '@/hooks/useVW'
 
 import type { ExtractMultipleApiResponse } from '@/api/api'
 const newPwd = ref('')
 const { push } = useRouter()
-
+const { fileList, upload, percentage, setPercentage, onExceed } = useUploadFile()
+const { fetch: importUsersFile, loading: importUsersLoading } = useFetch('importUsersFile')
+const importUsersModel = reactive<any>({
+  file: void 0,
+})
+watch(
+  fileList,
+  () => {
+    importUsersModel.file = fileList.value?.[0]?.raw
+    importUsersFile(importUsersModel).then(() => {
+      ElMessage.success('导入用户成功')
+    })
+  },
+  { deep: true }
+)
 const { formRef, model, items: formItems, rows, expand, toggleExpand } = useUserManageFilter()
 
 const {
@@ -227,6 +264,12 @@ function onExportUsers() {
   useFetch('exportUser').fetch(model)
 }
 
+function onImportUsers() {
+  alert(1)
+}
+function downTpl() {
+  useFetch('importUsersTemplate', 'get').fetch()
+}
 /** table column 修改用户 */
 function onEditUser(row: ExtractMultipleApiResponse<'getUserList'>) {
   push({ name: 'EditUser', params: { id: row.id } })

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

@@ -15,14 +15,14 @@ const useFormFilter = () => {
   const { formRef, elFormRef, defineColumn, _ } = useForm()
 
   const model = reactive<
-    Omit<ExtractApiParams<'getGroupMonitor'>, 'markingGroupNumbers'> & { markingGroupNumbers?: number }
+    Omit<ExtractApiParams<'getGroupMonitor'>, 'markingGroupNumbers'> & { markingGroupNumbers?: number | string }
   >({
     subjectCode: dataModel.subject || '',
     markingGroupNumbers: dataModel.group,
     questionMainNumber: dataModel.question,
   })
 
-  const formModel = computed<ExtractApiParams<'getGroupMonitor'>>(() => {
+  const formModel = computed<any>(() => {
     return {
       subjectCode: model.subjectCode,
       markingGroupNumbers:

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

@@ -84,7 +84,7 @@ const { subjectList, mainQuestionList, groupListWithAll, dataModel, changeModelV
 const model = reactive<
   Omit<ExtractApiParams<'getStatistics'>, 'markingGroupNumbers'> & {
     refresh: number
-    markingGroupNumbers?: number
+    markingGroupNumbers?: number | string
   }
 >({
   subjectCode: dataModel.subject || '',
@@ -100,7 +100,7 @@ const modelToFetchModel = () => {
   })
 }
 
-const fetchModel = reactive<ExtractApiParams<'getStatistics'> & { refresh: number }>(modelToFetchModel())
+const fetchModel = reactive<any & { refresh: number }>(modelToFetchModel())
 
 watch(fetchModel, () => {
   localStorage.set('MONITORING_REFRESH_RATE', fetchModel.refresh)

+ 3 - 2
src/modules/analysis/personnel-statistics/hooks/useStatisticsFilter.ts

@@ -16,7 +16,7 @@ type FormMode = Omit<
   time: string[]
   hasJudge: string[]
   expand: string[]
-  markingGroupNumbers?: number
+  markingGroupNumbers?: number | string
 }
 
 const useStatisticsFilter = () => {
@@ -50,7 +50,8 @@ const useStatisticsFilter = () => {
       immediate: true,
     }
   )
-  const fetchModel = computed<ExtractApiParams<'getStatisticsByGroup'> & { expand: boolean }>(() => {
+  // const fetchModel = computed<ExtractApiParams<'getStatisticsByGroup'> & { expand: boolean }>(() => {
+  const fetchModel = computed<any>(() => {
     return Object.assign(omit(model, 'time'), {
       startTime: model.time?.[0],
       endTime: model.time?.[1],

+ 1 - 1
src/modules/analysis/personnel-statistics/index.vue

@@ -130,7 +130,7 @@ const data = computed<ExtractApiResponse<'getStatisticsByGroup'>>(() => {
         }, [] as ExtractApiResponse<'getStatisticsByGroup'>)
         .sort((a, b) => a.markerId - b.markerId)
         .concat(totalIndex >= 0 ? groupList[totalIndex] : [])
-    : groupList.sort((a, b) => a.markingGroupNumber - b.markingGroupNumber)
+    : groupList.sort((a, b) => (a.markingGroupNumber as number) - (b.markingGroupNumber as number))
 })
 
 /** 刷新按钮 */

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

@@ -63,7 +63,7 @@ const { subjectList, mainQuestionList, groupListWithAll, dataModel, changeModelV
 const model = reactive<
   Omit<ExtractApiParams<'getStatistics'>, 'markingGroupNumbers'> & {
     time: string[] | null
-    markingGroupNumbers?: number
+    markingGroupNumbers?: number | string
   }
 >({
   subjectCode: dataModel.subject || '',
@@ -72,7 +72,7 @@ const model = reactive<
   time: null,
 })
 
-const fetchModel = computed<ExtractApiParams<'getStatistics'>>(() => {
+const fetchModel = computed<any>(() => {
   return Object.assign(omit(model, 'time'), {
     startTime: model.time?.[0],
     endTime: model.time?.[1],

+ 1 - 1
types/app.d.ts

@@ -1,5 +1,5 @@
 /** 用户角色 */
-type ROLE = 'ADMIN' | 'CHIEF' | 'DEPUTY' | 'MARKER'
+type ROLE = 'ADMIN' | 'CHIEF' | 'DEPUTY' | 'MARKER' | 'EXPERT' | 'SECTION_LEADER'
 
 /** 评卷员状态 */
 type STAGE = 'FORMAL' | 'SAMPLE_A' | 'SAMPLE_B' | 'FORCE'