DiagnoseConfig.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <div class="diagnose-config">
  3. <el-form
  4. ref="modalFormComp"
  5. :model="modalForm"
  6. :rules="rules"
  7. label-width="180px"
  8. >
  9. <el-form-item prop="knowledgeInterpret" label="知识:">
  10. <el-input
  11. v-model.trim="modalForm.knowledgeInterpret"
  12. placeholder="知识"
  13. clearable
  14. ></el-input>
  15. </el-form-item>
  16. <el-form-item
  17. prop="gradeModuleDefineParamList"
  18. label="二级维度的精熟度定义:"
  19. >
  20. <div class="part-box part-box-pad part-box-border-bold">
  21. <proficiency-edit
  22. :rates="modalForm.gradeModuleDefineParamList"
  23. @data-change="paramChange"
  24. ></proficiency-edit>
  25. </div>
  26. </el-form-item>
  27. <el-form-item prop="abilityInterpret" label="能力:">
  28. <el-input
  29. v-model.trim="modalForm.abilityInterpret"
  30. placeholder="能力"
  31. clearable
  32. ></el-input>
  33. </el-form-item>
  34. <el-form-item prop="totalScore" label="满分:">
  35. <el-input-number
  36. v-model="modalForm.totalScore"
  37. placeholder="请输入满分,如100"
  38. :min="1"
  39. :max="9999"
  40. :step="1"
  41. step-strictly
  42. :controls="false"
  43. ></el-input-number>
  44. <p class="tips-info">
  45. 说明:若显示赋分,则填写赋分满分分值,否则填写卷面原始分满分分值。
  46. </p>
  47. </el-form-item>
  48. <el-form-item prop="passScore" label="及格分:">
  49. <el-input-number
  50. v-model="modalForm.passScore"
  51. placeholder="请输入及格分,如60"
  52. :min="1"
  53. :max="9999"
  54. :step="1"
  55. step-strictly
  56. :controls="false"
  57. ></el-input-number>
  58. <p class="tips-info">
  59. 说明:成绩分数≥及格分数线,报告中的结果显示“通过”,否则为“不通过”。
  60. </p>
  61. </el-form-item>
  62. </el-form>
  63. <div class="config-footer">
  64. <el-button
  65. class="width-200"
  66. type="primary"
  67. :loading="loading"
  68. @click="toSubmit"
  69. >保存</el-button
  70. >
  71. </div>
  72. </div>
  73. </template>
  74. <script>
  75. import { mapState } from "vuex";
  76. import ProficiencyEdit from "./ProficiencyEdit.vue";
  77. import { updatePaperDefine } from "../../api";
  78. import { deepCopy } from "@/plugins/utils";
  79. const initModalForm = {
  80. knowledgeInterpret: "课程标准规定的学科内容",
  81. abilityInterpret: "经学习与训练内化而成的心理结构",
  82. totalScore: 100,
  83. passScore: 60,
  84. gradeModuleDefineParamList: [
  85. {
  86. level: "A",
  87. title: "熟练掌握",
  88. startRate: 90,
  89. endRate: 100
  90. },
  91. {
  92. level: "B",
  93. title: "较好掌握",
  94. startRate: 75,
  95. endRate: 90
  96. },
  97. {
  98. level: "C",
  99. title: "基本掌握",
  100. startRate: 55,
  101. endRate: 75
  102. },
  103. {
  104. level: "D",
  105. title: "部分掌握",
  106. startRate: 40,
  107. endRate: 55
  108. },
  109. {
  110. level: "E",
  111. title: "没有掌握,需从头再学",
  112. startRate: 0,
  113. endRate: 40
  114. }
  115. ]
  116. };
  117. export default {
  118. name: "diagnose-config",
  119. components: { ProficiencyEdit },
  120. data() {
  121. const isEmpty = num => !num && num !== 0;
  122. const rateSetValidator = (rule, value, callback) => {
  123. if (
  124. value.some(item => isEmpty(item.startRate) || isEmpty(item.endRate))
  125. ) {
  126. return callback(new Error("请完成精熟度定义"));
  127. }
  128. for (let i = 0; i < value.length; i++) {
  129. const item = value[i];
  130. if (i) {
  131. const prevItem = value[i - 1];
  132. if (prevItem.startRate !== item.endRate)
  133. return callback(new Error("请保证区间连续"));
  134. }
  135. }
  136. callback();
  137. };
  138. return {
  139. modalForm: { ...initModalForm },
  140. rules: {
  141. knowledgeInterpret: [
  142. {
  143. required: true,
  144. message: "请输入知识",
  145. trigger: "change"
  146. },
  147. {
  148. max: 100,
  149. message: "知识字数不能超过100",
  150. trigger: "change"
  151. }
  152. ],
  153. abilityInterpret: [
  154. {
  155. required: true,
  156. message: "请输入能力",
  157. trigger: "change"
  158. },
  159. {
  160. max: 100,
  161. message: "能力字数不能超过100",
  162. trigger: "change"
  163. }
  164. ],
  165. totalScore: [
  166. {
  167. required: true,
  168. message: "请输入满分",
  169. trigger: "change"
  170. }
  171. ],
  172. passScore: [
  173. {
  174. required: true,
  175. message: "请输入及格分",
  176. trigger: "change"
  177. }
  178. ],
  179. gradeModuleDefineParamList: [
  180. {
  181. validator: rateSetValidator,
  182. trigger: "change"
  183. }
  184. ]
  185. },
  186. loading: false
  187. };
  188. },
  189. computed: {
  190. ...mapState("baseConfigs", ["defineList", "baseInfo"])
  191. },
  192. created() {
  193. this.initData();
  194. },
  195. methods: {
  196. initData() {
  197. if (this.defineList) {
  198. this.modalForm = this.$objAssign(initModalForm, this.defineList);
  199. this.modalForm.gradeModuleDefineParamList = this.defineList.gradeModuleKnowledgeDefineParamList.map(
  200. item => {
  201. return {
  202. level: item.level,
  203. title: item.define.split(":")[0],
  204. startRate: item.min * 100,
  205. endRate: item.max * 100
  206. };
  207. }
  208. );
  209. } else {
  210. this.modalForm = deepCopy(initModalForm);
  211. }
  212. },
  213. paramChange(data) {
  214. this.modalForm.gradeModuleDefineParamList = data;
  215. this.$refs.modalFormComp.validateField("gradeModuleDefineParamList");
  216. },
  217. async toSubmit() {
  218. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  219. if (!valid) return;
  220. if (this.loading) return;
  221. this.loading = true;
  222. const datas = {
  223. ...this.modalForm,
  224. paperNumber: this.baseInfo.paperNumber,
  225. paperName: this.baseInfo.paperName,
  226. paperType: this.baseInfo.paperType
  227. };
  228. datas.gradeModuleDefineParamList = this.modalForm.gradeModuleDefineParamList.map(
  229. item => {
  230. const min = item.startRate / 100;
  231. const max = item.endRate / 100;
  232. let scopeStr = "",
  233. defineStr = "";
  234. if (item.endRate === 100) {
  235. scopeStr = `[${min},${max}]`;
  236. defineStr = `${item.title}:个人得分率≥${item.startRate}%`;
  237. } else if (item.min === 0) {
  238. scopeStr = `[${min},${max})`;
  239. defineStr = `${item.title}:个人得分率<${item.endRate}%`;
  240. } else {
  241. scopeStr = `[${min},${max})`;
  242. defineStr = `${item.title}:${item.startRate}%≤个人得分率<${item.endRate}%`;
  243. }
  244. return {
  245. level: item.level,
  246. min,
  247. max,
  248. scope: scopeStr,
  249. define: defineStr
  250. };
  251. }
  252. );
  253. const data = await updatePaperDefine(datas).catch(() => {});
  254. this.loading = false;
  255. if (!data) return;
  256. this.$message.success("保存成功!");
  257. this.$emit("modified");
  258. }
  259. }
  260. };
  261. </script>