workflowBase.vue 22 KB

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