workflowBase.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. <template>
  2. <div>
  3. <div class="flex-handle">
  4. <div class="flex-left">
  5. <div class="flex-left-header">
  6. <div class="flex-path">
  7. <div class="flex-left-header-text">
  8. 选择路径
  9. <div class="flex-path-list">
  10. <div v-if="manyReassignment" :class="actives" @click="clickManyTransfer(1)">
  11. 转派
  12. </div>
  13. <div v-if="transferStatus" :class="active" @click="clickTransfer(1)">
  14. 转派
  15. </div>
  16. <div v-if="copyStatus" @click="clickTransfer(2)">抄送</div>
  17. <div v-for="(item, index) in node.nextShapes" :key="index" :class="seleIndex == index ? 'active' : ''"
  18. @click="clickGetTree(item, index)">
  19. {{ item.properties.name }}
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. <div class="flex-commons">
  25. <div class="flex-left-header-text">
  26. 常用意见
  27. <span @click="clickEdit" class="flex-icon"><i class="el-icon-edit"></i>修改</span>
  28. </div>
  29. <div class="flex-slide">
  30. <div v-for="(item, index) in commonlyList" :key="index" ref="common" class="flex-common"
  31. @click="clickCommonly($event)">
  32. {{ item.dataName }}
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="flex-opinion">
  38. <div class="flex-left-header-text">意见内容</div>
  39. <el-input type="textarea" autosize placeholder="请输入内容" v-model="textarea">
  40. </el-input>
  41. </div>
  42. </div>
  43. <div class="flex-right" :class="{ copyClass: CopyStatus }">
  44. <div class="flex-left-header-text" :class="{ 'flex-right-text': CopyStatus }">
  45. 本部门人员办理
  46. <div style="display: flex">
  47. <div class="flex-header-text-tree">
  48. 候选人
  49. <deptTree ref="defTree" class="flex-slide" :treeList="treeList" @changeTree="changeTree" />
  50. </div>
  51. <div class="flex-header-text-tree">
  52. 已选人员
  53. <!-- <div class="">{{ selectUser }}</div> -->
  54. <div class="" v-for="(item, index) in backThree" :key="index">
  55. {{ item.loginNameStr }}
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <div v-if="CopyStatus" class="flex-left-header-text flex-right-text">
  61. 抄送人员
  62. <div style="display: flex">
  63. <div class="flex-header-text-tree">
  64. 抄送人
  65. <deptTree ref="defTrees" class="flex-slide" :treeList="treeCopyList" @changeTree="changeTreeCopy" />
  66. </div>
  67. <div class="flex-header-text-tree">
  68. 已选人员
  69. <div class="" v-for="(item, index) in copyUser" :key="index">
  70. {{ item.loginNameStr }}
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <div class="flex-footer-botton">
  78. <div class="flex-button">
  79. <el-button type="primary" @click="submitWork()" :loading="buttonLoading">提交</el-button>
  80. </div>
  81. </div>
  82. <el-dialog title="修改常用意见" :visible.sync="editStatus" width="100%" :before-close="editCloses" :modal="false"
  83. :destroy-on-close="true">
  84. <div style="overflow-y: scroll; overflow-x: hidden; height: 240px">
  85. <div v-for="(item, index) in commonlyList" :key="index" ref="common" class="flex-common">
  86. {{ item.dataName
  87. }}<i class="el-icon-circle-close" @click="deleStatus(item)"></i>
  88. </div>
  89. <div class="flex-common">
  90. <i class="el-icon-circle-plus-outline" @click="addStatus()"></i>
  91. </div>
  92. </div>
  93. </el-dialog>
  94. </div>
  95. </template>
  96. <script>
  97. import deptTree from "./workDeptThree.vue";
  98. export default {
  99. components: {
  100. deptTree,
  101. },
  102. name: "workflow",
  103. data() {
  104. return {
  105. active: "",
  106. buttonLoading: false, //按钮loadding
  107. manyPeopleStatus: false, //多人处理下发任务
  108. editStatus: false, //常用意见控制
  109. transferStatus: false, //转派按钮控制
  110. TransferStatus: false, //是否点击转派状态
  111. copyStatus: false, //抄送按钮控制
  112. CopyStatus: false, //是否点击抄送状态
  113. node: [], //路径列表
  114. seleIndex: "1099", //点击路径下标
  115. commonlyList: [], //常用意见数组
  116. textarea: "未填写意见", //意见内容字段
  117. copyUser: "", //抄送人员列表
  118. selectUser: "", //已选人员列表
  119. treeList: [], // 待选人员列表
  120. propsList: [],
  121. nodes: [],
  122. initialList: [], //第一次进入是加载节点
  123. clicknextName: "", //获取的流程节点
  124. backThree: [],
  125. treeCopyList: [],
  126. demand: "",
  127. nextDealManList: "",
  128. isLastManStatus: false,
  129. manyReassignment: false,
  130. actives: "",
  131. };
  132. },
  133. props: {
  134. // 表格数据和表格部分属性的对象
  135. // eslint-disable-next-line vue/require-default-prop
  136. list: {
  137. type: Object,
  138. },
  139. requestForm: {
  140. type: Object,
  141. },
  142. adminResourceId: {
  143. type: String,
  144. },
  145. },
  146. created() {
  147. console.log(this.list);
  148. this.getNextPath(this.list.resourceId, 1);
  149. this.getMetirialType();
  150. },
  151. methods: {
  152. //多人转派
  153. clickManyTransfer() {
  154. (this.actives = this.actives != "" ? "" : "active"),
  155. (this.seleIndex = "1099");
  156. this.getNextPath(this.adminResourceId, 3);
  157. },
  158. async getLastManList(e) {
  159. let _this = this;
  160. let obj = {
  161. url: _this.$url.formList.getComplateLastMan, //开始工作流接口
  162. data: e,
  163. // status: "form",
  164. headers: {
  165. "Content-Type": "application/json",
  166. },
  167. };
  168. let res = await this.common.httpPost(obj, success);
  169. function success(data) { }
  170. },
  171. async nextWorks(lists, list) {
  172. let listss = {
  173. userId: this.nextDealManList, //人员id
  174. taskId: this.list.taskId, //表单标识
  175. loginstr: JSON.parse(window.sessionStorage.userInfo).loginNoStr,
  176. // taskName: this.clicknextName, //流程节点
  177. content: this.textarea, //意见内容
  178. };
  179. if (this.manyReassignment == true) {
  180. let _this = this;
  181. let obj = {
  182. url: _this.$url.formList.getNewTransferTask + _this.list.taskId, //下一步工作流接口
  183. data: listss,
  184. status: "form",
  185. };
  186. await this.common.httpPost(obj, success);
  187. function success(data) {
  188. _this.$emit("beforeClose", true);
  189. }
  190. } else {
  191. let _this = this;
  192. let obj = {
  193. url: _this.$url.formList.nextWork, //下一步工作流接口
  194. data: lists,
  195. status: "form",
  196. };
  197. await this.common.httpPost(obj, success);
  198. function success(data) {
  199. console.log(data);
  200. let updateList = {
  201. taskId: data.taskid,
  202. id: _this.list.id,
  203. resourceId: _this.nodes.currentShape[0].resourceId,
  204. tableName: _this.requestForm.processDefinitionKey,
  205. };
  206. list.taskId = data.taskid;
  207. _this.setUpdate(updateList);
  208. _this.getLastManList(list);
  209. }
  210. }
  211. },
  212. submitWork() {
  213. this.buttonLoading = true
  214. //多人会签处理环节
  215. let list = {
  216. userId: JSON.parse(window.sessionStorage.userInfo).loginNo, //人员id
  217. taskId: this.list.taskId, //表单标识
  218. // procinstid: this.list.processId,
  219. taskName: this.clicknextName, //流程节点
  220. userCode: JSON.parse(window.sessionStorage.userInfo).loginNo, //人员code
  221. content: this.textarea, //意见内容
  222. };
  223. let newlist = {
  224. userId: JSON.parse(window.sessionStorage.userInfo).loginNo, //人员id
  225. taskId: this.list.taskId, //表单标识
  226. // procinstid: this.list.processId,
  227. taskName: this.clicknextName, //流程节点
  228. userCode: JSON.parse(window.sessionStorage.userInfo).loginNo, //人员code
  229. content: this.textarea, //意见内容
  230. };
  231. if (this.manyPeopleStatus == true) {
  232. list.procinstid = this.list.process_id;
  233. // if (this.backThree.length <= 1) {
  234. // this.$message.error("请选择多人");
  235. // return;
  236. // } else {
  237. list.lastmanList = this.nextDealManList;
  238. // }
  239. if (this.nodes.currentShape) {
  240. newlist.resolution = this.nodes.currentShape[0].condition.resolution;
  241. newlist.approve = this.nodes.currentShape[0].condition.approve;
  242. }
  243. if (this.backThree.length > 0) {
  244. newlist.nextDealMan = "admin";
  245. }
  246. this.nextWorks(newlist, list);
  247. } else {
  248. console.log(456);
  249. //生成需求决策编号
  250. if (this.clicknextName === "起草人发送") {
  251. this.getDemand();
  252. }
  253. if (!this.list.taskId) {
  254. this.$message.error("请先保存表单后处理");
  255. return false;
  256. }
  257. if (this.TransferStatus === true) {
  258. if (this.backThree.length > 0) {
  259. this.nextWork();
  260. } else {
  261. this.$message.error("请选择候选人");
  262. return false;
  263. }
  264. } else {
  265. if (this.copyUser.length) {
  266. //抄送
  267. // list.copyman = this.treeCopyList[0].loginNoStrCopy;
  268. // list.copyman = this.copyUser;
  269. list.copyman = ''
  270. this.copyUser.map((item) => {
  271. list.copyman += item.loginNoStr + ','
  272. })
  273. }
  274. if (this.isLastManStatus == true) {
  275. list.lastman = "yes";
  276. list.lastManDecision = "yes";
  277. list.resourceId = this.nodes.currentShape[0].resourceId
  278. }
  279. if (this.nodes.currentShape) {
  280. list.resolution = this.nodes.currentShape[0].condition.resolution;
  281. list.approve = this.nodes.currentShape[0].condition.approve;
  282. }
  283. if (this.clicknextName === "") {
  284. this.$message.error("请选择流程节点");
  285. return false;
  286. }
  287. if (this.backThree.length > 0) {
  288. if (this.manyPeopleStatus == true) {
  289. list.nextDealManList = this.nextDealManList;
  290. } else {
  291. list.nextDealMan = this.backThree[0].loginNoStr;
  292. }
  293. } else {
  294. if (this.clicknextName === "流程结束" || this.clicknextName === "提交至任务发起人") {
  295. } else {
  296. this.$message.error("请选择候选人");
  297. return false;
  298. }
  299. }
  300. this.nextWork(list);
  301. }
  302. }
  303. },
  304. //生成需求决策编号接口
  305. getDemand() {
  306. this.$http({
  307. url: "/market/waf/getBusi",
  308. method: "post",
  309. headers: {
  310. "Content-Type": "application/json",
  311. },
  312. data: {},
  313. }).then((res) => {
  314. this.demand = res.data;
  315. });
  316. },
  317. async nextWork(list) {
  318. console.log(list);
  319. //e:yes||no,list:传入数组,title:结束标签,res:驳回标签,id:工单更新id
  320. let _this = this;
  321. let copylist = list
  322. let obj = {
  323. url: _this.$url.formList.nextWork, //下一步工作流接口
  324. data: list,
  325. status: "form",
  326. };
  327. if (_this.TransferStatus === true) {
  328. let lists = {
  329. userId: _this.backThree[0].loginNoStr,
  330. taskId: _this.list.taskId,
  331. content: _this.textarea,
  332. };
  333. obj.url = _this.$url.formList.transferTask + _this.list.taskId;
  334. obj.data = lists;
  335. }
  336. await this.common.httpPost(obj, success);
  337. function success(data) {
  338. if (data != null) {
  339. console.log(123);
  340. if (_this.TransferStatus === true) {
  341. let list = {
  342. taskId: data.taskid,
  343. id: _this.list.id,
  344. tableName: _this.requestForm.processDefinitionKey,
  345. };
  346. _this.setUpdate(list);
  347. } else {
  348. let list = {
  349. taskId: data.taskid,
  350. id: _this.list.id,
  351. resourceId: _this.nodes.currentShape[0].resourceId,
  352. taskName: _this.nodes.nextShapes[0].properties.name,
  353. tableName: _this.requestForm.processDefinitionKey,
  354. };
  355. if (data.copytaskid) {
  356. list.copytaskid = data.copytaskid;
  357. // list.copyman = _this.treeCopyList[0].loginNoStrCopy;
  358. list.copyman = copylist.copyman;
  359. }
  360. if (_this.demand) {
  361. list.needNo = _this.demand;
  362. }
  363. _this.setUpdate(list);
  364. }
  365. } else {
  366. console.log(_this.list.id);
  367. console.log(_this.requestForm.processDefinitionKey);
  368. console.log(456);
  369. let list = {
  370. taskName: "结束",
  371. id: _this.list.id,
  372. tableName: _this.requestForm.processDefinitionKey,
  373. };
  374. _this.setUpdate(list);
  375. }
  376. }
  377. },
  378. setUpdate(e) {
  379. this.$http({
  380. url: "/market/waf/updateBase",
  381. method: "post",
  382. headers: {
  383. "Content-Type": "application/json",
  384. },
  385. data: e,
  386. }).then((res) => {
  387. this.$emit("updateForm", true);
  388. this.buttonLoading = false
  389. });
  390. },
  391. //查询路径接口
  392. getNextPath(e, status) {
  393. let { fresourceId, processDefinitionKey } = this.requestForm;
  394. let list = {
  395. fresourceId: fresourceId,
  396. processId: processDefinitionKey,
  397. };
  398. e ? (list.resourceId = e) : list;
  399. this.$http({
  400. url: "/market/waf/queryPath",
  401. method: "post",
  402. headers: {
  403. "Content-Type": "application/json",
  404. },
  405. data: list,
  406. }).then((res) => {
  407. if (status === 1) {
  408. //第一次进入取路径
  409. this.initialList = res.data.body;
  410. if (res.data.body.nextShapes[0].multi !== null) {
  411. if (res.data.body.nextShapes[0].multi.multi === "true") {
  412. // this.getqueryMultiTaskId();
  413. this.isLastManStatus = true;
  414. } else {
  415. this.isLastManStatus = false;
  416. }
  417. }
  418. if (res.data.body.nextShapes[0].loop !== null) {
  419. if (res.data.body.nextShapes[0].loop.loop === "true") {
  420. this.transferStatus = true; //转派按钮生效
  421. } else {
  422. this.transferStatus = false;
  423. }
  424. } else {
  425. this.transferStatus = false;
  426. }
  427. if (res.data.body.nextShapes[0].copy !== null) {
  428. if (res.data.body.nextShapes[0].copy.copy === "true") {
  429. this.copyStatus = true; //抄送按钮生效
  430. this.CopyStatus = true;
  431. } else {
  432. this.copyStatus = false;
  433. }
  434. } else {
  435. this.copyStatus = false;
  436. }
  437. res.data.body.currentShape.map((item, index) => {
  438. this.getNextPath(item.resourceId, 2);
  439. });
  440. }
  441. if (status === 2) {
  442. if (res.data.body.nextShapes[0].condition !== null) {
  443. this.node = res.data.body;
  444. } else {
  445. this.getNextPath(res.data.body.nextShapes[0].resourceId, 2);
  446. }
  447. }
  448. if (status === 3) {
  449. this.nodes = res.data.body;
  450. this.getTreeLists(res.data.body, 1);
  451. if (res.data.body.nextShapes[0].multi !== null) {
  452. if (res.data.body.nextShapes[0].multi.multi === "true") {
  453. this.manyPeopleStatus = true; //转派按钮生效
  454. } else {
  455. this.manyPeopleStatus = false;
  456. }
  457. } else {
  458. this.manyPeopleStatus = false;
  459. }
  460. }
  461. });
  462. },
  463. //查询候选人接口
  464. getTreeLists(e, status) {
  465. let createdId = "createId";
  466. let id =
  467. e.nextShapes[0].properties.documentation.indexOf(createdId) != -1
  468. ? this.list.createId
  469. : e.nextShapes[0].properties.documentation;
  470. console.log(id);
  471. this.$http({
  472. url: "/market/api/user/info/queryNodePers?params=" + id,
  473. method: "post",
  474. headers: {
  475. "Content-Type": "application/json",
  476. },
  477. data: "",
  478. }).then((res) => {
  479. console.log(status);
  480. if (status === 2) {
  481. // this.treeCopyList = res.data; //抄送
  482. // this.$refs.defTrees.treeList = res.data;
  483. } else {
  484. this.treeList = res.data; //抄送
  485. // this.$refs.defTree.treeList = res.data;
  486. console.log(this.treeList);
  487. }
  488. });
  489. if (this.copyStatus == true) {
  490. this.$http({
  491. url: "/market/api/user/info/queryNodePers?params=" + e.nextShapes[0].properties.formkeydefinition,
  492. method: "post",
  493. headers: {
  494. "Content-Type": "application/json",
  495. },
  496. data: "",
  497. }).then((res) => {
  498. console.log(status);
  499. this.treeCopyList = res.data; //抄送
  500. });
  501. } else {
  502. }
  503. },
  504. //转派按钮方法
  505. clickTransfer(e) {
  506. if (e == 1) {
  507. this.TransferStatus = true;
  508. } else if (e == 2) {
  509. this.CopyStatus = true;
  510. }
  511. this.getTreeLists(this.initialList, e);
  512. },
  513. //点击节点获取下一步的处理人字段
  514. clickGetTree(e, index) {
  515. this.$refs.defTree.userList = [];
  516. this.backThree = [];
  517. this.$refs.defTree.userList = [];
  518. this.backThree = [];
  519. this.copyUser = [];
  520. // this.CopyStatus = false;
  521. this.TransferStatus = false;
  522. // this.clickTaskName = e.properties.name;
  523. this.clicknextName = e.properties.name;
  524. console.log(this.clicknextName);
  525. this.seleIndex = index;
  526. this.getNextPath(e.resourceId, 3); //1 为点击后获取线
  527. },
  528. //点击常用意见方法
  529. clickCommonly(e) {
  530. this.textarea = e.currentTarget.innerHTML;
  531. },
  532. //点击修改
  533. clickEdit() {
  534. this.editStatus = true;
  535. },
  536. //选择树的回调
  537. changeTree(e) {
  538. if (this.manyPeopleStatus == true) {
  539. this.backThree = e;
  540. let arr = [];
  541. this.backThree.map((item) => {
  542. arr.push(item.loginNoStr);
  543. });
  544. this.nextDealManList = arr.toString();
  545. } else {
  546. if (e.length > 1) {
  547. this.$message.error("只能选择一个人");
  548. return;
  549. } else {
  550. this.backThree = e;
  551. if (this.CopyStatus === true) {
  552. this.getTreeLists(e[0].loginNoStr, 2);
  553. }
  554. if (e[0]) {
  555. this.selectUser = e[0].loginNameStr;
  556. } else {
  557. this.selectUser = "暂无选择";
  558. }
  559. }
  560. }
  561. },
  562. changeTreeCopy(e) {
  563. console.log(e);
  564. this.copyUser = e
  565. },
  566. //获取字典表常用意见
  567. getMetirialType(e) {
  568. this.$http({
  569. url: "/market/cfgDataDict/queryList",
  570. method: "post",
  571. headers: {
  572. "Content-Type": "application/json",
  573. },
  574. data: {
  575. dictCodePks: "approval",
  576. },
  577. }).then((res) => {
  578. console.log(res);
  579. this.commonlyList = res.data;
  580. });
  581. },
  582. //添加字典表常用意见
  583. geaddctType(e) {
  584. this.$http({
  585. url: "/market/cfgDataDict/add",
  586. method: "post",
  587. headers: {
  588. "Content-Type": "application/json",
  589. },
  590. data: e,
  591. }).then((res) => {
  592. this.getMetirialType();
  593. });
  594. },
  595. //关闭修改
  596. editCloses() {
  597. this.editStatus = false;
  598. },
  599. //常用意见添加
  600. addStatus() {
  601. let newData = Date.parse(new Date());
  602. this.$prompt("请输入常用意见", "提示", {
  603. confirmButtonText: "确定",
  604. cancelButtonText: "取消",
  605. })
  606. .then(({ value }) => {
  607. let list = {
  608. dictCode: "approval",
  609. dataCode: newData,
  610. dataName: value,
  611. dictName: "审批意见",
  612. };
  613. this.geaddctType(list);
  614. this.$message({
  615. type: "success",
  616. message: "常用意见添加成功",
  617. });
  618. })
  619. .catch(() => {
  620. this.$message({
  621. type: "info",
  622. message: "取消输入",
  623. });
  624. });
  625. },
  626. //常用意见删除
  627. deleStatus(e) {
  628. this.$confirm("此操作将删除此常用意见, 是否继续?", "提示", {
  629. confirmButtonText: "确定",
  630. cancelButtonText: "取消",
  631. type: "warning",
  632. })
  633. .then(() => {
  634. let list = {
  635. dataCode: e.dataCode,
  636. dictCode: "approval",
  637. };
  638. this.geDelectType(list);
  639. this.$message({
  640. type: "success",
  641. message: "删除成功!",
  642. });
  643. })
  644. .catch(() => {
  645. this.$message({
  646. type: "info",
  647. message: "已取消删除",
  648. });
  649. });
  650. },
  651. //删除字典表常用意见
  652. geDelectType(e) {
  653. this.$http({
  654. url: "/market/cfgDataDicts/del",
  655. method: "post",
  656. headers: {
  657. "Content-Type": "application/json",
  658. },
  659. data: e,
  660. }).then((res) => {
  661. this.getMetirialType();
  662. });
  663. },
  664. },
  665. };
  666. </script>
  667. <style lang='scss' scoped>
  668. .flex-header-text-tree {
  669. width: 50%;
  670. text-align: center;
  671. }
  672. .flex-icon {
  673. float: right;
  674. margin-right: 20px;
  675. color: #4277a1;
  676. }
  677. .flex-handle {
  678. width: 100%;
  679. padding: 30px;
  680. display: flex;
  681. .flex-right {
  682. width: 50%;
  683. border: 1px solid #e1e1e1;
  684. margin-left: 20px;
  685. }
  686. }
  687. .flex-left {
  688. width: 50%;
  689. display: flex;
  690. flex-direction: column;
  691. .flex-left-header {
  692. display: flex;
  693. justify-content: space-around;
  694. .flex-path {
  695. height: 280px;
  696. border: 1px solid #e1e1e1;
  697. width: 68%;
  698. }
  699. }
  700. }
  701. .flex-common {
  702. padding: 10px 5%;
  703. font-size: 18px;
  704. }
  705. .flex-left-header-text {
  706. height: 40px;
  707. line-height: 40px;
  708. color: black;
  709. padding-left: 10px;
  710. background-color: #cde4f6;
  711. font-size: 18px;
  712. font-weight: bold;
  713. }
  714. .flex-path-list {
  715. overflow-y: scroll;
  716. overflow-x: hidden;
  717. height: 14rem;
  718. }
  719. .flex-slide {
  720. overflow-y: scroll;
  721. overflow-x: hidden;
  722. }
  723. .active {
  724. background-color: #f3faff;
  725. }
  726. .flex-opinion {
  727. height: 280px;
  728. border: 1px solid #e1e1e1;
  729. width: 100%;
  730. margin-top: 20px;
  731. }
  732. .flex-right-text {
  733. margin-right: 20px;
  734. width: 50%;
  735. }
  736. .flex-commons {
  737. height: 280px;
  738. border: 1px solid #e1e1e1;
  739. width: 30%;
  740. }
  741. .flex-footer-botton {
  742. display: flex;
  743. justify-content: space-evenly;
  744. }
  745. .flex-button {
  746. margin-top: 10px;
  747. margin-bottom: 10px;
  748. ::v-deep .el-button--primary {
  749. width: 222px;
  750. }
  751. }
  752. .copyClass {
  753. display: flex;
  754. }
  755. </style>