ModifyMarkSetting.vue 10 KB

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