ModifyCardRule.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. <template>
  2. <el-dialog
  3. class="modify-card-rule"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10px"
  7. width="950px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @open="visibleChange"
  12. >
  13. <el-form
  14. ref="modalFormComp"
  15. label-width="130px"
  16. :rules="rules"
  17. :model="modalForm"
  18. >
  19. <el-form-item prop="name" label="题卡规则名称:">
  20. <el-input
  21. v-model.trim="modalForm.name"
  22. placeholder="建议不超过30个字,规则名称不允许重复"
  23. style="width: 100%"
  24. clearable
  25. :disabled="!editable"
  26. ></el-input>
  27. </el-form-item>
  28. <el-form-item prop="remark" label="备注:">
  29. <el-input
  30. v-model="modalForm.remark"
  31. type="textarea"
  32. resize="none"
  33. :rows="2"
  34. :maxlength="50"
  35. :disabled="!editable"
  36. clearable
  37. show-word-limit
  38. placeholder="建议不超过50个字"
  39. ></el-input>
  40. </el-form-item>
  41. <el-form-item
  42. prop="examNumberStyle"
  43. label="考号版式:"
  44. class="inline-block"
  45. >
  46. <el-select
  47. v-model="modalForm.examNumberStyle"
  48. style="width: 142px"
  49. placeholder="请选择"
  50. :disabled="!editable"
  51. @change="numStyleChange"
  52. >
  53. <el-option
  54. v-for="(val, key) in EXAM_NUMBER_STYLE"
  55. :key="key"
  56. :value="key"
  57. :label="val"
  58. ></el-option>
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item
  62. prop="examNumberDigit"
  63. label="考号位数:"
  64. class="inline-block"
  65. >
  66. <el-input-number
  67. v-if="modalForm.examNumberStyle === 'FILL'"
  68. v-model="modalForm.examNumberDigit"
  69. :min="5"
  70. :max="15"
  71. :step="1"
  72. step-strictly
  73. :controls="false"
  74. style="width: 100px"
  75. ></el-input-number>
  76. <span v-else>
  77. {{ modalForm.examNumberDigit }}
  78. </span>
  79. </el-form-item>
  80. <!-- <el-form-item prop="paperType" label="AB卷版式:" class="inline-block">
  81. <el-select
  82. v-model="modalForm.paperType"
  83. style="width: 142px"
  84. placeholder="请选择"
  85. :disabled="!editable"
  86. >
  87. <el-option
  88. v-for="(val, key) in PAPER_TYPE"
  89. :key="key"
  90. :value="key"
  91. :label="val"
  92. ></el-option>
  93. </el-select>
  94. </el-form-item> -->
  95. <el-form-item>
  96. <el-checkbox v-model="modalForm.examAbsent" :disabled="!editable"
  97. >启用“缺考填涂”</el-checkbox
  98. >
  99. <el-checkbox v-model="modalForm.discipline" :disabled="!editable"
  100. >启用“违纪填涂”</el-checkbox
  101. >
  102. <el-checkbox
  103. v-model="modalForm.writeSign"
  104. :disabled="modalForm.examNumberStyle === 'FILL' || !editable"
  105. >启用“手写签名”</el-checkbox
  106. >
  107. </el-form-item>
  108. <div class="part-box part-box-pad part-box-border">
  109. <h4 class="part-box-tips">题卡版头变量印刷字段配置:</h4>
  110. <el-form-item label="必选字段:" label-width="115px" required>
  111. <el-checkbox
  112. v-for="column in modalForm.requiredFields"
  113. :key="column.code"
  114. v-model="column.enable"
  115. disabled
  116. >{{ column.name }}</el-checkbox
  117. >
  118. </el-form-item>
  119. <el-form-item label="扩展字段:" label-width="115px">
  120. <el-checkbox
  121. v-for="column in modalForm.extendFields"
  122. :key="column.code"
  123. v-model="column.enable"
  124. :disabled="!editable"
  125. >{{ column.name }}</el-checkbox
  126. >
  127. </el-form-item>
  128. </div>
  129. <el-form-item prop="titleRule" label="题卡标题规则:">
  130. <!-- <el-input
  131. v-model="modalForm.titleRule"
  132. :disabled="!editable"
  133. ></el-input> -->
  134. <card-title-rule-edit
  135. v-model="modalForm.titleRule"
  136. :disabled="!editable"
  137. :field-sourses="fieldSourses"
  138. v-if="fieldSourses.length"
  139. ref="CardTitleRuleEdit"
  140. ></card-title-rule-edit>
  141. </el-form-item>
  142. <el-form-item prop="attention" label="注意事项:">
  143. <el-input
  144. type="textarea"
  145. :rows="4"
  146. v-model="modalForm.attention"
  147. :disabled="!editable"
  148. ></el-input>
  149. <p class="tips-info">
  150. 提示:换行之后,题卡注意事项会展示为多条内容,内容序号会被自动添加。
  151. </p>
  152. </el-form-item>
  153. <el-form-item prop="objectiveAttention" label="客观题注意事项:">
  154. <el-input
  155. v-model="modalForm.objectiveAttention"
  156. :disabled="!editable"
  157. ></el-input>
  158. </el-form-item>
  159. <el-form-item prop="subjectiveAttention" label="主观题注意事项:">
  160. <el-input
  161. v-model="modalForm.subjectiveAttention"
  162. :disabled="!editable"
  163. ></el-input>
  164. </el-form-item>
  165. </el-form>
  166. <div slot="footer">
  167. <el-button
  168. v-if="editable"
  169. type="primary"
  170. :disabled="isSubmit"
  171. @click="submit"
  172. >确认</el-button
  173. >
  174. <el-button @click="cancel">取消</el-button>
  175. </div>
  176. </el-dialog>
  177. </template>
  178. <script>
  179. import { EXAM_NUMBER_STYLE, PAPER_TYPE } from "@/constants/enumerate";
  180. import { saveCardRule } from "../api";
  181. import CardTitleRuleEdit from "./CardTitleRuleEdit";
  182. const initModalForm = {
  183. id: null,
  184. name: "",
  185. remark: "",
  186. examNumberStyle: "",
  187. examNumberDigit: 10,
  188. paperType: "PRINT",
  189. examAbsent: true,
  190. discipline: true,
  191. writeSign: true,
  192. requiredFields: [],
  193. extendFields: [],
  194. titleRule: "",
  195. attention: "",
  196. objectiveAttention: "",
  197. subjectiveAttention: "",
  198. };
  199. export default {
  200. name: "modify-card-rule",
  201. components: { CardTitleRuleEdit },
  202. props: {
  203. instance: {
  204. type: Object,
  205. default() {
  206. return {};
  207. },
  208. },
  209. editType: {
  210. type: String,
  211. default: "ADD",
  212. validator: (val) => ["ADD", "PREVIEW", "EDIT"].includes(val),
  213. },
  214. },
  215. computed: {
  216. title() {
  217. const names = {
  218. ADD: "新增题卡规则",
  219. PREVIEW: "题卡规则详情",
  220. EDIT: "编辑题卡规则",
  221. };
  222. return names[this.editType];
  223. },
  224. editable() {
  225. return this.editType !== "PREVIEW";
  226. },
  227. // fieldSourses() {
  228. // return [
  229. // ...this.modalForm.requiredFields,
  230. // ...this.modalForm.extendFields
  231. // ].filter(item => item.enable);
  232. // }
  233. },
  234. data() {
  235. return {
  236. modalIsShow: false,
  237. isSubmit: false,
  238. modalForm: { ...initModalForm },
  239. EXAM_NUMBER_STYLE,
  240. PAPER_TYPE,
  241. dataReady: false,
  242. rules: {
  243. name: [
  244. {
  245. required: true,
  246. message: "题卡规则名称不能超过30个字",
  247. max: 30,
  248. trigger: "change",
  249. },
  250. ],
  251. examNumberStyle: [
  252. {
  253. required: true,
  254. message: "请选择考号版式",
  255. trigger: "change",
  256. },
  257. ],
  258. examNumberDigit: [
  259. {
  260. required: true,
  261. message: "请输入考号位数",
  262. trigger: "change",
  263. },
  264. ],
  265. paperType: [
  266. {
  267. required: true,
  268. message: "请选择AB卷版式",
  269. trigger: "change",
  270. },
  271. ],
  272. titleRule: [
  273. {
  274. required: true,
  275. message: "请输入题卡标题规则",
  276. trigger: "change",
  277. },
  278. ],
  279. attention: [
  280. {
  281. required: true,
  282. message: "请输入注意事项",
  283. trigger: "change",
  284. },
  285. {
  286. validator: (rule, value, callback) => {
  287. const val = value.replace(/\n/g, "");
  288. if (val.length > 200) {
  289. callback(new Error("注意事项最多只能输入200个字符"));
  290. } else {
  291. callback();
  292. }
  293. },
  294. trigger: "change",
  295. },
  296. ],
  297. objectiveAttention: [
  298. {
  299. required: false,
  300. message: "请输入客观题注意事项",
  301. trigger: "change",
  302. },
  303. {
  304. max: 26,
  305. message: "客观题注意事项最多只能输入26个汉字",
  306. trigger: "change",
  307. },
  308. ],
  309. subjectiveAttention: [
  310. {
  311. required: false,
  312. message: "请输入主观题注意事项",
  313. trigger: "change",
  314. },
  315. {
  316. max: 26,
  317. message: "主观题注意事项最多只能输入26个汉字",
  318. trigger: "change",
  319. },
  320. ],
  321. },
  322. fieldSourses: [
  323. {
  324. code: "courseName",
  325. enable: true,
  326. name: "课程名称",
  327. },
  328. {
  329. code: "schoolName",
  330. enable: true,
  331. name: "学校名称",
  332. },
  333. ],
  334. };
  335. },
  336. methods: {
  337. initData(val) {
  338. this.modalForm = this.$objAssign(initModalForm, val);
  339. this.modalForm.examNumberDigit =
  340. this.modalForm.examNumberDigit || initModalForm.examNumberDigit;
  341. if (val.id) {
  342. this.modalForm.requiredFields = JSON.parse(val.requiredFields);
  343. this.modalForm.extendFields = JSON.parse(val.extendFields);
  344. }
  345. },
  346. visibleChange() {
  347. this.initData(this.instance);
  348. this.$nextTick(() => {
  349. this.$refs.modalFormComp.clearValidate();
  350. });
  351. },
  352. cancel() {
  353. this.modalIsShow = false;
  354. },
  355. open() {
  356. this.modalIsShow = true;
  357. },
  358. numStyleChange() {
  359. this.modalForm.writeSign = this.modalForm.examNumberStyle !== "FILL";
  360. if (this.modalForm.examNumberStyle !== "FILL") {
  361. this.modalForm.examNumberDigit = 10;
  362. }
  363. },
  364. async submit() {
  365. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  366. if (!valid) return;
  367. if (this.isSubmit) return;
  368. this.isSubmit = true;
  369. let modals = {
  370. ...this.modalForm,
  371. };
  372. modals.requiredFields = JSON.stringify(modals.requiredFields);
  373. modals.extendFields = JSON.stringify(modals.extendFields);
  374. const data = await saveCardRule(modals).catch(() => {});
  375. this.isSubmit = false;
  376. if (!data) return;
  377. this.$message.success("保存成功!");
  378. this.$emit("modified");
  379. this.cancel();
  380. },
  381. },
  382. };
  383. </script>