ModifyKnowledgeDim.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <template>
  2. <el-dialog
  3. class="modify-knowledge-dim"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10vh"
  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. :model="modalForm"
  16. :rules="rules"
  17. label-width="140px"
  18. >
  19. <el-form-item prop="courseCode" label="课程代码:" required>
  20. <el-input
  21. v-model.trim="modalForm.courseCode"
  22. placeholder="请输入课程代码"
  23. readonly
  24. ></el-input>
  25. </el-form-item>
  26. <el-form-item prop="courseName" label="课程名称:" required>
  27. <el-input
  28. v-model.trim="modalForm.courseName"
  29. placeholder="请输入课程名称"
  30. readonly
  31. ></el-input>
  32. </el-form-item>
  33. <el-form-item prop="namePrimary" label="一级知识维度:">
  34. <el-input
  35. v-model.trim="modalForm.namePrimary"
  36. placeholder="请输入一级知识维度"
  37. clearable
  38. @change="dimValidate"
  39. ></el-input>
  40. </el-form-item>
  41. <el-form-item prop="codePrimary" label="一级维度编号:">
  42. <el-input
  43. v-model.trim="modalForm.codePrimary"
  44. placeholder="请输入一级维度编号"
  45. clearable
  46. @change="dimValidate"
  47. ></el-input>
  48. </el-form-item>
  49. <el-form-item prop="nameSecond" label="二级知识维度:">
  50. <el-input
  51. v-model.trim="modalForm.nameSecond"
  52. placeholder="请输入二级知识维度"
  53. clearable
  54. @change="dimValidate"
  55. ></el-input>
  56. </el-form-item>
  57. <el-form-item prop="codeSecond" label="二级维度编号:">
  58. <el-input
  59. v-model.trim="modalForm.codeSecond"
  60. placeholder="请输入二级维度编号"
  61. clearable
  62. @change="dimValidate"
  63. ></el-input>
  64. </el-form-item>
  65. <el-form-item label="一级维度术语解释:">
  66. <el-input
  67. v-model.trim="modalForm.interpretation"
  68. type="textarea"
  69. :autosize="{ minRows: 3, maxRows: 5 }"
  70. placeholder="请输入一级维度术语解释"
  71. maxlength="100"
  72. show-word-limit
  73. ></el-input>
  74. </el-form-item>
  75. </el-form>
  76. <div slot="footer">
  77. <el-button type="primary" :disabled="isSubmit" @click="submit"
  78. >确认</el-button
  79. >
  80. <el-button type="danger" @click="cancel" plain>取消</el-button>
  81. </div>
  82. </el-dialog>
  83. </template>
  84. <script>
  85. import { mapState } from "vuex";
  86. const initModalForm = {
  87. id: null,
  88. courseId: "",
  89. courseName: "",
  90. courseCode: "",
  91. namePrimary: "",
  92. codePrimary: "",
  93. nameSecond: "",
  94. codeSecond: "",
  95. interpretation: "",
  96. dimensionType: "KNOWLEDGE",
  97. };
  98. export default {
  99. name: "modify-knowledge-dim",
  100. props: {
  101. instance: {
  102. type: Object,
  103. default() {
  104. return {};
  105. },
  106. },
  107. },
  108. computed: {
  109. ...mapState("baseConfigs", ["dimensionList"]),
  110. isEdit() {
  111. return !!this.instance.id;
  112. },
  113. title() {
  114. return (this.isEdit ? "编辑" : "新增") + "知识维度";
  115. },
  116. },
  117. data() {
  118. const namePrimaryValidator = (rule, value, callback) => {
  119. if (!this.modalForm.codePrimary || !value) return callback();
  120. let existFirstDim = this.dictData.find(
  121. (item) => item.code === this.modalForm.codePrimary
  122. );
  123. if (existFirstDim) {
  124. const existFirstDim1 = this.dictData.find(
  125. (item) => item.name === value && value !== existFirstDim.name
  126. );
  127. if (existFirstDim1) return callback(new Error("一级知识维度已存在"));
  128. } else {
  129. const existFirstDim1 = this.dictData.find(
  130. (item) => item.name === value
  131. );
  132. if (existFirstDim1 && !this.isEditOnlyOneDim)
  133. return callback(new Error("一级知识维度已存在"));
  134. }
  135. callback();
  136. };
  137. const nameSecondValidator = (rule, value, callback) => {
  138. if (
  139. !this.modalForm.codeSecond ||
  140. !value ||
  141. !this.modalForm.namePrimary ||
  142. !this.modalForm.codePrimary
  143. )
  144. return callback();
  145. const addValidator = () => {
  146. let existFirstDim = this.dictData.find(
  147. (item) => item.code === this.modalForm.codePrimary
  148. );
  149. if (existFirstDim) {
  150. const secondDimExist = this.dictData.some((item) =>
  151. item.children.some((elem) => elem.name === value)
  152. );
  153. if (secondDimExist) return callback(new Error("二级知识维度已存在"));
  154. }
  155. return callback();
  156. };
  157. const editValidator = () => {
  158. let existFirstDim = this.dictData.find(
  159. (item) => item.code === this.modalForm.codePrimary
  160. );
  161. if (existFirstDim) {
  162. const existSecondDim = existFirstDim.children.find(
  163. (item) =>
  164. item.name === value && item.name !== this.instance.nameSecond
  165. );
  166. if (existSecondDim) return callback(new Error("二级知识维度已存在"));
  167. }
  168. return callback();
  169. };
  170. return this.isEdit ? editValidator() : addValidator();
  171. };
  172. const codeSecondValidator = (rule, value, callback) => {
  173. if (
  174. !this.modalForm.codeSecond ||
  175. !value ||
  176. !this.modalForm.namePrimary ||
  177. !this.modalForm.codePrimary
  178. )
  179. return callback();
  180. if (value[0] !== this.modalForm.codePrimary) {
  181. return callback(new Error("二级维度编码首字母应该与一级维度编码一致"));
  182. }
  183. let existFirstDim = this.dictData.find(
  184. (item) => item.code === this.modalForm.codePrimary
  185. );
  186. if (existFirstDim) {
  187. let existSecondDim = existFirstDim.children.find(
  188. (item) => item.code === this.modalForm.codeSecond
  189. );
  190. if (this.isEdit) {
  191. if (
  192. existSecondDim &&
  193. existSecondDim.code !== this.instance.codeSecond
  194. ) {
  195. return callback(new Error("二级维度编号已存在"));
  196. }
  197. } else {
  198. if (existSecondDim) return callback(new Error("二级维度编号已存在"));
  199. }
  200. }
  201. callback();
  202. };
  203. return {
  204. modalIsShow: false,
  205. isSubmit: false,
  206. modalForm: {},
  207. dictData: [],
  208. isEditOnlyOneDim: false,
  209. rules: {
  210. namePrimary: [
  211. {
  212. required: true,
  213. message: "请输入一级知识维度",
  214. trigger: "change",
  215. },
  216. {
  217. max: 30,
  218. message: "一级知识维度字数不能超过30",
  219. trigger: "change",
  220. },
  221. {
  222. validator: namePrimaryValidator,
  223. trigger: "change",
  224. },
  225. ],
  226. codePrimary: [
  227. {
  228. required: true,
  229. pattern: /^[A-Z]{1}$/,
  230. message: "一级维度编号只能是大写字母A-Z,长度为1",
  231. trigger: "change",
  232. },
  233. ],
  234. nameSecond: [
  235. {
  236. required: true,
  237. message: "请输入二级知识维度",
  238. trigger: "change",
  239. },
  240. {
  241. max: 30,
  242. message: "二级知识维度字数不能超过30",
  243. trigger: "change",
  244. },
  245. {
  246. validator: nameSecondValidator,
  247. trigger: "change",
  248. },
  249. ],
  250. codeSecond: [
  251. {
  252. required: true,
  253. pattern: /^[A-Z][0-9]{1,4}$/,
  254. message: "二级维度编号只能是大写字母+数字,长度不能超过5",
  255. trigger: "change",
  256. },
  257. {
  258. validator: codeSecondValidator,
  259. trigger: "change",
  260. },
  261. ],
  262. },
  263. };
  264. },
  265. methods: {
  266. initData(val) {
  267. this.modalForm = this.$objAssign(initModalForm, val);
  268. },
  269. visibleChange() {
  270. this.getDict();
  271. const existPrimaryDim = this.dictData.find(
  272. (item) => item.code === this.instance.codePrimary
  273. );
  274. this.isEditOnlyOneDim =
  275. existPrimaryDim && existPrimaryDim.children.length === 1;
  276. this.initData(this.instance);
  277. this.$nextTick(() => {
  278. this.$refs.modalFormComp.clearValidate();
  279. });
  280. },
  281. cancel() {
  282. this.modalIsShow = false;
  283. },
  284. open() {
  285. this.modalIsShow = true;
  286. },
  287. getDict() {
  288. let dictData = {};
  289. this.dimensionList
  290. .filter((item) => item.dimensionType === "KNOWLEDGE")
  291. .forEach((item) => {
  292. if (!dictData[item.codePrimary]) {
  293. dictData[item.codePrimary] = {
  294. name: item.namePrimary,
  295. code: item.codePrimary,
  296. children: [],
  297. };
  298. }
  299. dictData[item.codePrimary].children.push({
  300. name: item.nameSecond,
  301. code: item.codeSecond,
  302. });
  303. });
  304. this.dictData = Object.values(dictData);
  305. },
  306. dimValidate() {
  307. this.$refs.modalFormComp.validateField([
  308. "namePrimary",
  309. "codePrimary",
  310. "nameSecond",
  311. "codeSecond",
  312. ]);
  313. },
  314. async submit() {
  315. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  316. if (!valid) return;
  317. this.$emit("modified", {
  318. ...this.modalForm,
  319. isLastSec: false,
  320. secondInd: this.modalForm.codeSecond.substring(1) * 1,
  321. });
  322. this.cancel();
  323. },
  324. },
  325. };
  326. </script>