CreatePrintTask.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <template>
  2. <el-dialog
  3. class="create-print-task"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10px"
  7. width="600px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @opened="visibleChange"
  12. >
  13. <el-form
  14. ref="modalFormComp"
  15. label-width="100px"
  16. :rules="rules"
  17. :model="modalForm"
  18. >
  19. <el-form-item label="印刷计划:">
  20. <span>{{ instance.printPlanName }}</span>
  21. </el-form-item>
  22. <el-form-item label="考试时间:"
  23. >{{ instance.examStartTime | timestampFilter }} 至
  24. {{ instance.examEndTime | timestampFilter }}
  25. </el-form-item>
  26. <el-form-item prop="examRoom" label="考场:">
  27. <el-input
  28. v-model="modalForm.examRoom"
  29. placeholder="请填写考场名称"
  30. clearable
  31. ></el-input>
  32. </el-form-item>
  33. <el-form-item prop="examPlace" label="考点:">
  34. <el-input
  35. v-model="modalForm.examPlace"
  36. placeholder="请填写考点名称"
  37. clearable
  38. ></el-input>
  39. </el-form-item>
  40. <el-form-item label="监考老师:">
  41. <el-input
  42. v-model="modalForm.invigilatorTeacher"
  43. placeholder="请填写监考老师"
  44. clearable
  45. ></el-input>
  46. </el-form-item>
  47. <el-form-item prop="classId" label="考试对象:">
  48. <el-select
  49. v-model="classIds"
  50. placeholder="请选择"
  51. multiple
  52. clearable
  53. @change="classChange"
  54. >
  55. <el-option
  56. v-for="clazz in classList"
  57. :key="clazz.classId"
  58. :value="clazz.classId"
  59. :label="clazz.className"
  60. ></el-option>
  61. </el-select>
  62. </el-form-item>
  63. <el-form-item prop="studentCount" label="人数:">
  64. <el-input-number
  65. v-model="modalForm.studentCount"
  66. :min="0"
  67. :max="10000"
  68. :step="1"
  69. step-strictly
  70. disabled
  71. :controls="false"
  72. ></el-input-number>
  73. </el-form-item>
  74. <el-form-item prop="printHouseId" label="印刷室:">
  75. <el-select
  76. v-model="modalForm.printHouseId"
  77. placeholder="请选择"
  78. @change="printHouseChange"
  79. >
  80. <el-option
  81. v-for="room in printRooms"
  82. :key="room.houseId"
  83. :value="room.houseId"
  84. :label="room.houseName"
  85. ></el-option>
  86. </el-select>
  87. </el-form-item>
  88. </el-form>
  89. <el-form
  90. ref="extendFieldFormComp"
  91. label-width="100px"
  92. :rules="extendFieldRules"
  93. :model="extendFieldModal"
  94. >
  95. <el-form-item
  96. v-for="item in extendFields"
  97. :key="item.code"
  98. :label="`${item.name}:`"
  99. :prop="item.code"
  100. >
  101. <el-input
  102. v-model="extendFieldModal[item.code]"
  103. :placeholder="`请填写${item.name}`"
  104. clearable
  105. ></el-input>
  106. </el-form-item>
  107. </el-form>
  108. <div slot="footer">
  109. <el-button type="primary" :disabled="isSubmit" @click="submit"
  110. >确认</el-button
  111. >
  112. <el-button @click="cancel">取消</el-button>
  113. </div>
  114. </el-dialog>
  115. </template>
  116. <script>
  117. import { calcSum } from "@/plugins/utils";
  118. import {
  119. createTaskPrint,
  120. listTaskPrintHouse,
  121. listTaskPrintClass
  122. } from "../api";
  123. export default {
  124. name: "create-print-task",
  125. props: {
  126. instance: {
  127. type: Object,
  128. default() {
  129. return {};
  130. }
  131. },
  132. extendFields: {
  133. type: Array,
  134. default() {
  135. return [];
  136. }
  137. }
  138. },
  139. computed: {
  140. isEdit() {
  141. return !!this.instance.id;
  142. },
  143. title() {
  144. return (this.isEdit ? "编辑" : "新增") + "印刷任务";
  145. }
  146. },
  147. data() {
  148. return {
  149. modalIsShow: false,
  150. isSubmit: false,
  151. modalForm: {},
  152. tableData: [],
  153. printRooms: [],
  154. teachers: [],
  155. classList: [],
  156. classIds: [],
  157. rules: {
  158. examRoom: [
  159. {
  160. required: true,
  161. message: "请输入考场名称",
  162. trigger: "change"
  163. }
  164. ],
  165. examPlace: [
  166. {
  167. required: true,
  168. message: "请输入考点名称",
  169. trigger: "change"
  170. }
  171. ],
  172. invigilatorTeacher: [
  173. {
  174. required: true,
  175. message: "请选择监考老师",
  176. trigger: "change"
  177. }
  178. ],
  179. classId: [
  180. {
  181. required: true,
  182. message: "请选择考试对象",
  183. trigger: "change"
  184. }
  185. ],
  186. studentCount: [
  187. {
  188. required: true,
  189. message: "请输入人数",
  190. trigger: "change"
  191. }
  192. ],
  193. printHouseId: [
  194. {
  195. required: true,
  196. message: "请选择印刷室",
  197. trigger: "change"
  198. }
  199. ]
  200. },
  201. // extend field
  202. extendFieldModal: {},
  203. extendFieldRules: {}
  204. };
  205. },
  206. created() {
  207. this.getPrintHouses();
  208. this.extendFields.forEach(field => {
  209. this.extendFieldRules[field.code] = [
  210. {
  211. required: true,
  212. message: `请输入${field.name}`,
  213. trigger: "change"
  214. }
  215. ];
  216. });
  217. },
  218. methods: {
  219. async getPrintHouses() {
  220. this.printRooms = await listTaskPrintHouse();
  221. },
  222. async getClazzs() {
  223. const data = await listTaskPrintClass({
  224. printPlanId: this.instance.printPlanId,
  225. courseCode: this.instance.courseCode,
  226. paperNumber: this.instance.paperNumber,
  227. examTaskPrintId: this.instance.id
  228. });
  229. this.classList = data || [];
  230. },
  231. visibleChange() {
  232. this.getClazzs();
  233. this.modalForm = { ...this.instance };
  234. this.classIds = this.modalForm.classId
  235. ? this.modalForm.classId.split(",")
  236. : [];
  237. const extendVals = this.instance.extends;
  238. let extendFieldModal = {};
  239. this.extendFields.forEach(field => {
  240. extendFieldModal[field.code] = extendVals ? extendVals[field.code] : "";
  241. });
  242. this.extendFieldModal = extendFieldModal;
  243. this.$nextTick(() => {
  244. this.$refs.modalFormComp.clearValidate();
  245. this.$refs.extendFieldFormComp.clearValidate();
  246. });
  247. },
  248. cancel() {
  249. this.modalIsShow = false;
  250. },
  251. open() {
  252. this.modalIsShow = true;
  253. },
  254. classChange(vals) {
  255. const classes = this.classList.filter(item =>
  256. vals.includes(item.classId)
  257. );
  258. this.modalForm.className = classes.map(item => item.className).join(",");
  259. this.modalForm.classId = this.classIds.join(",");
  260. this.modalForm.studentCount = calcSum(
  261. classes.map(item => item.studentCount)
  262. );
  263. },
  264. printHouseChange(val) {
  265. const curHouse = this.printRooms.find(item => item.houseId === val);
  266. if (curHouse) {
  267. this.modalForm.printHouseName = curHouse.houseName;
  268. }
  269. },
  270. async submit() {
  271. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  272. if (!valid) return;
  273. const extendValid = await this.$refs.extendFieldFormComp
  274. .validate()
  275. .catch(() => {});
  276. if (!extendValid) return;
  277. if (this.isSubmit) return;
  278. this.isSubmit = true;
  279. let datas = { ...this.modalForm };
  280. const extendFields = this.extendFields.map(field => {
  281. let info = { ...field };
  282. info.value = this.extendFieldModal[field.code];
  283. return info;
  284. });
  285. datas.extendFields = JSON.stringify(extendFields);
  286. const data = await createTaskPrint(datas).catch(() => {});
  287. this.isSubmit = false;
  288. if (!data) return;
  289. this.$emit("modified", this.modalForm);
  290. this.cancel();
  291. }
  292. }
  293. };
  294. </script>