finstlbillsitems.vue 18 KB

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