ModifyCardRule.vue 9.7 KB

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