123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746 |
- <!-- 计费账单 -->
- <template>
- <div id="detailsStatement">
- <div class="top">
- <el-form :inline="true">
- <el-form-item>
- <el-input v-model="shipName" placeholder="请输入船名"></el-input>
- </el-form-item>
- <el-form-item>
- <span class="demonstration">离港日期</span>
- <el-date-picker
- v-model="startTime"
- type="date"
- placeholder="选择日期"
- style="width:200px"
- >
- </el-date-picker>
- <span>至</span>
- <el-date-picker
- v-model="endTime"
- type="date"
- placeholder="选择日期"
- style="width:200px"
- >
- </el-date-picker>
- </el-form-item>
- <el-form-item>
- <el-button @click="onClick" type="primary" icon="el-icon-search">查询</el-button>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="exportAllReportToExcel"
- ><i class="el-icon-download"></i>Excel</el-button
- >
- </el-form-item>
- <!-- <el-form-item>
- <span class="totalWillTonage">合计已预开票吨位</span>
- <el-input
- v-model="totalWillTonageedValue"
- disabled
- style="width:80px"
- ></el-input>
- </el-form-item>
- <el-form-item>
- <span class="totalWillTonage">合计已预开金额</span>
- <el-input
- v-model="totalWillTonageedMoney"
- disabled
- style="width:80px"
- ></el-input>
- </el-form-item>
- <el-form-item>
- <span class="totalWillTonage">合计本次实际开票吨位</span>
- <el-input
- v-model="totalActuallyTonageedValue"
- disabled
- style="width:80px"
- ></el-input>
- </el-form-item>
- <el-form-item>
- <span class="totalWillTonage">合计本月实际开票金额</span>
- <el-input
- v-model="totalActuallyTonageedMoney"
- disabled
- style="width:80px"
- ></el-input>
- </el-form-item> -->
- </el-form>
- </div>
- <div class="main">
- <el-tabs v-model="activeName" @tab-click="handleClick">
- <el-tab-pane label="未结算" name="first">
- <el-table
- :data="tableData"
- ref="tableRef"
- border
- style="width: 100%; margin-top: 0px"
- fit
- max-height="500px"
- :row-style="{ height: '30px' }"
- :cell-style="{ fontWeight: '700' }"
- class="table"
- :span-method="objectSpanMethod"
- >
- <el-table-column
- prop="index"
- width="50"
- label="序号"
- align="center"
- :resizable="false"
- >
- <template slot-scope="scope">{{ scope.row.group + 1 }}</template>
- </el-table-column>
- <el-table-column
- prop="materialName"
- label="品种"
- width="150px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="resultForeignShipName"
- label="船名"
- width="150px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="portName"
- label="放货港口"
- width="150px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="carrierName"
- label="承运单位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="resultOutPortTime"
- label="离港日期"
- width="200px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="loadTonnage"
- label="装船吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="loadingProportion"
- label="装船比例"
- width="70px"
- align="center"
- >
- <template slot-scope="scope">
- {{(scope.row.loadingProportion*100).toFixed(2)}}%
- </template>
- </el-table-column>
- <el-table-column
- prop="realTonnage"
- label="结算吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="totalEnTonnage"
- label="到厂湿吨"
- width="120px"
- align="center"
- >
- <template slot-scope="scope">
- <el-input type="number" v-model="scope.row.totalEnTonnage"></el-input>
- </template>
- </el-table-column>
- <el-table-column
- prop="unitPrice"
- label="合同单价"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="inspectionFees"
- label="水分检测费"
- width="120px"
- align="center"
- >
- <template slot-scope="scope">
- <el-input type="number" v-model="scope.row.inspectionFees"></el-input>
- </template>
- </el-table-column>
- <el-table-column
- prop="statementTotalAmount"
- label="总计开票金额"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="fee"
- label="水运费"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="previewTonnage"
- label="已预开票吨位"
- width="120px"
- align="center"
- >
- <template slot-scope="scope">
- <el-input type="number" v-model="scope.row.previewTonnage"></el-input>
- </template>
- </el-table-column>
- <el-table-column
- prop="previewFee"
- label="已预开票金额"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="makeTonnage"
- label="实际开票吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="actuallyMoney"
- label="实际开票金额"
- width="100px"
- align="center"
- >
- </el-table-column>
- <!-- <el-table-column
- prop="feeMake"
- label="本月实际开票金额"
-
- align="center"
- >
- </el-table-column> -->
- <el-table-column
- prop="operate"
- label="操作"
- width="100px"
- align="center"
- fixed="right"
- >
- <template slot-scope="scope">
- <el-button type="text" @click="operate(scope.row)"
- >保存</el-button
- >
- <el-button type="text" @click="settlement(scope.row)"
- >结算</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- <el-tab-pane label="已结算" name="second">
- <el-table
- :data="tableData1"
- ref="tableRef1"
- border
- max-height="600px"
- :row-style="{ height: '30px' }"
- :cell-style="{ fontWeight: '700' }"
- class="table"
- :span-method="objectSpanMethod1"
- >
- <el-table-column
- prop="index"
- width="50"
- label="序号"
- align="center"
- :resizable="false"
- >
- <template slot-scope="scope">{{ scope.row.group + 1 }}</template>
- </el-table-column>
- <el-table-column
- prop="materialName"
- label="品种"
- width="150px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="resultForeignShipName"
- label="船名"
- width="150px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="portName"
- label="放货港口"
- width="150px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="carrierName"
- label="承运单位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="statementTotalAmount"
- label="开票总金额"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="makeTonnageTotal"
- label="开票总吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="resultOutPortTime"
- label="离港日期"
- width="200px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="loadTonnage"
- label="装船吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="loadingProportion"
- label="装船比例"
- width="100px"
- align="center"
- >
- <template slot-scope="scope">
- {{(scope.row.loadingProportion*100).toFixed(2)}}%
- </template>
- </el-table-column>
- <el-table-column
- prop="inspectionFees"
- label="水分检测费"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="realTonnage"
- label="结算吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="totalEnTonnage"
- label="到厂湿吨"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="unitPrice"
- label="合同单价"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="fee"
- label="金额(元)"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="previewTonnage"
- label="已预开票吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="previewFee"
- label="已预开票金额"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="makeTonnage"
- label="实际开票吨位"
- width="100px"
- align="center"
- >
- </el-table-column>
- <el-table-column
- prop="feeMake"
- label="实际开票金额"
- width="100px"
- align="center"
- >
- </el-table-column>
- </el-table>
- </el-tab-pane>
- </el-tabs>
- </div>
- </div>
- </template>
- <script>
- import { getCookie } from "@/utils/util.js";
- import { sjTime } from "@/utils/sharedJsFile";
- import BigNumber, {bigNumber} from "bignumber.js"
- export default {
- data() {
- return {
- totalWillTonageedValue: 0,
- totalWillTonageedMoney: 0,
- totalActuallyTonageedMoney: 0,
- totalActuallyTonageedValue: 0,
- shipName: null,
- tableData: [],
- tableData1: [],
- spanArr: [],
- spanArr1: [],
- pos: null,
- mergeList: [
- "index",
- "carrierName",
- "portName",
- "resultForeignShipName",
- "materialName",
- "totalEnTonnage",
- "operate",
- "statementTotalAmount",
- "makeTonnageTotal"
- ],
- activeName: "first",
- tableTitle: "结算账单报表",
- startTime: null,
- endTime: null
- };
- },
- watch: {
- tableData: {
- handler(newVal) {
- console.log("执行一次汇总函数");
- this.computedTableData(newVal);
- },
- deep: true,
- immediate: false
- },
- tableData1: {
- handler(newVal) {
- //console.log("执行一次汇总函数");
- //this.computedTableData1(newVal);
- },
- deep: true,
- immediate: false
- }
- },
- methods: {
- //结算
- settlement(row) {
- console.log("row:",row);
- //遍历tableData,找出相同批次的行数
- let arr = this.tableData.filter(e => {
- return e.batchId == row.batchId && e.noticeTime==row.noticeTime;
- });
- let map = {
- list: arr,
- statementType: 3,
- totalEnTonnage: row.totalEnTonnage,
- statementTotalAmount: row.statementTotalAmount,
- userID: getCookie("userId"),
- statementStatus:1
- };
- console.log("map:",map);
- this.axios
- .post("/api/v1/bms/addShipFeeStatement", map)
- .then(res => {
- if (res.data.code == "200") {
- this.getNoDetailsStament();
- this.$message.success("保存成功");
- }
- })
- .catch(() => {
- this.$message.error("保存失败");
- });
- },
- //保存
- operate(row) {
- console.log("row:",row);
- //遍历tableData,找出相同批次的行数
- let arr = this.tableData.filter(e => {
- return e.batchId == row.batchId && e.noticeTime==row.noticeTime;
- });
- let map = {
- list: arr,
- statementType: 3,
- totalEnTonnage: row.totalEnTonnage,
- statementTotalAmount: row.statementTotalAmount,
- userID: getCookie("userId")
- };
- console.log("map:",map);
- this.axios
- .post("/api/v1/bms/addShipFeeStatement", map)
- .then(res => {
- if (res.data.code == "200") {
- this.getNoDetailsStament();
- this.$message.success("保存成功");
- }
- })
- .catch(() => {
- this.$message.error("保存失败");
- });
- },
- //处理表格数据
- computedTableData(data) {
- data.forEach((item, index) => {
- if (index == 0) {
- } else if (item.batchId == data[index - 1].batchId && item.noticeTime == data[index - 1].noticeTime) {
- item.totalEnTonnage = data[index - 1].totalEnTonnage;
- }
- //预开金额
- item.previewFee = (item.unitPrice * item.previewTonnage).toFixed(2);
- //结算吨位
- item.realTonnage = (
- item.totalEnTonnage * item.loadingProportion
- ).toFixed(2);
- //金额
- item.fee = (item.realTonnage * item.unitPrice).toFixed(2);
- //开票吨位
- item.makeTonnage = (item.realTonnage - item.previewTonnage).toFixed(2);
- //实际开票金额
- item.actuallyMoney = (item.makeTonnage * item.unitPrice-item.inspectionFees).toFixed(2);
- });
- this.computedTotal(data);
- this.getSpanArr(this.tableData);
- },
- //遍历,汇总
- computedTotal(data){
- data.forEach((item, index) => {
- let arr = data.filter(e => {
- return e.batchId == item.batchId && e.noticeTime==item.noticeTime;
- });
- let inspectionFees=arr.reduce((pre, item1) => {
- console.log("parseFloat(item1.inspectionFees).toFixed(2)",parseFloat(item1.inspectionFees).toFixed(2));
- if(item1.inspectionFees)
- return pre.plus(new BigNumber(item1.inspectionFees));
- else
- return pre.plus(0.0);
- }, new BigNumber(0.0));
- console.log("inspectionFees:",inspectionFees.toNumber());
- item.statementTotalAmount=((item.totalEnTonnage-item.previewTonnage)*item.unitPrice-inspectionFees.toNumber()).toFixed(2);
- });
- },
- //根据表格据汇总顶部展示
- getTotalArr(data) {
- this.totalWillTonageedValue = data.reduce((pre, item) => {
- return pre + item.willTonanged;
- }, 0);
- this.totalWillTonageedMoney = data.reduce((pre, item) => {
- return pre + item.willMoneyed;
- });
- this.totalActuallyTonageedValue = data.reduce((pre, item) => {
- return pre + item.actuallyMoney;
- });
- this.totalActuallyTonageedMoney = data.reduce((pre, item) => {
- return pre + item.actuallyMonthMoney;
- });
- },
- handleClick() {
- console.log("我正在进行账单");
- },
- onClick() {
- if(this.activeName=='first'){
- this.getNoDetailsStament();
- }else if(this.activeName=='second'){
- this.getDetailsStamented();
- }
- },
- //获取未结算账单数据
- getNoDetailsStament() {
- let startTime = null;
- let endTime = null;
- let map={con:this.shipName};
- if (this.startTime) {
- startTime = sjTime(this.startTime);
- }
- if (this.endTime) {
- endTime = sjTime(this.endTime);
- }
- if(startTime && endTime && startTime < endTime){
- map.startTime=startTime;
- map.endTime=endTime;
- }
- this.axios.post("/api/v1/bms/getShipFeeStatement",map).then(res => {
- console.log(res.data.data);
- this.tableData = res.data.data;
- this.computedTableData(this.tableData);
- });
- },
- //已结算账单数据
- getDetailsStamented() {
- let startTime = null;
- let endTime = null;
- let map={con:this.shipName};
- if (this.startTime) {
- startTime = sjTime(this.startTime);
- }
- if (this.endTime) {
- endTime = sjTime(this.endTime);
- }
- if(startTime && endTime && startTime < endTime){
- map.startTime=startTime;
- map.endTime=endTime;
- }
- this.axios.post("/api/v1/bms/getShipFeeStatemented",map).then(res => {
- console.log(res.data.data);
- this.tableData1 = res.data.data;
- this.getSpanArr1(this.tableData1);
- });
- },
- //合并表格数据
- getSpanArr(data) {
- //每次调用方法初始化
- this.spanArr = [];
- for (var i = 0; i < data.length; i++) {
- if (i === 0) {
- this.spanArr.push(1);
- data[i].group = i;
- this.pos = 0;
- } else {
- // 判断当前元素与上一个元素是否相同
- if (data[i].batchId === data[i - 1].batchId) {
- this.spanArr[this.pos] += 1;
- data[i].group = data[i - 1].group;
- this.spanArr.push(0);
- } else {
- this.spanArr.push(1);
- this.pos = i;
- data[i].group = data[i - 1].group + 1;
- }
- }
- }
- },
- //合并表格数据
- getSpanArr1(data) {
- //每次调用方法初始化
- this.spanArr1 = [];
- for (var i = 0; i < data.length; i++) {
- if (i === 0) {
- this.spanArr1.push(1);
- data[i].group = i;
- this.pos = 0;
- } else {
- // 判断当前元素与上一个元素是否相同
- if (data[i].statementId === data[i - 1].statementId) {
- this.spanArr1[this.pos] += 1;
- data[i].group = data[i - 1].group;
- this.spanArr1.push(0);
- } else {
- this.spanArr1.push(1);
- this.pos = i;
- data[i].group = data[i - 1].group + 1;
- }
- }
- }
- },
- objectSpanMethod({ row, column, rowIndex, columnIndex }) {
- if (this.mergeList.includes(column.property)) {
- const _row = this.spanArr[rowIndex];
- const _col = _row > 0 ? 1 : 0;
- return {
- rowspan: _row,
- colspan: _col
- };
- }
- },
- objectSpanMethod1({ row, column, rowIndex, columnIndex }) {
- if (this.mergeList.includes(column.property)) {
- const _row = this.spanArr1[rowIndex];
- const _col = _row > 0 ? 1 : 0;
- return {
- rowspan: _row,
- colspan: _col
- };
- }
- },
- //导出账单数据
- exportAllReportToExcel() {
- console.log(this.$refs.tableRef);
- const loading = this.$loading({
- lock: true,
- text: "正在导出Excel",
- spinner: "el-icon-loading",
- background: "rgba(0, 0, 0, 0.7)"
- });
- var title = this.tableTitle;
- let tHeader = [];
- let filterVal = [];
- let data = [];
- if (this.activeName == "first") {
- data = this.$refs.tableRef.$children;
- } else {
- data = this.$refs.tableRef1.$children;
- }
- data.forEach(item => {
- if (item.label != undefined && item.prop != undefined) {
- if (tHeader.indexOf(item.label) === -1) {
- tHeader.push(item.label);
- }
- if (filterVal.indexOf(item.prop) === -1) {
- filterVal.push(item.prop);
- }
- }
- });
- this.downloadLoading = true;
- require.ensure([], () => {
- const {
- export_json_to_excel
- } = require("@/assets/excel/Export2Excel.js"); //这里必须使用绝对路径,使用@/+存放export2Excel的路径
- let data = this.tableData.map(v => filterVal.map(j => v[j])); //3.formatJson格式转换
- export_json_to_excel(tHeader, data, title); // (title)导出的表格名称
- });
- loading.close();
- }
- },
- mounted() {
- //this.getNoDetailsStament();
- this.getDetailsStamented();
- }
- };
- </script>
- <style lang="scss" scoped>
- #detailsStatement {
- .top {
- margin-left: 10px;
- margin-top: 30px;
- }
- .main {
- margin-left: 10px;
- margin-top: 30px;
- ::-webkit-scrollbar {
- // width: 20px;
- height: 20px;
- background-color: transparent;
- }
- }
- }
- </style>
|