Răsfoiți Sursa

feat: 任务设置

chenhao 2 ani în urmă
părinte
comite
a042f53501

+ 8 - 0
src/api/system.ts

@@ -38,6 +38,14 @@ const SystemApi: DefineApiModule<System.ApiMap> = {
     url: '/api/student/export',
     download: true,
   },
+  /** 任务设置 - 按评卷员设置 */
+  markerSetCount: '/api/user/marker/add/count',
+  /** 任务设置 - 按小组追加 */
+  markGroupUpdateCount: '/api/user/marker/update/count',
+  /** 任务设置-获取任务计划 */
+  getTaskDetail: '/api/mark/task/count/datail',
+  /** 任务设置-获取剩余任务 */
+  getUnMarkTasks: '/api/mark/task/count/unmark',
 }
 
 export default SystemApi

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

@@ -1,10 +1,35 @@
 <template>
-  <div class=""></div>
+  <base-table size="small" :columns="columns" :data="taskDetail"></base-table>
 </template>
 
 <script setup lang="ts" name="GroupSetting">
 /** 任务设置 - 按小组设置 */
-import { reactive, ref } from 'vue'
+import { watch } from 'vue'
+import useFetch from '@/hooks/useFetch'
+import BaseTable from '@/components/element/BaseTable.vue'
+
+import type { EpTableColumn } from 'global-type'
+
+const props = defineProps<{
+  mainNumber?: number
+  markingGroupNumber?: number
+  subjectCode?: string
+  statusSet: Array<'WAITING' | 'MARKED' | 'PROBLEM' | 'ARBITRATION'>
+}>()
+
+const { fetch: getTaskDetail, result: taskDetail } = useFetch('getTaskDetail')
+
+const columns: EpTableColumn[] = [
+  { label: '小组', prop: 'markingGroupNumber' },
+  { label: '计划量', prop: 'markCount' },
+  { label: '已完成量', prop: 'finishCount' },
+]
+
+watch(props, () => {
+  if (props.mainNumber && props.markingGroupNumber && props.subjectCode) {
+    getTaskDetail({ ...props, statusSet: [] })
+  }
+})
 </script>
 
 <style scoped lang="scss"></style>

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

@@ -1,10 +1,23 @@
 <template>
-  <div class=""></div>
+  <base-table size="small" :columns="columns" :data="userList?.result"></base-table>
 </template>
 
 <script setup lang="ts" name="MarkerSetting">
 /** 任务设置 - 按评卷员设置 */
-import { reactive, ref } from 'vue'
+import useFetch from '@/hooks/useFetch'
+import BaseTable from '@/components/element/BaseTable.vue'
+
+import type { EpTableColumn } from 'global-type'
+
+const { fetch: getUserList, result: userList } = useFetch('getUserList')
+
+const columns: EpTableColumn[] = [
+  { label: '评卷员代码', prop: 'loginName' },
+  { label: '任务量', prop: 'markTotalCount' },
+  { label: '每日任务量', prop: 'markDayCount' },
+]
+
+getUserList({ pageNumber: 1, pageSize: 9999, role: 'MARKER' })
 </script>
 
 <style scoped lang="scss"></style>

+ 206 - 3
src/modules/admin-data/task-setting/index.vue

@@ -1,12 +1,215 @@
 <template>
-  <div class="">任务设置</div>
+  <div class="p-base full">
+    <div class="fill-blank full radius-base p-base">
+      <base-form
+        ref="formRef"
+        size="small"
+        :model="taskSettingModel"
+        :items="items"
+        :rules="rules"
+        :label-width="useVW(88)"
+      >
+        <template #form-item-un-mark>
+          <span class="un-mark-count">{{ unMarkTasks?.unmarkCount }}</span>
+        </template>
+        <template #form-item-confirm>
+          <el-button type="primary" @click="onSubmit">{{ isGroupSetting ? '确认追加' : '确定' }}</el-button>
+        </template>
+      </base-form>
+      <div class="m-t-base">
+        <component :is="TableComponent" v-bind="taskSettingModel"></component>
+      </div>
+    </div>
+  </div>
 </template>
 
 <script setup lang="ts" name="DataTaskSetting">
 /** 任务设置 */
