electronicSignature.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. <template>
  2. <div>
  3. <div class="dianqian">
  4. <el-row :span="24">
  5. <el-col :span="3.3" style="line-height: 40px">
  6. 元素坐标:
  7. </el-col>
  8. <el-col :span="18">
  9. <avue-input v-model="htmlData1.name" placeholder="请点击坐标" :disabled='true'></avue-input>
  10. </el-col>
  11. </el-row>
  12. <el-row :span="24">
  13. <el-col :span="3.3" style="line-height: 40px">
  14. 证书类型:
  15. </el-col>
  16. <el-col :span="18">
  17. <el-select v-model="signType" placeholder="请选择证书类型" @change="signTypeChang()">
  18. <el-option v-for="item in seloptions" :label="item.label" :value="item.value" :key="item.value"></el-option>
  19. </el-select>
  20. </el-col>
  21. </el-row>
  22. <el-row :span="24" v-if="signType==2">
  23. <el-col :span="3.3">
  24. 所属方:
  25. </el-col>
  26. <el-col :span="18">
  27. <avue-radio v-model="radio" :dic="roleType" v-on:click="roleTypeChang()"></avue-radio>
  28. </el-col>
  29. </el-row>
  30. <el-row :span="24" v-if="signType==2">
  31. <el-col :span="3.3" style="line-height: 40px">
  32. 签字角色:
  33. </el-col>
  34. <el-col :span="18">
  35. <el-select v-model="roleInfo" placeholder="请选择签字岗位" filterable @change="changeRole">
  36. <el-option v-for="item in options" :key="item" :value="item" :label="item.label"></el-option>
  37. </el-select>
  38. </el-col>
  39. </el-row>
  40. <el-row :span="24" v-if="signType==2">
  41. <el-col :span="3.3" style="line-height: 40px">签字时间:</el-col>
  42. <el-col :span="18">
  43. <div style="height: 40px; display: flex; align-items: center">
  44. <el-checkbox v-model="timesTimeElement.timeState" :true-label="1" :false-label="2">是否需要获取签字时间</el-checkbox>
  45. </div>
  46. </el-col>
  47. </el-row>
  48. <el-row :span="24" v-if="timesTimeElement.timeState === 1">
  49. <el-col :span="3.3" style="line-height: 40px">时间元素:</el-col>
  50. <el-col :span="14">
  51. <el-input v-model="timesTimeElement.timeName" placeholder="请点击后,在左边选择元素" @focus="timeElementFocus"></el-input>
  52. </el-col>
  53. <el-col :span="3" style="margin-left: 5px">
  54. <el-button type="primary" :disabled="!isTimeElement" @click="timeElementFinish">完成</el-button>
  55. </el-col>
  56. </el-row>
  57. <el-row :span="24" v-if="signType==6">
  58. <el-col :span="3.3" style="line-height: 40px">
  59. 签章类型:
  60. </el-col>
  61. <el-col :span="18">
  62. <el-select v-model="signInfo" placeholder="请选择签章类型" @change="signInfoChang">
  63. <el-option v-for="item in options" :key="item.dictKey" :value="item.dictKey"
  64. :label="item.dictValue"></el-option>
  65. </el-select>
  66. </el-col>
  67. </el-row>
  68. <el-row :span="24">
  69. <el-col :span="3.3" style="line-height: 40px">
  70. 偏移位X:
  71. </el-col>
  72. <el-col :span="16">
  73. <avue-input v-model="pyzbx" placeholder="横坐标,负代表左移,正代表右移,偏移量50大概等于一厘米"
  74. type="number"></avue-input>
  75. </el-col>
  76. </el-row>
  77. <el-row :span="24">
  78. <el-col :span="3.3" style="line-height: 40px">
  79. 偏移位Y:
  80. </el-col>
  81. <el-col :span="16">
  82. <avue-input v-model="pyzby" placeholder="纵坐标,负代表下移,正代表上移,偏移量50大概等于一厘米"
  83. type="number"></avue-input>
  84. </el-col>
  85. </el-row>
  86. <el-row :span="24" style="text-align: center">
  87. <el-button type="warning"
  88. size="small"
  89. icon="el-icon-view"
  90. @click="previewClick()">预览
  91. </el-button> &nbsp;&nbsp;
  92. <el-button type="primary"
  93. size="small"
  94. icon="el-icon-circle-plus-outline"
  95. @click="addRoleInfo()">添加列表
  96. </el-button> &nbsp;&nbsp;
  97. </el-row>
  98. </div>
  99. <div style="border: 1px dotted rgb(187, 187, 187);box-sizing: border-box;padding: 0px 15px;" class="martop20 marbottom10">
  100. <el-tabs v-model="activeName" @tab-click="handleActiveClick">
  101. <el-tab-pane label="电签配置" name="tab1">
  102. <table @click class="table martop20 copyTable" width='100%' border='1px ' bordercolor="#E5E5E5" cellpadding='2px'>
  103. <thead cellpadding='2px' height='40px'>
  104. <tr>
  105. <th >元素位置</th>
  106. <th>签字岗位</th>
  107. <th>电签来源</th>
  108. <th>签字时间元素位置</th>
  109. <th >偏移x</th>
  110. <th>偏移y</th>
  111. <th >操作</th>
  112. </tr>
  113. </thead>
  114. <tbody height='36px'>
  115. <tr v-for="(item,key) in setsignaTable" :key="key" v-on:click="">
  116. <td>{{ item.colName }}</td>
  117. <td>{{ item.sigRoleName }}</td>
  118. <td align="center">
  119. <el-tag type="success" v-if="item.isSystem==1">电签角色库</el-tag>
  120. <el-tag type="info" v-if="item.isSystem==2">项目匹配</el-tag>
  121. <el-tag type="warning" v-if="item.isSystem==0">本表配置</el-tag>
  122. </td>
  123. <td>{{ item.timeName }}</td>
  124. <td>{{ item.pyzbx }}</td>
  125. <td>{{ item.pyzby }}</td>
  126. <td align="center">
  127. <span style="color:#409EFF;;cursor: pointer;margin-right: 5px;" @click="editClick(item)" v-if="item.show===false">编辑</span>
  128. <span style="color:green;;cursor: pointer;margin-right: 5px;" @click="saveClick(item)" v-else v-loading="isEditLoaing">保存</span>
  129. <span style="color:red;cursor: pointer;" v-on:click="deleteTableSig(key,item.id,item)">删除</span>
  130. </td>
  131. </tr>
  132. </tbody>
  133. </table>
  134. </el-tab-pane>
  135. <el-tab-pane label="系统识别" name="tab2">
  136. <table @click class="table martop20 copyTable" width='100%' border='1px ' bordercolor="#E5E5E5" cellpadding='2px'>
  137. <thead cellpadding='2px' height='40px'>
  138. <tr>
  139. <th width='30%'>元素位置</th>
  140. <th width='30%'>签字岗位</th>
  141. <th width='30%'>签字时间元素位置</th>
  142. <th width='10%'>偏移x</th>
  143. <th width='10%'>偏移y</th>
  144. </tr>
  145. </thead>
  146. <tbody height='36px'>
  147. <tr v-for="(item,key) in setsignaTable2" :key="key" v-on:click="">
  148. <td>{{ item.colName }}</td>
  149. <td>{{ item.sigRoleName }}</td>
  150. <td>{{ item.timeName }}</td>
  151. <td>{{ item.pyzbx }}</td>
  152. <td>{{ item.pyzby }}</td>
  153. </tr>
  154. </tbody>
  155. </table>
  156. </el-tab-pane>
  157. </el-tabs>
  158. <el-button type="primary" size="small" class="martop25" style="float:right;" icon="el-icon-circle-plus-outline" :loading="saveLoaing" @click="saveSingInfo()">保存入库</el-button> &nbsp;&nbsp;
  159. </div>
  160. </div>
  161. </template>
  162. <script>
  163. import {
  164. getRoleInfoByParentId,
  165. getRoleType,
  166. getSigList,
  167. saveSig,
  168. remove,
  169. updateDetail,
  170. getSignDetail
  171. } from "../../../../../api/manager/AdjustForm";
  172. import {findPfxType, getPriwbsPdf} from "../../../../../api/certificate/list";
  173. import {f} from "vuedraggable/dist/vuedraggable.common";
  174. export default {
  175. props: ['pkeyId1', 'htmlData1', 'excelId', 'times'],
  176. data() {
  177. return {
  178. radio: '',
  179. isTimeElement: false,
  180. timesTimeElement: {
  181. timeState: 2,
  182. },
  183. roleType: [],
  184. options: [],
  185. roleInfo: '',
  186. signInfo: '',
  187. signInfoarr: [],
  188. signType: '2', // 证书类型
  189. pyzbx: 0.0,
  190. pyzby: 0.0,
  191. setsignaTable: [],
  192. seloptions: [
  193. {
  194. value: '2',
  195. label: '个人证书',
  196. },
  197. {
  198. value: '6',
  199. label: '企业证书',
  200. }
  201. ],
  202. isCansave: false,
  203. colKey: '',
  204. colName: '',
  205. signId: '',
  206. isDeleted: '',
  207. parentRoleId: '',
  208. isEditLoaing: false,
  209. sigRoleName: '',
  210. saveLoaing: false,
  211. activeName: 'tab1',
  212. setsignaTable2: [],
  213. }
  214. },
  215. watch: {
  216. 'htmlData1': {
  217. handler(val) {
  218. setTimeout(async () => {
  219. if (val.obj) {
  220. let obj = val.obj
  221. this.signType = obj.type.toString()
  222. this.pyzbx = obj.pyzbx
  223. this.pyzby = obj.pyzby
  224. this.sigRoleId = obj.sigRoleId
  225. this.colKey = val.keyname
  226. this.colName = obj.colName
  227. this.signId = obj.id
  228. this.isDeleted = obj.isDeleted
  229. if (obj.type == 2) {
  230. this.radio = obj.parentRoleId
  231. await this.roleTypeChang()
  232. } else {
  233. this.radio = ''
  234. await this.signTypeChang()
  235. this.signInfo = obj.sigRoleId
  236. this.options.forEach((ele) => {
  237. if (ele.dictKey === this.signInfo) {
  238. this.sigRoleName = ele.dictValue
  239. }
  240. })
  241. }
  242. } else {
  243. let isEdit = this.setsignaTable.some(element => element.show === true);
  244. if (!isEdit) {
  245. this.radio = ''
  246. this.roleInfo = ''
  247. this.signInfo = ''
  248. this.signType = '2'
  249. this.pyzbx = 0
  250. this.pyzby = 0
  251. }
  252. this.colKey = val.keyname
  253. }
  254. }, 1000);
  255. // todo
  256. },
  257. deep: true
  258. },
  259. 'options': {
  260. handler(val) {
  261. if (this.sigRoleId && val.length > 0 && this.radio.length > 1) {
  262. this.options.forEach((ele) => {
  263. if (ele.value === this.sigRoleId) {
  264. this.roleInfo = ele
  265. }
  266. })
  267. }
  268. }
  269. },
  270. 'times': {
  271. handler(obj) {
  272. this.$set(this.timesTimeElement, 'timeName', obj.colName)
  273. this.$set(this.timesTimeElement, 'timeColKey', obj.keyname)
  274. },
  275. deep: true
  276. }
  277. },
  278. methods: {
  279. async getRoleType() {//获取角色类型
  280. const {data: res} = await getRoleType()
  281. if (res.code === 200) {
  282. this.roleType = res.data
  283. }
  284. },
  285. // 签证类型
  286. async signTypeChang() {
  287. setTimeout(async () => {
  288. if (this.signType == 6) {
  289. const {data: res} = await findPfxType({typeOrStatus: 'pfx_type'})
  290. if (res.code === 200) {
  291. this.options = res.data
  292. }
  293. }
  294. }, 200);
  295. },
  296. // 单选按钮改变事件
  297. async roleTypeChang() {
  298. setTimeout(async () => {
  299. const {data: res} = await getRoleInfoByParentId({ParentId: this.radio})
  300. if (res.code === 200) {
  301. this.options = res.data
  302. }
  303. }, 200);
  304. },
  305. //签章类型改变e
  306. signInfoChang(e) {
  307. console.log(e, 'e');
  308. this.signInfoarr = this.options.filter(item => {
  309. if (item.dictKey === e) {
  310. return item
  311. }
  312. })
  313. this.options.forEach((ele) => {
  314. if (ele.dictKey === this.signInfo) {
  315. this.sigRoleName = ele.dictValue
  316. }
  317. })
  318. },
  319. //角色改变
  320. changeRole(e) {
  321. this.sigRoleName = e.label
  322. this.sigRoleId = e.value
  323. },
  324. //预览
  325. previewClick() {
  326. let _this = this
  327. console.log('预览', this.pkeyId1)
  328. getPriwbsPdf(this.pkeyId1).then(({data}) => {
  329. if (data.code === 200 && data.data) {
  330. window.open(data.data, '_blank')
  331. } else {
  332. _this.$message({
  333. type: "error",
  334. message: data.msg || "预览失败"
  335. });
  336. }
  337. })
  338. },
  339. async addRoleInfo() {
  340. var isadd = true;
  341. // 集合中添加数据
  342. var data = {};
  343. // 坐标位置
  344. if (this.htmlData1.name === '') {
  345. this.$message({
  346. type: "error",
  347. message: "请选坐标位置"
  348. });
  349. return;
  350. } else if (this.htmlData1.name === '警告') {
  351. this.$message({
  352. type: "warning",
  353. message: "警告框不能配置电签"
  354. });
  355. return;
  356. }
  357. // 证书类型
  358. if (this.signType === '') {
  359. this.$message({
  360. type: "error",
  361. message: "请选择证书类型"
  362. });
  363. return;
  364. }
  365. if (this.signType == 2) {
  366. if (this.roleInfo === '') {
  367. this.$message({
  368. type: "error",
  369. message: "请选择签字岗位"
  370. });
  371. return;
  372. }
  373. data.sigRoleId = this.roleInfo.value;
  374. data.sigRoleName = this.roleInfo.label;
  375. data.type = 2;
  376. } else if (this.signType == 6) {
  377. if (this.signInfo === '') {
  378. this.$message({
  379. type: "error",
  380. message: "请选择签章类型"
  381. });
  382. return;
  383. }
  384. // data.sigRoleId = this.signInfo.dictKey;
  385. // data.sigRoleName = this.signInfo.dictValue;
  386. data.sigRoleId = this.signInfoarr[0].dictKey;
  387. data.sigRoleName = this.signInfoarr[0].dictValue;
  388. data.type = 6;
  389. }
  390. data.colKey = "__" + this.htmlData1.tr + "_" + this.htmlData1.td;
  391. data.tabId = this.pkeyId1;
  392. data.colName = this.htmlData1.name;
  393. data.pyzbx = this.pyzbx;
  394. data.pyzby = this.pyzby;
  395. //签字时间
  396. const times = this.timesTimeElement
  397. data.timeState = times.timeState || 2;
  398. data.timeName = times.timeName;
  399. data.timeColKey = times.timeColKey;
  400. if (data.timeState === 1 && (!data.timeName || data.timeName === '')) {
  401. this.$message({type: "error", message: "请先配置签字时间"});
  402. return;
  403. }
  404. try {
  405. this.setsignaTable.forEach(val => {
  406. if (val.sigRoleId == data.sigRoleId && val.colName == data.colName) {
  407. this.$message({
  408. type: "error",
  409. message: "一个位置只能配置一个岗位"
  410. });
  411. isadd = false;
  412. }
  413. })
  414. if (isadd) {
  415. data.show = false
  416. data.colKey = this.htmlData1.keyname
  417. this.setsignaTable.push(data);
  418. }
  419. } catch (e) {
  420. throw e;
  421. }
  422. },
  423. async editClick(item) {
  424. console.log(item, 'item222');
  425. this.setsignaTable.forEach((ele) => {
  426. ele.show = false
  427. })
  428. item.show = true
  429. console.log(this.htmlData1, 'htmlData222');
  430. const {data: res} = await getSignDetail({id: item.id, tabId: this.pkeyId1})
  431. if (res.code === 200) {
  432. console.log(res, 'res');
  433. this.htmlData1.obj = res.data
  434. debugger
  435. let obj = this.htmlData1.obj
  436. console.log(obj, 'opbj');
  437. if (obj) {
  438. console.log(obj, 'obj');
  439. this.htmlData1.name = obj.colName;
  440. this.htmlData1.keyname = obj.colKey;
  441. this.signType = obj.type.toString()
  442. this.pyzbx = obj.pyzbx
  443. this.pyzby = obj.pyzby
  444. this.sigRoleId = obj.sigRoleId
  445. this.sigRoleName = obj.sigRoleName
  446. this.colKey = obj.colKey
  447. this.colName = obj.colName
  448. this.signId = obj.id
  449. this.isDeleted = obj.isDeleted
  450. if (obj.type == 2) {
  451. this.radio = obj.parentRoleId
  452. await this.roleTypeChang()
  453. } else {
  454. this.radio = ''
  455. await this.signTypeChang()
  456. this.signInfo = obj.sigRoleId
  457. this.options.forEach((ele) => {
  458. if (ele.dictKey === this.signInfo) {
  459. this.sigRoleName = ele.dictValue
  460. }
  461. })
  462. }
  463. //签字时间
  464. this.timesTimeElement = {
  465. timeState: obj.timeState || 2,
  466. timeName: obj.timeName,
  467. timeColKey: obj.timeColKey
  468. }
  469. } else {
  470. this.radio = ''
  471. this.roleInfo = ''
  472. this.signInfo = ''
  473. this.signType = ''
  474. this.pyzbx = 0
  475. this.pyzby = 0
  476. //签字时间
  477. this.timesTimeElement = {
  478. timeState: 2,
  479. timeName: '',
  480. timeColKey: ''
  481. }
  482. }
  483. }
  484. console.log(this.htmlData1, ' this.htmlData1111');
  485. this.$emit('edit', true)
  486. },
  487. saveClick(item) {
  488. console.log('保存');
  489. debugger;
  490. this.editRoleInfo(item)
  491. },
  492. async editRoleInfo() {
  493. let obj = {}
  494. obj.colKey = this.colKey
  495. obj.colName = this.colName
  496. obj.sigRoleName = this.sigRoleName
  497. obj.tabId = this.pkeyId1
  498. obj.excelId = this.excelId
  499. obj.type = this.signType
  500. obj.pyzbx = this.pyzbx
  501. obj.pyzby = this.pyzby
  502. obj.id = this.signId
  503. obj.isDeleted = this.isDeleted
  504. const times = this.timesTimeElement
  505. obj.timeState = times.timeState || 2
  506. obj.timeName = times.timeName
  507. obj.timeColKey = times.timeColKey
  508. if (this.signType == 2) {
  509. obj.parentRoleId = this.radio
  510. obj.sigRoleId = this.sigRoleId
  511. } else {
  512. obj.sigRoleId = this.signInfo
  513. }
  514. let arr = this.setsignaTable
  515. arr.forEach((ele) => {
  516. if (obj.id == ele.id) {
  517. ele.colKey = this.colKey
  518. ele.excelId = obj.excelId
  519. ele.pyzbx = obj.pyzbx
  520. ele.pyzby = obj.pyzby
  521. ele.sigRoleId = obj.sigRoleId
  522. ele.sigRoleName = obj.sigRoleName
  523. ele.type = obj.type
  524. ele.tabId = obj.tabId
  525. ele.show = false
  526. ele.colName = this.htmlData1.name
  527. ele.timeState = obj.timeState
  528. ele.timeName = obj.timeName
  529. ele.timeColKey = obj.timeColKey
  530. }
  531. })
  532. this.$nextTick(() => {
  533. this.setsignaTable = arr
  534. })
  535. this.$forceUpdate()
  536. console.log(this.setsignaTable, 'this.setsignaTable');
  537. // this.saveSingInfo()
  538. this.$emit('edit', false)
  539. },
  540. async deleteTableSig(key, id, item) {//删除数据
  541. console.log(item, 'item');
  542. this.setsignaTable.splice(key, 1);
  543. this.isCansave = true
  544. // this.saveSingInfo();
  545. // const {data: res} = await saveSig({dataInfo: this.setsignaTable,tabId:this.pkeyId1})
  546. if (id) {
  547. const {data: res} = await remove(id, this.pkeyId1)
  548. if (res.code === 200) {
  549. //console.log(this.$parent)
  550. this.isCansave = false
  551. this.$parent.getExcelHtml(this.pkeyId1);
  552. this.getSingInfo()
  553. this.$message({
  554. type: "success",
  555. message: "操作成功"
  556. });
  557. }
  558. }
  559. this.$emit('edit', false)
  560. },
  561. async saveSingInfo() {
  562. console.log(this.setsignaTable, 'this.setsignaTable');
  563. if (this.activeName==='tab1' && this.setsignaTable.length === 0) {
  564. this.$message.warning('请先选择数据')
  565. return
  566. }
  567. if (this.activeName==='tab2' && this.setsignaTable2 === 0) {
  568. this.$message.warning('暂无系统识别数据')
  569. return
  570. }
  571. let newDataArr = []
  572. if (this.activeName==='tab1') {
  573. newDataArr = this.setsignaTable
  574. } else if (this.activeName==='tab2') {
  575. newDataArr = this.setsignaTable2
  576. }
  577. this.saveLoaing = true
  578. setTimeout(() => {
  579. this.saveLoaing = false
  580. }, 1500);
  581. const {data: res} = await saveSig({
  582. dataInfo: newDataArr,
  583. tabId: this.pkeyId1
  584. })
  585. if (res.code === 200) {
  586. //console.log(this.$parent)
  587. this.$parent.getExcelHtml(this.pkeyId1);
  588. this.activeName = 'tab1'
  589. this.getSingInfo()
  590. this.$message({
  591. type: "success",
  592. message: "操作成功"
  593. });
  594. }
  595. },
  596. //电签配置
  597. async getSingInfo() {
  598. const {data: res} = await getSigList({
  599. current: 0,
  600. size: 100,
  601. tabId: this.pkeyId1,
  602. type: 2,
  603. excelId: this.excelId,
  604. showType: 1
  605. })
  606. if (res.code === 200) {
  607. this.setsignaTable = res.data.records;
  608. this.setsignaTable.forEach((ele) => {
  609. ele.show = false
  610. })
  611. }
  612. },
  613. //系统识别
  614. async getSingInfo1() {
  615. const {data: res} = await getSigList({
  616. current: 0,
  617. size: 100,
  618. tabId: this.pkeyId1,
  619. type: 2,
  620. excelId: this.excelId,
  621. showType: 2
  622. })
  623. if (res.code === 200) {
  624. this.setsignaTable2 = res.data.records;
  625. }
  626. },
  627. timeElementFocus() {
  628. this.isTimeElement = true
  629. this.$emit('timeFocus', true)
  630. },
  631. timeElementFinish() {
  632. this.isTimeElement = false
  633. this.$emit('timeFocus', false)
  634. },
  635. //电签配置和系统识别
  636. handleActiveClick() {
  637. //系统识别
  638. if (this.activeName === 'tab2') {
  639. this.getSingInfo1()
  640. }
  641. },
  642. },
  643. created() {
  644. this.getRoleType(); //获取文本类型接口
  645. this.getSingInfo();
  646. this.setsignaTable = [];
  647. console.log(this.htmlData1, 'html1');
  648. },
  649. }
  650. </script>
  651. <style lang="scss" scoped>
  652. .table {
  653. margin-top: 20px;
  654. border-radius: 5px;
  655. color: #101010;
  656. font-size: 14px;
  657. }
  658. .dianqian {
  659. width: 90%;
  660. height: 100%;
  661. }
  662. .copyTable td {
  663. user-select: initial !important;
  664. }
  665. </style>