finstlbillsitems.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. <template>
  2. <div>
  3. <!--:row-style="{height:'20px',padding:'0px',fontSize:'12px'}"-->
  4. <avue-crud :option="option" :data="tableData" id="out-table" ref="crud"
  5. @selection-change="handleSelectionChange" :header-cell-style="tableHeaderCellStyle"
  6. :row-class-name="rowClassName" :cell-style="cellStyle"
  7. @resetColumn="resetColumn('crud', 'option', 'optionBack', 493)"
  8. @saveColumn="saveColumn('crud', 'option', 'optionBack', 493)">
  9. <template slot="menuLeft">
  10. <slot name="menuLeft"></slot>
  11. </template>
  12. <tempalte slot="currentStlAmountRMB" slot-scope="{ row }">
  13. <el-input-number v-if="(brfalse && !editSave)" v-model="row.currentStlAmountRMB"
  14. @change="armbChange(row)" :controls="false" placeholder="请输入 本次对账CNY" size="mini"
  15. style="width: 100%;"
  16. :disabled="row.curCode != getLocalCurrency() || settlementdistar || !(form.status == '0' || form.status == '4' || form.status == null)"></el-input-number>
  17. <span v-else>{{ row.currentStlAmountRMB }}</span>
  18. </tempalte>
  19. <tempalte slot="currentStlAmountUSD" slot-scope="{ row }">
  20. <el-input-number v-if="(brfalse && !editSave)" v-model="row.currentStlAmountUSD"
  21. @change="ausdChange(row)" :controls="false" placeholder="请输入 本次对账USD" size="mini"
  22. style="width: 100%;"
  23. :disabled="row.curCode == getLocalCurrency() || settlementdistar || !(form.status == '0' || form.status == '4' || form.status == null)"></el-input-number>
  24. <span v-else>{{ row.currentStlAmountUSD }}</span>
  25. </tempalte>
  26. <template slot="remarkss" slot-scope="{ row }">
  27. <el-input style="width: 100%;" v-model="row.remarkss" v-if="(brfalse && !editSave)" size="mini"
  28. autocomplete="off" clearable placeholder="请输入 备注">
  29. </el-input>
  30. <span v-else>{{ row.remarkss }}</span>
  31. </template>
  32. <template slot="taxInvoiceNumber" slot-scope="{ row }">
  33. <el-input style="width: 100%;" v-model="row.taxInvoiceNumber"
  34. v-if="row.feeCnName == '增值税' && (brfalse && !editSave)" size="mini" autocomplete="off" clearable
  35. placeholder="请输入税票号">
  36. </el-input>
  37. <span v-else>{{ row.taxInvoiceNumber }}</span>
  38. </template>
  39. <template slot="taxInvoiceDate" slot-scope="{ row }">
  40. <el-date-picker style="width: 100%;" v-model="row.taxInvoiceDate"
  41. v-if="row.feeCnName == '增值税' && (brfalse && !editSave)" size="mini" type="date" placeholder="选择日期"
  42. format="yyyy-MM-dd" value-format="yyyy-MM-dd">
  43. </el-date-picker>
  44. <span v-else>{{ row.taxInvoiceDate }}</span>
  45. </template>
  46. <template slot="deductionTime" slot-scope="{ row }">
  47. <el-date-picker style="width: 100%;" v-model="row.deductionTime"
  48. v-if="row.feeCnName == '增值税' && (brfalse && !editSave)" size="mini" type="date" placeholder="选择日期"
  49. format="yyyy-MM-dd" value-format="yyyy-MM-dd">
  50. </el-date-picker>
  51. <span v-else>{{ row.deductionTime }}</span>
  52. </template>
  53. </avue-crud>
  54. </div>
  55. </template>
  56. <script>
  57. import { getWorkDicts } from "@/api/system/dictbiz";
  58. import SearchQuery from "@/components/iosbasic-data/searchquery.vue";
  59. import { getRateList } from "@/api/iosBasicData/rateManagement";
  60. import costDetails from "@/views/iosBasicData/finstlbills/assembly/costDetails.vue";
  61. import { feecenterSelectByAccNoList } from "@/api/iosBasicData/finstlbills";
  62. export default {
  63. components: { costDetails, SearchQuery },
  64. props: {
  65. tableData: {
  66. type: Array,
  67. default: [],
  68. },
  69. brfalse: {
  70. type: Boolean,
  71. default: true,
  72. },
  73. handleSelectionData: {
  74. type: Array,
  75. default: []
  76. },
  77. // 是否禁用
  78. editSave: {
  79. type: Boolean,
  80. default: false
  81. },
  82. settlementdistar: {
  83. type: Boolean,
  84. default: false
  85. },
  86. form: {
  87. type: Object,
  88. default: {},
  89. },
  90. },
  91. data() {
  92. return {
  93. ifInvoiceData: [], // 是否数据
  94. invoicelosDara: [],// 发票
  95. curCodeData: [], // 币种
  96. option: {},
  97. optionBack: {
  98. height: 'auto',
  99. calcHeight: 30,
  100. menuWidth: 60,
  101. tip: false,
  102. menu: false,
  103. border: true,
  104. addBtn: false,
  105. viewBtn: false,
  106. editBtn: false,
  107. delBtn: false,
  108. refreshBtn: false,
  109. index: true,
  110. selection: true,
  111. align: 'center',
  112. column: [
  113. {
  114. label: "所属公司",
  115. prop: "branchName",
  116. width: 120,
  117. overHidden: true
  118. },
  119. {
  120. label: "收付",
  121. prop: "dc",
  122. width: 60,
  123. type: 'select',
  124. dicData: [{
  125. label: '收',
  126. value: 'D'
  127. }, {
  128. label: '付',
  129. value: 'C'
  130. }],
  131. overHidden: true,
  132. },
  133. {
  134. label: "费用名称",
  135. prop: "feeCnName",
  136. width: 80,
  137. overHidden: true
  138. },
  139. {
  140. label: "MB/L NO",
  141. prop: "mblno",
  142. width: 100,
  143. overHidden: true
  144. },
  145. {
  146. label: "HB/L NO",
  147. prop: "hblno",
  148. width: 100,
  149. overHidden: true
  150. },
  151. {
  152. label: "币种",
  153. prop: "currentStlCurCode",
  154. width: 60,
  155. overHidden: true
  156. },
  157. {
  158. label: "汇率",
  159. prop: "currentStlExrate",
  160. width: 80,
  161. overHidden: true
  162. },
  163. {
  164. label: "本次本币",
  165. prop: "currentStlAmountRMB",
  166. width: 100,
  167. overHidden: true
  168. },
  169. {
  170. label: "本次外币",
  171. prop: "currentStlAmountUSD",
  172. width: 100,
  173. overHidden: true
  174. },
  175. {
  176. label: "ETD",
  177. prop: "etd",
  178. width: 90,
  179. overHidden: true
  180. },
  181. {
  182. label: "船名",
  183. prop: "vesselEnName",
  184. width: 90,
  185. overHidden: true
  186. },
  187. {
  188. label: "航次",
  189. prop: "voyageNo",
  190. width: 90,
  191. overHidden: true
  192. },
  193. {
  194. label: "目的港",
  195. prop: "podCnName",
  196. width: 90,
  197. overHidden: true
  198. },
  199. {
  200. label: "应结算本币",
  201. prop: "amountRMB",
  202. width: 90,
  203. overHidden: true
  204. },
  205. {
  206. label: "应结算外币",
  207. prop: "amountUSD",
  208. width: 90,
  209. overHidden: true
  210. },
  211. {
  212. label: "已结算本币",
  213. prop: "stlTtlAmountRMB",
  214. width: 90,
  215. overHidden: true
  216. },
  217. {
  218. label: "已结算外币",
  219. prop: "stlTtlAmountUSD",
  220. width: 90,
  221. overHidden: true
  222. },
  223. {
  224. label: "ETA",
  225. prop: "eta",
  226. width: 120,
  227. overHidden: true
  228. }
  229. ]
  230. },
  231. }
  232. },
  233. async created() {
  234. this.option = await this.getColumnData(this.getColumnName(493), this.optionBack);
  235. this.isSignforWorkDicts()
  236. this.invoicelosWorkDictsfun()
  237. },
  238. methods: {
  239. armbChange(row) {
  240. if (row.dc == 'C') {
  241. if (Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount) > 0) {
  242. if (Number(row.currentStlAmountRMB) < 0) {
  243. row.currentStlAmountRMB = 0
  244. return this.$message.error("本次对账金额不能输入负数");
  245. }
  246. if (Number(row.currentStlAmountRMB) > Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)) {
  247. row.currentStlAmountRMB = 0
  248. return this.$message.error("本次对账金额不能超过未对账金额");
  249. }
  250. }
  251. if (Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount) < 0) {
  252. if (Number(row.currentStlAmountRMB) >= 0) {
  253. row.currentStlAmountRMB = Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)
  254. return this.$message.error("本次对账金额不能输入非负数");
  255. }
  256. if (Number(row.currentStlAmountRMB) < Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)) {
  257. row.currentStlAmountRMB = Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)
  258. return this.$message.error("本次对账金额不能超过未对账金额");
  259. }
  260. }
  261. }
  262. if (row.dc == 'D') {
  263. if (Number(row.amount - row.stlTtlAmount) > 0) {
  264. if (Number(row.currentStlAmountRMB) < 0) {
  265. row.currentStlAmountRMB = 0
  266. return this.$message.error("本次对账金额不能输入负数");
  267. }
  268. if (Number(row.currentStlAmountRMB) > Number(row.amount - row.stlTtlAmount)) {
  269. row.currentStlAmountRMB = 0
  270. return this.$message.error("本次对账金额不能超过未对账金额");
  271. }
  272. }
  273. if (Number(row.amount - row.stlTtlAmount) < 0) {
  274. if (Number(row.currentStlAmountRMB) >= 0) {
  275. row.currentStlAmountRMB = Number(row.amount - row.stlTtlAmount)
  276. return this.$message.error("本次对账金额不能输入非负数");
  277. }
  278. if (Number(row.currentStlAmountRMB) < Number(row.amount - row.stlTtlAmount)) {
  279. row.currentStlAmountRMB = Number(row.amount - row.stlTtlAmount)
  280. return this.$message.error("本次对账金额不能超过未对账金额");
  281. }
  282. }
  283. }
  284. },
  285. ausdChange(row) {
  286. if (row.dc == 'C') {
  287. if (Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount) > 0) {
  288. if (Number(row.currentStlAmountUSD) < 0) {
  289. row.currentStlAmountUSD = 0
  290. return this.$message.error("本次对账金额不能输入负数");
  291. }
  292. if (Number(row.currentStlAmountUSD) > Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)) {
  293. row.currentStlAmountUSD = 0
  294. return this.$message.error("本次对账金额不能超过未对账金额");
  295. }
  296. }
  297. if (Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount) < 0) {
  298. if (Number(row.currentStlAmountUSD) >= 0) {
  299. row.currentStlAmountUSD = Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)
  300. return this.$message.error("本次对账金额不能输入非负数");
  301. }
  302. if (Number(row.currentStlAmountUSD) < Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)) {
  303. row.currentStlAmountUSD = Number(row.amount - (row.appliedAmount - row.appliedAmountStl) - row.stlTtlAmount)
  304. return this.$message.error("本次对账金额不能超过未对账金额");
  305. }
  306. }
  307. }
  308. if (row.dc == 'D') {
  309. if (Number(row.amount - row.stlTtlAmount) > 0) {
  310. if (Number(row.currentStlAmountUSD) < 0) {
  311. row.currentStlAmountUSD = 0
  312. return this.$message.error("本次对账金额不能输入负数");
  313. }
  314. if (Number(row.currentStlAmountUSD) > Number(row.amount - row.stlTtlAmount)) {
  315. row.currentStlAmountUSD = 0
  316. return this.$message.error("本次对账金额不能超过未对账金额");
  317. }
  318. }
  319. if (Number(row.amount - row.stlTtlAmount) < 0) {
  320. if (Number(row.currentStlAmountUSD) >= 0) {
  321. console.log(row.amount - row.stlTtlAmount)
  322. row.currentStlAmountUSD = Number(row.amount - row.stlTtlAmount)
  323. return this.$message.error("本次对账金额不能输入非负数");
  324. }
  325. if (Number(row.currentStlAmountUSD) < Number(row.amount - row.stlTtlAmount)) {
  326. row.currentStlAmountUSD = Number(row.amount - row.stlTtlAmount)
  327. return this.$message.error("本次对账金额不能超过未对账金额");
  328. }
  329. }
  330. }
  331. },
  332. // 展开行或者关闭
  333. expandChange(row) {
  334. let accBillId = ''
  335. if (this.form.id) {
  336. accBillId = row.accBillId
  337. } else {
  338. accBillId = row.id
  339. }
  340. feecenterSelectByAccNoList({ accBillId }).then(res => {
  341. row.costDate = res.data.data.map(item => {
  342. if (item.curCode == this.getLocalCurrency()) {
  343. this.$set(item, 'rmbAmount', item.amount)
  344. this.$set(item, 'usdAmount', '')
  345. this.$set(item, 'rmbAmountNet', item.amountNet)
  346. this.$set(item, 'usdAmountNet', '')
  347. } else {
  348. this.$set(item, 'usdAmount', item.amount)
  349. this.$set(item, 'rmbAmount', '')
  350. this.$set(item, 'usdAmountNet', item.amountNet)
  351. this.$set(item, 'rmbAmountNet', '')
  352. }
  353. return item
  354. })
  355. })
  356. },
  357. // 明细删除
  358. deletefun(row, index) {
  359. this.$emit('deletefun', row.id, index)
  360. },
  361. // 币别切换
  362. corpChange(value, row) {
  363. this.$set(row, 'currentStlCurCode', value)
  364. if (value == this.getLocalCurrency()) {
  365. this.$set(row, 'currentStlAmountRMB', Number(row.amount) - Number(row.stlTtlAmount))
  366. } else {
  367. this.$set(row, 'currentStlAmountUSD', Number(row.amount) - Number(row.stlTtlAmount))
  368. }
  369. },
  370. // 接口请求
  371. // 是否接口
  372. isSignforWorkDicts() {
  373. getWorkDicts('ifInvoice').then(res => {
  374. this.ifInvoiceData = res.data.data
  375. })
  376. },
  377. // 发票
  378. invoicelosWorkDictsfun() {
  379. getWorkDicts('invoice_los').then(res => {
  380. this.invoicelosDara = res.data.data
  381. })
  382. },
  383. // 获取币别数据
  384. // 获取币别数据
  385. async getRateListfun(cnName) {
  386. await this.checkRate(null, null, null, 2)
  387. this.curCodeData = this.getCheckRate()
  388. // getRateList({ current: 1, size: 10, cnName }).then(res => {
  389. // this.curCodeData = res.data.data.records
  390. // })
  391. },
  392. // 表头样式
  393. tableHeaderCellStyle({ row, column, rowIndex, columnIndex }) {
  394. return "padding:4px 0px;fontSize:12px;color:#000;background:#ecf5ff"
  395. },
  396. // 更改表格颜色
  397. headerClassName(tab) {
  398. //颜色间隔
  399. let back = ""
  400. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  401. if (tab.columnIndex % 2 === 0) {
  402. back = "back-one"
  403. } else if (tab.columnIndex % 2 === 1) {
  404. back = "back-two"
  405. }
  406. }
  407. return back;
  408. },
  409. // Element UI 表格点击选中行/取消选中 快捷多选 以及快捷连续多选,高亮选中行 ——-------------------------------------——
  410. // 多选选择的数据
  411. handleSelectionChange(arr) {
  412. // // 全选
  413. // if (arr.length == this.tableData.length) {
  414. // for (let item of arr) {
  415. // this.$set(item,'tableSelect',1)
  416. // }
  417. // }
  418. // // 清除全选
  419. // if (arr.length == 0) {
  420. // for (let item of this.tableData) {
  421. // this.$set(item,'tableSelect',0)
  422. // }
  423. // }
  424. this.$emit('handleSelectionChange', arr)
  425. },
  426. // // 多选
  427. // toggleSelection(rows){
  428. // if (rows) {
  429. // rows.forEach(row => {
  430. // this.$refs.tableRef.toggleRowSelection(row);
  431. // });
  432. // } else {
  433. // this.$refs.tableRef.clearSelection();
  434. // }
  435. // },
  436. // 监听点击表格事件
  437. rowClick(row, column, event) {
  438. let refsElTable = this.$refs.tableRef; // 获取表格对象
  439. if (this.CtrlDown) {
  440. refsElTable.toggleRowSelection(row); // ctrl多选 如果点击两次同样会取消选中
  441. return;
  442. }
  443. if (this.shiftOrAltDown && this.handleSelectionData.length > 0) {
  444. // 通过rowIndex判断已选择的行中最上面和最下面的是哪行,再对比按住shift/alt点击的当前行得到新的最上面和最下面的行,把这两行中间的行进行循环选中。
  445. let topAndBottom = this.getTopAndBottom(row, this.bottomSelectionRow, this.topSelectionRow);
  446. refsElTable.clearSelection(); //先清空 不然会导致在这两行中间之外的行状态不变
  447. for (let index = topAndBottom.top; index <= topAndBottom.bottom; index++) { //选中两行之间的所有行
  448. refsElTable.toggleRowSelection(this.tableData[index], true);
  449. }
  450. } else {
  451. let findRow = this.handleSelectionData.find(c => c.rowIndex == row.rowIndex); //找出当前选中行
  452. //如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
  453. if (findRow && this.handleSelectionData.length === 1) {
  454. refsElTable.toggleRowSelection(row, false);
  455. return;
  456. }
  457. // refsElTable.clearSelection(); // 清空之前选择的数据(如果放开,选择之前会变成单选)
  458. refsElTable.toggleRowSelection(row); // 调用选中行方法
  459. }
  460. },
  461. // 行的 style 的回调方法
  462. rowStyle({ row, rowIndex }) {
  463. // 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
  464. // object: 要添加或者修改属性的目标对象;prop: 要定义或修改属性的名称;descript: 是一个对象,里面是我们上述的对象属性的特性;
  465. Object.defineProperty(row, 'rowIndex', { //给每一行添加不可枚举属性rowIndex来标识当前行
  466. value: rowIndex, // 设置age的值,不设置的话默认为undefined
  467. writable: true, // 表示属性的值true可以修改,false不可以被修改
  468. enumerable: false, // 设置为false表示不能通过 for-in 循环返回
  469. // configurable: false, // configurable 设置为 false,意味着这个属性不能从对象上删除
  470. })
  471. },
  472. keyDown(event) {
  473. let key = event.keyCode;
  474. if (key == 17) this.CtrlDown = true;
  475. if (key == 16 || key == 18) this.shiftOrAltDown = true;
  476. },
  477. keyUp(event) {
  478. let key = event.keyCode;
  479. if (key == 17) this.CtrlDown = false;
  480. if (key == 16 || key == 18) this.shiftOrAltDown = false;
  481. },
  482. // 文章说明 https://www.jianshu.com/p/48f2c522d2a2
  483. getTopAndBottom(row, bottom, top) {
  484. let n = row.rowIndex,
  485. mx = bottom.rowIndex,
  486. mi = top.rowIndex;
  487. if (n > mx) {
  488. return {
  489. top: mi,
  490. bottom: n
  491. };
  492. } else if (n < mx && n > mi) {
  493. return {
  494. top: mi,
  495. bottom: n
  496. };
  497. } else if (n < mi) {
  498. return {
  499. top: n,
  500. bottom: mx
  501. };
  502. } else if (n == mi || n == mx) {
  503. return {
  504. top: mi,
  505. bottom: mx
  506. };
  507. }
  508. },
  509. // 给选中行加上current-row这个class类,所以要使用row-class-name这个属性(其实给每一行添加rowIndex也可以用这个属性),
  510. // 判断方式也是通过判断rowIndex对比
  511. rowClassName({ row, rowIndex }) {
  512. let rowName = "",
  513. findRow = this.handleSelectionData.find(c => c.rowIndex === row.rowIndex);
  514. if (findRow) {
  515. rowName = "current-row"; // elementUI 默认高亮行的class类 不用再样式了^-^,也可通过css覆盖改变背景颜色
  516. }
  517. return rowName; //也可以再加上其他类名 如果有需求的话
  518. },
  519. // 收付展示不一样的颜色
  520. cellStyle({ row, rowIndex, columnIndex }) {
  521. return
  522. let rowStyle = ''
  523. let bgStyle = ''
  524. if (row.dc == 'D') {
  525. rowStyle = 'color:#8cb24b;'
  526. } else if (row.dc == 'C') {
  527. rowStyle = 'color:#F56C6C;'
  528. }
  529. if (row.id) {
  530. bgStyle = 'background: #f0f9eb;'
  531. }
  532. return rowStyle + 'padding:0px;fontSize:12px;' + bgStyle
  533. },
  534. //自定义列保存
  535. async saveColumn(ref, option, optionBack, code) {
  536. const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
  537. if (inSave) {
  538. this.$message.success("保存成功");
  539. //关闭窗口
  540. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  541. }
  542. },
  543. //自定义列重置
  544. async resetColumn(ref, option, optionBack, code) {
  545. this[option] = this[optionBack];
  546. const inSave = await this.delColumnData(this.getColumnName(code), this[optionBack]);
  547. if (inSave) {
  548. this.$message.success("重置成功");
  549. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  550. }
  551. },
  552. },
  553. mounted() {
  554. // 按住ctrl实现多选 设置监听keydown事件,以及keyup事件,
  555. addEventListener("keydown", this.keyDown, false);
  556. addEventListener("keyup", this.keyUp, false);
  557. },
  558. beforeDestroy() { //解绑
  559. removeEventListener("keydown", this.keyDown);
  560. removeEventListener("keyup", this.keyUp);
  561. },
  562. computed: { //实时得到最上行和最下行
  563. bottomSelectionRow() {
  564. if (this.handleSelectionData.length == 0) return null;
  565. return this.handleSelectionData.reduce((start, end) => {
  566. return start.rowIndex > end.rowIndex ? start : end;
  567. });
  568. },
  569. topSelectionRow() {
  570. if (this.handleSelectionData.length == 0) return null;
  571. return this.handleSelectionData.reduce((start, end) => {
  572. return start.rowIndex < end.rowIndex ? start : end;
  573. });
  574. }
  575. },
  576. }
  577. </script>
  578. <style scoped>
  579. .textHide {
  580. width: 100%;
  581. overflow: hidden;
  582. white-space: nowrap;
  583. text-overflow: ellipsis;
  584. }
  585. </style>