-import { reactive, ref } from 'vue'
+import { reactive, nextTick, computed, watch } from 'vue'
+import { ElButton } from 'element-plus'
+import useFetch from '@/hooks/useFetch'
+import useOptions from '@/hooks/useOptions'
+import useForm from '@/hooks/useForm'
+import useVW from '@/hooks/useVW'
+import BaseForm from '@/components/element/BaseForm.vue'
 import GroupSetting from './components/GroupSetting.vue'
 import MarkerSetting from './components/MarkerSetting.vue'
+
+import type { ExtractApiParams } from 'api-type'
+import type { EpFormRules, EpFormItem } from 'global-type'
+
+type FormParams = ExtractApiParams<'markerSetCount'> &
+  ExtractApiParams<'markGroupUpdateCount'> & { settingType: 'group' | 'marker' }
+
+const { formRef, elFormRef, defineColumn, _ } = useForm()
+
+const taskSettingModel = reactive<FormParams>({
+  subjectCode: '',
+  mainNumber: void 0,
+  markingGroupNumber: void 0,
+  markCount: void 0,
+  markDayCount: void 0,
+  markTotalCount: void 0,
+  userId: [],
+  settingType: 'group',
+})
+
+const isGroupSetting = computed(() => taskSettingModel.settingType === 'group')
+
+const TableComponent = computed(() => {
+  return isGroupSetting.value ? GroupSetting : MarkerSetting
+})
+
+const { fetch: getUnMarkTasks, result: unMarkTasks } = useFetch('getUnMarkTasks')
+
+watch(
+  () => taskSettingModel.settingType,
+  () => {
+    setTimeout(() => {
+      elFormRef?.value?.clearValidate()
+    })
+  }
+)
+
+watch(
+  () => taskSettingModel.markingGroupNumber,
+  () => {
+    if (taskSettingModel.markingGroupNumber) {
+      getUnMarkTasks({
+        subjectCode: taskSettingModel.subjectCode,
+        mainNumber: taskSettingModel.mainNumber,
+        markingGroupNumber: taskSettingModel.markingGroupNumber,
+        statusSet: [],
+      })
+    }
+  }
+)
+
+const { subjectList, mainQuestionList, groupList, changeModelValue, dataModel } = useOptions([
+  'subject',
+  'question',
+  'group',
+])
+
+watch(dataModel, () => {
+  taskSettingModel.subjectCode = dataModel.subject
+  taskSettingModel.mainNumber = dataModel.question
+  taskSettingModel.markingGroupNumber = dataModel.group
+})
+
+const Span5 = defineColumn(_, '', { span: 5 })
+
+const items = computed<EpFormItem[]>(() => [
+  Span5({
+    rowKey: 'row-1',
+    label: '科目',
+    prop: 'subjectCode',
+    slotType: 'select',
+    slot: { options: subjectList.value, onChange: changeModelValue('subject') },
+  }),
+  Span5({
+    rowKey: 'row-1',
+    label: '大题',
+    prop: 'mainNumber',
+    slotType: 'select',
+    slot: { options: mainQuestionList.value, onChange: changeModelValue('question') },
+  }),
+  Span5({
+    rowKey: 'row-2',
+    label: '任务设置对像',
+    prop: 'settingType',
+    slotType: 'select',
+    slot: {
+      options: [
+        { label: '按小组追加', value: 'group' },
+        { label: '按评卷员设置', value: 'marker' },
+      ],
+    },
+  }),
+  Span5({
+    rowKey: 'row-2',
+    label: '小组',
+    prop: 'markingGroupNumber',
+    slotType: 'select',
+    hidden: !isGroupSetting.value,
+    slot: {
+      options: groupList.value,
+      onChange: changeModelValue('group'),
+    },
+  }),
+  Span5({
+    rowKey: 'row-2',
+    label: '任务余量',
+    slotName: 'un-mark',
+    hidden: !isGroupSetting.value || !unMarkTasks?.value?.unmarkCount,
+  }),
+  Span5({
+    rowKey: 'row-3',
+    label: '任务数设置',
+    prop: 'markTotalCount',
+    slotType: 'input',
+    hidden: isGroupSetting.value,
+  }),
+  Span5({
+    rowKey: 'row-3',
+    label: '每日任务量',
+    prop: 'markDayCount',
+    slotType: 'input',
+    hidden: isGroupSetting.value,
+  }),
+  Span5({ rowKey: 'row-3', label: '统一追加量', prop: 'markCount', slotType: 'input', hidden: !isGroupSetting.value }),
+  Span5({ rowKey: 'row-3', slotName: 'confirm' }),
+])
+
+const rules = computed<EpFormRules>(() => {
+  const obj: EpFormRules = {
+    subjectCode: [{ required: true, message: '请选择科目' }],
+    mainNumber: [{ required: true, message: '请选择大题' }],
+  }
+  if (isGroupSetting.value) {
+    obj['markingGroupNumber'] = [{ required: true, message: '请选择小组' }]
+    obj['markCount'] = [{ required: true, message: '请设置统一追加量' }]
+  } else {
+    obj['markTotalCount'] = [{ required: true, message: '请设置任务数' }]
+    obj['markDayCount'] = [{ required: true, message: '请设置每日任务量' }]
+  }
+  return obj
+})
+
+/** 按评卷员设置 */
+const onMarkerSetCount = async () => {
+  try {
+    await useFetch('markerSetCount').fetch(taskSettingModel)
+  } catch (error) {
+    console.error(error)
+  }
+}
+
+/** 按小组追加 */
+
+const onMarkGroupUpdateCount = async () => {
+  try {
+    await useFetch('markGroupUpdateCount').fetch(taskSettingModel)
+  } catch (error) {
+    console.error(error)
+  }
+}
+
+const onSubmit = async () => {
+  try {
+    const valid = await elFormRef?.value?.validate()
+    if (valid) {
+      isGroupSetting.value ? onMarkGroupUpdateCount() : onMarkerSetCount()
+    }
+  } catch (error) {
+    console.error(error)
+  }
+}
 </script>
 
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+.un-mark-count {
+  color: $DangerColor;
+  font-size: $MediumFont;
+}
+</style>

