OrgProperty.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  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. </template>
  203. </el-form>
  204. <!-- 组卷配置 -->
  205. <!-- <el-form v-if="activeName === 'tab4'" label-width="120px">
  206. <el-form-item label="综合组卷">
  207. <el-radio-group v-model="form.properties.PAPER_BUILD_SYNTHESIS">
  208. <el-radio label="true">开启</el-radio>
  209. <el-radio label="false">关闭</el-radio>
  210. </el-radio-group>
  211. <div class="tips-info">
  212. *开启跨课程组卷模式,支持将多个课程试题组到一份试卷下
  213. </div>
  214. </el-form-item>
  215. </el-form> -->
  216. <div v-show="activeName === 'tab4'">
  217. <el-form label-width="60px" inline>
  218. <el-form-item label="角色">
  219. <el-select v-model="roleCode" placeholder="请选择">
  220. <el-option
  221. v-for="item in roleList"
  222. :key="item.id"
  223. :label="item.name"
  224. :value="item.code"
  225. />
  226. </el-select>
  227. </el-form-item>
  228. <el-form-item>
  229. <el-button type="primary" @click="searchTree"> 查询 </el-button>
  230. </el-form-item>
  231. </el-form>
  232. <div class="part-box tree-box">
  233. <el-tree
  234. ref="authTree"
  235. :data="treeData"
  236. show-checkbox
  237. node-key="code"
  238. :props="defaultTreeProps"
  239. @check-change="treeCheckChange"
  240. @check="tab4Entered = true"
  241. default-expand-all
  242. :filter-node-method="filterTree"
  243. >
  244. <span class="custom-tree-node" slot-scope="{ node, data }">
  245. <span>{{ node.label }}</span>
  246. <span v-if="data.privilegeType == 'BUTTON'" class="is-btn">
  247. 按钮
  248. </span>
  249. </span>
  250. </el-tree>
  251. </div>
  252. </div>
  253. <!-- AI命题 -->
  254. <el-form v-if="activeName === 'tab5'" size="small" label-width="120px">
  255. <el-form-item label="AI命题">
  256. <el-radio-group v-model="form.properties.USE_AI_QUESTION">
  257. <el-radio label="true">开启</el-radio>
  258. <el-radio label="false">关闭</el-radio>
  259. </el-radio-group></el-form-item
  260. >
  261. <el-form-item label="剩余题数">
  262. {{ leftCount }}
  263. </el-form-item>
  264. <!-- <el-form-item label="累计出题数">
  265. {{ permitCount }}
  266. </el-form-item> -->
  267. <el-form-item label="">
  268. <el-button type="primary" @click="updateAiNums">更新数量</el-button>
  269. </el-form-item>
  270. <!-- <el-form-item label="购买出题数据包">
  271. <el-radio-group v-model="trade">
  272. <el-radio-button
  273. v-for="item in tradeOptions"
  274. :key="item"
  275. :label="item"
  276. >{{ item + "道" }}</el-radio-button
  277. >
  278. </el-radio-group>
  279. <el-button
  280. type="primary"
  281. class="margin-left-10"
  282. :disabled="!trade"
  283. :loading="loading"
  284. @click="toBuy"
  285. >购买</el-button
  286. >
  287. </el-form-item>
  288. <el-form-item label="剩余出题数量">{{
  289. form.properties.AI_QUESTION_REMAINDER
  290. }}</el-form-item>
  291. <el-form-item label="已购记录">
  292. <el-table :data="tradeList" border class="trade-table">
  293. <el-table-column type="index" label="序号" width="70" />
  294. <el-table-column prop="questionCount" label="购买出题数量" />
  295. <el-table-column prop="creationTime" width="170" label="购买时间" />
  296. </el-table>
  297. </el-form-item> -->
  298. </el-form>
  299. <el-form v-if="activeName === 'tab6'" size="small" label-width="120px">
  300. <el-form-item label="组卷配置">
  301. <el-radio-group v-model="form.properties.GEN_PAPER_QUESTION_ENABLE">
  302. <el-radio label="true">开启</el-radio>
  303. <el-radio label="false">关闭</el-radio>
  304. </el-radio-group>
  305. (开启后,则必须在指定时间段内该课程新增试题数量满足条件才允许组卷,否则提示试题数量不够不允许组卷)
  306. </el-form-item>
  307. <template v-if="form.properties.GEN_PAPER_QUESTION_ENABLE == 'true'">
  308. <el-form-item label="试题创建时间">
  309. <el-date-picker
  310. v-model="timeRange"
  311. type="daterange"
  312. range-separator="-"
  313. start-placeholder="开始时间"
  314. end-placeholder="结束时间"
  315. value-format="yyyy-MM-dd"
  316. align="right"
  317. unlink-panels
  318. >
  319. </el-date-picker>
  320. </el-form-item>
  321. <el-form-item label="新增试题数量">
  322. <!-- <el-input-number
  323. style="width: 80px"
  324. v-model="form.properties.GEN_PAPER_QUESTION_COUNT"
  325. :step="1"
  326. :controls="false"
  327. ></el-input-number> -->
  328. <el-input
  329. style="width: 80px"
  330. maxLength="7"
  331. v-model="form.properties.GEN_PAPER_QUESTION_COUNT"
  332. ></el-input>
  333. </el-form-item>
  334. </template>
  335. </el-form>
  336. </div>
  337. </section>
  338. </template>
  339. <script>
  340. import { mapState } from "vuex";
  341. import { QUESTION_API } from "@/constants/constants.js";
  342. import { orgAiTransactionSaveApi, orgAiTransactionListApi } from "../api";
  343. import { getAiNums, updateAiNums } from "../../question/api";
  344. export default {
  345. name: "OrgProperty",
  346. data() {
  347. return {
  348. leftCount: "",
  349. permitCount: "",
  350. tab4Entered: false,
  351. treeCheckedCodes: [],
  352. style: {
  353. label_width_tab1: "120px",
  354. label_width_tab2: "120px",
  355. label_width_tab3: "120px",
  356. },
  357. menus: [
  358. // {
  359. // name: "题型设置",
  360. // val: "tab1",
  361. // },
  362. {
  363. name: "审核配置",
  364. val: "tab2",
  365. },
  366. {
  367. name: "查重配置",
  368. val: "tab3",
  369. },
  370. // {
  371. // name: "组卷配置",
  372. // val: "tab4",
  373. // },
  374. {
  375. name: "角色管理",
  376. val: "tab4",
  377. },
  378. {
  379. name: "AI命题",
  380. val: "tab5",
  381. },
  382. { name: "组卷配置", val: "tab6" },
  383. ],
  384. activeName: "tab2",
  385. rootOrgName: "",
  386. form: {
  387. orgId: null,
  388. properties: {
  389. // ROOT_ORG_QUESTION_TYPES: [],
  390. // ROOT_ORG_QUESTION_TYPES1: [],
  391. // ROOT_ORG_QUESTION_TYPES2: [],
  392. // ROOT_ORG_QUESTION_TYPES3: [],
  393. // QUESTION_TYPE_SPECIAL_SET: [],
  394. PAPER_AUDIT: "false",
  395. PAPER_FIRST_AUDIT: "false",
  396. PAPER_SECOND_AUDIT: "false",
  397. PAPER_THIRD_AUDIT: "false",
  398. EXAM_PAPER_AUDIT: "false",
  399. EXAM_PAPER_FIRST_AUDIT: "false",
  400. EXAM_PAPER_SECOND_AUDIT: "false",
  401. EXAM_PAPER_THIRD_AUDIT: "false",
  402. CHECK_DUPLICATE: "false",
  403. CHECK_OPTION_DUPLICATE_THRESHOLD: "false",
  404. CHECK_DUPLICATE_THRESHOLD: 80,
  405. OPTION_DUPLICATE_THRESHOLD: 94,
  406. CHECK_DUPLICATE_COUNT: 5,
  407. // 综合组卷
  408. // PAPER_BUILD_SYNTHESIS: "false",
  409. // AI命题
  410. AI_QUESTION_REMAINDER: 0,
  411. USE_AI_QUESTION: "false",
  412. GEN_PAPER_QUESTION_ENABLE: "true",
  413. GEN_PAPER_QUESTION_COUNT: "",
  414. GEN_PAPER_QUESTION_START: "",
  415. GEN_PAPER_QUESTION_END: "",
  416. },
  417. },
  418. timeRange: [],
  419. roleCode: "",
  420. roleList: [],
  421. rules: {
  422. // code: [{ required: true, validator: validateCode, trigger: "blur" }],
  423. },
  424. // AI命题
  425. trade: 10000,
  426. tradeOptions: [10000, 20000, 50000],
  427. tradeList: [],
  428. loading: false,
  429. defaultTreeProps: {
  430. label: "name",
  431. children: "subRolePrivilege",
  432. },
  433. treeData: [],
  434. };
  435. },
  436. computed: {
  437. ...mapState({ user: (state) => state.user }),
  438. },
  439. created() {
  440. this.form.orgId = this.$route.query.rootOrgId;
  441. this.rootOrgName =
  442. this.$route.query.rootOrgName + "(" + this.$route.query.rootOrgCode + ")";
  443. if (!this.form.orgId) {
  444. this.form.orgId = sessionStorage.getItem("org_prop_info_org_id");
  445. this.rootOrgName = sessionStorage.getItem("org_prop_info_org_name");
  446. } else {
  447. sessionStorage.setItem("org_prop_info_org_id", this.form.orgId);
  448. sessionStorage.setItem("org_prop_info_org_name", this.rootOrgName);
  449. }
  450. this.init();
  451. this.getTradeList();
  452. this.initAiNums();
  453. },
  454. mounted() {
  455. setTimeout(() => {
  456. this.$store.commit("UPDATE_CURRENT_PATHS", [
  457. "系统管理",
  458. "顶级机构管理",
  459. "机构设置",
  460. ]);
  461. }, 200);
  462. },
  463. methods: {
  464. initAiNums(msg) {
  465. getAiNums({
  466. rootOrgId: this.$route.query.rootOrgId,
  467. }).then((res) => {
  468. if (res.data) {
  469. this.leftCount = res.data?.leftCount;
  470. this.permitCount = res.data?.permitCount;
  471. if (msg) {
  472. this.$message.success(msg);
  473. }
  474. }
  475. });
  476. },
  477. updateAiNums() {
  478. updateAiNums({
  479. rootOrgId: this.$route.query.rootOrgId,
  480. }).then(() => {
  481. this.initAiNums("更新成功");
  482. });
  483. },
  484. init() {
  485. var url = QUESTION_API + "/org/allProperties/" + this.form.orgId;
  486. this.$httpWithMsg.get(url).then((response) => {
  487. if (response.data) {
  488. // if (response.data.ROOT_ORG_QUESTION_TYPES1) {
  489. // this.form.properties.ROOT_ORG_QUESTION_TYPES1 = JSON.parse(
  490. // response.data.ROOT_ORG_QUESTION_TYPES1
  491. // );
  492. // }
  493. // if (response.data.ROOT_ORG_QUESTION_TYPES2) {
  494. // this.form.properties.ROOT_ORG_QUESTION_TYPES2 = JSON.parse(
  495. // response.data.ROOT_ORG_QUESTION_TYPES2
  496. // );
  497. // }
  498. // if (response.data.ROOT_ORG_QUESTION_TYPES3) {
  499. // this.form.properties.ROOT_ORG_QUESTION_TYPES3 = JSON.parse(
  500. // response.data.ROOT_ORG_QUESTION_TYPES3
  501. // );
  502. // }
  503. // if (response.data.QUESTION_TYPE_SPECIAL_SET) {
  504. // this.form.properties.QUESTION_TYPE_SPECIAL_SET = JSON.parse(
  505. // response.data.QUESTION_TYPE_SPECIAL_SET
  506. // );
  507. // }
  508. this.form.properties = this.$objAssign(
  509. this.form.properties,
  510. response.data
  511. );
  512. this.timeRange = [
  513. response.data.GEN_PAPER_QUESTION_START || "",
  514. response.data.GEN_PAPER_QUESTION_END || "",
  515. ];
  516. }
  517. });
  518. },
  519. getRoleList() {
  520. this.$httpWithMsg
  521. .post(QUESTION_API + "/rolePrivilege/getRoles")
  522. .then((res) => {
  523. this.roleList = res.data;
  524. if (res.data?.length) {
  525. this.roleCode = res.data[0].code;
  526. }
  527. });
  528. },
  529. searchTree() {},
  530. setParams() {
  531. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES1) {
  532. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  533. }
  534. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES2) {
  535. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  536. }
  537. for (let i of this.form.properties.ROOT_ORG_QUESTION_TYPES3) {
  538. this.form.properties.ROOT_ORG_QUESTION_TYPES.push(i);
  539. }
  540. this.form.properties.ROOT_ORG_QUESTION_TYPES = JSON.stringify(
  541. this.form.properties.ROOT_ORG_QUESTION_TYPES
  542. );
  543. if (this.form.properties.ROOT_ORG_QUESTION_TYPES1) {
  544. this.form.properties.ROOT_ORG_QUESTION_TYPES1 = JSON.stringify(
  545. this.form.properties.ROOT_ORG_QUESTION_TYPES1
  546. );
  547. }
  548. if (this.form.properties.ROOT_ORG_QUESTION_TYPES2) {
  549. this.form.properties.ROOT_ORG_QUESTION_TYPES2 = JSON.stringify(
  550. this.form.properties.ROOT_ORG_QUESTION_TYPES2
  551. );
  552. }
  553. if (this.form.properties.ROOT_ORG_QUESTION_TYPES3) {
  554. this.form.properties.ROOT_ORG_QUESTION_TYPES3 = JSON.stringify(
  555. this.form.properties.ROOT_ORG_QUESTION_TYPES3
  556. );
  557. }
  558. if (this.form.properties.QUESTION_TYPE_SPECIAL_SET) {
  559. this.form.properties.QUESTION_TYPE_SPECIAL_SET = JSON.stringify(
  560. this.form.properties.QUESTION_TYPE_SPECIAL_SET
  561. );
  562. }
  563. },
  564. async save() {
  565. // this.setParams();
  566. let url = QUESTION_API + "/org/saveOrgProperties";
  567. if (this.form.properties.GEN_PAPER_QUESTION_ENABLE == "false") {
  568. this.timeRange = [];
  569. this.form.properties.GEN_PAPER_QUESTION_COUNT = "";
  570. }
  571. let GEN_PAPER_QUESTION_START = this.timeRange?.[0] || "";
  572. let GEN_PAPER_QUESTION_END = this.timeRange?.[1] || "";
  573. let params = {
  574. orgId: this.form.orgId,
  575. properties: {
  576. ...this.form.properties,
  577. GEN_PAPER_QUESTION_START,
  578. GEN_PAPER_QUESTION_END,
  579. },
  580. };
  581. let res = await this.$httpWithMsg.put(url, params).catch(() => {});
  582. if (!res) return;
  583. if (this.tab4Entered) {
  584. let res2 = await this.$httpWithMsg
  585. .post(QUESTION_API + "/rolePrivilege/savePrivilege", {
  586. privileges: this.treeCheckedCodes,
  587. rootOrgId: this.form.orgId,
  588. role: this.roleCode,
  589. })
  590. .catch(() => {});
  591. if (!res2) return;
  592. }
  593. this.$notify({
  594. type: "success",
  595. message: "保存成功!",
  596. });
  597. // this.back();
  598. },
  599. async getTradeList() {
  600. const res = await orgAiTransactionListApi(this.form.orgId);
  601. this.tradeList = res.data || [];
  602. },
  603. async toBuy() {
  604. if (!this.trade) return;
  605. const confirm = await this.$confirm(
  606. `确定要购买${this.trade}道吗?`,
  607. "提示",
  608. {
  609. type: "warning",
  610. }
  611. ).catch(() => {});
  612. if (confirm !== "confirm") return;
  613. if (this.loading) return;
  614. this.loading = true;
  615. const res = await orgAiTransactionSaveApi({
  616. rootOrgId: this.form.orgId,
  617. trade: this.trade,
  618. }).catch(() => {});
  619. this.loading = false;
  620. if (!res) return;
  621. this.$message.success("购买成功!");
  622. this.init();
  623. this.getTradeList();
  624. },
  625. back() {
  626. this.$router.push({ path: "/questions/school" });
  627. },
  628. treeCheckChange(curNode, isChecked) {
  629. let keys = this.$refs.authTree.getCheckedKeys(true);
  630. if (curNode.privilegeType === "BUTTON" && isChecked) {
  631. keys = Array.from(new Set([...keys, curNode.mountPageCode]));
  632. this.$refs.authTree.setCheckedKeys(keys);
  633. }
  634. // this.treeCheckedCodes = [...keys].filter(
  635. // (key) => !key.endsWith("__page")
  636. // );
  637. this.$nextTick(() => {
  638. let nodes = this.$refs.authTree.getCheckedNodes(false, true);
  639. this.treeCheckedCodes = nodes
  640. .map((item) => item.code)
  641. .filter((key) => !key.endsWith("__page"));
  642. });
  643. },
  644. filterTree(value, data) {
  645. return !data.originId;
  646. },
  647. },
  648. watch: {
  649. activeName(val) {
  650. if (val === "tab4" && !this.tab4Entered) {
  651. this.$nextTick(() => {
  652. this.getRoleList();
  653. });
  654. }
  655. },
  656. roleCode(val) {
  657. this.$httpWithMsg
  658. .post(
  659. QUESTION_API +
  660. `/rolePrivilege/getRolePrivileges?roleCode=${val}&rootOrgId=${this.form.orgId}`
  661. )
  662. .then((res) => {
  663. let checkedLeafCodes = [];
  664. res.data.forEach((level1) => {
  665. if (level1.subRolePrivilege?.length) {
  666. level1.subRolePrivilege = level1.subRolePrivilege.map(
  667. (level2) => {
  668. if (level2.subRolePrivilege?.length) {
  669. level2.subRolePrivilege = level2.subRolePrivilege.map(
  670. (v) => {
  671. v.mountPageCode = level2.code + "__page";
  672. v.enable && checkedLeafCodes.push(v.code);
  673. return v;
  674. }
  675. );
  676. level2.subRolePrivilege.unshift({
  677. code: level2.code + "__page",
  678. enable: level2.enable,
  679. name: "页面",
  680. privilegeType: "PAGE",
  681. originId: level2.code,
  682. });
  683. level2.enable &&
  684. checkedLeafCodes.push(level2.code + "__page");
  685. } else {
  686. level2.enable && checkedLeafCodes.push(level2.code);
  687. }
  688. return level2;
  689. }
  690. );
  691. } else {
  692. level1.enable && checkedLeafCodes.push(level1.code);
  693. }
  694. });
  695. this.treeData = res.data;
  696. //初始化选中状态,使用叶子节点的enable进行设置
  697. this.$refs.authTree.setCheckedKeys(checkedLeafCodes);
  698. });
  699. },
  700. treeData() {
  701. this.$nextTick(() => {
  702. this.$refs.authTree?.filter("");
  703. });
  704. },
  705. },
  706. };
  707. </script>
  708. <style lang="scss" scoped>
  709. .org-property {
  710. .tree-box {
  711. :deep(.custom-tree-node) {
  712. .is-page,
  713. .is-btn {
  714. padding: 3px 5px;
  715. font-size: 10px;
  716. border-radius: 4px;
  717. background: #67c23a;
  718. color: #fff;
  719. margin-left: 8px;
  720. vertical-align: middle;
  721. position: relative;
  722. top: -2px;
  723. }
  724. }
  725. }
  726. }
  727. </style>