index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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="'120px'"
  11. >
  12. <template #form-item-un-mark>
  13. <span class="un-mark-count">{{ unMarkTasks?.unmarkCount ?? 0 }}</span>
  14. </template>
  15. <template #form-item-chooseMarkers>
  16. <choose-markers
  17. v-if="!isGroupSetting"
  18. :subject-code="taskSettingModel.subjectCode"
  19. :main-number="taskSettingModel.mainNumber"
  20. @user-list="onUserListChange"
  21. ></choose-markers>
  22. </template>
  23. <template #form-item-confirm>
  24. <el-button :loading="loading" type="primary" @click="onSubmit">{{
  25. isGroupSetting ? '确认追加' : '确定'
  26. }}</el-button>
  27. </template>
  28. </base-form>
  29. <div class="flex-1 overflow-hidden m-t-base">
  30. <!-- <component
  31. :is="TableComponent"
  32. v-bind="taskSettingModel"
  33. :key="refresh"
  34. @user-list="onUserListChange"
  35. ></component> -->
  36. <group-setting v-if="isGroupSetting" v-bind="taskSettingModel" :key="refresh"></group-setting>
  37. <marker-setting
  38. v-else
  39. v-bind="taskSettingModel"
  40. :filter-users="userIds"
  41. @user-list="onUserListChange"
  42. ></marker-setting>
  43. </div>
  44. </div>
  45. </div>
  46. </template>
  47. <script setup lang="ts" name="DataTaskSetting">
  48. /** 任务设置 */
  49. import { ref, reactive, computed, watch, nextTick } from 'vue'
  50. import { ElButton, ElMessage } from 'element-plus'
  51. import useFetch from '@/hooks/useFetch'
  52. import useOptions from '@/hooks/useOptions'
  53. import useForm from '@/hooks/useForm'
  54. import useVW from '@/hooks/useVW'
  55. import BaseForm from '@/components/element/BaseForm.vue'
  56. import GroupSetting from './components/GroupSetting.vue'
  57. import MarkerSetting from './components/MarkerSetting.vue'
  58. import ChooseMarkers from '@/components/common/ChooseMarkers.vue'
  59. import bus from '@/utils/bus'
  60. import { omit } from 'lodash-es'
  61. import type { ExtractApiParams, ExtractMultipleApiResponse } from '@/api/api'
  62. import type { EpFormRules, EpFormItem } from 'global-type'
  63. type FormParams = ExtractApiParams<'markerSetCount'> &
  64. ExtractApiParams<'markGroupUpdateCount'> & { settingType: 'group' | 'marker' }
  65. const refresh = ref<number>(0)
  66. const { subjectList, mainQuestionList, groupList, groupListWithAll, changeModelValue, dataModel } = useOptions(
  67. ['subject', 'question', 'group'],
  68. undefined,
  69. true,
  70. true,
  71. true,
  72. false,
  73. false
  74. )
  75. const { formRef, elFormRef, defineColumn, _ } = useForm()
  76. const taskSettingModel = reactive<FormParams>({
  77. subjectCode: dataModel.subject,
  78. mainNumber: dataModel.question,
  79. markingGroupNumbers: dataModel.group,
  80. markCount: void 0,
  81. markDayCount: void 0,
  82. markTotalCount: void 0,
  83. userId: [],
  84. settingType: 'group',
  85. })
  86. const isGroupSetting = computed(() => taskSettingModel.settingType === 'group')
  87. const TableComponent = computed(() => {
  88. return isGroupSetting.value ? GroupSetting : MarkerSetting
  89. })
  90. const { fetch: getUnMarkTasks, result: unMarkTasks } = useFetch('getUnMarkTasks')
  91. watch(
  92. () => taskSettingModel.settingType,
  93. (val: string) => {
  94. if (val === 'group') {
  95. userList.value = []
  96. }
  97. setTimeout(() => {
  98. elFormRef?.value?.clearValidate()
  99. })
  100. }
  101. )
  102. watch(
  103. () => taskSettingModel.markingGroupNumbers,
  104. () => {
  105. if (taskSettingModel.markingGroupNumbers) {
  106. getUnMarkTasks({
  107. subjectCode: taskSettingModel.subjectCode,
  108. mainNumber: taskSettingModel.mainNumber,
  109. markingGroupNumbers: taskSettingModel.markingGroupNumbers,
  110. })
  111. }
  112. }
  113. )
  114. watch(dataModel, () => {
  115. taskSettingModel.subjectCode = dataModel.subject
  116. taskSettingModel.mainNumber = dataModel.question
  117. taskSettingModel.markingGroupNumbers = dataModel.group
  118. })
  119. const Span7 = defineColumn(_, '', { span: 7 })
  120. const customGroupChange = (v: any) => {
  121. if (groupListWithAll.value.find((item: any) => item.value == undefined)) {
  122. if (taskSettingModel.markingGroupNumbers?.includes(undefined)) {
  123. taskSettingModel.markingGroupNumbers = [void 0]
  124. changeModelValue('group')(taskSettingModel.markingGroupNumbers)
  125. } else {
  126. changeModelValue('group')(v)
  127. }
  128. } else {
  129. changeModelValue('group')(v)
  130. }
  131. }
  132. const transGroupOptions = computed(() => {
  133. // return (taskSettingModel.markingGroupNumbers || []).includes(undefined)
  134. // ? (groupListWithAll.value || []).map((item: any) => {
  135. // item.value != undefined && (item.disabled = true)
  136. // return item
  137. // })
  138. // : groupListWithAll.value.map((item: any) => {
  139. // item.disabled = false
  140. // return item
  141. // })
  142. return groupListWithAll.value || []
  143. })
  144. const items = computed<EpFormItem[]>(() => [
  145. Span7({
  146. rowKey: 'row-1',
  147. label: '科目',
  148. prop: 'subjectCode',
  149. slotType: 'select',
  150. slot: { options: subjectList.value, onChange: changeModelValue('subject') },
  151. }),
  152. Span7({
  153. rowKey: 'row-1',
  154. label: '大题',
  155. prop: 'mainNumber',
  156. slotType: 'select',
  157. slot: { options: mainQuestionList.value, onChange: changeModelValue('question') },
  158. }),
  159. Span7({
  160. rowKey: 'row-2',
  161. label: '任务设置对像',
  162. prop: 'settingType',
  163. slotType: 'select',
  164. slot: {
  165. options: [
  166. { label: '按小组追加', value: 'group' },
  167. { label: '按评卷员设置', value: 'marker' },
  168. ],
  169. },
  170. }),
  171. Span7({
  172. rowKey: 'row-2',
  173. label: '小组',
  174. prop: 'markingGroupNumbers',
  175. slotType: 'select',
  176. hidden: !isGroupSetting.value,
  177. slot: {
  178. // options: groupList.value,
  179. onChange: changeModelValue('group'),
  180. // multiple: true,
  181. options: transGroupOptions.value,
  182. // onChange: customGroupChange,
  183. multiple: true,
  184. },
  185. }),
  186. Span7({
  187. rowKey: 'row-2',
  188. label: '任务余量',
  189. slotName: 'un-mark',
  190. hidden: !isGroupSetting.value,
  191. }),
  192. Span7({
  193. rowKey: 'row-2',
  194. label: '评卷员',
  195. slotName: 'chooseMarkers',
  196. hidden: isGroupSetting.value,
  197. prop: 'userId',
  198. }),
  199. Span7({
  200. rowKey: 'row-3',
  201. label: '任务数设置',
  202. prop: 'markTotalCount',
  203. slotType: 'inputNumber',
  204. slot: {
  205. step: 1,
  206. stepStrictly: true,
  207. },
  208. hidden: isGroupSetting.value,
  209. }),
  210. Span7({
  211. rowKey: 'row-3',
  212. label: '每日任务量',
  213. prop: 'markDayCount',
  214. slotType: 'inputNumber',
  215. slot: {
  216. step: 1,
  217. stepStrictly: true,
  218. },
  219. hidden: isGroupSetting.value,
  220. }),
  221. Span7({
  222. rowKey: 'row-3',
  223. label: '统一追加量',
  224. prop: 'markCount',
  225. slotType: 'inputNumber',
  226. slot: {
  227. step: 1,
  228. stepStrictly: true,
  229. },
  230. hidden: !isGroupSetting.value,
  231. }),
  232. Span7({ rowKey: 'row-3', slotName: 'confirm' }),
  233. ])
  234. const rules = computed<EpFormRules>(() => {
  235. const obj: EpFormRules = {
  236. subjectCode: [{ required: true, message: '请选择科目' }],
  237. mainNumber: [{ required: true, message: '请选择大题' }],
  238. }
  239. if (isGroupSetting.value) {
  240. obj['markingGroupNumbers'] = [
  241. { required: true, message: '请选择小组', trigger: 'blur' },
  242. {
  243. validator: (rule: any, value: any, callback: any) => {
  244. if (!taskSettingModel.markingGroupNumbers?.length) {
  245. callback(new Error('请选择小组'))
  246. } else {
  247. callback()
  248. }
  249. },
  250. trigger: 'blur',
  251. },
  252. ]
  253. obj['markCount'] = [{ required: true, message: '请设置统一追加量' }]
  254. } else {
  255. obj['markTotalCount'] = [
  256. { required: true, message: '请设置任务数' },
  257. { type: 'number', min: 0, max: 999999, message: '任务数限制0-999999之间' },
  258. ]
  259. obj['markDayCount'] = [
  260. { required: true, message: '请设置每日任务量' },
  261. { type: 'number', min: 0, max: 999999, message: '每日任务量限制0-999999之间' },
  262. ]
  263. obj['userId'] = [
  264. { required: true, message: '请选择评卷员', trigger: 'blur' },
  265. {
  266. validator: (rule: any, value: any, callback: any) => {
  267. console.log('taskSettingModel.userId', taskSettingModel.userId)
  268. if (!taskSettingModel.userId?.length) {
  269. callback(new Error('请选择评卷员'))
  270. } else {
  271. callback()
  272. }
  273. },
  274. trigger: 'blur',
  275. },
  276. ]
  277. }
  278. return obj
  279. })
  280. const userList = ref<ExtractMultipleApiResponse<'getUserList'>[]>([])
  281. const userIds = computed(() => {
  282. return userList.value?.map((u) => u.id) || []
  283. })
  284. watch(userIds, () => {
  285. taskSettingModel.userId = [...(userIds.value || [])]
  286. })
  287. const onUserListChange = (list: ExtractMultipleApiResponse<'getUserList'>[]) => {
  288. userList.value = list || []
  289. nextTick(() => {
  290. elFormRef?.value?.validateField('userId')
  291. })
  292. }
  293. const loading = ref<boolean>(false)
  294. /** 按评卷员设置 */
  295. const onMarkerSetCount = async () => {
  296. loading.value = true
  297. try {
  298. taskSettingModel.userId = userIds.value
  299. await useFetch('markerSetCount')
  300. .fetch(omit(taskSettingModel, 'markingGroupNumbers'))
  301. .then(() => {
  302. bus.emit('updateMarkerSetting')
  303. })
  304. } catch (error) {
  305. console.error(error)
  306. } finally {
  307. loading.value = false
  308. }
  309. }
  310. /** 按小组追加 */
  311. const onMarkGroupUpdateCount = async () => {
  312. loading.value = true
  313. try {
  314. await useFetch('markGroupUpdateCount').fetch(taskSettingModel)
  315. } catch (error) {
  316. console.error(error)
  317. } finally {
  318. loading.value = false
  319. }
  320. }
  321. const onSubmit = async () => {
  322. try {
  323. const valid = await elFormRef?.value?.validate()
  324. if (valid) {
  325. await (isGroupSetting.value ? onMarkGroupUpdateCount() : onMarkerSetCount())
  326. }
  327. ElMessage.success('设置成功')
  328. Object.assign(taskSettingModel, { markCount: void 0, markDayCount: void 0, markTotalCount: void 0, userId: [] })
  329. setTimeout(() => {
  330. elFormRef?.value?.clearValidate()
  331. refresh.value++
  332. })
  333. } catch (error) {
  334. console.error(error)
  335. }
  336. }
  337. </script>
  338. <style scoped lang="scss">
  339. .un-mark-count {
  340. color: $DangerColor;
  341. font-size: $MediumFont;
  342. }
  343. </style>