OrgProperty.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  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" @click="save">保存</el-button>
  8. <el-button type="danger" plain @click="back">返回</el-button>
  9. </div>
  10. </div>
  11. <div class="part-tabs">
  12. <div
  13. v-for="menu in menus"
  14. :key="menu.val"
  15. :class="['part-tabs-item', { 'is-active': activeName === menu.val }]"
  16. @click="activeName = menu.val"
  17. >
  18. <div class="part-tabs-name">
  19. {{ menu.name }}
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. <div class="org-body part-box">
  25. <!-- 题型设置 -->
  26. <!-- <el-form v-if="activeName === 'tab1'" label-width="160px">
  27. <h3 class="org-body-title">可用题型</h3>
  28. <el-form-item
  29. label="基础题型"
  30. prop="properties.ROOT_ORG_QUESTION_TYPES1"
  31. >
  32. <el-checkbox-group v-model="form.properties.ROOT_ORG_QUESTION_TYPES1">
  33. <el-checkbox label="SINGLE_ANSWER_QUESTION" class="checkbox_length"
  34. >单选</el-checkbox
  35. >
  36. <el-checkbox
  37. label="MULTIPLE_ANSWER_QUESTION"
  38. class="checkbox_length"
  39. >多选</el-checkbox
  40. >
  41. <el-checkbox label="BOOL_ANSWER_QUESTION" class="checkbox_length"
  42. >判断</el-checkbox
  43. >
  44. <el-checkbox label="FILL_BLANK_QUESTION" class="checkbox_length"
  45. >填空</el-checkbox
  46. >
  47. <el-checkbox label="TEXT_ANSWER_QUESTION" class="checkbox_length"
  48. >问答</el-checkbox
  49. >
  50. </el-checkbox-group>
  51. </el-form-item>
  52. <el-form-item
  53. label="组合题型"
  54. prop="properties.ROOT_ORG_QUESTION_TYPES2"
  55. >
  56. <el-checkbox-group v-model="form.properties.ROOT_ORG_QUESTION_TYPES2">
  57. <el-checkbox label="READING_COMPREHENSION" class="checkbox_length"
  58. >阅读理解</el-checkbox
  59. >
  60. <el-checkbox label="CLOZE" class="checkbox_length"
  61. >完形填空</el-checkbox
  62. >
  63. <el-checkbox label="PARAGRAPH_MATCHING" class="checkbox_length"
  64. >段落匹配</el-checkbox
  65. >
  66. <el-checkbox label="BANKED_CLOZE" class="checkbox_length"
  67. >选词填空</el-checkbox
  68. >
  69. </el-checkbox-group>
  70. </el-form-item>
  71. <el-form-item
  72. label="特殊题型"
  73. prop="properties.ROOT_ORG_QUESTION_TYPES3"
  74. >
  75. <el-checkbox-group v-model="form.properties.ROOT_ORG_QUESTION_TYPES3">
  76. <el-checkbox label="LISTENING_QUESTION" class="checkbox_length"
  77. >听力</el-checkbox
  78. >
  79. </el-checkbox-group>
  80. </el-form-item>
  81. <h3 class="org-body-title">成卷配置</h3>
  82. <el-form-item label="特殊设置">
  83. <el-checkbox-group
  84. v-model="form.properties.QUESTION_TYPE_SPECIAL_SET"
  85. class="pull_length"
  86. >
  87. <el-checkbox label="AUTONOMY_QUESTION" class="checkbox_length"
  88. >选做题设置</el-checkbox
  89. >
  90. </el-checkbox-group>
  91. </el-form-item>
  92. </el-form> -->
  93. <!-- 审核配置 -->
  94. <el-form v-if="activeName === 'tab2'" label-width="160px">
  95. <el-form-item class="label-title" label="题库审核" label-width="90px">
  96. <el-radio-group v-model="form.properties.PAPER_AUDIT">
  97. <el-radio label="true">开启</el-radio>
  98. <el-radio label="false">关闭</el-radio>
  99. </el-radio-group>
  100. </el-form-item>
  101. <template v-if="form.properties.PAPER_AUDIT == 'true'">
  102. <el-form-item label="初级审核">
  103. <el-radio-group v-model="form.properties.PAPER_FIRST_AUDIT">
  104. <el-radio label="true">正常流程</el-radio>
  105. <el-radio label="false">免审流程</el-radio>
  106. </el-radio-group>
  107. </el-form-item>
  108. <el-form-item label="中级审核">
  109. <el-radio-group v-model="form.properties.PAPER_SECOND_AUDIT">
  110. <el-radio label="true">正常流程</el-radio>
  111. <el-radio label="false">免审流程</el-radio>
  112. </el-radio-group>
  113. </el-form-item>
  114. <el-form-item label="高级审核">
  115. <el-radio-group v-model="form.properties.PAPER_THIRD_AUDIT">
  116. <el-radio label="true">正常流程</el-radio>
  117. <el-radio label="false">免审流程</el-radio>
  118. </el-radio-group>
  119. </el-form-item>
  120. </template>
  121. <el-form-item class="label-title" label="卷库审核" label-width="90px">
  122. <el-radio-group v-model="form.properties.EXAM_PAPER_AUDIT">
  123. <el-radio label="true">开启</el-radio>
  124. <el-radio label="false">关闭</el-radio>
  125. </el-radio-group>
  126. </el-form-item>
  127. <template v-if="form.properties.EXAM_PAPER_AUDIT == 'true'">
  128. <el-form-item label="初级审核">
  129. <el-radio-group v-model="form.properties.EXAM_PAPER_FIRST_AUDIT">
  130. <el-radio label="true">正常流程</el-radio>
  131. <el-radio label="false">免审流程</el-radio>
  132. </el-radio-group>
  133. </el-form-item>
  134. <el-form-item label="中级审核">
  135. <el-radio-group v-model="form.properties.EXAM_PAPER_SECOND_AUDIT">
  136. <el-radio label="true">正常流程</el-radio>
  137. <el-radio label="false">免审流程</el-radio>
  138. </el-radio-group>
  139. </el-form-item>
  140. <el-form-item label="高级审核">
  141. <el-radio-group v-model="form.properties.EXAM_PAPER_THIRD_AUDIT">
  142. <el-radio label="true">正常流程</el-radio>
  143. <el-radio label="false">免审流程</el-radio>
  144. </el-radio-group>
  145. </el-form-item>
  146. </template>
  147. </el-form>
  148. <!-- 查重配置 -->
  149. <el-form v-if="activeName === 'tab3'" label-width="120px">
  150. <el-form-item label="选项查重">
  151. <el-radio-group
  152. v-model="form.properties.CHECK_OPTION_DUPLICATE_THRESHOLD"
  153. >
  154. <el-radio label="true">开启</el-radio>
  155. <el-radio label="false">关闭</el-radio>
  156. </el-radio-group></el-form-item
  157. >
  158. <template
  159. v-if="form.properties.CHECK_OPTION_DUPLICATE_THRESHOLD == 'true'"
  160. >
  161. <el-form-item label="选项重复阀值">
  162. <el-input-number
  163. v-model="form.properties.OPTION_DUPLICATE_THRESHOLD"
  164. :precision="1"
  165. :min="0"
  166. :max="100"
  167. ></el-input-number>
  168. <span class="tips-info margin-left-10"
  169. >*大于等于所设阈值,判定为重复</span
  170. >
  171. </el-form-item>
  172. </template>
  173. <el-form-item label="试题查重">
  174. <el-radio-group v-model="form.properties.CHECK_DUPLICATE">
  175. <el-radio label="true">开启</el-radio>
  176. <el-radio label="false">关闭</el-radio>
  177. </el-radio-group></el-form-item
  178. >
  179. <template v-if="form.properties.CHECK_DUPLICATE == 'true'">
  180. <el-form-item label="试题重复阀值">
  181. <el-input-number
  182. v-model="form.properties.CHECK_DUPLICATE_THRESHOLD"
  183. :precision="1"
  184. :min="0"
  185. :max="100"
  186. ></el-input-number>
  187. <span class="tips-info margin-left-10"
  188. >*大于等于所设阈值,判定为重复</span
  189. >
  190. </el-form-item>
  191. <el-form-item label="试题陈列数量">
  192. <el-input-number
  193. v-model="form.properties.CHECK_DUPLICATE_COUNT"
  194. :precision="0"
  195. :min="1"
  196. :max="10"
  197. ></el-input-number>
  198. <span class="tips-info margin-left-10"
  199. >*选取超过阈值的试题在查重页面显示</span
  200. >
  201. </el-form-item>
  202. <el-form-item label="试题字数数量">
  203. <el-input-number
  204. v-model="form.properties.CHECK_LIMIT_CHAR_COUNT"
  205. :precision="0"
  206. :min="0"
  207. :max="1000"
  208. ></el-input-number>
  209. <span class="tips-info margin-left-10"
  210. >*低于所设字数,不进行查重计算</span
  211. >
  212. </el-form-item>
  213. </template>
  214. </el-form>
  215. <!-- 组卷配置 -->
  216. <!-- <el-form v-if="activeName === 'tab4'" label-width="120px">
  217. <el-form-item label="综合组卷">
  218. <el-radio-group v-model="form.properties.PAPER_BUILD_SYNTHESIS">
  219. <el-radio label="true">开启</el-radio>
  220. <el-radio label="false">关闭</el-radio>
  221. </el-radio-group>
  222. <div class="tips-info">
  223. *开启跨课程组卷模式,支持将多个课程试题组到一份试卷下
  224. </div>
  225. </el-form-item>
  226. </el-form> -->
  227. <div v-show="activeName === 'tab4'">
  228. <el-form label-width="60px" inline>
  229. <el-form-item label="角色">
  230. <el-select v-model="roleCode" placeholder="请选择">
  231. <el-option
  232. v-for="item in roleList"
  233. :key="item.id"
  234. :label="item.name"
  235. :value="item.code"
  236. />
  237. </el-select>
  238. </el-form-item>
  239. <el-form-item>
  240. <el-button type="primary" @click="searchTree"> 查询 </el-button>
  241. </el-form-item>
  242. </el-form>
  243. <div class="part-box tree-box">
  244. <el-tree
  245. ref="authTree"
  246. :data="treeData"
  247. show-checkbox
  248. node-key="code"
  249. :props="defaultTreeProps"
  250. @check-change="treeCheckChange"
  251. @check="tab4Entered = true"
  252. default-expand-all
  253. :filter-node-method="filterTree"
  254. >
  255. <span class="custom-tree-node" slot-scope="{ node, data }">
  256. <span>{{ node.label }}</span>
  257. <span v-if="data.privilegeType == 'BUTTON'" class="is-btn">
  258. 按钮
  259. </span>
  260. </span>
  261. </el-tree>
  262. </div>
  263. </div>
  264. <!-- AI命题 -->
  265. <el-form v-if="activeName === 'tab5'" size="small" label-width="120px">
  266. <el-form-item label="AI命题">
  267. <el-radio-group v-model="form.properties.USE_AI_QUESTION">
  268. <el-radio label="true">开启</el-radio>
  269. <el-radio label="false">关闭</el-radio>
  270. </el-radio-group></el-form-item
  271. >
  272. <el-form-item label="剩余题数">
  273. {{ leftCount }}
  274. </el-form-item>
  275. <!-- <el-form-item label="累计出题数">
  276. {{ permitCount }}
  277. </el-form-item> -->
  278. <el-form-item label="">
  279. <el-button type="primary" @click="updateAiNums">更新数量</el-button>
  280. </el-form-item>
  281. <!-- <el-form-item label="购买出题数据包">
  282. <el-radio-group v-model="trade">
  283. <el-radio-button
  284. v-for="item in tradeOptions"
  285. :key="item"
  286. :label="item"
  287. >{{ item + "道" }}</el-radio-button
  288. >
  289. </el-radio-group>
  290. <el-button
  291. type="primary"
  292. class="margin-left-10"
  293. :disabled="!trade"
  294. :loading="loading"
  295. @click="toBuy"
  296. >购买</el-button
  297. >
  298. </el-form-item>
  299. <el-form-item label="剩余出题数量">{{
  300. form.properties.AI_QUESTION_REMAINDER
  301. }}</el-form-item>
  302. <el-form-item label="已购记录">
  303. <el-table :data="tradeList" border class="trade-table">
  304. <el-table-column type="index" label="序号" width="70" />
  305. <el-table-column prop="questionCount" label="购买出题数量" />
  306. <el-table-column prop="creationTime" width="170" label="购买时间" />
  307. </el-table>
  308. </el-form-item> -->
  309. </el-form>
  310. <el-form v-if="activeName === 'tab6'" size="small" label-width="120px">
  311. <el-form-item label="组卷配置">
  312. <el-radio-group v-model="form.properties.GEN_PAPER_QUESTION_ENABLE">
  313. <el-radio label="true">开启</el-radio>
  314. <el-radio label="false">关闭</el-radio>
  315. </el-radio-group>
  316. (开启后,则必须在指定时间段内该课程新增试题数量满足条件才允许组卷,否则提示试题数量不够不允许组卷)
  317. </el-form-item>
  318. <template v-if="form.properties.GEN_PAPER_QUESTION_ENABLE == 'true'">
  319. <el-form-item label="试题创建时间">
  320. <el-date-picker
  321. v-model="timeRange"
  322. type="daterange"
  323. range-separator="-"
  324. start-placeholder="开始时间"
  325. end-placeholder="结束时间"
  326. value-format="yyyy-MM-dd"
  327. align="right"
  328. unlink-panels
  329. >
  330. </el-date-picker>
  331. </el-form-item>
  332. <el-form-item label="新增试题数量">
  333. <!-- <el-input-number
  334. style="width: 80px"
  335. v-model="form.properties.GEN_PAPER_QUESTION_COUNT"
  336. :step="1"
  337. :controls="false"
  338. ></el-input-number> -->
  339. <el-input
  340. style="width: 80px"
  341. maxLength="7"
  342. v-model="form.properties.GEN_PAPER_QUESTION_COUNT"
  343. ></el-input>
  344. </el-form-item>
  345. </template>
  346. </el-form>
  347. </div>
  348. </section>
  349. </template>
  350. <script>
  351. import { mapState } from "vuex";
  352. import { QUESTION_API } from "@/constants/constants.js";
  353. import { orgAiTransactionSaveApi, orgAiTransactionListApi } from "../api";
  354. import { getAiNums, updateAiNums } from "../../question/api";
  355. export default {
  356. name: "OrgProperty",
  357. data() {
  358. return {
  359. leftCount: "",
  360. permitCount: "",
  361. tab4Entered: false,
  362. treeCheckedCodes: [],
  363. style: {
  364. label_width_tab1: "120px",
  365. label_width_tab2: "120px",
  366. label_width_tab3: "120px",
  367. },
  368. menus: [
  369. // {
  370. // name: "题型设置",
  371. // val: "tab1",
  372. // },
  373. {
  374. name: "审核配置",
  375. val: "tab2",
  376. },
  377. {
  378. name: "查重配置",
  379. val: "tab3",
  380. },
  381. // {
  382. // name: "组卷配置",
  383. // val: "tab4",
  384. // },
  385. {
  386. name: "角色管理",
  387. val: "tab4",
  388. },
  389. {
  390. name: "AI命题",
  391. val: "tab5",
  392. },
  393. { name: "组卷配置", val: "tab6" },
  394. ],
  395. activeName: "tab2",
  396. rootOrgName: "",
  397. form: {
  398. orgId: null,
  399. properties: {
  400. // ROOT_ORG_QUESTION_TYPES: [],
  401. // ROOT_ORG_QUESTION_TYPES1: [],
  402. // ROOT_ORG_QUESTION_TYPES2: [],
  403. // ROOT_ORG_QUESTION_TYPES3: [],
  404. // QUESTION_TYPE_SPECIAL_SET: [],
  405. PAPER_AUDIT: "false",
  406. PAPER_FIRST_AUDIT: "false",
  407. PAPER_SECOND_AUDIT: "false",
  408. PAPER_THIRD_AUDIT: "false",
  409. EXAM_PAPER_AUDIT: "false",
  410. EXAM_PAPER_FIRST_AUDIT: "false",
  411. EXAM_PAPER_SECOND_AUDIT: "false",
  412. EXAM_PAPER_THIRD_AUDIT: "false",
  413. CHECK_DUPLICATE: "false",
  414. CHECK_OPTION_DUPLICATE_THRESHOLD: "false",
  415. CHECK_DUPLICATE_THRESHOLD: 80,
  416. OPTION_DUPLICATE_THRESHOLD: 94,
  417. CHECK_LIMIT_CHAR_COUNT: 0,
  418. CHECK_DUPLICATE_COUNT: 5,
  419. // 综合组卷
  420. // PAPER_BUILD_SYNTHESIS: "false",
  421. // AI命题
  422. AI_QUESTION_REMAINDER: 0,
  423. USE_AI_QUESTION: "false",
  424. GEN_PAPER_QUESTION_ENABLE: "true",
  425. GEN_PAPER_QUESTION_COUNT: "",
  426. GEN_PAPER_QUESTION_START: "",
  427. GEN_PAPER_QUESTION_END: "",
  428. },
  429. },
  430. timeRange: [],
  431. roleCode: "",
  432. roleList: [],
  433. rules: {
  434. // code: [{ required: true, validator: validateCode, trigger: "blur" }],
  435. },
  436. // AI命题
  437. trade: 10000,
  438. tradeOptions: [10000, 20000, 50000],
  439. tradeList: [],
  440. loading: false,
  441. defaultTreeProps: {
  442. label: "name",
  443. children: "subRolePrivilege",
  444. },
  445. treeData: [],
  446. };
  447. },
  448. computed: {
  449. ...mapState({ user: (state) => state.user }),
  450. },
  451. created() {
  452. this.form.orgId = this.$route.query.rootOrgId;
  453. this.rootOrgName =
  454. this.$route.query.rootOrgName + "(" + this.$route.query.rootOrgCode + ")";
  455. if (!this.form.orgId) {
  456. this.form.orgId = sessionStorage.getItem("org_prop_info_org_id");
  457. this.rootOrgName = sessionStorage.getItem("org_prop_info_org_name");
  458. } else {
  459. sessionStorage.setItem("org_prop_info_org_id", this.form.orgId);
  460. sessionStorage.setItem("org_prop_info_org_name", this.rootOrgName);
  461. }
  462. this.init();
  463. this.getTradeList();
  464. this.initAiNums();
  465. },
  466. mounted() {
  467. setTimeout(() => {
  468. this.$store.commit("UPDATE_CURRENT_PATHS", [
  469. "系统管理",
  470. "顶级机构管理",
  471. "机构设置",
  472. ]);
  473. }, 200);
  474. },
  475. methods: {
  476. initAiNums(msg) {
  477. getAiNums({
  478. rootOrgId: this.$route.query.rootOrgId,
  479. }).then((res) => {
  480. if (res.data) {
  481. this.leftCount = res.data?.leftCount;
  482. this.permitCount = res.data?.permitCount;
  483. if (msg) {
  484. this.$message.success(msg);
  485. }
  486. }
  487. });
  488. },
  489. updateAiNums() {
  490. updateAiNums({
  491. rootOrgId: this.$route.query.rootOrgId,
  492. }).then(() => {
  493. this.initAiNums("更新成功");
  494. });
  495. },
  496. init() {
  497. var url = QUESTION_API + "/org/allProperties/" + this.form.orgId;
  498. this.$httpWithMsg.get(url).then((response) => {
  499. if (response.data) {
  500. // if (response.data.ROOT_ORG_QUESTION_TYPES1) {
  501. // this.form.properties.ROOT_ORG_QUESTION_TYPES1 = JSON.parse(
  502. // response.data.ROOT_ORG_QUESTION_TYPES1
  503. // );
  504. // }
  505. // if (response.data.ROOT_ORG_QUESTION_TYPES2) {
  506. // this.form.properties.ROOT_ORG_QUESTION_TYPES2 = JSON.parse(
  507. // response.data.ROOT_ORG_QUESTION_TYPES2
  508. // );
  509. // }
  510. // if (response.data.ROOT_ORG_QUESTION_TYPES3) {
  511. // this.form.properties.ROOT_ORG_QUESTION_TYPES3 = JSON.parse(
  512. // response.data.ROOT_ORG_QUESTION_TYPES3
  513. // );
  514. // }
  515. // if (response.data.QUESTION_TYPE_SPECIAL_SET) {
  516. // this.form.properties.QUESTION_TYPE_SPECIAL_SET = JSON.parse(
  517. // response.data.QUESTION_TYPE_SPECIAL_SET
  518. // );
  519. // }
  520. this.form.properties = this.$objAssign(
  521. this.form.properties,
  522. response.data
  523. );
  524. this.timeRange = [
  525. response.data.GEN_PAPER_QUESTION_START || "",
  526. response.data.GEN_PAPER_QUESTION_END || "",
  527. ];
  528. }
  529. });
  530. },
  531. getRoleList() {
  532. this.$httpWithMsg
  533. .post(QUESTION_API + "/rolePrivilege/getRoles")
  534. .then((res) => {
  535. this.roleList = res.data;
  536. if (res.data?.length) {
  537. this.roleCode = res.data[0].code;
  538. }
  539. });
  540. },
  541. searchTree() {},
  542. setParams() {
  543. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES1) {
  544. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  545. }
  546. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES2) {
  547. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  548. }
  549. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES3) {
  550. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  551. }
  552. this.form.properties.ROOT_ORG_QUESTION_TYPES = JSON.stringify(
  553. this.form.properties.ROOT_ORG_QUESTION_TYPES
  554. );
  555. if (this.form.properties.ROOT_ORG_QUESTION_TYPES1) {
  556. this.form.properties.ROOT_ORG_QUESTION_TYPES1 = JSON.stringify(
  557. this.form.properties.ROOT_ORG_QUESTION_TYPES1
  558. );
  559. }
  560. if (this.form.properties.ROOT_ORG_QUESTION_TYPES2) {
  561. this.form.properties.ROOT_ORG_QUESTION_TYPES2 = JSON.stringify(
  562. this.form.properties.ROOT_ORG_QUESTION_TYPES2
  563. );
  564. }
  565. if (this.form.properties.ROOT_ORG_QUESTION_TYPES3) {
  566. this.form.properties.ROOT_ORG_QUESTION_TYPES3 = JSON.stringify(
  567. this.form.properties.ROOT_ORG_QUESTION_TYPES3
  568. );
  569. }
  570. if (this.form.properties.QUESTION_TYPE_SPECIAL_SET) {
  571. this.form.properties.QUESTION_TYPE_SPECIAL_SET = JSON.stringify(
  572. this.form.properties.QUESTION_TYPE_SPECIAL_SET
  573. );
  574. }
  575. },
  576. async save() {
  577. // this.setParams();
  578. let url = QUESTION_API + "/org/saveOrgProperties";
  579. if (this.form.properties.GEN_PAPER_QUESTION_ENABLE == "false") {
  580. this.timeRange = [];
  581. this.form.properties.GEN_PAPER_QUESTION_COUNT = "";
  582. }
  583. let GEN_PAPER_QUESTION_START = this.timeRange?.[0] || "";
  584. let GEN_PAPER_QUESTION_END = this.timeRange?.[1] || "";
  585. let params = {
  586. orgId: this.form.orgId,
  587. properties: {
  588. ...this.form.properties,
  589. GEN_PAPER_QUESTION_START,
  590. GEN_PAPER_QUESTION_END,
  591. },
  592. };
  593. // 调试
  594. // params.properties.CHECK_LIMIT_CHAR_COUNT = undefined;
  595. let res = await this.$httpWithMsg.put(url, params).catch(() => {});
  596. if (!res) return;
  597. if (this.tab4Entered) {
  598. let res2 = await this.$httpWithMsg
  599. .post(QUESTION_API + "/rolePrivilege/savePrivilege", {
  600. privileges: this.treeCheckedCodes,
  601. rootOrgId: this.form.orgId,
  602. role: this.roleCode,
  603. })
  604. .catch(() => {});
  605. if (!res2) return;
  606. }
  607. this.$notify({
  608. type: "success",
  609. message: "保存成功!",
  610. });
  611. // this.back();
  612. },
  613. async getTradeList() {
  614. const res = await orgAiTransactionListApi(this.form.orgId);
  615. this.tradeList = res.data || [];
  616. },
  617. async toBuy() {
  618. if (!this.trade) return;
  619. const confirm = await this.$confirm(
  620. `确定要购买${this.trade}道吗?`,
  621. "提示",
  622. {
  623. type: "warning",
  624. }
  625. ).catch(() => {});
  626. if (confirm !== "confirm") return;
  627. if (this.loading) return;
  628. this.loading = true;
  629. const res = await orgAiTransactionSaveApi({
  630. rootOrgId: this.form.orgId,
  631. trade: this.trade,
  632. }).catch(() => {});
  633. this.loading = false;
  634. if (!res) return;
  635. this.$message.success("购买成功!");
  636. this.init();
  637. this.getTradeList();
  638. },
  639. back() {
  640. this.$router.push({ path: "/questions/school" });
  641. },
  642. treeCheckChange(curNode, isChecked) {
  643. let keys = this.$refs.authTree.getCheckedKeys(true);
  644. if (curNode.privilegeType === "BUTTON" && isChecked) {
  645. keys = Array.from(new Set([...keys, curNode.mountPageCode]));
  646. this.$refs.authTree.setCheckedKeys(keys);
  647. }
  648. // this.treeCheckedCodes = [...keys].filter(
  649. // (key) => !key.endsWith("__page")
  650. // );
  651. this.$nextTick(() => {
  652. let nodes = this.$refs.authTree.getCheckedNodes(false, true);
  653. this.treeCheckedCodes = nodes
  654. .map((item) => item.code)
  655. .filter((key) => !key.endsWith("__page"));
  656. });
  657. },
  658. filterTree(value, data) {
  659. return !data.originId;
  660. },
  661. },
  662. watch: {
  663. activeName(val) {
  664. if (val === "tab4" && !this.tab4Entered) {
  665. this.$nextTick(() => {
  666. this.getRoleList();
  667. });
  668. }
  669. },
  670. roleCode(val) {
  671. this.$httpWithMsg
  672. .post(
  673. QUESTION_API +
  674. `/rolePrivilege/getRolePrivileges?roleCode=${val}&rootOrgId=${this.form.orgId}`
  675. )
  676. .then((res) => {
  677. let checkedLeafCodes = [];
  678. res.data.forEach((level1) => {
  679. if (level1.subRolePrivilege?.length) {
  680. level1.subRolePrivilege = level1.subRolePrivilege.map(
  681. (level2) => {
  682. if (level2.subRolePrivilege?.length) {
  683. level2.subRolePrivilege = level2.subRolePrivilege.map(
  684. (v) => {
  685. v.mountPageCode = level2.code + "__page";
  686. v.enable && checkedLeafCodes.push(v.code);
  687. return v;
  688. }
  689. );
  690. level2.subRolePrivilege.unshift({
  691. code: level2.code + "__page",
  692. enable: level2.enable,
  693. name: "页面",
  694. privilegeType: "PAGE",
  695. originId: level2.code,
  696. });
  697. level2.enable &&
  698. checkedLeafCodes.push(level2.code + "__page");
  699. } else {
  700. level2.enable && checkedLeafCodes.push(level2.code);
  701. }
  702. return level2;
  703. }
  704. );
  705. } else {
  706. level1.enable && checkedLeafCodes.push(level1.code);
  707. }
  708. });
  709. this.treeData = res.data;
  710. //初始化选中状态,使用叶子节点的enable进行设置
  711. this.$refs.authTree.setCheckedKeys(checkedLeafCodes);
  712. });
  713. },
  714. treeData() {
  715. this.$nextTick(() => {
  716. this.$refs.authTree?.filter("");
  717. });
  718. },
  719. },
  720. };
  721. </script>
  722. <style lang="scss" scoped>
  723. .org-property {
  724. .tree-box {
  725. :deep(.custom-tree-node) {
  726. .is-page,
  727. .is-btn {
  728. padding: 3px 5px;
  729. font-size: 10px;
  730. border-radius: 4px;
  731. background: #67c23a;
  732. color: #fff;
  733. margin-left: 8px;
  734. vertical-align: middle;
  735. position: relative;
  736. top: -2px;
  737. }
  738. }
  739. }
  740. }
  741. </style>