detailsStatement.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. <!-- 计费账单 -->
  2. <template>
  3. <div id="detailsStatement">
  4. <div class="top">
  5. <el-form :inline="true">
  6. <el-form-item>
  7. <el-input v-model="shipName" placeholder="请输入船名"></el-input>
  8. </el-form-item>
  9. <el-form-item>
  10. <span class="demonstration">结算日期</span>
  11. <el-date-picker
  12. v-model="startTime"
  13. type="date"
  14. placeholder="选择日期"
  15. style="width:200px"
  16. >
  17. </el-date-picker>
  18. <span>至</span>
  19. <el-date-picker
  20. v-model="endTime"
  21. type="date"
  22. placeholder="选择日期"
  23. style="width:200px"
  24. >
  25. </el-date-picker>
  26. </el-form-item>
  27. <el-form-item>
  28. <el-button @click="onClick">查询</el-button>
  29. </el-form-item>
  30. <el-form-item>
  31. <el-button type="primary" @click="exportAllReportToExcel"
  32. ><i class="el-icon-download"></i>Excel</el-button
  33. >
  34. </el-form-item>
  35. <el-form-item>
  36. <span class="totalWillTonage">合计已预开票吨位</span>
  37. <el-input
  38. v-model="totalWillTonageedValue"
  39. disabled
  40. style="width:80px"
  41. ></el-input>
  42. </el-form-item>
  43. <el-form-item>
  44. <span class="totalWillTonage">合计已预开金额</span>
  45. <el-input
  46. v-model="totalWillTonageedMoney"
  47. disabled
  48. style="width:80px"
  49. ></el-input>
  50. </el-form-item>
  51. <el-form-item>
  52. <span class="totalWillTonage">合计本次实际开票吨位</span>
  53. <el-input
  54. v-model="totalActuallyTonageedValue"
  55. disabled
  56. style="width:80px"
  57. ></el-input>
  58. </el-form-item>
  59. <el-form-item>
  60. <span class="totalWillTonage">合计本月实际开票金额</span>
  61. <el-input
  62. v-model="totalActuallyTonageedMoney"
  63. disabled
  64. style="width:80px"
  65. ></el-input>
  66. </el-form-item>
  67. </el-form>
  68. </div>
  69. <div class="main">
  70. <el-tabs v-model="activeName" @tab-click="handleClick">
  71. <el-tab-pane label="未结算" name="first">
  72. <el-table
  73. :data="tableData"
  74. ref="tableRef"
  75. border
  76. stripe
  77. style="width: 100%; margin-top: 20px"
  78. max-height="500px"
  79. :row-style="{ height: '30px' }"
  80. :cell-style="{ fontWeight: '700' }"
  81. class="table"
  82. :span-method="objectSpanMethod"
  83. >
  84. <el-table-column
  85. prop="index"
  86. width="50"
  87. label="序号"
  88. align="center"
  89. :resizable="false"
  90. >
  91. <template slot-scope="scope">{{ scope.row.group + 1 }}</template>
  92. </el-table-column>
  93. <el-table-column
  94. prop="materialName"
  95. label="品种"
  96. width="150px"
  97. align="center"
  98. >
  99. </el-table-column>
  100. <el-table-column
  101. prop="resultForeignShipName"
  102. label="船名"
  103. width="150px"
  104. align="center"
  105. >
  106. </el-table-column>
  107. <el-table-column
  108. prop="portName"
  109. label="放货港口"
  110. width="150px"
  111. align="center"
  112. >
  113. </el-table-column>
  114. <el-table-column
  115. prop="carrierName"
  116. label="承运单位"
  117. width="100px"
  118. align="center"
  119. >
  120. </el-table-column>
  121. <el-table-column
  122. prop="resultOutPortTime"
  123. label="离港日期"
  124. width="200px"
  125. align="center"
  126. >
  127. </el-table-column>
  128. <el-table-column
  129. prop="loadTonnage"
  130. label="装船吨位"
  131. width="100px"
  132. align="center"
  133. >
  134. </el-table-column>
  135. <el-table-column
  136. prop="loadingProportion"
  137. label="装船比例"
  138. width="100px"
  139. align="center"
  140. >
  141. </el-table-column>
  142. <el-table-column
  143. prop="realTonnage"
  144. label="结算吨位"
  145. width="100px"
  146. align="center"
  147. >
  148. </el-table-column>
  149. <el-table-column
  150. prop="totalEnTonnage"
  151. label="到厂湿吨"
  152. width="100px"
  153. align="center"
  154. >
  155. <template slot-scope="scope">
  156. <el-input v-model="scope.row.totalEnTonnage"></el-input>
  157. </template>
  158. </el-table-column>
  159. <el-table-column
  160. prop="unitPrice"
  161. label="合同单价"
  162. width="100px"
  163. align="center"
  164. >
  165. </el-table-column>
  166. <el-table-column
  167. prop="fee"
  168. label="金额(元)"
  169. width="100px"
  170. align="center"
  171. >
  172. </el-table-column>
  173. <el-table-column
  174. prop="previewTonnage"
  175. label="已预开票吨位"
  176. width="100px"
  177. align="center"
  178. >
  179. <template slot-scope="scope">
  180. <el-input v-model="scope.row.previewTonnage"></el-input>
  181. </template>
  182. </el-table-column>
  183. <el-table-column
  184. prop="previewFee"
  185. label="已预开票金额"
  186. width="100px"
  187. align="center"
  188. >
  189. </el-table-column>
  190. <el-table-column
  191. prop="makeTonnage"
  192. label="本次实际开票吨位"
  193. width="100px"
  194. align="center"
  195. >
  196. </el-table-column>
  197. <el-table-column
  198. prop="actuallyMoney"
  199. label="本次实际开票金额"
  200. width="100px"
  201. align="center"
  202. >
  203. </el-table-column>
  204. <el-table-column
  205. prop="feeMake"
  206. label="本月实际开票金额"
  207. width="100px"
  208. align="center"
  209. >
  210. </el-table-column>
  211. <el-table-column
  212. prop="operate"
  213. label="操作"
  214. width="100px"
  215. align="center"
  216. fixed="right"
  217. >
  218. <template slot-scope="scope">
  219. <el-button type="text" @click="operate(scope.row)"
  220. >保存</el-button
  221. >
  222. <el-button type="text" @click="settlement(scope.row)"
  223. >结算</el-button
  224. >
  225. </template>
  226. </el-table-column>
  227. </el-table>
  228. </el-tab-pane>
  229. <el-tab-pane label="已结算" name="second">
  230. <el-table
  231. :data="tableData1"
  232. ref="tableRef1"
  233. border
  234. stripe
  235. max-height="600px"
  236. :row-style="{ height: '30px' }"
  237. :cell-style="{ fontWeight: '700' }"
  238. class="table"
  239. :span-method="objectSpanMethod1"
  240. >
  241. <el-table-column
  242. prop="index"
  243. width="50"
  244. label="序号"
  245. align="center"
  246. :resizable="false"
  247. >
  248. <template slot-scope="scope">{{ scope.row.group + 1 }}</template>
  249. </el-table-column>
  250. <el-table-column
  251. prop="materialName"
  252. label="品种"
  253. width="150px"
  254. align="center"
  255. >
  256. </el-table-column>
  257. <el-table-column
  258. prop="resultForeignShipName"
  259. label="船名"
  260. width="150px"
  261. align="center"
  262. >
  263. </el-table-column>
  264. <el-table-column
  265. prop="portName"
  266. label="放货港口"
  267. width="150px"
  268. align="center"
  269. >
  270. </el-table-column>
  271. <el-table-column
  272. prop="carrierName"
  273. label="承运单位"
  274. width="100px"
  275. align="center"
  276. >
  277. </el-table-column>
  278. <el-table-column
  279. prop="resultOutPortTime"
  280. label="离港日期"
  281. width="200px"
  282. align="center"
  283. >
  284. </el-table-column>
  285. <el-table-column
  286. prop="loadTonnage"
  287. label="装船吨位"
  288. width="100px"
  289. align="center"
  290. >
  291. </el-table-column>
  292. <el-table-column
  293. prop="loadingProportion"
  294. label="装船比例"
  295. width="100px"
  296. align="center"
  297. >
  298. </el-table-column>
  299. <el-table-column
  300. prop="realTonnage"
  301. label="结算吨位"
  302. width="100px"
  303. align="center"
  304. >
  305. </el-table-column>
  306. <el-table-column
  307. prop="totalEnTonnage"
  308. label="到厂湿吨"
  309. width="100px"
  310. align="center"
  311. >
  312. <template slot-scope="scope">
  313. <el-input v-model="scope.row.totalEnTonnage"></el-input>
  314. </template>
  315. </el-table-column>
  316. <el-table-column
  317. prop="unitPrice"
  318. label="合同单价"
  319. width="100px"
  320. align="center"
  321. >
  322. </el-table-column>
  323. <el-table-column
  324. prop="fee"
  325. label="金额(元)"
  326. width="100px"
  327. align="center"
  328. >
  329. </el-table-column>
  330. <el-table-column
  331. prop="previewTonnage"
  332. label="已预开票吨位"
  333. width="100px"
  334. align="center"
  335. >
  336. <template slot-scope="scope">
  337. <el-input v-model="scope.row.willTonanged"></el-input>
  338. </template>
  339. </el-table-column>
  340. <el-table-column
  341. prop="previewFee"
  342. label="已预开票金额"
  343. width="100px"
  344. align="center"
  345. >
  346. </el-table-column>
  347. <el-table-column
  348. prop="makeTonnage"
  349. label="本次实际开票吨位"
  350. width="100px"
  351. align="center"
  352. >
  353. </el-table-column>
  354. <el-table-column
  355. prop="actuallyMoney"
  356. label="本次实际开票金额"
  357. width="100px"
  358. align="center"
  359. >
  360. </el-table-column>
  361. <el-table-column
  362. prop="feeMake"
  363. label="本月实际开票金额"
  364. width="100px"
  365. align="center"
  366. >
  367. </el-table-column>
  368. </el-table>
  369. </el-tab-pane>
  370. </el-tabs>
  371. </div>
  372. </div>
  373. </template>
  374. <script>
  375. import { getCookie } from "@/utils/util.js";
  376. export default {
  377. data() {
  378. return {
  379. totalWillTonageedValue: 0,
  380. totalWillTonageedMoney: 0,
  381. totalActuallyTonageedMoney: 0,
  382. totalActuallyTonageedValue: 0,
  383. shipName: null,
  384. tableData: [],
  385. tableData1: [],
  386. spanArr: [],
  387. spanArr1: [],
  388. pos: null,
  389. mergeList: [
  390. "index",
  391. "carrierName",
  392. "portName",
  393. "resultForeignShipName",
  394. "materialName",
  395. "totalEnTonnage",
  396. "operate"
  397. ],
  398. activeName: "first",
  399. tableTitle: "结算账单报表",
  400. startTime: null,
  401. endTime: null
  402. };
  403. },
  404. watch: {
  405. tableData: {
  406. handler(newVal) {
  407. console.log("执行一次汇总函数");
  408. this.computedTableData(newVal);
  409. },
  410. deep: true,
  411. immediate: false
  412. },
  413. tableData1: {
  414. handler(newVal) {
  415. console.log("执行一次汇总函数");
  416. this.computedTableData(newVal);
  417. },
  418. deep: true,
  419. immediate: false
  420. }
  421. },
  422. methods: {
  423. //结算
  424. settlement(row) {},
  425. //保存
  426. operate(row) {
  427. console.log(row);
  428. //遍历tableData,找出相同批次的行数
  429. let arr = this.tableData.filter(e => {
  430. return e.batchId == row.batchId;
  431. });
  432. let stateMentTotalAmount = this.tableData.reduce((pre, item) => {
  433. return pre + item.fee;
  434. }, 0);
  435. let map = {
  436. list: arr,
  437. statementType: 3,
  438. totalEnTonnage: row.totalEnTonnage,
  439. stateMentTotalAmount: stateMentTotalAmount,
  440. userID: getCookie("userId")
  441. };
  442. this.axios
  443. .post("/api/v1/bms/addShipFeeStatement", map)
  444. .then(res => {
  445. if (res.data.code == "200") {
  446. this.getNoDetailsStament();
  447. this.$message.success("保存成功");
  448. }
  449. })
  450. .catch(() => {
  451. this.$message.error("保存失败");
  452. });
  453. },
  454. //处理表格数据
  455. computedTableData(data) {
  456. data.forEach((item, index) => {
  457. if (index == 0) {
  458. } else if (item.batchId == data[index - 1].batchId) {
  459. item.totalEnTonnage = data[index - 1].totalEnTonnage;
  460. }
  461. //预开金额
  462. item.previewFee = (item.unitPrice * item.previewTonnage).toFixed(2);
  463. //金额
  464. item.fee = (item.realTonnage * item.unitPrice).toFixed(2);
  465. //结算吨位
  466. item.realTonnage = (
  467. item.totalEnTonnage * item.loadingProportion
  468. ).toFixed(2);
  469. //开票吨位
  470. item.makeTonnage = (item.realTonnage - item.previewTonnage).toFixed(2);
  471. //实际开票金额
  472. item.actuallyMoney = (item.makeTonnage * item.unitPrice).toFixed(2);
  473. });
  474. this.getSpanArr(this.tableData);
  475. },
  476. //根据表格据汇总顶部展示
  477. getTotalArr(data) {
  478. this.totalWillTonageedValue = data.reduce((pre, item) => {
  479. return pre + item.willTonanged;
  480. }, 0);
  481. this.totalWillTonageedMoney = data.reduce((pre, item) => {
  482. return pre + item.willMoneyed;
  483. });
  484. this.totalActuallyTonageedValue = data.reduce((pre, item) => {
  485. return pre + item.actuallyMoney;
  486. });
  487. this.totalActuallyTonageedMoney = data.reduce((pre, item) => {
  488. return pre + item.actuallyMonthMoney;
  489. });
  490. },
  491. handleClick() {
  492. console.log("我正在进行账单");
  493. },
  494. onClick() {},
  495. //获取未结算账单数据
  496. getNoDetailsStament() {
  497. this.axios.post("/api/v1/bms/getShipFeeStatement").then(res => {
  498. console.log(res.data.data);
  499. this.tableData = res.data.data;
  500. this.computedTableData(this.tableData);
  501. });
  502. },
  503. getDetailsStamented() {},
  504. //合并表格数据
  505. getSpanArr(data) {
  506. //每次调用方法初始化
  507. this.spanArr = [];
  508. for (var i = 0; i < data.length; i++) {
  509. if (i === 0) {
  510. this.spanArr.push(1);
  511. data[i].group = i;
  512. this.pos = 0;
  513. } else {
  514. // 判断当前元素与上一个元素是否相同
  515. if (data[i].batchId === data[i - 1].batchId) {
  516. this.spanArr[this.pos] += 1;
  517. data[i].group = data[i - 1].group;
  518. this.spanArr.push(0);
  519. } else {
  520. this.spanArr.push(1);
  521. this.pos = i;
  522. data[i].group = data[i - 1].group + 1;
  523. }
  524. }
  525. }
  526. },
  527. objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  528. if (this.mergeList.includes(column.property)) {
  529. const _row = this.spanArr[rowIndex];
  530. const _col = _row > 0 ? 1 : 0;
  531. return {
  532. rowspan: _row,
  533. colspan: _col
  534. };
  535. }
  536. },
  537. objectSpanMethod1({ row, column, rowIndex, columnIndex }) {
  538. if (this.mergeList.includes(column.property)) {
  539. const _row = this.spanArr[rowIndex];
  540. const _col = _row > 0 ? 1 : 0;
  541. return {
  542. rowspan: _row,
  543. colspan: _col
  544. };
  545. }
  546. },
  547. //导出账单数据
  548. exportAllReportToExcel() {
  549. console.log(this.$refs.tableRef);
  550. const loading = this.$loading({
  551. lock: true,
  552. text: "正在导出Excel",
  553. spinner: "el-icon-loading",
  554. background: "rgba(0, 0, 0, 0.7)"
  555. });
  556. var title = this.tableTitle;
  557. let tHeader = [];
  558. let filterVal = [];
  559. let data = [];
  560. if (this.activeName == "first") {
  561. data = this.$refs.tableRef.$children;
  562. } else {
  563. data = this.$refs.tableRef1.$children;
  564. }
  565. data.forEach(item => {
  566. if (item.label != undefined && item.prop != undefined) {
  567. if (tHeader.indexOf(item.label) === -1) {
  568. tHeader.push(item.label);
  569. }
  570. if (filterVal.indexOf(item.prop) === -1) {
  571. filterVal.push(item.prop);
  572. }
  573. }
  574. });
  575. this.downloadLoading = true;
  576. require.ensure([], () => {
  577. const {
  578. export_json_to_excel
  579. } = require("@/assets/excel/Export2Excel.js"); //这里必须使用绝对路径,使用@/+存放export2Excel的路径
  580. let data = this.tableData.map(v => filterVal.map(j => v[j])); //3.formatJson格式转换
  581. export_json_to_excel(tHeader, data, title); // (title)导出的表格名称
  582. });
  583. loading.close();
  584. }
  585. },
  586. mounted() {
  587. this.getNoDetailsStament();
  588. this.getDetailsStamented();
  589. }
  590. };
  591. </script>
  592. <style lang="scss" scoped>
  593. #detailsStatement {
  594. .top {
  595. margin-left: 10px;
  596. margin-top: 30px;
  597. }
  598. .main {
  599. margin-left: 10px;
  600. margin-top: 30px;
  601. ::-webkit-scrollbar {
  602. // width: 20px;
  603. height: 20px;
  604. background-color: transparent;
  605. }
  606. }
  607. }
  608. </style>