<template> <div class="app-container" > <div id="print" style="font-size: 18px;"> <div style="text-align: center;font-weight: bold;font-size: 26px;padding: 22px 0;border-top: 1px solid #666;border-left:1px solid #666;border-right: 1px solid #666;">{{$t('捷道货运收款单')}}</div> <table border="1" style="width: 100%;text-align: center;border-collapse: collapse; "> <tr> <td style="font-weight: bold;width:12.5%">{{$t('部门')}}</td> <td style="width:12.5%">{{form?form.departmentName:$t('无')}}</td> <td style="font-weight: bold;width:12.5%">{{$t('客户名称')}}</td> <td colspan="2" style="width: 25%;">{{form?form.customerName:$t('无')}}</td> <td style="font-weight: bold;width:12.5%">{{$t('收款日期')}}</td> <td colspan="2" style="width: 25%;">{{parseTime(date)||$t('无')}}</td> </tr> <tr> <td style="font-weight: bold;width:12.5%">{{$t('收款单号')}}</td> <td style="width:12.5%">{{form?form.receiptNo:$t('无')}}</td> <td style="font-weight: bold;width:12.5%">{{$t('备注')}}</td> <td colspan="4" style="width: 50%;">{{form?form.remark:$t('无')}}</td> </tr> <tr> <td colspan="8">Form/To:{{orderData.logisticsInfoDto?orderData.logisticsInfoDto.startTitleZh:''}}>{{orderData.logisticsInfoDto?orderData.logisticsInfoDto.destAddressZh:''}}</td> </tr> </table> <table border="1" style="width: 100%;text-align: center;border-collapse: collapse; border-top: 0;"> <tr> <th style="width: 12.5%;">{{$t('序号')}}</th> <th style="width: 12.5%;">{{$t('提单号')}}</th> <th style="width: 12.5%;">{{$t('订单号')}}</th> <th style="width: 12.5%;">{{$t('品名')}}</th> <th style="width: 12.5%;">{{$t('收入类型')}}</th> <th style="width: 12.5%;">{{$t('金额')}}</th> <th style="width: 12.5%;">{{$t('币种')}}</th> <th style="width: 12.5%;">{{$t('优惠金额')}}</th> </tr> <tr v-for="(item, index) in list" :key="index"> <td>{{ index + 1 }}</td> <td>{{ orderData.tidanNo||''}}</td> <td>{{ item.orderNo }}</td> <td>{{ $i18n.locale=='zh_CN'?item.titleZh:item.titleEn }}</td> <td><dict-tag :value="item.feeType" :type="DICT_TYPE.FEE_TYPE"></dict-tag></td> <td> {{item.totalAmount}}</td> <td>{{getCurrencyLabel(item.currencyId)}}</td> <td>{{ item.discountTotal||0 }}</td> </tr> <tr v-for="(items, indexs) in receiptAccountList" :key="indexs"> <td>{{getCurrencyLabel(items.currencyId)}}{{$t('应收合计')}}</td> <td ><span v-if="items.discountTotal>0">{{ `${items.receivableAmount - items.discountTotal }(${items.receivableAmount} - ${items.discountTotal})` }}</span> <span v-else>{{ `${items.receivableAmount - items.discountTotal }` }}</span> </td> <td>{{$t('汇率')}}</td> <td>{{ items.collectionRate}}</td> <td>{{$t('收款金额')}}({{getCurrencyLabel(items.collectionCurrencyId)}})</td> <td colspan="3">{{ items.collectionAmount}}</td> </tr> </table> <div style="text-align: center;border-left:1px solid #666;border-right: 1px solid #666;height: 36px;line-height: 36px;"> {{$t('银行信息')}} </div> <div style="display: flex;align-items: center;border-top: 1px solid #666;border-left:1px solid #666;border-right: 1px solid #666;" v-for="(bankTiem,index) in detailed" :key="index"> <div style="padding:6px 0;width: 12.5%;text-align: center;border-right: 1px solid #666;" > <p style="margin: 0;word-break: break-all;">{{$t('户名')}}:{{bankTiem.accountName}}</p> <p style="margin: 0;word-break: break-all;">{{$t('银行名称')}}:{{bankTiem.accountBankName||''}}</p> <p style="margin: 0;word-break: break-all;">A/C NO:{{bankTiem.accountNo}}</p> </div> <div style="padding:6px 0;width: 87.5%;text-align: center;"> <p style="margin: 0;">{{$t('实收')}}{{getCurrencyLabel(bankTiem.currencyId)}}:{{bankTiem.amount}}¥</p> <!-- <p style="margin: 0;">未收:¥{{bankTiem.noReceipt}}</p> --> </div> </div> <div style="display: flex;align-items: center;border: 1px solid #666;"> <div style="font-weight: bold;width: 12.5%;text-align: center;border-right: 1px solid #666;height: 36px;line-height: 36px;">{{$t('主管')}}</div> <div style="width: 12.5%;text-align: center;border-right: 1px solid #666;height: 36px;line-height: 36px;"></div> <div style="font-weight: bold;width: 12.5%;text-align: center;border-right: 1px solid #666;height: 36px;line-height: 36px;">{{$t('会计')}}</div> <div style="width: 12.5%;text-align: center;border-right: 1px solid #666;height: 36px;line-height: 36px;"></div> <div style="font-weight: bold;width: 12.5%;text-align: center;border-right: 1px solid #666;height: 36px;line-height: 36px;">{{$t('出纳')}}</div> <div style="width: 12.5%;text-align: center;height: 36px;line-height: 36px;border-right: 1px solid #666;"></div> <div style="font-weight: bold;width: 12.5%;text-align: center;border-right: 1px solid #666;height: 36px;line-height: 36px;">{{$t('经手人')}}</div> <div style="width: 12.5%;text-align: center;height: 36px;line-height: 36px;"></div> </div> </div> <div slot="footer" class="card"> <el-button type="primary" @click="print">{{ $t('确订打印') }}</el-button> </div> </div> </template> <script> import { listSimpleUsers } from "@/api/system/user" import {DICT_TYPE} from '@/utils/dict' import CustomerSelector from '@/components/CustomerSelector' import { getBankAccountPage } from "@/api/ecw/bankAccount"; import { listSimpleDepts } from "@/api/system/dept" import { getReceipt} from "@/api/ecw/receipt"; import lodop from '@/utils/lodop' import NP from 'number-precision' import {getOrder} from '@/api/ecw/order' import { getCurrencyPage } from "@/api/ecw/currency"; import { getReceiptInfoByIds, getInvoicingItem,getReceiptAccountList,getReceivableItem} from "@/api/ecw/financial"; export default { name: "PrintVoucher", components: { CustomerSelector }, data() { return { loadings: false, form:{}, title:this.$t('收款单'), // creatorData:[], list:[], fileList:[], bankData:[], params:{ page:1, rows:20, }, receiptAccountList:[], deptData:[], deptArr:[], id:0, orderData:{}, detailed:[], date:'', currencyList:[] } }, async created() { let that = this // listSimpleUsers().then(res =>that.creatorData = res.data) // getBankAccountPage(that.params).then(res =>that.bankData = res.data.list) await getCurrencyPage(this.params).then(res => this.currencyList = res.data.list) await listSimpleDepts().then(res =>{ res.data.forEach((item)=>{ if(item.parentId==0){ that.deptArr.push(item) }else{ that.deptData.push(item) } }) that.deptData.forEach((value)=>{ var dept = that.deptArr.filter(itt=>itt.id==value.parentId) if(dept.length>0){ value.name =dept[0].name+' | '+ value.name } }) }) if(that.$route.query.id){ that.id = that.$route.query.id that.getCollectionData() that.getList() getInvoicingItem({id: this.id}).then(res => { this.list = res.data if(this.list.length>0) this.getOrder(this.list[0].orderId) }) } getReceiptAccountList({ id: this.id }).then(res => { // if (res.data.length > 0) { // // totalAmount // res.data = [...res.data, { // type: 'total', // writeOffAmount: res.data.reduce((total, currentValue) => NP.plus(total, currentValue.writeOffAmount || 0), 0), // collectionAmount: [0, 0, 0] // }] // } // 收款总计 // const dollarList = res.data.filter(v => v.collectionCurrencyId == 1) // const dollar = dollarList.reduce((total, currentValue) => NP.plus(total, currentValue.collectionAmount || 0), 0) // const rmbList = res.data.filter(v => v.collectionCurrencyId == 2) // const rmb = rmbList.reduce((total, currentValue) => NP.plus(total, currentValue.collectionAmount || 0), 0) // const nairaList = res.data.filter(v => v.collectionCurrencyId == 3) // const naira = nairaList.reduce((total, currentValue) => NP.plus(total, currentValue.collectionAmount || 0), 0) // res.data[res.data.length -1].collectionAmount = [dollar, rmb, naira] // this.$set(this.form, 'receiptAccountList', [...this.form.receiptAccountList]) const dollarListByList = this.list.filter(v => v.currencyId === 1) const discountDollar = dollarListByList.reduce((total, currentValue) => NP.plus(total, currentValue.discountTotal || 0), 0) const d = res.data.find(v => v.currencyId == 1) d && (d.discountTotal = discountDollar) const rmbListByList = this.list.filter(v => v.currencyId === 2) const discountRmb = rmbListByList.reduce((total, currentValue) => NP.plus(total, currentValue.discountTotal || 0), 0) const r = res.data.find(v => v.currencyId == 2) r && (r.discountTotal = discountRmb) const nairaListByList = this.list.filter(v => v.currencyId === 3) const discountNaira = nairaListByList.reduce((total, currentValue) => NP.plus(total, currentValue.discountTotal || 0), 0) const n = res.data.find(v => v.currencyId == 3) n && (n.discountTotal = discountNaira) console.log(res.data) this.$set(this, 'receiptAccountList', [...res.data]) this.$nextTick(() => { // this.form.receiptAccountList.forEach((item, index) => { // this.rateChange(item, index) // }); }) }) }, methods: { getCurrencyLabel(id){ var label = this.currencyList.filter(item=>item.id == id) if(label.length>0) return this.$i18n.locale=='zh_CN'?label[0].titleZh:label[0].titleEn return '' }, getList() { getReceivableItem({ id: this.id }).then(res => { this.detailed = res.data this.detailed.forEach(item=>{ if(!this.date){ this.date = item.amountDate }else if(this.date<item.amountDate){ this.date = item.amountDate } }) }) }, getCollectionData(){ let that = this getReceiptInfoByIds({id:that.id}).then(res =>{ that.form = res.data that.form.departmentName = that.deptData.find(v => v.id == that.form.departmentId).name }) }, getRecep(id){ var total = 0 if(id){ var data = this.detailed.filter(item=>item.currencyId==id) data.forEach(item => { total = NP.plus(total, item.writeOffAmount) }) } return total }, handleAddReceiptItem() { let recepted = [] this.detailed.forEach(item => { if(!recepted[item.currencyId]){ recepted[item.currencyId] = item.amount }else recepted[item.currencyId] = NP.plus(recepted[item.currencyId], item.amount) }) console.log('rece',recepted) let collom = [] this.receiptAccountList.forEach(item => { if(recepted[item.currencyId]){ item.noReceipt = +parseFloat(item.receivableAmount-recepted[item.currencyId]) } }) }, getOrder(orderId){ getOrder(orderId).then(response => { this.orderData = response.data }); }, print(){ lodop().then(LODOP => { LODOP.PRINT_INIT(); LODOP.SET_PRINT_STYLE("FontSize",18); LODOP.SET_PRINT_STYLE("Bold",1); // LODOP.ADD_PRINT_TEXT(50,231,260,39,"打印页面部分内容"); // var stylePrint = "<style>table th,td{padding:0;margin:0;border:1px solid #000000;border-collapse:collapse;}</style>" var htmlContent = "<body>"+document.getElementById("print").innerHTML+"</body>" LODOP.ADD_PRINT_HTM("6mm", "6mm", "RightMargin:6mm", "BottomMargin:6mm", htmlContent); LODOP.PRINT(); // this.$alert('已发起打印任务'); // LODOP.PREVIEW(); // 预览 /* LODOP.PRINTA(); // 选择打印机 // 直接打印 */ console.log('打印哦') }).catch(err => { console.error('lodop异常', err) alert(this.$t('请检查LODOP打印控件是否安装并启动')); }) }, totalMoney() { const t = this.list.map(v => v.actualAmount).reduce((prev, curr) => { return prev + curr; }, 0) return t }, convertCurrency(money) { //汉字的数字 var cnNums = new Array('零', this.$t('壹'), this.$t('贰'), this.$t('叁'), this.$t('肆'), this.$t('伍'), this.$t('陆'), this.$t('柒'), this.$t('捌'), '玖'); //基本单位 var cnIntRadice = new Array('', this.$t('拾'), this.$t('佰'), '仟'); //对应整数部分扩展单位 var cnIntUnits = new Array('', this.$t('万'), this.$t('亿'), '兆'); //对应小数部分单位 var cnDecUnits = new Array('角', this.$t('分'), this.$t('毫'), '厘'); //整数金额时后面跟的字符 var cnInteger = this.$t('整'); //整型完以后的单位 var cnIntLast = this.$t('元'); //最大处理的数字 var maxNum = 999999999999999.9999; //金额整数部分 var integerNum; //金额小数部分 var decimalNum; //输出的中文金额字符串 var chineseStr = ''; //分离金额后用的数组,预定义 var parts; // 传入的参数为空情况 if(money === '') { return ''; } money = parseFloat(money) if(money >= maxNum){ return '' } // 传入的参数为0情况 if (money === 0) { chineseStr = cnNums[0] + cnIntLast + cnInteger; return chineseStr } // 转为字符串 money = money.toString(); // indexOf 检测某字符在字符串中首次出现的位置 返回索引值(从0 开始) -1 代表无 if (money.indexOf('.') == -1) { integerNum = money; decimalNum = '' }else{ parts = money.split('.'); integerNum = parts[0]; decimalNum = parts[1].substr(0,4); } //转换整数部分 if(parseInt(integerNum,10) > 0){ let zeroCount = 0; let IntLen = integerNum.length for(let i = 0; i < IntLen; i++){ let n = integerNum.substr(i,1); let p = IntLen - i - 1; let q = p / 4; let m = p % 4; if( n == '0'){ zeroCount ++ ; }else{ if(zeroCount > 0){ chineseStr += cnNums[0] } zeroCount = 0; chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]; } if(m == 0 && zeroCount < 4){ chineseStr += cnIntUnits[q]; } } // 最后+ 元 chineseStr += cnIntLast; } // 转换小数部分 if(decimalNum != ''){ let decLen = decimalNum.length; for(let i = 0; i <decLen; i++){ let n = decimalNum.substr(i,1); if(n != '0'){ chineseStr += cnNums[Number(n)] + cnDecUnits[i] } } } if(chineseStr == ''){ chineseStr = cnNums[0] + cnIntLast + cnInteger }else if(decimalNum == ''){ chineseStr += cnInteger; } return chineseStr }, }, } </script> <style scoped id="printStyle"> .card{ margin-top: 20px; } .dialog-footer{ padding: 40px; } .card-title{ font-size: 18px; font-weight: bold; text-align: center; } .header{ display: flex; align-items: center; justify-content: space-between; } .lastRow{ border-top:1px solid #dfe6ec; display: flex; width: 100%; height: 44px; text-align: center; align-items: center; } .lastRow div{ height: 44px; line-height: 44px; border-right:1px solid #dfe6ec; } </style>