index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <template>
  2. <div class="p-base full">
  3. <div class="flex direction-column fill-blank full radius-base p-base">
  4. <base-form
  5. ref="formRef"
  6. size="small"
  7. :model="taskSettingModel"
  8. :items="items"
  9. :rules="rules"
  10. :label-width="useVW(88)"
  11. >
  12. <template #form-item-un-mark>
  13. <span class="un-mark-count">{{ unMarkTasks?.unmarkCount }}</span>
  14. </template>
  15. <template #form-item-confirm>
  16. <el-button type="primary" @click="onSubmit">{{ isGroupSetting ? '确认追加' : '确定' }}</el-button>
  17. </template>
  18. </base-form>
  19. <div class="flex-1 overflow-hidden m-t-base">
  20. <component
  21. :is="TableComponent"
  22. v-bind="taskSettingModel"
  23. :key="refresh"
  24. @user-list="onUserListChange"
  25. ></component>
  26. </div>
  27. </div>
  28. </div>
  29. </template>
  30. <script setup lang="ts" name="DataTaskSetting">
  31. /** 任务设置 */
  32. import { ref, reactive, computed, watch } from 'vue'
  33. import { ElButton, ElMessage } from 'element-plus'
  34. import useFetch from '@/hooks/useFetch'
  35. import useOptions from '@/hooks/useOptions'
  36. import useForm from '@/hooks/useForm'
  37. import useVW from '@/hooks/useVW'
  38. import BaseForm from '@/components/element/BaseForm.vue'
  39. import GroupSetting from './components/GroupSetting.vue'
  40. import MarkerSetting from './components/MarkerSetting.vue'
  41. import type { ExtractApiParams, ExtractMultipleApiResponse } from 'api-type'
  42. import type { EpFormRules, EpFormItem } from 'global-type'
  43. type FormParams = ExtractApiParams<'markerSetCount'> &
  44. ExtractApiParams<'markGroupUpdateCount'> & { settingType: 'group' | 'marker' }
  45. const refresh = ref<number>(0)
  46. const { formRef, elFormRef, defineColumn, _ } = useForm()
  47. const taskSettingModel = reactive<FormParams>({
  48. subjectCode: '',
  49. mainNumber: void 0,
  50. markingGroupNumber: void 0,
  51. markCount: void 0,
  52. markDayCount: void 0,
  53. markTotalCount: void 0,
  54. userId: [],
  55. settingType: 'group',
  56. })
  57. const isGroupSetting = computed(() => taskSettingModel.settingType === 'group')
  58. const TableComponent = computed(() => {
  59. return isGroupSetting.value ? GroupSetting : MarkerSetting
  60. })
  61. const { fetch: getUnMarkTasks, result: unMarkTasks } = useFetch('getUnMarkTasks')
  62. watch(
  63. () => taskSettingModel.settingType,
  64. () => {
  65. setTimeout(() => {
  66. elFormRef?.value?.clearValidate()
  67. })
  68. }
  69. )
  70. watch(
  71. () => taskSettingModel.markingGroupNumber,
  72. () => {
  73. if (taskSettingModel.markingGroupNumber) {
  74. getUnMarkTasks({
  75. subjectCode: taskSettingModel.subjectCode,
  76. mainNumber: taskSettingModel.mainNumber,
  77. markingGroupNumber: taskSettingModel.markingGroupNumber,
  78. })
  79. }
  80. }
  81. )
  82. const { subjectList, mainQuestionList, groupList, changeModelValue, dataModel } = useOptions([
  83. 'subject',
  84. 'question',
  85. 'group',
  86. ])
  87. watch(dataModel, () => {
  88. taskSettingModel.subjectCode = dataModel.subject
  89. taskSettingModel.mainNumber = dataModel.question
  90. taskSettingModel.markingGroupNumber = dataModel.group
  91. })
  92. const Span5 = defineColumn(_, '', { span: 5 })
  93. const items = computed<EpFormItem[]>(() => [
  94. Span5({
  95. rowKey: 'row-1',
  96. label: '科目',
  97. prop: 'subjectCode',
  98. slotType: 'select',
  99. slot: { options: subjectList.value, onChange: changeModelValue('subject') },
  100. }),
  101. Span5({
  102. rowKey: 'row-1',
  103. label: '大题',
  104. prop: 'mainNumber',
  105. slotType: 'select',
  106. slot: { options: mainQuestionList.value, onChange: changeModelValue('question') },
  107. }),
  108. Span5({
  109. rowKey: 'row-2',
  110. label: '任务设置对像',
  111. prop: 'settingType',
  112. slotType: 'select',
  113. slot: {
  114. options: [
  115. { label: '按小组追加', value: 'group' },
  116. { label: '按评卷员设置', value: 'marker' },
  117. ],
  118. },
  119. }),
  120. Span5({
  121. rowKey: 'row-2',
  122. label: '小组',
  123. prop: 'markingGroupNumber',
  124. slotType: 'select',
  125. hidden: !isGroupSetting.value,
  126. slot: {
  127. options: groupList.value,
  128. onChange: changeModelValue('group'),
  129. },
  130. }),
  131. Span5({
  132. rowKey: 'row-2',
  133. label: '任务余量',
  134. slotName: 'un-mark',
  135. hidden: !isGroupSetting.value || !unMarkTasks?.value?.unmarkCount,
  136. }),
  137. Span5({
  138. rowKey: 'row-3',
  139. label: '任务数设置',
  140. prop: 'markTotalCount',
  141. slotType: 'input',
  142. hidden: isGroupSetting.value,
  143. }),
  144. Span5({
  145. rowKey: 'row-3',
  146. label: '每日任务量',
  147. prop: 'markDayCount',
  148. slotType: 'input',
  149. hidden: isGroupSetting.value,
  150. }),
  151. Span5({ rowKey: 'row-3', label: '统一追加量', prop: 'markCount', slotType: 'input', hidden: !isGroupSetting.value }),
  152. Span5({ rowKey: 'row-3', slotName: 'confirm' }),
  153. ])
  154. const rules = computed<EpFormRules>(() => {
  155. const obj: EpFormRules = {
  156. subjectCode: [{ required: true, message: '请选择科目' }],
  157. mainNumber: [{ required: true, message: '请选择大题' }],
  158. }
  159. if (isGroupSetting.value) {
  160. obj['markingGroupNumber'] = [{ required: true, message: '请选择小组' }]
  161. obj['markCount'] = [{ required: true, message: '请设置统一追加量' }]
  162. } else {
  163. obj['markTotalCount'] = [{ required: true, message: '请设置任务数' }]
  164. obj['markDayCount'] = [{ required: true, message: '请设置每日任务量' }]
  165. }
  166. return obj
  167. })
  168. const userList = ref<ExtractMultipleApiResponse<'getUserList'>[]>([])
  169. const userIds = computed(() => {
  170. return userList.value?.map((u) => u.id) || []
  171. })
  172. const onUserListChange = (list: ExtractMultipleApiResponse<'getUserList'>[]) => {
  173. userList.value = list || []
  174. }
  175. /** 按评卷员设置 */
  176. const onMarkerSetCount = async () => {
  177. try {
  178. taskSettingModel.userId = userIds.value
  179. await useFetch('markerSetCount').fetch(taskSettingModel)
  180. } catch (error) {
  181. console.error(error)
  182. }
  183. }
  184. /** 按小组追加 */
  185. const onMarkGroupUpdateCount = async () => {
  186. try {
  187. await useFetch('markGroupUpdateCount').fetch(taskSettingModel)
  188. } catch (error) {
  189. console.error(error)
  190. }
  191. }
  192. const onSubmit = async () => {
  193. try {
  194. const valid = await elFormRef?.value?.validate()
  195. if (valid) {
  196. await (isGroupSetting.value ? onMarkGroupUpdateCount() : onMarkerSetCount())
  197. }
  198. ElMessage.success('设置成功')
  199. Object.assign(taskSettingModel, { markCount: void 0, markDayCount: void 0, markTotalCount: void 0, userId: [] })
  200. setTimeout(() => {
  201. elFormRef?.value?.clearValidate()
  202. refresh.value++
  203. })
  204. } catch (error) {
  205. console.error(error)
  206. }
  207. }
  208. </script>
  209. <style scoped lang="scss">
  210. .un-mark-count {
  211. color: $DangerColor;
  212. font-size: $MediumFont;
  213. }
  214. </style>