ModifyCardRule.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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. @change="numStyleChange"
  50. placeholder="请选择"
  51. :disabled="!editable"
  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 prop="paperType" label="AB卷版式:" class="inline-block">
  62. <el-select
  63. v-model="modalForm.paperType"
  64. style="width: 142px;"
  65. placeholder="请选择"
  66. :disabled="!editable"
  67. >
  68. <el-option
  69. v-for="(val, key) in PAPER_TYPE"
  70. :key="key"
  71. :value="key"
  72. :label="val"
  73. ></el-option>
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item>
  77. <el-checkbox v-model="modalForm.examAbsent" :disabled="!editable"
  78. >启用“缺考填涂”</el-checkbox
  79. >
  80. <el-checkbox v-model="modalForm.discipline" :disabled="!editable"
  81. >启用“违纪填涂”</el-checkbox
  82. >
  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 modalForm.requiredFields"
  94. :key="column.code"
  95. v-model="column.enable"
  96. disabled
  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 modalForm.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. <card-title-rule-edit
  116. v-model="modalForm.titleRule"
  117. :disabled="!editable"
  118. :field-sourses="fieldSourses"
  119. v-if="fieldSourses.length"
  120. ref="CardTitleRuleEdit"
  121. ></card-title-rule-edit>
  122. </el-form-item>
  123. <el-form-item prop="attention" label="注意事项:">
  124. <el-input
  125. type="textarea"
  126. :rows="4"
  127. v-model="modalForm.attention"
  128. :disabled="!editable"
  129. ></el-input>
  130. <p class="tips-info">
  131. 提示:换行之后,题卡注意事项会展示为多条内容,内容序号会被自动添加。
  132. </p>
  133. </el-form-item>
  134. <el-form-item prop="objectiveAttention" label="客观题注意事项:">
  135. <el-input
  136. v-model="modalForm.objectiveAttention"
  137. :disabled="!editable"
  138. ></el-input>
  139. </el-form-item>
  140. <el-form-item prop="subjectiveAttention" label="主观题注意事项:">
  141. <el-input
  142. v-model="modalForm.subjectiveAttention"
  143. :disabled="!editable"
  144. ></el-input>
  145. </el-form-item>
  146. <el-form-item prop="orgIds" label="适用机构范围:">
  147. <select-orgs
  148. v-model="modalForm.orgIds"
  149. ref="SelectOrgs"
  150. :disabled="!editable"
  151. ></select-orgs>
  152. </el-form-item>
  153. </el-form>
  154. <div slot="footer">
  155. <el-button
  156. v-if="editable"
  157. type="primary"
  158. :disabled="isSubmit"
  159. @click="submit"
  160. >确认</el-button
  161. >
  162. <el-button @click="cancel">取消</el-button>
  163. </div>
  164. </el-dialog>
  165. </template>
  166. <script>
  167. import { EXAM_NUMBER_STYLE, PAPER_TYPE } from "@/constants/enumerate";
  168. import { saveCardRule } from "../api";
  169. import SelectOrgs from "./SelectOrgs";
  170. import CardTitleRuleEdit from "./CardTitleRuleEdit";
  171. const initModalForm = {
  172. id: null,
  173. name: "",
  174. remark: "",
  175. examNumberStyle: "",
  176. paperType: "PRINT",
  177. examAbsent: true,
  178. discipline: true,
  179. writeSign: true,
  180. requiredFields: [],
  181. extendFields: [],
  182. titleRule: "",
  183. attention: "",
  184. objectiveAttention: "",
  185. subjectiveAttention: "",
  186. orgIds: []
  187. };
  188. export default {
  189. name: "modify-card-rule",
  190. components: { SelectOrgs, CardTitleRuleEdit },
  191. props: {
  192. instance: {
  193. type: Object,
  194. default() {
  195. return {};
  196. }
  197. },
  198. editType: {
  199. type: String,
  200. default: "ADD",
  201. validator: val => ["ADD", "PREVIEW", "EDIT"].includes(val)
  202. }
  203. },
  204. computed: {
  205. title() {
  206. const names = {
  207. ADD: "新增题卡规则",
  208. PREVIEW: "题卡规则详情",
  209. EDIT: "编辑题卡规则"
  210. };
  211. return names[this.editType];
  212. },
  213. editable() {
  214. return this.editType !== "PREVIEW";
  215. }
  216. // fieldSourses() {
  217. // return [
  218. // ...this.modalForm.requiredFields,
  219. // ...this.modalForm.extendFields
  220. // ].filter(item => item.enable);
  221. // }
  222. },
  223. data() {
  224. return {
  225. modalIsShow: false,
  226. isSubmit: false,
  227. modalForm: { ...initModalForm },
  228. EXAM_NUMBER_STYLE,
  229. PAPER_TYPE,
  230. dataReady: false,
  231. rules: {
  232. name: [
  233. {
  234. required: true,
  235. message: "题卡规则名称不能超过30个字",
  236. max: 30,
  237. trigger: "change"
  238. }
  239. ],
  240. examNumberStyle: [
  241. {
  242. required: true,
  243. message: "请选择考号版式",
  244. trigger: "change"
  245. }
  246. ],
  247. paperType: [
  248. {
  249. required: true,
  250. message: "请选择AB卷版式",
  251. trigger: "change"
  252. }
  253. ],
  254. titleRule: [
  255. {
  256. required: true,
  257. message: "请输入题卡标题规则",
  258. trigger: "change"
  259. }
  260. ],
  261. attention: [
  262. {
  263. required: true,
  264. message: "请输入注意事项",
  265. trigger: "change"
  266. },
  267. {
  268. validator: (rule, value, callback) => {
  269. const val = value.replace(/\n/g, "");
  270. if (val.length > 200) {
  271. callback(new Error("注意事项最多只能输入200个字符"));
  272. } else {
  273. callback();
  274. }
  275. },
  276. trigger: "change"
  277. }
  278. ],
  279. objectiveAttention: [
  280. {
  281. required: true,
  282. message: "请输入客观题注意事项",
  283. trigger: "change"
  284. },
  285. {
  286. max: 26,
  287. message: "客观题注意事项最多只能输入26个汉字",
  288. trigger: "change"
  289. }
  290. ],
  291. subjectiveAttention: [
  292. {
  293. required: true,
  294. message: "请输入主观题注意事项",
  295. trigger: "change"
  296. },
  297. {
  298. max: 26,
  299. message: "主观题注意事项最多只能输入26个汉字",
  300. trigger: "change"
  301. }
  302. ],
  303. orgIds: [
  304. {
  305. required: true,
  306. validator: (rule, value, callback) => {
  307. if (value.length) {
  308. callback();
  309. } else {
  310. callback(new Error("请选择适用机构"));
  311. }
  312. },
  313. trigger: "change"
  314. }
  315. ]
  316. },
  317. fieldSourses: [
  318. {
  319. code: "courseName",
  320. enable: true,
  321. name: "课程名称"
  322. },
  323. {
  324. code: "schoolName",
  325. enable: true,
  326. name: "学校名称"
  327. }
  328. ]
  329. };
  330. },
  331. methods: {
  332. initData(val) {
  333. this.modalForm = this.$objAssign(initModalForm, val);
  334. if (val.id) {
  335. this.modalForm.requiredFields = JSON.parse(val.requiredFields);
  336. this.modalForm.extendFields = JSON.parse(val.extendFields);
  337. this.modalForm.orgIds = val.orgs.map(item => item.id);
  338. } else {
  339. this.modalForm.orgIds = [];
  340. }
  341. },
  342. visibleChange() {
  343. this.initData(this.instance);
  344. this.$nextTick(() => {
  345. this.$refs.modalFormComp.clearValidate();
  346. });
  347. },
  348. cancel() {
  349. this.modalIsShow = false;
  350. },
  351. open() {
  352. this.modalIsShow = true;
  353. },
  354. numStyleChange() {
  355. this.modalForm.writeSign = this.modalForm.examNumberStyle !== "FILL";
  356. },
  357. async submit() {
  358. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  359. if (!valid) return;
  360. if (this.isSubmit) return;
  361. this.isSubmit = true;
  362. let modals = {
  363. ...this.modalForm
  364. };
  365. modals.requiredFields = JSON.stringify(modals.requiredFields);
  366. modals.extendFields = JSON.stringify(modals.extendFields);
  367. const data = await saveCardRule(modals).catch(() => {});
  368. this.isSubmit = false;
  369. if (!data) return;
  370. this.$message.success("保存成功!");
  371. this.$emit("modified");
  372. this.cancel();
  373. }
  374. }
  375. };
  376. </script>