index.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <div class="p-base bulk-add-user-view">
  3. <el-card shadow="never" class="form-card">
  4. <base-form ref="formRef" :label-width="'130px'" :groups="groups" :model="model" :items="items" :rules="rules">
  5. <template #form-item-examName>
  6. <el-input :value="mainStore.myUserInfo?.examName" disabled />
  7. </template>
  8. <el-form-item class="m-t-base form-footer">
  9. <confirm-button :loading="loading" @confirm="onSubmit" @cancel="cancel"></confirm-button>
  10. </el-form-item>
  11. </base-form>
  12. </el-card>
  13. </div>
  14. </template>
  15. <script setup lang="ts" name="BulkAddUser">
  16. /** 批量新增用户 */
  17. import { reactive, watch, nextTick, unref, computed, ref } from 'vue'
  18. import { useRouter } from 'vue-router'
  19. import { ElCard, ElFormItem, ElMessage, ElInput } from 'element-plus'
  20. import BaseForm from '@/components/element/BaseForm.vue'
  21. import ConfirmButton from '@/components/common/ConfirmButton.vue'
  22. import useFetch from '@/hooks/useFetch'
  23. import useForm from '@/hooks/useForm'
  24. import useVW from '@/hooks/useVW'
  25. import useOptions from '@/hooks/useOptions'
  26. import useMainStore from '@/store/main'
  27. import { StatusMap } from '@/constants/dicts'
  28. import type { ExtractApiParams } from '@/api/api'
  29. import type { EpFormItem, EpFormRules, FormGroup } from 'global-type'
  30. const ROLE_OPTION = ref<any[]>([])
  31. useFetch('getRoleList')
  32. .fetch()
  33. .then((res: any) => {
  34. ROLE_OPTION.value = res.map((item: any) => {
  35. return {
  36. value: item.code,
  37. label: item.roleName,
  38. }
  39. })
  40. })
  41. const { back } = useRouter()
  42. const mainStore = useMainStore()
  43. const { subjectList, mainQuestionList, groupList, dataModel, changeModelValue } = useOptions([
  44. 'subject',
  45. 'question',
  46. 'group',
  47. ])
  48. const initModel: ExtractApiParams<'bulkSaveUser'> = {
  49. subjectCode: dataModel.subject || '',
  50. mainNumber: dataModel.question,
  51. markingGroupNumber: dataModel.group,
  52. enable: true,
  53. loginNameLength: 3,
  54. markingGroupAccounts: void 0,
  55. password: '',
  56. prefix: '',
  57. role: 'MARKER',
  58. start: 1,
  59. employer: '',
  60. }
  61. const model = reactive<any>(initModel)
  62. const { formRef, elFormRef, defineColumn, _ } = useForm()
  63. const rules = computed<EpFormRules>(() => {
  64. return {
  65. subjectCode: [{ required: true, message: '请选择科目' }],
  66. mainNumber: [{ required: true, message: '请选择大题' }],
  67. markingGroupNumber: model.role !== 'CHIEF' ? [{ required: true, message: '请选择小组' }] : [],
  68. role: [{ required: true, message: '请选择用户角色' }],
  69. loginNameLength: [
  70. { required: true, message: '请填写账号代码位数' },
  71. { type: 'number', min: 0, max: 9, message: '账号代码位数限制0-9之间' },
  72. ],
  73. password: [
  74. { required: true, message: '请填写用户密码' },
  75. { pattern: /[0-9a-zA-Z~!@#¥%&\*]/, message: '密码限制"数字、字母、~!@#¥%&\*"' },
  76. ],
  77. enable: [{ required: true, message: '请选择用户状态' }],
  78. stage: model.role === 'MARKER' ? [{ required: true, message: '请选择评卷阶段' }] : [],
  79. markingGroupAccounts: [
  80. { required: true, message: '请填写分组账号数量' },
  81. { type: 'number', min: 0, max: 999999, message: '分组账号数量限制0-999999之间' },
  82. ],
  83. prefix: [
  84. { required: true, message: '请填写账号前缀' },
  85. { type: 'string', max: 50, message: '账号前缀限制50字以内' },
  86. { pattern: /[0-9a-zA-Z]/, message: '账号前缀限制"数字、字母"' },
  87. ],
  88. start: [
  89. { required: true, message: '请填写账号起始数' },
  90. { type: 'number', min: 0, max: 999999, message: '账号起始数限制0-999999之间' },
  91. ],
  92. }
  93. })
  94. watch(dataModel, () => {
  95. if (model.role !== 'EXPERT' && model.role !== 'SECTION_LEADER') {
  96. model.subjectCode = dataModel.subject || ''
  97. model.mainNumber = dataModel.question
  98. model.markingGroupNumber = dataModel.group
  99. }
  100. })
  101. watch(
  102. () => model.role,
  103. () => {
  104. if (model.role === 'EXPERT') {
  105. model.subjectCode = '全部'
  106. model.mainNumber = '全部'
  107. model.markingGroupNumber = '全部'
  108. } else if (model.role === 'SECTION_LEADER') {
  109. model.subjectCode = ''
  110. model.mainNumber = '全部'
  111. model.markingGroupNumber = '全部'
  112. } else {
  113. model.subjectCode = ''
  114. model.mainNumber = void 0
  115. model.markingGroupNumber = void 0
  116. }
  117. }
  118. )
  119. const groups: FormGroup[] = [
  120. {
  121. rowKeys: ['row-1', 'row-2', 'row-3', 'row-4', 'row-5'],
  122. },
  123. {
  124. groupTitle: '批量新增设置',
  125. rowKeys: ['row-6', 'row-7', 'row-8', 'row-9', 'row-10'],
  126. },
  127. ]
  128. const span7 = defineColumn(_, '', { span: 7 })
  129. const items = computed<EpFormItem[]>(() => {
  130. return [
  131. {
  132. label: '考试批次',
  133. slotName: 'examName',
  134. // slotType: 'input',
  135. // slot: {
  136. // disabled: true,
  137. // value: mainStore.myUserInfo?.examName,
  138. // },
  139. colProp: {
  140. span: 6,
  141. },
  142. },
  143. span7({
  144. label: '用户角色',
  145. slotType: 'select',
  146. prop: 'role',
  147. slot: {
  148. options: ROLE_OPTION.value,
  149. placeholder: '设置用户角色',
  150. },
  151. }),
  152. span7({
  153. label: '科目',
  154. slotType: 'select',
  155. prop: 'subjectCode',
  156. slot: {
  157. placeholder: '请选择科目',
  158. onChange: changeModelValue('subject'),
  159. options: model.role === 'EXPERT' ? [{ value: '全部', label: '全部' }, ...subjectList.value] : subjectList.value,
  160. disabled: model.role === 'EXPERT',
  161. },
  162. }),
  163. span7({
  164. label: '大题',
  165. slotType: 'select',
  166. prop: 'mainNumber',
  167. slot: {
  168. placeholder: '大题号-大题名称',
  169. onChange: changeModelValue('question'),
  170. // options: mainQuestionList.value,
  171. options:
  172. model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
  173. ? [{ label: '全部', value: '全部' }, ...mainQuestionList.value]
  174. : mainQuestionList.value,
  175. disabled: model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
  176. },
  177. }),
  178. model.role !== 'CHIEF'
  179. ? span7({
  180. label: '小组',
  181. slotType: 'select',
  182. prop: 'markingGroupNumber',
  183. slot: {
  184. placeholder: '用户所在小组',
  185. // options: groupList.value,
  186. onChange: changeModelValue('group'),
  187. options:
  188. model.role === 'EXPERT' || model.role === 'SECTION_LEADER'
  189. ? [{ label: '全部', value: '全部' }, ...groupList.value]
  190. : groupList.value,
  191. disabled: model.role === 'EXPERT' || model.role === 'SECTION_LEADER',
  192. },
  193. })
  194. : null,
  195. span7({
  196. rowKey: 'row-6',
  197. label: '自定义前缀',
  198. slotType: 'input',
  199. prop: 'prefix',
  200. slot: {
  201. placeholder: '自定义账号前缀',
  202. },
  203. }),
  204. span7({
  205. rowKey: 'row-6',
  206. label: '账号代码位数',
  207. slotType: 'inputNumber',
  208. prop: 'loginNameLength',
  209. slot: {
  210. placeholder: '账号代码位数',
  211. step: 1,
  212. stepStrictly: true,
  213. },
  214. }),
  215. span7({
  216. rowKey: 'row-7',
  217. label: '起始数',
  218. slotType: 'inputNumber',
  219. prop: 'start',
  220. slot: {
  221. placeholder: '起始数',
  222. step: 1,
  223. stepStrictly: true,
  224. },
  225. }),
  226. span7({
  227. rowKey: 'row-7',
  228. label: '账号数量',
  229. slotType: 'inputNumber',
  230. prop: 'markingGroupAccounts',
  231. slot: {
  232. placeholder: '账号数量',
  233. step: 1,
  234. stepStrictly: true,
  235. },
  236. }),
  237. span7({
  238. rowKey: 'row-8',
  239. label: '用户密码',
  240. slotType: 'input',
  241. prop: 'password',
  242. slot: {
  243. showPassword: true,
  244. placeholder: '设置用户密码',
  245. },
  246. }),
  247. model.role === 'MARKER'
  248. ? span7({
  249. rowKey: 'row-8',
  250. label: '阶段',
  251. slotType: 'select',
  252. prop: 'stage',
  253. slot: {
  254. placeholder: '选择阶段',
  255. options: [
  256. { label: 'SAMPLE_A', value: 'SAMPLE_A' },
  257. { label: 'SAMPLE_B', value: 'SAMPLE_B' },
  258. // { label: '强制考核卷', value: 'FORCE' },
  259. { label: '正评', value: 'FORMAL' },
  260. ],
  261. },
  262. })
  263. : null,
  264. span7({
  265. rowKey: 'row-9',
  266. label: '状态',
  267. slotType: 'select',
  268. prop: 'enable',
  269. slot: {
  270. options: StatusMap,
  271. placeholder: '设置用户角色',
  272. },
  273. }),
  274. span7({
  275. rowKey: 'row-9',
  276. label: '单位',
  277. slotType: 'input',
  278. prop: 'employer',
  279. slot: {
  280. maxlength: 100,
  281. placeholder: '设置用户单位',
  282. },
  283. }),
  284. ].filter(Boolean) as EpFormItem[]
  285. })
  286. const { fetch, loading } = useFetch('bulkSaveUser')
  287. /** 确定提交 */
  288. async function onSubmit() {
  289. try {
  290. await unref(elFormRef)?.validate()
  291. let data: any = {}
  292. for (let k in model) {
  293. if (model[k] !== '全部') {
  294. data[k] = model[k]
  295. }
  296. }
  297. await fetch(data)
  298. // unref(elFormRef)?.resetFields()
  299. ElMessage.success({
  300. message: `创建用户成功`,
  301. duration: 1000,
  302. })
  303. back()
  304. } catch (error) {
  305. console.error(error)
  306. }
  307. }
  308. /** 取消 */
  309. function cancel() {
  310. back()
  311. }
  312. </script>
  313. <style scoped lang="scss"></style>