+ 47 - 0
types/api.d.ts

@@ -324,6 +324,45 @@ declare module 'api-type' {
     type GetCetScoreList = BaseDefine<MultipleQuery<{ subjectCode: string }>, MultipleResult<ScoreListItem>>
 
     type ExportCetScoreList = BaseDefine<{ subjectCode: string }, null>
+
+    /** 任务设置 - 按评卷员设置 */
+    type MarkerSetCount = BaseDefine<{ markDayCount?: number; markTotalCount?: number; userId: number[] }>
+
+    /** 任务设置 - 按小组追加 */
+    type MarkGroupUpdateCount = BaseDefine<{
+      markCount?: number
+      markingGroupNumber?: number
+      mainNumber?: number
+      subjectCode?: string
+    }>
+
+    /** 任务设置-获取任务计划 */
+    interface TaskDetail {
+      finishCount: number
+      markCount: number
+      markingGroupNumber: number
+    }
+    type GetTaskDetail = BaseDefine<
+      {
+        mainNumber?: number
+        markingGroupNumber?: number
+        subjectCode?: string
+        statusSet: Array<'WAITING' | 'MARKED' | 'PROBLEM' | 'ARBITRATION'>
+      },
+      TaskDetail[]
+    >
+    /** 任务设置-获取剩余任务 */
+    type GetUnMarkTasks = BaseDefine<
+      {
+        mainNumber?: number
+        markingGroupNumber?: number
+        subjectCode?: string
+        statusSet: Array<'WAITING' | 'MARKED' | 'PROBLEM' | 'ARBITRATION'>
+      },
+      {
+        unmarkCount: 0
+      }
+    >
     export interface ApiMap {
       importMarkingData: ImportMarkingData
       getImportFilePath: GetImportFilePath
@@ -332,6 +371,14 @@ declare module 'api-type' {
       importMarkStandard: ImportMarkStandard
       getCetScoreList: GetCetScoreList
       exportCetScoreList: ExportCetScoreList
+      /** 任务设置 - 按评卷员设置 */
+      markerSetCount: MarkerSetCount
+      /** 任务设置 - 按小组追加 */
+      markGroupUpdateCount: MarkGroupUpdateCount
+      /** 任务设置-获取任务计划 */
+      getTaskDetail: GetTaskDetail
+      /** 任务设置-获取剩余任务 */
+      getUnMarkTasks: GetUnMarkTasks
     }
   }