irc_web/.svn/pristine/a1/a1edf688eaee594827c8149e4c7...

560 lines
20 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container monthly-paymentDetail">
<div class="filter-container">
<el-form :inline="true" :model="basicInfo" class="demo-form-inline" size="small">
<el-form-item label="Name">
<el-input v-model="basicInfo.Name" style="width:160px;" readonly />
</el-form-item>
<el-form-item label="ID">
<el-input v-model="basicInfo.Code" style="width:100px;" readonly />
</el-form-item>
<el-form-item label="Rank">
<el-input v-model="basicInfo.RankName" style="width:180px;" readonly />
</el-form-item>
<el-form-item label="Month">
<el-input v-model="basicInfo.YearMonth" readonly style="width:100px;" />
</el-form-item>
<el-form-item label="Exchange Rate">
<el-input v-model="basicInfo.ExchangeRate" readonly style="width:80px;" />
</el-form-item>
<el-button type="primary" size="small" @click="exportExcel">Export Excel</el-button>
<el-button
size="small"
type="primary"
:loading="loading"
@click="handleWindowPrint( '#payDetailPdf2', htmlTitle )"
>Export PDF</el-button>
</el-form>
</div>
<el-table
id="payDetailPdf2"
height="90%"
:data="list"
:span-method="objectSpanMethod"
border
show-summary
:summary-method="getSummaries"
align="center"
size="small"
>
<el-table-column prop="TrialCode" label="Project ID" show-overflow-tooltip min-width="100" />
<el-table-column
prop="PaymentType"
label="Read Type"
show-overflow-tooltip
min-width="100"
>
<template slot-scope="scope">
<div>{{ scope.row.TrialCode!='Adjustment'? scope.row.PaymentType :scope.row.AdjustmentView.AdjustType }}</div>
</template>
</el-table-column>
<el-table-column prop="Count" label="Volume" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<div>{{ scope.row.TrialCode!='Adjustment'? scope.row.Count : scope.row.AdjustmentView.Note }}</div>
</template>
</el-table-column>
<el-table-column
prop="BasePrice"
label="Base Rate ($)"
show-overflow-tooltip
min-width="100"
>
<template slot-scope="scope">
<span>{{ scope.row.BasePrice | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="PersonalAdditional"
label="Personal Adjustment ($)"
show-overflow-tooltip
min-width="160"
>
<template slot-scope="scope">
<span>{{ scope.row.PersonalAdditional | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="TrialAdditional"
label="Project Adjustment ($)"
show-overflow-tooltip
min-width="150"
>
<template slot-scope="scope">
<span>{{ scope.row.TrialAdditional | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="TotalUnitPrice"
label="Adjusted Rate ($)"
show-overflow-tooltip
min-width="130"
>
<template slot-scope="scope">
<span>{{ scope.row.TotalUnitPrice | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="PaymentUSD"
label="Subtotal ($)"
show-overflow-tooltip
min-width="100"
>
<template slot-scope="scope">
<span>{{ scope.row.PaymentUSD | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="PaymentCNY"
:label="rmbTitle"
show-overflow-tooltip
min-width="120"
>
<template slot-scope="scope">
<span v-if="basicInfo.ExchangeRate==0" style="color:red">{{ 'Setting Needed' }}</span>
<span v-else>{{ scope.row.PaymentCNY }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getMonthlyPaymentDetailList } from '@/api/financials'
import Excel from 'exceljs'
import floatObj from '@/utils/float-operation'
export default {
name: 'PaymentDetail',
filters: {
rounding(value) {
return value ? Number(value).toFixed(2) : value
// return value
}
},
data() {
return {
basicInfo: {},
list: [],
spanArr: [],
pos: 0,
htmlTitle: '',
rmbTitle: '',
loading: false
}
},
mounted() {
const info = this.$router.currentRoute.query
this.basicInfo = (({ Id, DoctorId, ChineseName, LastName, FirstName, Code, ExchangeRate, RankName, YearMonth }) => ({ Id, DoctorId, ChineseName, LastName, FirstName, Code, ExchangeRate, RankName, YearMonth }))(info)
this.basicInfo.Name = `${this.basicInfo.FirstName} ${this.basicInfo.LastName} ${this.basicInfo.ChineseName}`
this.htmlTitle = this.basicInfo.ChineseName + '_' + this.basicInfo.YearMonth
this.getList()
},
methods: {
getList() {
getMonthlyPaymentDetailList(this.basicInfo.Id, this.basicInfo.DoctorId, this.basicInfo.YearMonth).then(res => {
this.list = res.Result.DetailList
this.rmbTitle = 'Subtotal(¥)'
this.getSpanArr(res.Result.DetailList)
this.list.forEach((item, index, array) => {
if (item.AdjustmentView) {
item.AdjustmentView.Note = `Note: ${item.AdjustmentView.Note}`
}
})
})
},
getSummaries(param) {
var that = this
const { columns, data } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = 'Total'
return
}
if (column.property === 'PaymentUSD') {
const values = data.map(item => Number(item[column.property]))
if (!values.every(value => isNaN(value))) {
sums[index] = values
.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value)) {
return floatObj.add(prev, curr)
} else {
return prev
}
}, 0)
}
}
if (column.property === 'PaymentCNY') {
const values = data.map(item => Number(item['PaymentCNY']))
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value)) {
return floatObj.add(prev, curr)
} else {
return prev
}
}, 0)
if (sums[index] === 0.0 && that.basicInfo.ExchangeRate === 0) {
sums[index] = 'Setting Needed'
}
return
}
})
return sums
},
getSpanArr(data) {
for (var i = 0; i < data.length; i++) {
if (i === 0) {
this.spanArr.push(1)
this.pos = 0
} else {
// 判断当前元素与上一个元素是否相同
if (data[i].TrialCode === data[i - 1].TrialCode) {
this.spanArr[this.pos] += 1
this.spanArr.push(0)
} else {
this.spanArr.push(1)
this.pos = i
}
}
}
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
const _row = this.spanArr[rowIndex]
const _col = _row > 0 ? 1 : 0
return {
rowspan: _row,
colspan: _col
}
}
if (row.TrialCode === 'Adjustment') {
if (columnIndex === 2) {
return [1, 5]
} else if (columnIndex === 3 || columnIndex === 4 || columnIndex === 5 || columnIndex === 6) {
return [0, 0]
}
}
},
exportExcel() {
var workbook = new Excel.Workbook()
var sheet = workbook.addWorksheet(this.basicInfo.ChineseName + ' ' + this.basicInfo.YearMonth)
sheet.properties.defaultRowHeight = 22
sheet.columns = [
{ header: 'Project ID', key: 'TrialCode', width: 15 },
{ header: 'Type', key: 'PaymentType', width: 30 },
{ header: 'Count', key: 'Count', width: 15 },
{ header: 'Base Price', key: 'BasePrice', width: 15 },
{ header: 'Personal Additional', key: 'PersonalAdditional', width: 22 },
{ header: 'Trial Additional', key: 'TrialAdditional', width: 22 },
{ header: 'Total Price', key: 'TotalUnitPrice', width: 22 },
{ header: 'Total Fee', key: 'PaymentUSD', width: 22 },
{ header: 'Subtotal(¥)', key: 'PaymentCNY', width: 22 }
]
var that = this
var tempTotalFee = 0
var tempTotalFeeInCN = 0
this.list.forEach(element => {
tempTotalFee += parseFloat(element.PaymentUSD)
tempTotalFeeInCN += parseFloat(element.PaymentCNY)
})
var rowsCount = Number(this.list.length + 1)
// 处理标题
var titleRows = 4
sheet.mergeCells('A1', 'I2')
sheet.getCell('A1').value = 'Monthly Payment' // that.basicInfo.DoctorChineseName + ' ' + that.date + ' 费用明细'
sheet.getCell('A1').alignment = { vertical: 'middle', horizontal: 'center' }
sheet.getCell('A1').font = { name: 'SimSun', family: 4, size: 13, bold: true }
sheet.mergeCells('A3', 'D3')
// that.basicInfo.FirstName + ' ' + that.basicInfo.LastName + ' Name CN:'+
sheet.getCell('A3').value = 'Name' + this.basicInfo.ChineseName + ' ID:' + that.basicInfo.Code
sheet.mergeCells('E3', 'I3')
// sheet.getCell('E3').value =
// ' Rank' +
// that.basicInfo.RankName +
// ' Month' +
// that.basicInfo.YearMonth +
// ' Exchange Rate: ' +
// Number(that.basicInfo.ExchangeRate).toFixed(2)
sheet.getCell('E3').value =
' Rank' +
that.basicInfo.RankName +
' Month' +
that.basicInfo.YearMonth +
' Exchange Rate: ' +
Number(that.basicInfo.ExchangeRate)
sheet.getCell('A3').alignment = { vertical: 'middle', horizontal: 'left' }
sheet.getCell('E3').alignment = { vertical: 'middle', horizontal: 'right' }
// heet.mergeCells('A4', 'H4')
sheet.getCell('A4').value = 'Project ID'
sheet.getCell('B4').value = 'Read Type'
sheet.getCell('C4').value = 'Volume'
sheet.getCell('D4').value = 'Base Rate($)'
sheet.getCell('E4').value = 'Personal Adjustment($)'
sheet.getCell('F4').value = 'Project Adjustment($)'
sheet.getCell('G4').value = 'Adjusted Rate($)'
sheet.getCell('H4').value = 'Subtotal($)'
sheet.getCell('I4').value = 'Subtotal(¥)'
sheet.getRow(4).font = { name: 'SimSun', family: 4, size: 11, bold: true }
sheet.addRows(this.list)
// 合并项目编号单元格
var projectCount = Math.floor(Number(this.list.length / 9)) // 项目个数
for (let i = 0; i < projectCount; i++) {
var tempR1 = 'A' + (10 * i + titleRows + 1)
var tempR2 = 'A' + (10 * (i + 1) + titleRows)
if (10 * (i + 1) < rowsCount) {
sheet.mergeCells(tempR1, tempR2)
sheet.getCell(tempR1).alignment = { vertical: 'middle', horizontal: 'center' }
}
}
// 合并奖励单元格
var awardCount = this.list.filter(t => t.TrialCode === 'Volume Reward').length
var adjustMentCount = this.list.filter(t => t.TrialCode === 'Adjustment').length
if (awardCount > 0) {
var R1 = 'A' + (projectCount * 10 + titleRows + 1)
var R2 = 'A' + (projectCount * 10 + titleRows + awardCount)
sheet.mergeCells(R1, R2)
sheet.getCell(R1).alignment = { vertical: 'middle', horizontal: 'center' }
}
if (adjustMentCount > 0) {
// 处理调整行列合并
var R3 = 'A' + (projectCount * 10 + titleRows + awardCount + 1)
var R4 = 'A' + (rowsCount + titleRows - 1)
sheet.mergeCells(R3, R4)
sheet.getCell(R3).alignment = { vertical: 'middle', horizontal: 'center' }
// 行合并
var i = 0
for (i = 0; i < adjustMentCount; i++) {
var adjustMentCell1 = 'B' + (projectCount * 10 + titleRows + awardCount + 1 + i)
var adjustMentCell2 = 'C' + (projectCount * 10 + titleRows + awardCount + 1 + i)
var adjustMentCell3 = 'G' + (projectCount * 10 + titleRows + awardCount + 1 + i)
sheet.mergeCells(adjustMentCell2, adjustMentCell3)
var index = projectCount * 10 + awardCount + i
sheet.getCell(adjustMentCell1).value = this.list[index].AdjustmentView.AdjustType
sheet.getCell(adjustMentCell2).value = this.list[index].AdjustmentView.Note
}
}
var tempCell = 'A' + (rowsCount + 1 + titleRows - 1)
var tempCell1 = 'B' + (rowsCount + 1 + titleRows - 1)
var tempCell2 = 'G' + (rowsCount + 1 + titleRows - 1)
var tempCell3 = 'H' + (rowsCount + 1 + titleRows - 1)
var tempCell4 = 'I' + (rowsCount + 1 + titleRows - 1)
sheet.mergeCells(tempCell1, tempCell2)
sheet.getCell(tempCell).value = 'Total' // that.date + ' 费用总计: '
sheet.getCell(tempCell3).value = tempTotalFee
sheet.getCell(tempCell4).value = tempTotalFeeInCN
sheet.getCell(tempCell3).font = { name: 'SimSun', family: 4, size: 13, bold: true }
sheet.getRow(rowsCount + titleRows).font = { name: 'SimSun', family: 4, size: 13, bold: true }
sheet.getColumn(7).numFmt = '#,##0.00'
sheet.getColumn(8).numFmt = '#,##0.00'
sheet.getColumn(9).numFmt = '#,##0.00'
sheet.eachRow((row, number) => {
if (number > 3) {
row.eachCell((cell, rowNumber) => {
cell.border = {
top: { style: 'thin' },
left: { style: 'thin' },
bottom: { style: 'thin' },
right: { style: 'thin' }
}
})
}
})
workbook.xlsx
.writeBuffer({
base64: true
})
.then(function(xls64) {
var data = new Blob([xls64], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
if ('msSaveOrOpenBlob' in navigator) {
// ie使用的下载方式
window.navigator.msSaveOrOpenBlob(data, that.basicInfo.ChineseName + ' ' + that.basicInfo.YearMonth + '.xlsx')
} else {
var a = document.createElement('a')
var url = URL.createObjectURL(data)
a.href = url
a.download = that.basicInfo.ChineseName + ' ' + that.basicInfo.YearMonth + '.xlsx'
document.body.appendChild(a)
a.click()
setTimeout(function() {
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
}, 0)
}
})
},
handleWindowPrint(ele, fileName, vm) {
var oIframe = document.createElement('iframe')
oIframe.style.display = 'none'
var oScript = document.createElement('script')
var oStyle = document.createElement('style')
oStyle.type = 'text/css'
document.body.appendChild(oIframe)
document.head.getElementsByTagName('title')[0].innerText = `${fileName}`
oIframe.contentDocument.head.innerHTML = `<meta charset="utf-8">
<title>${fileName}</title>
<meta name="format-detection" content="telephone=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">`
var divHeader = ' <div style="text-align:center; font-size:20px:"> Monthly Payment </div>'
var divElement = `<div style='display: flex;justify-content: space-between;margin:25px 0px 20px'>
<label>Name: ${this.basicInfo.ChineseName}</label>
<label>ID: ${this.basicInfo.Code}</label>
<label>Rank: ${this.basicInfo.RankName}</label>
<label>Month: ${this.basicInfo.YearMonth}</label>
<label>Exchange Rate: ${this.basicInfo.ExchangeRate}</label>
</div>`
oIframe.contentDocument.body.innerHTML = divHeader + divElement + document.querySelector(ele).outerHTML
// oIframe.contentDocument.getElementsByClassName('el-table__body-wrapper')[0].style.maxHeight = '100%'
// 页面打印缩放比例设置
oIframe.contentDocument.body.style.zoom = 0.75
// oIframe.contentDocument.getElementById('payDetailPdf2').removeAttribute('el-table--scrollable-y')
oIframe.contentDocument.getElementsByClassName('el-table--scrollable-y').style = ''
oIframe.contentDocument.getElementsByClassName('el-table__body-wrapper')[0].style = {
'max-height': '100%'
// ,'width':'100%'
}
oIframe.contentDocument.getElementsByClassName('el-table__header-wrapper')[0].remove()
var ostatFirstTr = document.createElement('tr')
ostatFirstTr.innerHTML = `
<td >
<div class="cell">Trial ID</div>
</td>
<td >
<div class="cell">Read Type</div>
</td>
<td >
<div class="cell">Volume</div>
</td>
<td >
<div class="cell">Base Rate ($)</div>
</td>
<td >
<div class="cell">Personal Adjustment ($)</div>
</td>
<td>
<div class="cell">Trial Adjustment ($)</div>
</td>
<td >
<div class="cell">Adjusted Rate ($)</div>
</td>
<td>
<div class="cell">Subtotal ($)</div>
</td>
<td >
<div class="cell">Subtotal(¥)</div>
</td>
<th></th>`
oIframe.contentDocument.getElementsByClassName('el-table__body')[0].children[1].appendChild(ostatFirstTr)
var oldEle = oIframe.contentDocument.getElementsByClassName('el-table__body')[0].children[1].firstChild // 现有的元素
oldEle.parentNode.insertBefore(ostatFirstTr, oldEle)
// 将newEle插入到oldEle之前
var tempTotalFee = 0
var tempTotalFeeInCN = 0
this.list.forEach(element => {
tempTotalFee += parseFloat(element.PaymentUSD)
tempTotalFeeInCN += parseFloat(element.PaymentCNY)
})
// tempTotalFee = tempTotalFee.toFixed(2)
// tempTotalFeeInCN = tempTotalFeeInCN.toFixed(2)
// 移除尾部统计行
oIframe.contentDocument.getElementsByClassName('el-table__footer-wrapper')[0].remove()
// 创建尾部统计行Last
var ostatLastTr = document.createElement('tr')
ostatLastTr.innerHTML = `
<td >
<div class="cell">Total</div>
</td>
<td >
<div class="cell"></div>
</td>
<td >
<div class="cell"></div>
</td>
<td >
<div class="cell"></div>
</td>
<td >
<div class="cell"></div>
</td>
<td>
<div class="cell"></div>
</td>
<td >
<div class="cell"></div>
</td>
<td>
<div class="cell">${tempTotalFee}</div>
</td>
<td >
<div class="cell">${tempTotalFeeInCN}</div>
</td>
<th></th>`
oIframe.contentDocument.getElementsByClassName('el-table__body')[0].lastChild.appendChild(ostatLastTr)
oStyle.innerHTML = `.el-table td{border:1px solid #ccc;}
th{text-align:center} td{text-align:right}
@page{size: landscape;}
`
oIframe.contentDocument.body.appendChild(oStyle)
oScript.innerText =
`if (window.navigator.userAgent.indexOf("Edge") >= 0)
{
window.print();
}
else{window.print();}`
oIframe.contentDocument.body.appendChild(oScript)
}
}
}
</script>
<style lang="scss">
.monthly-paymentDetail{
.el-table {
overflow: visible !important;
}
}
</style>