detailsStatement.vue 18 KB

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