ModifyMarkSetting.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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.showObjectScore"
  81. >评卷显示客观分</el-checkbox
  82. >
  83. </el-form-item>
  84. <el-form-item class="form-item-info">
  85. <el-checkbox v-model="modalForm.allowMarkByQuestion"
  86. >评卷界面显示按小题评卷开关</el-checkbox
  87. >
  88. </el-form-item>
  89. <el-form-item class="form-item-info">
  90. <el-checkbox v-model="modalForm.autoScroll"
  91. >评卷提交自动定位</el-checkbox
  92. >
  93. </el-form-item>
  94. <el-form-item class="form-item-info">
  95. <el-checkbox v-model="modalForm.openDoubleMarking"
  96. >是否开启双评</el-checkbox
  97. >
  98. </el-form-item>
  99. <el-form-item class="form-item-info">
  100. <el-checkbox v-model="modalForm.fillBlankAsOne"
  101. >填空题作为一个整体设置评卷员及评卷方式</el-checkbox
  102. >
  103. </el-form-item>
  104. <el-form-item class="form-item-info">
  105. <el-checkbox v-model="modalForm.allowCloseBeforeFinish"
  106. >允许不评卷结束阅卷</el-checkbox
  107. >
  108. </el-form-item>
  109. </el-form>
  110. <div slot="footer">
  111. <el-button type="primary" :disabled="isSubmit" @click="submit"
  112. >确认</el-button
  113. >
  114. <el-button @click="cancel">取消</el-button>
  115. </div>
  116. </el-dialog>
  117. <!-- ModifyPaperArea -->
  118. <modify-paper-area
  119. ref="ModifyPaperArea"
  120. :areaConfigs="modalForm.sheetConfig"
  121. :paperList="paperList"
  122. @modified="areaModified"
  123. ></modify-paper-area>
  124. </div>
  125. </template>
  126. <script>
  127. import {
  128. markSettingSave,
  129. markSettingBatchSave,
  130. markSettingDetail,
  131. examStructureFindJpg,
  132. } from "../api";
  133. import { cardDetail } from "../../card/api";
  134. import { MARK_MODE_TYPE } from "@/constants/enumerate";
  135. import ModifyPaperArea from "./ModifyPaperArea.vue";
  136. const initModalForm = {
  137. examId: null,
  138. paperNumber: "",
  139. markMode: "",
  140. markStartTime: "",
  141. markEndTime: "",
  142. showObjectScore: false,
  143. allowMarkByQuestion: false,
  144. openDoubleMarking: false,
  145. autoScroll: false,
  146. fillBlankAsOne: true,
  147. allowCloseBeforeFinish: false,
  148. passScore: 60,
  149. excellentScore: 80,
  150. sheetConfig: [],
  151. };
  152. export default {
  153. name: "modify-mark-setting",
  154. components: { ModifyPaperArea },
  155. props: {
  156. instance: {
  157. type: Object,
  158. default() {
  159. return {};
  160. },
  161. },
  162. multipleInst: {
  163. type: Array,
  164. default() {
  165. return [];
  166. },
  167. },
  168. },
  169. data() {
  170. return {
  171. modalIsShow: false,
  172. isSubmit: false,
  173. MARK_MODE_TYPE,
  174. modalForm: { ...initModalForm },
  175. paperList: [],
  176. rules: {
  177. markMode: [
  178. {
  179. required: true,
  180. message: "请选择评卷模式",
  181. trigger: "change",
  182. },
  183. ],
  184. markStartTime: [
  185. {
  186. required: true,
  187. message: "请设置评卷时间",
  188. trigger: "change",
  189. },
  190. ],
  191. passScore: [
  192. {
  193. required: true,
  194. message: "请设置及格分",
  195. trigger: "change",
  196. },
  197. ],
  198. excellentScore: [
  199. {
  200. required: true,
  201. message: "请设置优秀分",
  202. trigger: "change",
  203. },
  204. ],
  205. },
  206. // date-picker
  207. markTime: [],
  208. };
  209. },
  210. computed: {
  211. isMultiple() {
  212. return !!this.multipleInst.length;
  213. },
  214. title() {
  215. return this.isMultiple ? "评卷批量设置" : "评卷设置";
  216. },
  217. },
  218. methods: {
  219. async getPaperList() {
  220. this.paperList = [];
  221. const data = await examStructureFindJpg({
  222. examId: this.instance.examId,
  223. courseId: this.instance.courseId,
  224. paperNumber: this.instance.paperNumber,
  225. serialNumber: this.instance.serialNumber,
  226. });
  227. const papers = data || [];
  228. papers.sort((a, b) => a.index - b.index);
  229. this.paperList = papers.map((paper) => {
  230. return {
  231. imgUrl: paper.path,
  232. areas: [],
  233. };
  234. });
  235. },
  236. async initData(val) {
  237. if (this.isMultiple) {
  238. this.modalForm = { ...initModalForm };
  239. this.markTime = [undefined, undefined];
  240. return;
  241. }
  242. await this.getPaperList();
  243. const res = await markSettingDetail({
  244. examId: this.instance.examId,
  245. paperNumber: this.instance.paperNumber,
  246. });
  247. this.modalForm = this.$objAssign(initModalForm, res || {});
  248. this.markTime = [
  249. this.modalForm.markStartTime || undefined,
  250. this.modalForm.markEndTime || undefined,
  251. ];
  252. if (res.sheetConfig) {
  253. this.modalForm.sheetConfig = JSON.parse(res.sheetConfig);
  254. } else {
  255. this.modalForm.sheetConfig = await this.getDefaultSheetConfig();
  256. }
  257. this.modalForm.passScore = this.modalForm.passScore || 60;
  258. this.modalForm.excellentScore = this.modalForm.excellentScore || 80;
  259. },
  260. async getDefaultSheetConfig() {
  261. const detData = await cardDetail(this.instance.cardId);
  262. const cardContent = JSON.parse(detData.content);
  263. const areas = [];
  264. cardContent.pages.forEach((item, index) => {
  265. if (item.exchange.info_area && item.exchange.info_area.length) {
  266. item.exchange.info_area.forEach((area) => {
  267. const [x, y, w, h] = area;
  268. areas.push({
  269. i: index + 1,
  270. x,
  271. y,
  272. w,
  273. h,
  274. });
  275. });
  276. }
  277. });
  278. return areas;
  279. },
  280. visibleChange() {
  281. this.initData(this.instance);
  282. },
  283. cancel() {
  284. this.modalIsShow = false;
  285. },
  286. open() {
  287. this.modalIsShow = true;
  288. },
  289. dateChange() {
  290. if (this.markTime) {
  291. this.modalForm.markStartTime = this.markTime[0];
  292. this.modalForm.markEndTime = this.markTime[1];
  293. } else {
  294. this.modalForm.markStartTime = "";
  295. this.modalForm.markEndTime = "";
  296. }
  297. },
  298. areaModified(areas) {
  299. this.modalForm.sheetConfig = areas;
  300. },
  301. toSetSheetConfig() {
  302. this.$refs.ModifyPaperArea.open();
  303. },
  304. async submit() {
  305. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  306. if (!valid) return;
  307. if (this.isSubmit) return;
  308. this.isSubmit = true;
  309. let res = null;
  310. if (this.isMultiple) {
  311. const datas = {
  312. list: this.multipleInst.map((item) => {
  313. return {
  314. examId: item.examId,
  315. paperNumber: item.paperNumber,
  316. };
  317. }),
  318. config: { ...this.modalForm },
  319. };
  320. res = await markSettingBatchSave(datas).catch(() => {});
  321. } else {
  322. const data = { ...this.modalForm };
  323. data.sheetConfig = JSON.stringify(data.sheetConfig);
  324. res = await markSettingSave(data).catch(() => {});
  325. }
  326. this.isSubmit = false;
  327. if (!res) return;
  328. this.$message.success("修改成功!");
  329. this.$emit("modified");
  330. this.cancel();
  331. },
  332. },
  333. };
  334. </script>