finstlbillsitems.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. <template>
  2. <div>
  3. <!--:row-style="{height:'20px',padding:'0px',fontSize:'12px'}"-->
  4. <el-table
  5. ref="tableRef"
  6. :cell-style="{padding:'0px',fontSize:'12px'}"
  7. :header-cell-style="tableHeaderCellStyle"
  8. :data="tableData"
  9. border
  10. style="width: 100%"
  11. @selection-change="handleSelectionChange"
  12. @row-click="rowClick"
  13. :row-style="rowStyle"
  14. :row-class-name="rowClassName" >
  15. <el-table-column
  16. v-if="brfalse"
  17. type="selection"
  18. width="55">
  19. <!--<template slot-scope="scope">-->
  20. <!-- <el-checkbox v-model="scope.row.tableSelect"-->
  21. <!-- :true-label="1" :false-label="0"-->
  22. <!-- @change="toggleSelection([scope.row])">-->
  23. <!-- </el-checkbox>-->
  24. <!--</template>-->
  25. </el-table-column>
  26. <el-table-column
  27. prop="lineNo"
  28. label="行号" width="50px">
  29. </el-table-column>
  30. <el-table-column
  31. prop="isCleared"
  32. label="核销">
  33. <template slot-scope="{ row }">
  34. <span v-if="row.isCleared == item.dictKey" v-for="item in ifInvoiceData" :key="item.dictKey">
  35. {{item.dictValue}}
  36. </span>
  37. </template>
  38. </el-table-column>
  39. <el-table-column
  40. prop="lineNo"
  41. label="源业务编号" width="120px">
  42. <template slot-scope="{ row }">
  43. <span class="textHide" v-if="row.businessBillDivideNo">{{row.businessBillDivideNo}}</span>
  44. <span class="textHide" v-else>{{row.businessBillNo}}</span>
  45. </template>
  46. </el-table-column>
  47. <!--<el-table-column-->
  48. <!-- prop="tableSelect"-->
  49. <!-- label="选择" width="50px" v-if="brfalse">-->
  50. <!-- <template slot-scope="scope">-->
  51. <!-- <el-checkbox v-model="scope.row.tableSelect"-->
  52. <!-- :true-label="1" :false-label="0"-->
  53. <!-- @change="toggleSelection([scope.row])">-->
  54. <!-- </el-checkbox>-->
  55. <!-- </template>-->
  56. <!--</el-table-column>-->
  57. <el-table-column
  58. prop="accBillNo"
  59. label="账单编号" width="140px">
  60. </el-table-column>
  61. <el-table-column
  62. prop="corpCnName"
  63. label="客户简称" width="130px">
  64. <template slot-scope="{ row }">
  65. <avue-text-ellipsis :text="row.corpCnName" :height="50" :width="130">
  66. <small slot="more">...</small>
  67. </avue-text-ellipsis>
  68. </template>
  69. </el-table-column>
  70. <el-table-column
  71. prop="mblno"
  72. label="MB/L NO" width="120px">
  73. <template slot-scope="{ row }">
  74. <avue-text-ellipsis :text="row.mblno" :height="50" :width="120">
  75. <small slot="more">...</small>
  76. </avue-text-ellipsis>
  77. </template>
  78. </el-table-column>
  79. <el-table-column
  80. prop="dc"
  81. label="收/付" width="120px">
  82. <template slot-scope="{ row }">
  83. <span>{{row.dc}}</span>
  84. </template>
  85. </el-table-column>
  86. <el-table-column
  87. prop="currentStlExrate"
  88. label="汇率">
  89. </el-table-column>
  90. <!--<el-table-column-->
  91. <!-- label="本次结算币种"-->
  92. <!-- prop="currentStlCurCode" width="130px">-->
  93. <!-- <template slot-scope="{row}">-->
  94. <!-- <search-query :datalist="curCodeData"-->
  95. <!-- :selectValue="row.currentStlCurCode"-->
  96. <!-- :filterable="true"-->
  97. <!-- :clearable="true"-->
  98. <!-- :remote="true"-->
  99. <!-- :buttonIf="false"-->
  100. <!-- :forParameter="{key:'id',label:'code',value:'code'}"-->
  101. <!-- @remoteMethod="getRateListfun"-->
  102. <!-- @corpChange="corpChange($event,row)"-->
  103. <!-- @corpFocus="getRateListfun">-->
  104. <!-- </search-query>-->
  105. <!-- </template>-->
  106. <!--</el-table-column>-->
  107. <el-table-column
  108. prop="currentStlAmountRMB"
  109. label="本次RMB" width="100px">
  110. <template slot-scope="scope">
  111. <el-input style="width: 100%;" v-model="scope.row.currentStlAmountRMB"
  112. :disabled="scope.row.curCode != 'CNY'"
  113. v-if="brfalse && !editSave"
  114. size="mini" autocomplete="off"
  115. clearable placeholder="请输入USD" >
  116. </el-input>
  117. <span v-else>{{scope.row.currentStlAmountRMB}}</span>
  118. </template>
  119. </el-table-column>
  120. <el-table-column
  121. prop="currentStlAmountUSD"
  122. label="本次USD" width="100px">
  123. <template slot-scope="scope">
  124. <el-input style="width: 100%;" v-model="scope.row.currentStlAmountUSD"
  125. :disabled="scope.row.curCode != 'USD'"
  126. v-if="brfalse && !editSave"
  127. size="mini" autocomplete="off"
  128. clearable placeholder="请输入USD" >
  129. </el-input>
  130. <span v-else>{{scope.row.currentStlAmountUSD}}</span>
  131. </template>
  132. </el-table-column>
  133. <!--<el-table-column label="本次结算金额(净额)">-->
  134. <!-- &lt;!&ndash;默认应结算 可以修改&ndash;&gt;-->
  135. <!-- &lt;!&ndash;currentStlAmountNet&ndash;&gt;-->
  136. <!-- <el-table-column-->
  137. <!-- prop="currentStlAmountNetRMB"-->
  138. <!-- label="RMB" width="100px">-->
  139. <!-- <template slot-scope="scope">-->
  140. <!-- <el-input style="width: 100%;" v-model="scope.row.currentStlAmountNetRMB" v-if="brfalse"-->
  141. <!-- size="mini" autocomplete="off"-->
  142. <!-- clearable placeholder="请输入USD" >-->
  143. <!-- </el-input>-->
  144. <!-- <span v-else>{{scope.row.currentStlAmountNetRMB}}</span>-->
  145. <!-- </template>-->
  146. <!-- </el-table-column>-->
  147. <!-- <el-table-column-->
  148. <!-- prop="currentStlAmountNetUSD"-->
  149. <!-- label="USD" width="100px">-->
  150. <!-- <template slot-scope="scope">-->
  151. <!-- <el-input style="width: 100%;" v-model="scope.row.currentStlAmountNetUSD" v-if="brfalse"-->
  152. <!-- size="mini" autocomplete="off"-->
  153. <!-- clearable placeholder="请输入USD" >-->
  154. <!-- </el-input>-->
  155. <!-- <span v-else>{{scope.row.currentStlAmountNetUSD}}</span>-->
  156. <!-- </template>-->
  157. <!-- </el-table-column>-->
  158. <!--</el-table-column>-->
  159. <el-table-column
  160. prop="isSignfor"
  161. label="签收">
  162. <template slot-scope="{ row }">
  163. <span v-if="row.isSignfor == item.dictKey" v-for="item in ifInvoiceData" :key="item.dictKey">
  164. {{item.dictValue}}
  165. </span>
  166. </template>
  167. </el-table-column>
  168. <el-table-column
  169. prop="signforDate"
  170. label="签收日期">
  171. </el-table-column>
  172. <el-table-column
  173. prop="currentInvoiceAmountRMB"
  174. label="发票RMB">
  175. </el-table-column>
  176. <el-table-column
  177. prop="currentInvoiceAmountUSD"
  178. label="发票USD">
  179. </el-table-column>
  180. <el-table-column
  181. prop="ETD"
  182. label="ETD">
  183. </el-table-column>
  184. <el-table-column
  185. prop="vesselCnName"
  186. label="船名" width="140px">
  187. </el-table-column>
  188. <el-table-column
  189. prop="voyageNo"
  190. label="航次" width="100px">
  191. <template slot-scope="{ row }">
  192. <span class="textHide" >{{row.voyageNo}}</span>
  193. </template>
  194. </el-table-column>
  195. <el-table-column
  196. prop="podCnName"
  197. label="目的港">
  198. </el-table-column>
  199. <el-table-column
  200. prop="quantityCntrTypesDescr"
  201. label="箱量">
  202. </el-table-column>
  203. <!--amount 应结算金额 有税-->
  204. <!--amountNet 应结算金额 没有税-->
  205. <el-table-column
  206. prop="amountRMB"
  207. label="应结算RMB" width="90px">
  208. </el-table-column>
  209. <el-table-column
  210. prop="amountUSD"
  211. label="应结算USD" width="90px">
  212. </el-table-column>
  213. <!--<el-table-column label="应结算金额(净额)">-->
  214. <!-- &lt;!&ndash;amountNet&ndash;&gt;-->
  215. <!-- <el-table-column-->
  216. <!-- prop="amountNetRMB"-->
  217. <!-- label="RMB">-->
  218. <!-- </el-table-column>-->
  219. <!-- <el-table-column-->
  220. <!-- prop="amountNetUSD"-->
  221. <!-- label="USD">-->
  222. <!-- </el-table-column>-->
  223. <!--</el-table-column>-->
  224. <el-table-column
  225. prop="stlTtlAmountRMB"
  226. label="已结算RMB" width="100px">
  227. </el-table-column>
  228. <el-table-column
  229. prop="stlTtlAmountUSD"
  230. label="已结算USD" width="100px">
  231. </el-table-column>
  232. <!--<el-table-column label="已结算金额(净额)">-->
  233. <!-- &lt;!&ndash;自己起的 stlTtlAmountNet&ndash;&gt;-->
  234. <!-- <el-table-column-->
  235. <!-- prop="stlTtlAmountNetRMB"-->
  236. <!-- label="RMB">-->
  237. <!-- </el-table-column>-->
  238. <!-- <el-table-column-->
  239. <!-- prop="stlTtlAmountNetUSD"-->
  240. <!-- label="USD">-->
  241. <!-- </el-table-column>-->
  242. <!--</el-table-column>-->
  243. <!-- stlTtlAmount 乘 taxRate + surchargeRate-->
  244. <el-table-column
  245. prop="eta"
  246. label="ETA">
  247. <template slot-scope="{ row }">
  248. <span class="textHide" >{{row.eta}}</span>
  249. </template>
  250. </el-table-column>
  251. <el-table-column
  252. prop="remarkss"
  253. label="备注" width="150px">
  254. <template slot-scope="scope">
  255. <el-input style="width: 100%;" v-model="scope.row.remarkss" v-if="brfalse"
  256. size="mini" autocomplete="off"
  257. clearable placeholder="请输入备注" >
  258. </el-input>
  259. <span v-else>{{scope.row.remarkss}}</span>
  260. </template>
  261. </el-table-column>
  262. <el-table-column
  263. fixed="right"
  264. label="操作"
  265. width="100">
  266. <template slot-scope="scope">
  267. <el-button type="text" size="small" @click="deletefun(scope.row,scope.index)">删除</el-button>
  268. </template>
  269. </el-table-column>
  270. </el-table>
  271. </div>
  272. </template>
  273. <script>
  274. import {getWorkDicts} from "@/api/system/dictbiz";
  275. import SearchQuery from "@/components/iosbasic-data/searchquery.vue";
  276. import {getRateList} from "@/api/iosBasicData/rateManagement";
  277. export default {
  278. components: {SearchQuery},
  279. props:{
  280. tableData:{
  281. type:Array,
  282. default:[],
  283. },
  284. brfalse:{
  285. type:Boolean,
  286. default:true,
  287. },
  288. handleSelectionData:{
  289. type:Array,
  290. default:[]
  291. },
  292. // 是否禁用
  293. editSave:{
  294. type:Boolean,
  295. default:false
  296. }
  297. },
  298. data(){
  299. return {
  300. ifInvoiceData:[], // 是否数据
  301. invoicelosDara:[],// 发票
  302. curCodeData:[], // 币种
  303. }
  304. },
  305. created() {
  306. this.isSignforWorkDicts()
  307. this.invoicelosWorkDictsfun()
  308. },
  309. methods:{
  310. // 明细删除
  311. deletefun(row,index){
  312. this.$emit('deletefun',row.id,index)
  313. },
  314. // 币别切换
  315. corpChange(value,row){
  316. this.$set(row,'currentStlCurCode',value)
  317. if (value == 'CNY') {
  318. this.$set(row,'currentStlAmountRMB',Number(row.amount) - Number(row.stlTtlAmount))
  319. }else {
  320. this.$set(row,'currentStlAmountUSD',Number(row.amount) - Number(row.stlTtlAmount))
  321. }
  322. },
  323. // 接口请求
  324. // 是否接口
  325. isSignforWorkDicts(){
  326. getWorkDicts('ifInvoice').then(res=>{
  327. this.ifInvoiceData = res.data.data
  328. })
  329. },
  330. // 发票
  331. invoicelosWorkDictsfun(){
  332. getWorkDicts('invoice_los').then(res=>{
  333. this.invoicelosDara = res.data.data
  334. })
  335. },
  336. // 获取币别数据
  337. getRateListfun(cnName){
  338. getRateList({current:1,size:10,cnName}).then(res=>{
  339. this.curCodeData = res.data.data.records
  340. })
  341. },
  342. // 表头样式
  343. tableHeaderCellStyle({row,column,rowIndex, columnIndex}){
  344. return "padding:4px 0px;fontSize:12px;color:#000;background:#ecf5ff"
  345. },
  346. // Element UI 表格点击选中行/取消选中 快捷多选 以及快捷连续多选,高亮选中行 ——-------------------------------------——
  347. // 多选选择的数据
  348. handleSelectionChange(arr){
  349. // // 全选
  350. // if (arr.length == this.tableData.length) {
  351. // for (let item of arr) {
  352. // this.$set(item,'tableSelect',1)
  353. // }
  354. // }
  355. // // 清除全选
  356. // if (arr.length == 0) {
  357. // for (let item of this.tableData) {
  358. // this.$set(item,'tableSelect',0)
  359. // }
  360. // }
  361. this.$emit('handleSelectionChange',arr)
  362. },
  363. // // 多选
  364. // toggleSelection(rows){
  365. // if (rows) {
  366. // rows.forEach(row => {
  367. // this.$refs.tableRef.toggleRowSelection(row);
  368. // });
  369. // } else {
  370. // this.$refs.tableRef.clearSelection();
  371. // }
  372. // },
  373. // 监听点击表格事件
  374. rowClick(row, column, event) {
  375. let refsElTable = this.$refs.tableRef; // 获取表格对象
  376. if (this.CtrlDown) {
  377. refsElTable.toggleRowSelection(row); // ctrl多选 如果点击两次同样会取消选中
  378. return;
  379. }
  380. if ( this.shiftOrAltDown && this.handleSelectionData.length > 0) {
  381. // 通过rowIndex判断已选择的行中最上面和最下面的是哪行,再对比按住shift/alt点击的当前行得到新的最上面和最下面的行,把这两行中间的行进行循环选中。
  382. let topAndBottom = this.getTopAndBottom( row, this.bottomSelectionRow, this.topSelectionRow );
  383. refsElTable.clearSelection(); //先清空 不然会导致在这两行中间之外的行状态不变
  384. for (let index = topAndBottom.top; index <= topAndBottom.bottom; index++) { //选中两行之间的所有行
  385. refsElTable.toggleRowSelection(this.tableData[index], true);
  386. }
  387. } else {
  388. let findRow = this.handleSelectionData.find(c => c.rowIndex == row.rowIndex); //找出当前选中行
  389. //如果只有一行且点击的也是这一行则取消选择 否则清空再选中当前点击行
  390. if (findRow&& this.handleSelectionData.length === 1 ) {
  391. refsElTable.toggleRowSelection(row, false);
  392. return;
  393. }
  394. // refsElTable.clearSelection(); // 清空之前选择的数据(如果放开,选择之前会变成单选)
  395. refsElTable.toggleRowSelection(row); // 调用选中行方法
  396. }
  397. },
  398. // 行的 style 的回调方法
  399. rowStyle({row,rowIndex}) {
  400. // 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
  401. // object: 要添加或者修改属性的目标对象;prop: 要定义或修改属性的名称;descript: 是一个对象,里面是我们上述的对象属性的特性;
  402. Object.defineProperty(row, 'rowIndex', { //给每一行添加不可枚举属性rowIndex来标识当前行
  403. value: rowIndex, // 设置age的值,不设置的话默认为undefined
  404. writable: true, // 表示属性的值true可以修改,false不可以被修改
  405. enumerable: false, // 设置为false表示不能通过 for-in 循环返回
  406. // configurable: false, // configurable 设置为 false,意味着这个属性不能从对象上删除
  407. })
  408. },
  409. keyDown(event) {
  410. let key = event.keyCode;
  411. if (key == 17) this.CtrlDown = true;
  412. if (key == 16 || key == 18) this.shiftOrAltDown = true;
  413. },
  414. keyUp(event) {
  415. let key = event.keyCode;
  416. if (key == 17) this.CtrlDown = false;
  417. if (key == 16 || key == 18) this.shiftOrAltDown = false;
  418. },
  419. // 文章说明 https://www.jianshu.com/p/48f2c522d2a2
  420. getTopAndBottom(row, bottom, top){
  421. let n = row.rowIndex,
  422. mx = bottom.rowIndex,
  423. mi = top.rowIndex;
  424. if (n > mx) {
  425. return {
  426. top: mi,
  427. bottom: n
  428. };
  429. } else if (n < mx && n > mi) {
  430. return {
  431. top: mi,
  432. bottom: n
  433. };
  434. } else if (n < mi) {
  435. return {
  436. top: n,
  437. bottom: mx
  438. };
  439. } else if (n == mi || n == mx) {
  440. return {
  441. top: mi,
  442. bottom: mx
  443. };
  444. }
  445. },
  446. // 给选中行加上current-row这个class类,所以要使用row-class-name这个属性(其实给每一行添加rowIndex也可以用这个属性),
  447. // 判断方式也是通过判断rowIndex对比
  448. rowClassName({ row, rowIndex }) {
  449. let rowName = "",
  450. findRow = this.handleSelectionData.find(c => c.rowIndex === row.rowIndex);
  451. if (findRow) {
  452. rowName = "current-row "; // elementUI 默认高亮行的class类 不用再样式了^-^,也可通过css覆盖改变背景颜色
  453. }
  454. return rowName; //也可以再加上其他类名 如果有需求的话
  455. },
  456. },
  457. mounted() {
  458. // 按住ctrl实现多选 设置监听keydown事件,以及keyup事件,
  459. addEventListener("keydown", this.keyDown, false);
  460. addEventListener("keyup", this.keyUp, false);
  461. },
  462. beforeDestroy() { //解绑
  463. removeEventListener("keydown", this.keyDown);
  464. removeEventListener("keyup", this.keyUp);
  465. },
  466. computed: { //实时得到最上行和最下行
  467. bottomSelectionRow() {
  468. if (this.handleSelectionData.length == 0) return null;
  469. return this.handleSelectionData.reduce((start, end) => {
  470. return start.rowIndex > end.rowIndex ? start : end;
  471. });
  472. },
  473. topSelectionRow() {
  474. if (this.handleSelectionData.length == 0) return null;
  475. return this.handleSelectionData.reduce((start, end) => {
  476. return start.rowIndex < end.rowIndex ? start : end;
  477. });
  478. }
  479. },
  480. }
  481. </script>
  482. <style scoped>
  483. .textHide {
  484. width: 100%;
  485. overflow: hidden;
  486. white-space: nowrap;
  487. text-overflow: ellipsis;
  488. }
  489. </style>