OrgProperty.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <template>
  2. <section class="org-property">
  3. <div class="org-header">
  4. <div class="part-box-header">
  5. <h1 class="part-box-title">{{ rootOrgName }}</h1>
  6. <div>
  7. <el-button type="primary" icon="icon icon-save-white" @click="save"
  8. >保存</el-button
  9. >
  10. <el-button type="danger" plain icon="icon icon-back" @click="back"
  11. >返回</el-button
  12. >
  13. </div>
  14. </div>
  15. <div class="part-tabs">
  16. <div
  17. v-for="menu in menus"
  18. :key="menu.val"
  19. :class="['part-tabs-item', { 'is-active': activeName === menu.val }]"
  20. @click="activeName = menu.val"
  21. >
  22. <div class="part-tabs-name">
  23. {{ menu.name }}
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. <div class="org-body part-box">
  29. <!-- 题型设置 -->
  30. <!-- <el-form v-if="activeName === 'tab1'" label-width="160px">
  31. <h3 class="org-body-title">可用题型</h3>
  32. <el-form-item
  33. label="基础题型"
  34. prop="properties.ROOT_ORG_QUESTION_TYPES1"
  35. >
  36. <el-checkbox-group v-model="form.properties.ROOT_ORG_QUESTION_TYPES1">
  37. <el-checkbox label="SINGLE_ANSWER_QUESTION" class="checkbox_length"
  38. >单选</el-checkbox
  39. >
  40. <el-checkbox
  41. label="MULTIPLE_ANSWER_QUESTION"
  42. class="checkbox_length"
  43. >多选</el-checkbox
  44. >
  45. <el-checkbox label="BOOL_ANSWER_QUESTION" class="checkbox_length"
  46. >判断</el-checkbox
  47. >
  48. <el-checkbox label="FILL_BLANK_QUESTION" class="checkbox_length"
  49. >填空</el-checkbox
  50. >
  51. <el-checkbox label="TEXT_ANSWER_QUESTION" class="checkbox_length"
  52. >问答</el-checkbox
  53. >
  54. </el-checkbox-group>
  55. </el-form-item>
  56. <el-form-item
  57. label="组合题型"
  58. prop="properties.ROOT_ORG_QUESTION_TYPES2"
  59. >
  60. <el-checkbox-group v-model="form.properties.ROOT_ORG_QUESTION_TYPES2">
  61. <el-checkbox label="READING_COMPREHENSION" class="checkbox_length"
  62. >阅读理解</el-checkbox
  63. >
  64. <el-checkbox label="CLOZE" class="checkbox_length"
  65. >完形填空</el-checkbox
  66. >
  67. <el-checkbox label="PARAGRAPH_MATCHING" class="checkbox_length"
  68. >段落匹配</el-checkbox
  69. >
  70. <el-checkbox label="BANKED_CLOZE" class="checkbox_length"
  71. >选词填空</el-checkbox
  72. >
  73. </el-checkbox-group>
  74. </el-form-item>
  75. <el-form-item
  76. label="特殊题型"
  77. prop="properties.ROOT_ORG_QUESTION_TYPES3"
  78. >
  79. <el-checkbox-group v-model="form.properties.ROOT_ORG_QUESTION_TYPES3">
  80. <el-checkbox label="LISTENING_QUESTION" class="checkbox_length"
  81. >听力</el-checkbox
  82. >
  83. </el-checkbox-group>
  84. </el-form-item>
  85. <h3 class="org-body-title">成卷配置</h3>
  86. <el-form-item label="特殊设置">
  87. <el-checkbox-group
  88. v-model="form.properties.QUESTION_TYPE_SPECIAL_SET"
  89. class="pull_length"
  90. >
  91. <el-checkbox label="AUTONOMY_QUESTION" class="checkbox_length"
  92. >选做题设置</el-checkbox
  93. >
  94. </el-checkbox-group>
  95. </el-form-item>
  96. </el-form> -->
  97. <!-- 审核配置 -->
  98. <el-form v-if="activeName === 'tab2'" label-width="160px">
  99. <el-form-item class="label-title" label="题库审核" label-width="90px">
  100. <el-radio-group v-model="form.properties.PAPER_AUDIT">
  101. <el-radio label="true">开启</el-radio>
  102. <el-radio label="false">关闭</el-radio>
  103. </el-radio-group>
  104. </el-form-item>
  105. <template v-if="form.properties.PAPER_AUDIT == 'true'">
  106. <el-form-item label="初级审核">
  107. <el-radio-group v-model="form.properties.PAPER_FIRST_AUDIT">
  108. <el-radio label="true">正常流程</el-radio>
  109. <el-radio label="false">免审流程</el-radio>
  110. </el-radio-group>
  111. </el-form-item>
  112. <el-form-item label="中级审核">
  113. <el-radio-group v-model="form.properties.PAPER_SECOND_AUDIT">
  114. <el-radio label="true">正常流程</el-radio>
  115. <el-radio label="false">免审流程</el-radio>
  116. </el-radio-group>
  117. </el-form-item>
  118. <el-form-item label="高级审核">
  119. <el-radio-group v-model="form.properties.PAPER_THIRD_AUDIT">
  120. <el-radio label="true">正常流程</el-radio>
  121. <el-radio label="false">免审流程</el-radio>
  122. </el-radio-group>
  123. </el-form-item>
  124. </template>
  125. <el-form-item class="label-title" label="卷库审核" label-width="90px">
  126. <el-radio-group v-model="form.properties.EXAM_PAPER_AUDIT">
  127. <el-radio label="true">开启</el-radio>
  128. <el-radio label="false">关闭</el-radio>
  129. </el-radio-group>
  130. </el-form-item>
  131. <template v-if="form.properties.EXAM_PAPER_AUDIT == 'true'">
  132. <el-form-item label="初级审核">
  133. <el-radio-group v-model="form.properties.EXAM_PAPER_FIRST_AUDIT">
  134. <el-radio label="true">正常流程</el-radio>
  135. <el-radio label="false">免审流程</el-radio>
  136. </el-radio-group>
  137. </el-form-item>
  138. <el-form-item label="中级审核">
  139. <el-radio-group v-model="form.properties.EXAM_PAPER_SECOND_AUDIT">
  140. <el-radio label="true">正常流程</el-radio>
  141. <el-radio label="false">免审流程</el-radio>
  142. </el-radio-group>
  143. </el-form-item>
  144. <el-form-item label="高级审核">
  145. <el-radio-group v-model="form.properties.EXAM_PAPER_THIRD_AUDIT">
  146. <el-radio label="true">正常流程</el-radio>
  147. <el-radio label="false">免审流程</el-radio>
  148. </el-radio-group>
  149. </el-form-item>
  150. </template>
  151. </el-form>
  152. <!-- 查重配置 -->
  153. <el-form v-if="activeName === 'tab3'" label-width="120px">
  154. <el-form-item label="选项重复阀值">
  155. <el-input-number
  156. v-model="form.properties.OPTION_DUPLICATE_THRESHOLD"
  157. :precision="1"
  158. :min="0"
  159. :max="100"
  160. ></el-input-number>
  161. <span class="tips-info margin-left-10"
  162. >*大于等于所设阈值,判定为重复</span
  163. >
  164. </el-form-item>
  165. <el-form-item label="试题查重">
  166. <el-radio-group v-model="form.properties.CHECK_DUPLICATE">
  167. <el-radio label="true">开启</el-radio>
  168. <el-radio label="false">关闭</el-radio>
  169. </el-radio-group></el-form-item
  170. >
  171. <template v-if="form.properties.CHECK_DUPLICATE == 'true'">
  172. <el-form-item label="试题重复阀值">
  173. <el-input-number
  174. v-model="form.properties.CHECK_DUPLICATE_THRESHOLD"
  175. :precision="1"
  176. :min="0"
  177. :max="100"
  178. ></el-input-number>
  179. <span class="tips-info margin-left-10"
  180. >*大于等于所设阈值,判定为重复</span
  181. >
  182. </el-form-item>
  183. <el-form-item label="试题陈列数量">
  184. <el-input-number
  185. v-model="form.properties.CHECK_DUPLICATE_COUNT"
  186. :precision="0"
  187. :min="1"
  188. :max="10"
  189. ></el-input-number>
  190. <span class="tips-info margin-left-10"
  191. >*选取超过阈值的试题在查重页面显示</span
  192. >
  193. </el-form-item>
  194. </template>
  195. </el-form>
  196. <!-- 组卷配置 -->
  197. <el-form v-if="activeName === 'tab4'" label-width="120px">
  198. <el-form-item label="综合组卷">
  199. <el-radio-group v-model="form.properties.PAPER_BUILD_SYNTHESIS">
  200. <el-radio label="true">开启</el-radio>
  201. <el-radio label="false">关闭</el-radio>
  202. </el-radio-group>
  203. <div class="tips-info">
  204. *开启跨课程组卷模式,支持将多个课程试题组到一份试卷下
  205. </div>
  206. </el-form-item>
  207. </el-form>
  208. <!-- AI命题 -->
  209. <el-form v-if="activeName === 'tab5'" size="small" label-width="120px">
  210. <el-form-item label="AI命题">
  211. <el-radio-group v-model="form.properties.USE_AI_QUESTION">
  212. <el-radio label="true">开启</el-radio>
  213. <el-radio label="false">关闭</el-radio>
  214. </el-radio-group></el-form-item
  215. >
  216. <el-form-item label="购买出题数据包">
  217. <el-radio-group v-model="trade">
  218. <el-radio-button
  219. v-for="item in tradeOptions"
  220. :key="item"
  221. :label="item"
  222. >{{ item + "道" }}</el-radio-button
  223. >
  224. </el-radio-group>
  225. <el-button
  226. type="primary"
  227. class="margin-left-10"
  228. :disabled="!trade"
  229. :loading="loading"
  230. @click="toBuy"
  231. >购买</el-button
  232. >
  233. </el-form-item>
  234. <el-form-item label="剩余出题数量">{{
  235. form.properties.AI_QUESTION_REMAINDER
  236. }}</el-form-item>
  237. <el-form-item label="已购记录">
  238. <el-table :data="tradeList" border class="trade-table">
  239. <el-table-column type="index" label="序号" width="70" />
  240. <el-table-column prop="questionCount" label="购买出题数量" />
  241. <el-table-column prop="creationTime" width="170" label="购买时间" />
  242. </el-table>
  243. </el-form-item>
  244. </el-form>
  245. </div>
  246. </section>
  247. </template>
  248. <script>
  249. import { mapState } from "vuex";
  250. import { QUESTION_API } from "@/constants/constants.js";
  251. import { orgAiTransactionSaveApi, orgAiTransactionListApi } from "../api";
  252. export default {
  253. name: "OrgProperty",
  254. data() {
  255. return {
  256. style: {
  257. label_width_tab1: "120px",
  258. label_width_tab2: "120px",
  259. label_width_tab3: "120px",
  260. },
  261. menus: [
  262. // {
  263. // name: "题型设置",
  264. // val: "tab1",
  265. // },
  266. {
  267. name: "审核配置",
  268. val: "tab2",
  269. },
  270. {
  271. name: "查重配置",
  272. val: "tab3",
  273. },
  274. {
  275. name: "组卷配置",
  276. val: "tab4",
  277. },
  278. {
  279. name: "AI命题",
  280. val: "tab5",
  281. },
  282. ],
  283. activeName: "tab2",
  284. rootOrgName: "",
  285. form: {
  286. orgId: null,
  287. properties: {
  288. // ROOT_ORG_QUESTION_TYPES: [],
  289. // ROOT_ORG_QUESTION_TYPES1: [],
  290. // ROOT_ORG_QUESTION_TYPES2: [],
  291. // ROOT_ORG_QUESTION_TYPES3: [],
  292. // QUESTION_TYPE_SPECIAL_SET: [],
  293. PAPER_AUDIT: "false",
  294. PAPER_FIRST_AUDIT: "false",
  295. PAPER_SECOND_AUDIT: "false",
  296. PAPER_THIRD_AUDIT: "false",
  297. EXAM_PAPER_AUDIT: "false",
  298. EXAM_PAPER_FIRST_AUDIT: "false",
  299. EXAM_PAPER_SECOND_AUDIT: "false",
  300. EXAM_PAPER_THIRD_AUDIT: "false",
  301. CHECK_DUPLICATE: "false",
  302. CHECK_DUPLICATE_THRESHOLD: 80,
  303. OPTION_DUPLICATE_THRESHOLD: 94,
  304. CHECK_DUPLICATE_COUNT: 5,
  305. // 综合组卷
  306. PAPER_BUILD_SYNTHESIS: "false",
  307. // AI命题
  308. AI_QUESTION_REMAINDER: 0,
  309. USE_AI_QUESTION: "false",
  310. },
  311. },
  312. rules: {
  313. // code: [{ required: true, validator: validateCode, trigger: "blur" }],
  314. },
  315. // AI命题
  316. trade: 10000,
  317. tradeOptions: [10000, 20000, 50000],
  318. tradeList: [],
  319. loading: false,
  320. };
  321. },
  322. computed: {
  323. ...mapState({ user: (state) => state.user }),
  324. },
  325. created() {
  326. this.form.orgId = this.$route.params.rootOrgId;
  327. this.rootOrgName =
  328. this.$route.params.rootOrgName +
  329. "(" +
  330. this.$route.params.rootOrgCode +
  331. ")";
  332. if (!this.form.orgId) {
  333. this.form.orgId = sessionStorage.getItem("org_prop_info_org_id");
  334. this.rootOrgName = sessionStorage.getItem("org_prop_info_org_name");
  335. } else {
  336. sessionStorage.setItem("org_prop_info_org_id", this.form.orgId);
  337. sessionStorage.setItem("org_prop_info_org_name", this.rootOrgName);
  338. }
  339. this.init();
  340. this.getTradeList();
  341. },
  342. mounted() {
  343. setTimeout(() => {
  344. this.$store.commit("UPDATE_CURRENT_PATHS", [
  345. "系统管理",
  346. "顶级机构管理",
  347. "机构设置",
  348. ]);
  349. }, 200);
  350. },
  351. methods: {
  352. init() {
  353. var url = QUESTION_API + "/org/allProperties/" + this.form.orgId;
  354. this.$httpWithMsg.get(url).then((response) => {
  355. if (response.data) {
  356. // if (response.data.ROOT_ORG_QUESTION_TYPES1) {
  357. // this.form.properties.ROOT_ORG_QUESTION_TYPES1 = JSON.parse(
  358. // response.data.ROOT_ORG_QUESTION_TYPES1
  359. // );
  360. // }
  361. // if (response.data.ROOT_ORG_QUESTION_TYPES2) {
  362. // this.form.properties.ROOT_ORG_QUESTION_TYPES2 = JSON.parse(
  363. // response.data.ROOT_ORG_QUESTION_TYPES2
  364. // );
  365. // }
  366. // if (response.data.ROOT_ORG_QUESTION_TYPES3) {
  367. // this.form.properties.ROOT_ORG_QUESTION_TYPES3 = JSON.parse(
  368. // response.data.ROOT_ORG_QUESTION_TYPES3
  369. // );
  370. // }
  371. // if (response.data.QUESTION_TYPE_SPECIAL_SET) {
  372. // this.form.properties.QUESTION_TYPE_SPECIAL_SET = JSON.parse(
  373. // response.data.QUESTION_TYPE_SPECIAL_SET
  374. // );
  375. // }
  376. this.form.properties = this.$objAssign(
  377. this.form.properties,
  378. response.data
  379. );
  380. }
  381. });
  382. },
  383. setParams() {
  384. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES1) {
  385. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  386. }
  387. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES2) {
  388. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  389. }
  390. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES3) {
  391. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  392. }
  393. this.form.properties.ROOT_ORG_QUESTION_TYPES = JSON.stringify(
  394. this.form.properties.ROOT_ORG_QUESTION_TYPES
  395. );
  396. if (this.form.properties.ROOT_ORG_QUESTION_TYPES1) {
  397. this.form.properties.ROOT_ORG_QUESTION_TYPES1 = JSON.stringify(
  398. this.form.properties.ROOT_ORG_QUESTION_TYPES1
  399. );
  400. }
  401. if (this.form.properties.ROOT_ORG_QUESTION_TYPES2) {
  402. this.form.properties.ROOT_ORG_QUESTION_TYPES2 = JSON.stringify(
  403. this.form.properties.ROOT_ORG_QUESTION_TYPES2
  404. );
  405. }
  406. if (this.form.properties.ROOT_ORG_QUESTION_TYPES3) {
  407. this.form.properties.ROOT_ORG_QUESTION_TYPES3 = JSON.stringify(
  408. this.form.properties.ROOT_ORG_QUESTION_TYPES3
  409. );
  410. }
  411. if (this.form.properties.QUESTION_TYPE_SPECIAL_SET) {
  412. this.form.properties.QUESTION_TYPE_SPECIAL_SET = JSON.stringify(
  413. this.form.properties.QUESTION_TYPE_SPECIAL_SET
  414. );
  415. }
  416. },
  417. save() {
  418. // this.setParams();
  419. let url = QUESTION_API + "/org/saveOrgProperties";
  420. this.$httpWithMsg.put(url, this.form).then(() => {
  421. this.$notify({
  422. type: "success",
  423. message: "保存成功!",
  424. });
  425. this.back();
  426. });
  427. },
  428. async getTradeList() {
  429. const res = await orgAiTransactionListApi(this.form.orgId);
  430. this.tradeList = res.data || [];
  431. },
  432. async toBuy() {
  433. if (!this.trade) return;
  434. const confirm = await this.$confirm(
  435. `确定要购买${this.trade}道吗?`,
  436. "提示",
  437. {
  438. type: "warning",
  439. }
  440. ).catch(() => {});
  441. if (confirm !== "confirm") return;
  442. if (this.loading) return;
  443. this.loading = true;
  444. const res = await orgAiTransactionSaveApi({
  445. rootOrgId: this.form.orgId,
  446. trade: this.trade,
  447. }).catch(() => {});
  448. this.loading = false;
  449. if (!res) return;
  450. this.$message.success("购买成功!");
  451. this.init();
  452. this.getTradeList();
  453. },
  454. back() {
  455. this.$router.push({ path: "/questions/school" });
  456. },
  457. },
  458. };
  459. </script>