ModifyMarkSetting.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="modify-mark-setting"
  5. :visible.sync="modalIsShow"
  6. :title="title"
  7. top="10px"
  8. width="660px"
  9. :close-on-click-modal="false"
  10. :close-on-press-escape="false"
  11. append-to-body
  12. destroy-on-close
  13. @open="visibleChange"
  14. >
  15. <el-form
  16. ref="modalFormComp"
  17. :model="modalForm"
  18. :rules="rules"
  19. :key="modalForm.paperNumber"
  20. label-width="120px"
  21. >
  22. <el-form-item prop="markMode" label="评卷模式:">
  23. <el-select v-model="modalForm.markMode">
  24. <el-option
  25. v-for="(val, key) in MARK_MODE_TYPE"
  26. :key="key"
  27. :value="key"
  28. :label="val"
  29. ></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="评卷时间:">
  33. <el-date-picker
  34. v-model="markTime"
  35. type="datetimerange"
  36. range-separator="至"
  37. start-placeholder="评卷开始日期"
  38. end-placeholder="评卷结束日期"
  39. value-format="timestamp"
  40. align="right"
  41. unlink-panels
  42. @change="dateChange"
  43. >
  44. </el-date-picker>
  45. </el-form-item>
  46. <el-form-item prop="passScore" label="及格分:">
  47. <el-input-number
  48. style="width: 125px"
  49. v-model="modalForm.passScore"
  50. :min="1"
  51. :max="100"
  52. :step="1"
  53. step-strictly
  54. :controls="false"
  55. ></el-input-number>
  56. <span class="ml-1">%</span>
  57. </el-form-item>
  58. <el-form-item prop="excellentScore" label="优秀分:">
  59. <el-input-number
  60. style="width: 125px"
  61. v-model="modalForm.excellentScore"
  62. :min="1"
  63. :max="100"
  64. :step="1"
  65. step-strictly
  66. :controls="false"
  67. ></el-input-number>
  68. <span class="ml-1">%</span>
  69. </el-form-item>
  70. <el-form-item v-if="!isMultiple" prop="sheetConfig" label="原图遮盖:">
  71. <el-button class="btn-primary" type="text" @click="toSetSheetConfig"
  72. >设置</el-button
  73. >
  74. <i
  75. v-if="modalForm.sheetConfig?.length"
  76. class="el-icon-success color-success ml-1"
  77. ></i>
  78. </el-form-item>
  79. <!-- <el-form-item class="form-item-info">
  80. <el-checkbox v-model="modalForm.sheetView">小助手原卷</el-checkbox>
  81. </el-form-item> -->
  82. <el-form-item class="form-item-info">
  83. <el-checkbox v-model="modalForm.showObjectScore"
  84. >评卷显示客观分</el-checkbox
  85. >
  86. </el-form-item>
  87. <el-form-item class="form-item-info">
  88. <el-checkbox v-model="modalForm.autoScroll"
  89. >评卷提交自动定位</el-checkbox
  90. >
  91. </el-form-item>
  92. <el-form-item class="form-item-info">
  93. <el-checkbox v-model="modalForm.openDoubleMarking"
  94. >是否开启双评</el-checkbox
  95. >
  96. </el-form-item>
  97. </el-form>
  98. <div slot="footer">
  99. <el-button type="primary" :disabled="isSubmit" @click="submit"
  100. >确认</el-button
  101. >
  102. <el-button @click="cancel">取消</el-button>
  103. </div>
  104. </el-dialog>
  105. <!-- ModifyPaperArea -->
  106. <modify-paper-area
  107. ref="ModifyPaperArea"
  108. :areaConfigs="modalForm.sheetConfig"
  109. :paperList="paperList"
  110. @modified="areaModified"
  111. ></modify-paper-area>
  112. </div>
  113. </template>
  114. <script>
  115. import {
  116. markSettingSave,
  117. markSettingBatchSave,
  118. markSettingDetail,
  119. examStructureFindJpg,
  120. } from "../api";
  121. import { cardDetail } from "../../card/api";
  122. import { MARK_MODE_TYPE } from "@/constants/enumerate";
  123. import ModifyPaperArea from "./ModifyPaperArea.vue";
  124. const initModalForm = {
  125. examId: null,
  126. paperNumber: "",
  127. markMode: "",
  128. markStartTime: "",
  129. markEndTime: "",
  130. // sheetView: false,
  131. showObjectScore: false,
  132. openDoubleMarking: false,
  133. autoScroll: false,
  134. passScore: 60,
  135. excellentScore: 80,
  136. sheetConfig: [],
  137. };
  138. export default {
  139. name: "modify-mark-setting",
  140. components: { ModifyPaperArea },
  141. props: {
  142. instance: {
  143. type: Object,
  144. default() {
  145. return {};
  146. },
  147. },
  148. multipleInst: {
  149. type: Array,
  150. default() {
  151. return [];
  152. },
  153. },
  154. },
  155. data() {
  156. return {
  157. modalIsShow: false,
  158. isSubmit: false,
  159. MARK_MODE_TYPE,
  160. modalForm: { ...initModalForm },
  161. paperList: [],
  162. rules: {
  163. markMode: [
  164. {
  165. required: true,
  166. message: "请选择评卷模式",
  167. trigger: "change",
  168. },
  169. ],
  170. markStartTime: [
  171. {
  172. required: true,
  173. message: "请设置评卷时间",
  174. trigger: "change",
  175. },
  176. ],
  177. passScore: [
  178. {
  179. required: true,
  180. message: "请设置及格分",
  181. trigger: "change",
  182. },
  183. ],
  184. excellentScore: [
  185. {
  186. required: true,
  187. message: "请设置优秀分",
  188. trigger: "change",
  189. },
  190. ],
  191. },
  192. // date-picker
  193. markTime: [],
  194. };
  195. },
  196. computed: {
  197. isMultiple() {
  198. return !!this.multipleInst.length;
  199. },
  200. title() {
  201. return this.isMultiple ? "评卷批量设置" : "评卷设置";
  202. },
  203. },
  204. methods: {
  205. async getPaperList() {
  206. this.paperList = [];
  207. const data = await examStructureFindJpg({
  208. examId: this.instance.examId,
  209. courseId: this.instance.courseId,
  210. paperNumber: this.instance.paperNumber,
  211. serialNumber: this.instance.serialNumber,
  212. });
  213. const papers = data || [];
  214. papers.sort((a, b) => a.index - b.index);
  215. this.paperList = papers.map((paper) => {
  216. return {
  217. imgUrl: paper.path,
  218. areas: [],
  219. };
  220. });
  221. },
  222. async initData(val) {
  223. if (this.isMultiple) {
  224. this.modalForm = { ...initModalForm };
  225. this.markTime = [undefined, undefined];
  226. return;
  227. }
  228. await this.getPaperList();
  229. const res = await markSettingDetail({
  230. examId: this.instance.examId,
  231. paperNumber: this.instance.paperNumber,
  232. });
  233. this.modalForm = this.$objAssign(initModalForm, res || {});
  234. this.markTime = [
  235. this.modalForm.markStartTime || undefined,
  236. this.modalForm.markEndTime || undefined,
  237. ];
  238. if (res.sheetConfig) {
  239. this.modalForm.sheetConfig = JSON.parse(res.sheetConfig);
  240. } else {
  241. this.modalForm.sheetConfig = await this.getDefaultSheetConfig();
  242. }
  243. this.modalForm.passScore = this.modalForm.passScore || 60;
  244. this.modalForm.excellentScore = this.modalForm.excellentScore || 80;
  245. },
  246. async getDefaultSheetConfig() {
  247. const detData = await cardDetail(this.instance.cardId);
  248. const cardContent = JSON.parse(detData.content);
  249. const areas = [];
  250. cardContent.pages.forEach((item, index) => {
  251. if (item.exchange.info_area && item.exchange.info_area.length) {
  252. item.exchange.info_area.forEach((area) => {
  253. const [x, y, w, h] = area;
  254. areas.push({
  255. i: index + 1,
  256. x,
  257. y,
  258. w,
  259. h,
  260. });
  261. });
  262. }
  263. });
  264. return areas;
  265. },
  266. visibleChange() {
  267. this.initData(this.instance);
  268. },
  269. cancel() {
  270. this.modalIsShow = false;
  271. },
  272. open() {
  273. this.modalIsShow = true;
  274. },
  275. dateChange() {
  276. if (this.markTime) {
  277. this.modalForm.markStartTime = this.markTime[0];
  278. this.modalForm.markEndTime = this.markTime[1];
  279. } else {
  280. this.modalForm.markStartTime = "";
  281. this.modalForm.markEndTime = "";
  282. }
  283. },
  284. areaModified(areas) {
  285. this.modalForm.sheetConfig = areas;
  286. },
  287. toSetSheetConfig() {
  288. this.$refs.ModifyPaperArea.open();
  289. },
  290. async submit() {
  291. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  292. if (!valid) return;
  293. if (this.isSubmit) return;
  294. this.isSubmit = true;
  295. let res = null;
  296. if (this.isMultiple) {
  297. const datas = {
  298. list: this.multipleInst.map((item) => {
  299. return {
  300. examId: item.examId,
  301. paperNumber: item.paperNumber,
  302. };
  303. }),
  304. config: { ...this.modalForm },
  305. };
  306. res = await markSettingBatchSave(datas).catch(() => {});
  307. } else {
  308. const data = { ...this.modalForm };
  309. data.sheetConfig = JSON.stringify(data.sheetConfig);
  310. res = await markSettingSave(data).catch(() => {});
  311. }
  312. this.isSubmit = false;
  313. if (!res) return;
  314. this.$message.success("修改成功!");
  315. this.$emit("modified");
  316. this.cancel();
  317. },
  318. },
  319. };
  320. </script>