1268 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			1268 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			Plaintext
		
	
	
| <template>
 | ||
|   <div class="monthly-payment data-list">
 | ||
|     <div class="filter-container">
 | ||
|       <el-date-picker
 | ||
|         v-model="listQuery.StatisticsDate"
 | ||
|         class="mr"
 | ||
|         type="month"
 | ||
|         value-format="yyyy-MM"
 | ||
|         format="yyyy-MM"
 | ||
|         placeholder="Select Month"
 | ||
|         :picker-options="pickerOption"
 | ||
|         :clearable="false"
 | ||
|         size="small"
 | ||
|       />
 | ||
|       <el-select v-model="listQuery.Nation" placeholder="Nation" size="small" style="width:120px;margin-right:5px;" clearable>
 | ||
|         <el-option label="CN" value="0" />
 | ||
|         <el-option label="US" value="1" />
 | ||
|       </el-select>
 | ||
| 
 | ||
|       <el-input
 | ||
|         v-model="listQuery.KeyWord"
 | ||
|         placeholder="ID or Name"
 | ||
|         style="width:150px;margin-right:5px;"
 | ||
|         class="handle-select"
 | ||
|         size="small"
 | ||
|       />
 | ||
|       <el-button type="text" size="small" style="margin-left:5px;" @click="handleReset">Reset</el-button>
 | ||
|       <el-button type="primary" size="small" @click="handleSearch">Search</el-button>
 | ||
| 
 | ||
|       <el-button
 | ||
|         type="primary"
 | ||
|         :disabled="unlockCount==0||!exchangeRate > 0 || arrID.length == 0"
 | ||
|         size="small"
 | ||
|         :loading="lockLoading"
 | ||
|         @click="handleLock"
 | ||
|       >Lock</el-button>
 | ||
|       <el-button
 | ||
|         type="primary"
 | ||
|         :disabled="arrID.length == 0 || unlockCount==0"
 | ||
|         size="small"
 | ||
|         :loading="calcLoading"
 | ||
|         @click="handleCalculate"
 | ||
|       >Calculate</el-button>
 | ||
|       <el-button
 | ||
|         type="primary"
 | ||
|         size="small"
 | ||
|         :disabled="!exchangeRate > 0 || arrID.length == 0"
 | ||
|         :loading="exportLoading"
 | ||
|         @click="handleExportExcel"
 | ||
|       >Export Summary</el-button>
 | ||
|       <el-button
 | ||
|         type="primary"
 | ||
|         size="small"
 | ||
|         :disabled="!exchangeRate > 0 || arrID.length == 0"
 | ||
|         :loading="exportDetailLoading"
 | ||
|         @click="handleExportDetail"
 | ||
|       >Export Details</el-button>
 | ||
| 
 | ||
|       <el-button
 | ||
|         type="primary"
 | ||
|         size="small"
 | ||
|         :disabled="!exchangeRate > 0 || arrID.length == 0"
 | ||
|         :loading="exportPayrollLoading"
 | ||
|         @click="handleExportPayroll"
 | ||
|       >Export Payrolls</el-button>
 | ||
| 
 | ||
|       <el-button
 | ||
|         style="margin-left:auto"
 | ||
|         type="primary"
 | ||
|         size="small"
 | ||
|         @click="handleAdjustment"
 | ||
|       >Adjustment</el-button>
 | ||
|       <el-button
 | ||
|         style="margin-left: 5px"
 | ||
|         type="primary"
 | ||
|         size="small"
 | ||
|         @click="handleSetting"
 | ||
|       >Settings</el-button>
 | ||
|     </div>
 | ||
|     <div class="data-table">
 | ||
|       <el-table
 | ||
|         ref="table"
 | ||
|         v-loading="listLoading"
 | ||
|         size="small"
 | ||
|         height="99%"
 | ||
|         :data="list"
 | ||
|         stripe
 | ||
|         :cell-style="cellStyle"
 | ||
|         :summary-method="getSummaries"
 | ||
|         show-summary
 | ||
|         @sort-change="handleSortChange"
 | ||
|         @selection-change="handleSelectChange"
 | ||
|       >
 | ||
|         <el-table-column type="selection" :selectable="handleSelectTable" />
 | ||
|         <el-table-column type="index" width="40" />
 | ||
|         <el-table-column
 | ||
|           prop="LastName"
 | ||
|           label="Name"
 | ||
|           show-overflow-tooltip
 | ||
|           min-width="140"
 | ||
|           sortable="custom"
 | ||
|         >
 | ||
|           <template slot-scope="scope">{{ scope.row.LastName + ' / ' + scope.row.FirstName }}</template>
 | ||
|         </el-table-column>
 | ||
|         <el-table-column
 | ||
|           prop="DoctorNameInBank"
 | ||
|           label="Name CN"
 | ||
|           show-overflow-tooltip
 | ||
|           min-width="110"
 | ||
|           sortable="custom"
 | ||
|         >
 | ||
|           <template
 | ||
|             slot-scope="scope"
 | ||
|           >{{ scope.row.DoctorNameInBank?scope.row.DoctorNameInBank:scope.row.ChineseName }}</template>
 | ||
|         </el-table-column>
 | ||
|         <el-table-column
 | ||
|           prop="Code"
 | ||
|           label="ID"
 | ||
|           show-overflow-tooltip
 | ||
|           min-width="90"
 | ||
|           sortable="custom"
 | ||
|         />
 | ||
|         <el-table-column prop="RankName" label="Rank" show-overflow-tooltip min-width="80" />
 | ||
|         <el-table-column prop="IDCard" label="Resident ID" show-overflow-tooltip min-width="100" />
 | ||
|         <el-table-column prop="Phone" label="Phone Number" show-overflow-tooltip min-width="115" />
 | ||
| 
 | ||
|         <el-table-column prop="BankName" label="Bank" show-overflow-tooltip min-width="80" />
 | ||
|         <el-table-column
 | ||
|           prop="BankCardNumber"
 | ||
|           label="Account Number"
 | ||
|           show-overflow-tooltip
 | ||
|           min-width="125"
 | ||
|         />
 | ||
|         <el-table-column
 | ||
|           prop="TotalPaymentUSD"
 | ||
|           label="Payment ($)"
 | ||
|           min-width="130"
 | ||
|           sortable="custom"
 | ||
|         >
 | ||
|           <template slot-scope="scope">
 | ||
|             <el-tooltip class="item" effect="dark" placement="top">
 | ||
|               <div slot="content">
 | ||
|                 {{ 'Current month: ' + scope.row.PaymentUSD }}
 | ||
|                 <br>
 | ||
|                 {{ 'Adjustment: ' + scope.row.AdjustPaymentUSD }}
 | ||
|               </div>
 | ||
|               <div>
 | ||
|                 {{
 | ||
|                   !scope.row.IDCard || !scope.row.BankCardNumber || !scope.row.RankName
 | ||
|                     ? 'Setting Needed'
 | ||
|                     : scope.row.TotalPaymentUSD.toFixed(2)
 | ||
|                 }}
 | ||
| 
 | ||
|                 <!-- {{
 | ||
|                   !scope.row.IDCard || !scope.row.BankCardNumber || !scope.row.RankName
 | ||
|                     ? 'Setting Needed'
 | ||
|                     : scope.row.TotalPaymentUSD
 | ||
|                 }} -->
 | ||
|               </div>
 | ||
|             </el-tooltip>
 | ||
|           </template>
 | ||
|         </el-table-column>
 | ||
|         <el-table-column prop="ExchangeRate" label="Exchange Rate" min-width="110">
 | ||
|           <template slot-scope="scope">
 | ||
|             <span>{{ scope.row.ExchangeRate | rounding }}</span>
 | ||
|           </template>
 | ||
|         </el-table-column>
 | ||
|         <el-table-column
 | ||
|           prop="TotalPaymentCNY"
 | ||
|           label="Payment(¥)"
 | ||
|           min-width="110"
 | ||
|           sortable="custom"
 | ||
|           :formatter="paymentCNFormatter"
 | ||
|         >
 | ||
|           <template slot-scope="scope">
 | ||
|             <el-tooltip class="item" effect="dark" placement="top">
 | ||
|               <div slot="content">
 | ||
|                 {{ 'Current month: ' + scope.row.PaymentCNY }}
 | ||
|                 <br>
 | ||
|                 {{ 'Adjustment: ' + scope.row.AdjustPaymentCNY }}
 | ||
|               </div>
 | ||
|               <!-- <div>{{ scope.row.ExchangeRate > 0 ? scope.row.TotalPaymentCNY.toFixed(2) : 'Setting Needed' }}</div> -->
 | ||
|               <div>{{ scope.row.ExchangeRate > 0 ? scope.row.TotalPaymentCNY : 'Setting Needed' }}</div>
 | ||
|             </el-tooltip>
 | ||
|           </template>
 | ||
|         </el-table-column>
 | ||
|         <el-table-column label="Status" prop="IsLock" sortable="custom">
 | ||
|           <template slot-scope="scope">{{ scope.row.IsLock?'Locked':'Pending' }}</template>
 | ||
|         </el-table-column>
 | ||
|         <el-table-column label="Action" min-width="120">
 | ||
|           <template slot-scope="scope">
 | ||
|             <el-button
 | ||
|               size="small"
 | ||
|               type="text"
 | ||
|               :disabled="!(scope.row.IDCard && scope.row.BankCardNumber)"
 | ||
|               @click="handleDetail(scope.row)"
 | ||
|             >Detail</el-button>
 | ||
| 
 | ||
|             <el-button
 | ||
|               v-if="!scope.row.IDCard || !scope.row.BankCardNumber || !scope.row.RankName"
 | ||
|               size="small"
 | ||
|               type="text"
 | ||
|               style="color:red;"
 | ||
|               @click="handleSettingDoctor(scope.row)"
 | ||
|             >Setting</el-button>
 | ||
|           </template>
 | ||
|         </el-table-column>
 | ||
|       </el-table>
 | ||
|     </div>
 | ||
|     <div class="pagination">
 | ||
|       <pagination
 | ||
|         :total="total"
 | ||
|         :page.sync="listQuery.PageIndex"
 | ||
|         :limit.sync="listQuery.PageSize"
 | ||
|         @pagination="getList"
 | ||
|       />
 | ||
|     </div>
 | ||
|     <el-dialog
 | ||
|       :key="form.DoctorId"
 | ||
|       title="Edit"
 | ||
|       :visible.sync="dialogVisible"
 | ||
|       width="500px"
 | ||
|       :close-on-click-modal="false"
 | ||
|       size="small"
 | ||
|     >
 | ||
|       <el-form ref="reviewerDataForm" label-width="170px" :rules="rules" :model="form" size="small">
 | ||
|         <el-form-item label="Name: ">
 | ||
|           <el-input v-model="form.Name" readonly />
 | ||
|         </el-form-item>
 | ||
| 
 | ||
|         <el-form-item label="Name CN: " prop="DoctorNameInBank">
 | ||
|           <el-input v-model="form.DoctorNameInBank" />
 | ||
|         </el-form-item>
 | ||
|         <el-form-item label="ID: " prop="Code">
 | ||
|           <el-input v-model="form.Code" readonly />
 | ||
|         </el-form-item>
 | ||
|         <el-form-item label="Rank: " prop="Rank">
 | ||
|           <el-select v-model="form.RankId" style="width:100%;">
 | ||
|             <el-option
 | ||
|               v-for="(item) in rankList"
 | ||
|               :key="item.Id"
 | ||
|               :label="item.RankName"
 | ||
|               :value="item.Id"
 | ||
|             />
 | ||
|           </el-select>
 | ||
|         </el-form-item>
 | ||
|         <el-form-item label="Personal Adjustment ($): " prop="Additional">
 | ||
|           <el-input v-model="form.Additional" type="number" />
 | ||
|         </el-form-item>
 | ||
|         <el-form-item label="Resident ID: " prop="IDCard">
 | ||
|           <el-input v-model="form.IDCard" />
 | ||
|         </el-form-item>
 | ||
|         <el-form-item label="Bank: " prop="BankName">
 | ||
|           <el-input v-model="form.BankName" />
 | ||
|         </el-form-item>
 | ||
|         <el-form-item label="Account Number: " prop="BankCardNumber">
 | ||
|           <el-input v-model="form.BankCardNumber" />
 | ||
|         </el-form-item>
 | ||
|       </el-form>
 | ||
|       <span slot="footer" class="dialog-footer">
 | ||
|         <el-button size="small" @click="dialogVisible = false">Cancel</el-button>
 | ||
|         <el-button type="primary" :disabled="btnDisabled" size="small" @click="handleSave">Ok</el-button>
 | ||
|       </span>
 | ||
|     </el-dialog>
 | ||
|   </div>
 | ||
| </template>
 | ||
| <script>
 | ||
| import Pagination from '@/components/Pagination'
 | ||
| import { num2Money } from '@/utils/formatter'
 | ||
| import floatObj from '@/utils/float-operation'
 | ||
| import {
 | ||
|   getMonthlyPaymentList,
 | ||
|   lockMonthlyPayment,
 | ||
|   calculateMonthlyPayment,
 | ||
|   addOrUpdateReviewerPayInfo,
 | ||
|   getReviewersPaymentDetailList,
 | ||
|   getMonthlyPayroll
 | ||
| } from '@/api/financials'
 | ||
| import store from '@/store'
 | ||
| import { mapGetters, mapMutations } from 'vuex'
 | ||
| import Excel from 'exceljs'
 | ||
| import Zip from 'jszip'
 | ||
| import { saveAs } from 'file-saver'
 | ||
| const getListQueryDefault = () => {
 | ||
|   return {
 | ||
|     StatisticsDate: '',
 | ||
|     KeyWord: '',
 | ||
|     PageSize: 20,
 | ||
|     PageIndex: 1,
 | ||
|     Asc: true,
 | ||
|     SortField: ''
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| export default {
 | ||
|   name: 'EnrollmentsStats',
 | ||
|   components: { Pagination },
 | ||
|   filters: {
 | ||
|     rounding(value) {
 | ||
|       // return value ? Number(value).toFixed(2) : value
 | ||
|       return value
 | ||
|     }
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       listQuery: getListQueryDefault(),
 | ||
|       list: [],
 | ||
|       listLoading: false,
 | ||
|       total: 0,
 | ||
|       exchangeRate: '',
 | ||
|       arrID: '',
 | ||
|       excelData: [], // 支付费用详情Excel数据
 | ||
|       excelDataCount: 0,
 | ||
|       excelDataPayroll: [], // 公司单汇总及明细 Excel数据
 | ||
|       excelDataPayrollCount: 0,
 | ||
|       lockLoading: false,
 | ||
|       calcLoading: false,
 | ||
|       exportLoading: false,
 | ||
|       exportDetailLoading: false,
 | ||
|       exportPayrollLoading: false,
 | ||
|       form: {},
 | ||
|       rules: {
 | ||
|         DoctorNameInBank: [
 | ||
|           { required: true, message: 'Please specify', trigger: 'blur' }
 | ||
|         ],
 | ||
|         BankName: [
 | ||
|           { required: true, message: 'Please specify', trigger: 'blur' }
 | ||
|         ],
 | ||
|         BankCardNumber: [
 | ||
|           { required: true, message: 'Please specify', trigger: 'blur' }
 | ||
|         ],
 | ||
|         IDCard: [
 | ||
|           { required: true, message: 'Please specify', trigger: 'blur' },
 | ||
|           {
 | ||
|             pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
 | ||
|             message: 'Incorrect ID card format'
 | ||
|           }
 | ||
|         ],
 | ||
|         Rank: [{ required: true, message: 'Please select', trigger: ['blur', 'change'] }]
 | ||
|       },
 | ||
|       btnDisabled: false,
 | ||
|       dialogVisible: false,
 | ||
|       pickerOption: {
 | ||
|         disabledDate: (time) => {
 | ||
|           const _now = Date.now()
 | ||
|           return time.getTime() > _now
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|   },
 | ||
|   computed: {
 | ||
|     ...mapGetters(['rankList', 'paymentQuery']),
 | ||
|     unlockCount: function() {
 | ||
|       var tempCount = 0
 | ||
|       this.list.forEach((item) => {
 | ||
|         if (this.arrID.indexOf(item.DoctorId) > -1) {
 | ||
|           if (!item.IsLock) {
 | ||
|             tempCount++
 | ||
|           }
 | ||
|         }
 | ||
|       })
 | ||
|       return tempCount
 | ||
|     }
 | ||
|   },
 | ||
|   mounted() {
 | ||
|     this.listQuery.StatisticsDate = new Date(
 | ||
|       new Date().setMonth(new Date().getMonth() - 1)
 | ||
|     ).format('yyyy-MM')
 | ||
|     this.paymentQuery ? (this.listQuery = this.paymentQuery) : ''
 | ||
|     this.getList()
 | ||
|   },
 | ||
| 
 | ||
|   destroyed() {},
 | ||
|   methods: {
 | ||
|     getList() {
 | ||
|       this.listLoading = true
 | ||
|       this.setQueryParam(this.listQuery)
 | ||
|       getMonthlyPaymentList(this.listQuery)
 | ||
|         .then((res) => {
 | ||
|           this.listLoading = false
 | ||
|           this.list = res.Result.CostList.CurrentPageData
 | ||
|           this.total = res.Result.CostList.TotalCount
 | ||
|           this.exchangeRate = res.Result.ExchangeRate
 | ||
|         })
 | ||
|         .catch(() => {
 | ||
|           this.listLoading = false
 | ||
|         })
 | ||
|     },
 | ||
|     handleSearch() {
 | ||
|       this.listQuery.PageIndex = 1
 | ||
|       this.getList()
 | ||
|     },
 | ||
|     handleReset() {
 | ||
|       this.listQuery = getListQueryDefault()
 | ||
|       this.listQuery.StatisticsDate = new Date(
 | ||
|         new Date().setMonth(new Date().getMonth() - 1)
 | ||
|       ).format('yyyy-MM')
 | ||
|       this.getList()
 | ||
|     },
 | ||
|     handleLock() {
 | ||
|       const param = {
 | ||
|         ReviewerIdList: this.arrID,
 | ||
|         Month: this.listQuery.StatisticsDate
 | ||
|       }
 | ||
|       this.lockLoading = true
 | ||
|       lockMonthlyPayment(param)
 | ||
|         .then((res) => {
 | ||
|           this.lockLoading = false
 | ||
|           this.getList()
 | ||
|           this.$message.success('Locked successfully')
 | ||
|         })
 | ||
|         .catch(() => {
 | ||
|           this.lockLoading = false
 | ||
|         })
 | ||
|     },
 | ||
|     handleCalculate() {
 | ||
|       const param = {
 | ||
|         CalculateMonth: this.listQuery.StatisticsDate,
 | ||
|         NeedCalculateReviewers: this.arrID
 | ||
|       }
 | ||
|       this.calcLoading = true
 | ||
|       calculateMonthlyPayment(param)
 | ||
|         .then((res) => {
 | ||
|           this.calcLoading = false
 | ||
|           this.getList()
 | ||
|           this.$message.success('Calculate successfully')
 | ||
|         })
 | ||
|         .catch(() => {
 | ||
|           this.calcLoading = false
 | ||
|         })
 | ||
|     },
 | ||
|     handleAdjustment() {
 | ||
|       this.$router.push({
 | ||
|         name: 'Adjustment',
 | ||
|         query: {
 | ||
|           exchangeRate: this.exchangeRate,
 | ||
|           date: this.listQuery.StatisticsDate
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     handleSetting() {
 | ||
|       this.$router.push({ name: 'PaymentSettings' })
 | ||
|     },
 | ||
| 
 | ||
|     handleDetail(row) {
 | ||
|       this.$router.push({ name: 'PaymentDetail', query: row })
 | ||
|     },
 | ||
|     handleSettingDoctor(row) {
 | ||
|       store.dispatch('financials/getRank')
 | ||
|       this.form = (({
 | ||
|         FirstName,
 | ||
|         LastName,
 | ||
|         ChineseName,
 | ||
|         Code,
 | ||
|         DoctorId,
 | ||
|         DoctorNameInBank,
 | ||
|         IDCard,
 | ||
|         BankCardNumber,
 | ||
|         BankName,
 | ||
|         RankId,
 | ||
|         Additional
 | ||
|       }) => ({
 | ||
|         FirstName,
 | ||
|         LastName,
 | ||
|         ChineseName,
 | ||
|         Code,
 | ||
|         DoctorId,
 | ||
|         DoctorNameInBank,
 | ||
|         IDCard,
 | ||
|         BankCardNumber,
 | ||
|         BankName,
 | ||
|         RankId,
 | ||
|         Additional
 | ||
|       }))(row)
 | ||
|       this.form.Name = `${row.LastName} / ${row.FirstName}`
 | ||
|       this.form.DoctorNameInBank = this.form.DoctorNameInBank
 | ||
|         ? this.form.DoctorNameInBank
 | ||
|         : this.form.ChineseName
 | ||
|       this.dialogVisible = true
 | ||
|     },
 | ||
|     handleSave() {
 | ||
|       this.btnDisabled = true
 | ||
|       const param = (({
 | ||
|         DoctorId,
 | ||
|         DoctorNameInBank,
 | ||
|         IDCard,
 | ||
|         BankCardNumber,
 | ||
|         BankName,
 | ||
|         RankId,
 | ||
|         Additional
 | ||
|       }) => ({
 | ||
|         DoctorId,
 | ||
|         DoctorNameInBank,
 | ||
|         IDCard,
 | ||
|         BankCardNumber,
 | ||
|         BankName,
 | ||
|         RankId,
 | ||
|         Additional
 | ||
|       }))(this.form)
 | ||
|       addOrUpdateReviewerPayInfo(param)
 | ||
|         .then((res) => {
 | ||
|           this.btnDisabled = false
 | ||
|           this.dialogVisible = false
 | ||
|           this.getList()
 | ||
|           this.$message.success('Updated successfully')
 | ||
|         })
 | ||
|         .catch(() => {
 | ||
|           this.btnDisabled = false
 | ||
|         })
 | ||
|     },
 | ||
|     handleSortChange(column) {
 | ||
|       if (column.order === 'ascending') {
 | ||
|         this.listQuery.Asc = true
 | ||
|       } else {
 | ||
|         this.listQuery.Asc = false
 | ||
|       }
 | ||
|       this.listQuery.SortField = column.prop
 | ||
|       this.listQuery.PageIndex = 1
 | ||
|       this.getList()
 | ||
|     },
 | ||
|     handleSelectChange(val) {
 | ||
|       const arr = []
 | ||
|       for (let index = 0; index < val.length; index++) {
 | ||
|         arr.push(val[index].DoctorId)
 | ||
|       }
 | ||
|       this.arrID = arr
 | ||
|     },
 | ||
|     getSummaries(param) {
 | ||
|       const { columns, data } = param
 | ||
|       const sums = []
 | ||
|       // const scope = this
 | ||
|       columns.forEach((column, index) => {
 | ||
|         if (index === 2) {
 | ||
|           sums[index] = 'Total (Current Page)'
 | ||
|           return
 | ||
|         }
 | ||
|         if (column.property === 'TotalPaymentUSD') {
 | ||
|           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 === 'TotalPaymentCNY') {
 | ||
|           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)
 | ||
|           }
 | ||
|         }
 | ||
|       })
 | ||
|       return sums
 | ||
|     },
 | ||
|     addNum(n1, n2) {
 | ||
|       var s1, s2, m
 | ||
|       try {
 | ||
|         s1 = n1.toString().split('.')[1].length
 | ||
|       } catch (e) {
 | ||
|         s1 = 0
 | ||
|       }
 | ||
|       try {
 | ||
|         s2 = n2.toString().split('.')[1].length
 | ||
|       } catch (e) {
 | ||
|         s2 = 0
 | ||
|       }
 | ||
|       m = Math.pow(10, Math.max(s1, s2))
 | ||
|       console.log(n1 + '===' + n2 + '===' + m + '===' + (n1 * m + n2 * m) / m)
 | ||
|       return (n1 * m + n2 * m) / m
 | ||
|     },
 | ||
|     handleSelectTable(row) {
 | ||
|       return !!(row.IDCard && row.BankCardNumber && row.BankName)
 | ||
|     },
 | ||
|     onSelected(e) {
 | ||
|       const obj = this.rankOption.find((item) => {
 | ||
|         return item.Id === e
 | ||
|       })
 | ||
|       this.form.Rank = obj.RankName
 | ||
|     },
 | ||
| 
 | ||
|     cellStyle({ row, column, rowIndex, columnIndex }) {
 | ||
|       if (
 | ||
|         (row.TotalPaymentCNY === 0 && columnIndex === 12) ||
 | ||
|         (columnIndex === 10 &&
 | ||
|           (!row.IDCard || !row.BankCardNumber || !row.RankName))
 | ||
|       ) {
 | ||
|         return 'color:red'
 | ||
|       }
 | ||
|     },
 | ||
|     paymentCNFormatter(row, column) {
 | ||
|       return row.ExchangeRate > 0
 | ||
|         ? num2Money(row.PaymentCNY + row.AdjustPaymentCNY, 2, 0)
 | ||
|         : 'Setting Needed'
 | ||
|     },
 | ||
| 
 | ||
|     handleExportDetail() {
 | ||
|       var that = this
 | ||
|       that.excelData = []
 | ||
|       var queryArray = []
 | ||
|       this.list.forEach((item) => {
 | ||
|         if (this.arrID.indexOf(item.DoctorId) > -1) {
 | ||
|           queryArray.push({
 | ||
|             PaymentId: item.Id,
 | ||
|             ReviewerId: item.DoctorId,
 | ||
|             YearMonth: item.YearMonth
 | ||
|           })
 | ||
|         }
 | ||
|       })
 | ||
|       that.exportDetailLoading = true
 | ||
|       getReviewersPaymentDetailList(queryArray)
 | ||
|         .then((res) => {
 | ||
|           that.excelDataCount = res.Result.length
 | ||
|           res.Result.forEach((element) => {
 | ||
|             that.exportDetailExcel(element.DoctorInfo, element.DetailList)
 | ||
|           })
 | ||
|         })
 | ||
|         .catch(() => {
 | ||
|           that.exportDetailLoading = false
 | ||
|         })
 | ||
|     },
 | ||
|     handleExportPayroll() {
 | ||
|       var that = this
 | ||
|       that.excelDataPayroll = []
 | ||
|       var doctorIds = []
 | ||
|       this.list.forEach((item) => {
 | ||
|         if (this.arrID.indexOf(item.DoctorId) > -1) doctorIds.push(item.Id)
 | ||
|       })
 | ||
|       that.exportPayrollLoading = true
 | ||
|       getMonthlyPayroll(doctorIds)
 | ||
|         .then((res) => {
 | ||
|           that.ExportExcelPayroll(res.Result)
 | ||
|         })
 | ||
|         .catch(() => {
 | ||
|           that.exportPayrollLoading = false
 | ||
|         })
 | ||
|     },
 | ||
| 
 | ||
|     ExportExcelPayroll(payrollDataList) {
 | ||
|       var workbook = new Excel.Workbook()
 | ||
|       var sheet = workbook.addWorksheet(this.listQuery.StatisticsDate)
 | ||
| 
 | ||
|       sheet.properties.defaultRowHeight = 22
 | ||
|       sheet.columns = [
 | ||
|         { key: 'ChineseName', width: 15 },
 | ||
|         { key: 'ResidentId', width: 30 },
 | ||
|         { key: 'Phone', width: 15 },
 | ||
|         { key: 'AccountNumber', width: 20 },
 | ||
|         { key: 'Bank', width: 30 },
 | ||
|         { key: 'PaymentCNY', width: 20 },
 | ||
|         { key: 'TaxCNY', width: 20 },
 | ||
|         { key: 'ActuallyPaidCNY', width: 20 }
 | ||
|       ]
 | ||
|       var that = this
 | ||
| 
 | ||
|       // 处理标题
 | ||
|       sheet.mergeCells('A1', 'H2')
 | ||
|       sheet.getCell('A1').value =
 | ||
|         that.listQuery.StatisticsDate + ' Payroll Summary'
 | ||
|       sheet.getCell('A1').alignment = {
 | ||
|         vertical: 'middle',
 | ||
|         horizontal: 'center'
 | ||
|       }
 | ||
|       sheet.getCell('A1').font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 13,
 | ||
|         bold: true
 | ||
|       }
 | ||
|       sheet.mergeCells('A3', 'H3')
 | ||
|       sheet.getCell('A3').value = 'Month:' + that.listQuery.StatisticsDate
 | ||
|       sheet.getCell('A3').alignment = {
 | ||
|         vertical: 'middle',
 | ||
|         horizontal: 'right'
 | ||
|       }
 | ||
| 
 | ||
|       sheet.getRow(4).values = [
 | ||
|         'Name CN',
 | ||
|         'Resident ID',
 | ||
|         'Phone Number',
 | ||
|         'Account Number',
 | ||
|         'Bank',
 | ||
|         '劳务费总计',
 | ||
|         '应付税额',
 | ||
|         '实付劳务费'
 | ||
|       ]
 | ||
|       sheet.getRow(4).font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 11,
 | ||
|         bold: true
 | ||
|       }
 | ||
|       sheet.getRow(4).alignment = { vertical: 'middle', horizontal: 'left' }
 | ||
| 
 | ||
|       sheet.addRows(payrollDataList)
 | ||
| 
 | ||
|       sheet.getColumn(6).numFmt = '#,##0.00'
 | ||
|       sheet.getColumn(7).numFmt = '#,##0.00'
 | ||
|       sheet.getColumn(8).numFmt = '#,##0.00'
 | ||
| 
 | ||
|       sheet.eachRow((row, number) => {
 | ||
|         if (number > 3) {
 | ||
|           row.eachCell((cell, rowNumber) => {
 | ||
|             cell.alignment = { vertical: 'center', horizontal: 'left' }
 | ||
|             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'
 | ||
|           })
 | ||
|           that.excelDataPayrollCount = payrollDataList.length + 1
 | ||
|           that.excelDataPayroll.push({
 | ||
|             data: data,
 | ||
|             fileName:
 | ||
|               'Payroll Summary_' + that.listQuery.StatisticsDate + '.xlsx'
 | ||
|           })
 | ||
| 
 | ||
|           payrollDataList.forEach((element) => {
 | ||
|             that.ExportExcelPayrollDeatil(element)
 | ||
|           })
 | ||
|         })
 | ||
|     },
 | ||
|     ExportExcelPayrollDeatil(payrollItem) {
 | ||
|       var that = this
 | ||
|       var workbook = new Excel.Workbook()
 | ||
|       var sheet = workbook.addWorksheet(
 | ||
|         payrollItem.ChineseName + ' ' + this.listQuery.StatisticsDate
 | ||
|       )
 | ||
| 
 | ||
|       sheet.properties.defaultRowHeight = 25
 | ||
|       sheet.properties.defaultColWidth = 30
 | ||
|       // 处理标题
 | ||
|       sheet.mergeCells('A1', 'E1')
 | ||
|       sheet.getCell('A1').value = '上海致准信息科技有限公司'
 | ||
|       sheet.getCell('A1').alignment = {
 | ||
|         vertical: 'middle',
 | ||
|         horizontal: 'center'
 | ||
|       }
 | ||
|       sheet.getCell('A1').font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 13,
 | ||
|         bold: true
 | ||
|       }
 | ||
|       sheet.mergeCells('A2', 'E2')
 | ||
|       sheet.getCell('A2').value = '劳务支付单'
 | ||
|       sheet.getCell('A2').alignment = {
 | ||
|         vertical: 'middle',
 | ||
|         horizontal: 'center'
 | ||
|       }
 | ||
|       sheet.getCell('A2').font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 13,
 | ||
|         bold: true
 | ||
|       }
 | ||
| 
 | ||
|       sheet.getRow(3).values = ['姓名', '身份证号', '', '工作月份', '发放月份']
 | ||
| 
 | ||
|       sheet.mergeCells('B3', 'C3')
 | ||
| 
 | ||
|       var myDate = new Date()
 | ||
|       var tYear = myDate.getFullYear()
 | ||
|       var tMonth = myDate.getMonth() + 1
 | ||
|       if (tMonth < 10) tMonth = '0' + tMonth
 | ||
| 
 | ||
|       sheet.getRow(4).values = [
 | ||
|         payrollItem.ChineseName,
 | ||
|         payrollItem.ResidentId,
 | ||
|         '',
 | ||
|         payrollItem.YearMonth,
 | ||
|         tYear + '-' + tMonth
 | ||
|       ]
 | ||
|       sheet.mergeCells('B4', 'C4')
 | ||
| 
 | ||
|       sheet.getRow(5).values = [
 | ||
|         '应付金额',
 | ||
|         '代扣税金',
 | ||
|         '实付金额',
 | ||
|         '银行转账',
 | ||
|         ''
 | ||
|       ]
 | ||
|       sheet.getRow(6).values = [
 | ||
|         payrollItem.PaymentCNY,
 | ||
|         payrollItem.TaxCNY,
 | ||
|         payrollItem.ActuallyPaidCNY,
 | ||
|         payrollItem.ActuallyPaidCNY,
 | ||
|         ''
 | ||
|       ]
 | ||
|       sheet.mergeCells('D5', 'E5')
 | ||
|       sheet.mergeCells('D6', 'E6')
 | ||
|       sheet.getRow(7).values = ['审核', '', '经办', '', '']
 | ||
|       sheet.mergeCells('A7', 'B7')
 | ||
|       sheet.mergeCells('C7', 'E7')
 | ||
| 
 | ||
|       sheet.eachRow((row, number) => {
 | ||
|         if (number > 2) {
 | ||
|           row.eachCell((cell, rowNumber) => {
 | ||
|             if (number < 7) {
 | ||
|               cell.alignment = { vertical: 'center', horizontal: 'center' }
 | ||
|             }
 | ||
|             cell.numFmt = '#,##0.00'
 | ||
|             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'
 | ||
|           })
 | ||
| 
 | ||
|           that.excelDataPayroll.push({
 | ||
|             data: data,
 | ||
|             fileName:
 | ||
|               payrollItem.ChineseName + '_paystub_' + payrollItem.YearMonth + '.xlsx'
 | ||
|           })
 | ||
| 
 | ||
|           if (that.excelDataPayrollCount === that.excelDataPayroll.length) {
 | ||
|             var zip = new Zip()
 | ||
|             that.excelDataPayroll.forEach((element) => {
 | ||
|               zip.file(element.fileName, element.data)
 | ||
|             })
 | ||
|             zip.generateAsync({ type: 'blob' }).then(function(content) {
 | ||
|               saveAs(
 | ||
|                 content,
 | ||
|                 'Monthly Payroll  ' + payrollItem.YearMonth + '.zip'
 | ||
|               )
 | ||
|             })
 | ||
|           }
 | ||
|           that.exportPayrollLoading = false
 | ||
|         })
 | ||
|     },
 | ||
| 
 | ||
|     exportDetailExcel(basicInfo, list) {
 | ||
|       var workbook = new Excel.Workbook()
 | ||
|       var sheet = workbook.addWorksheet(
 | ||
|         basicInfo.ChineseName + ' ' + 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
 | ||
| 
 | ||
|       list.forEach((element) => {
 | ||
|         tempTotalFee += parseFloat(element.PaymentUSD)
 | ||
|         tempTotalFeeInCN += parseFloat(element.PaymentCNY)
 | ||
|       })
 | ||
|       var rowsCount = Number(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:' + basicInfo.ChineseName + '    ID:' + basicInfo.Code
 | ||
|       sheet.mergeCells('E3', 'I3')
 | ||
|       sheet.getCell('E3').value =
 | ||
|         '         Rank:' +
 | ||
|         basicInfo.PayTitle +
 | ||
|         '             Month:' +
 | ||
|         basicInfo.YearMonth +
 | ||
|         '          Exchange Rate: ' +
 | ||
|         Number(list[0].ExchangeRate).toFixed(2)
 | ||
|       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(list)
 | ||
|       // 合并项目编号单元格
 | ||
|       var projectCount = Math.floor(Number(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 = list.filter((t) => t.TrialCode === 'Volume Reward')
 | ||
|         .length
 | ||
| 
 | ||
|       var adjustMentCount = 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 =
 | ||
|             list[index].AdjustmentView.AdjustType
 | ||
|           sheet.getCell(adjustMentCell2).value =
 | ||
|             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'
 | ||
|           })
 | ||
| 
 | ||
|           that.excelData.push({
 | ||
|             data: data,
 | ||
|             fileName:
 | ||
|               basicInfo.ChineseName + '_detail_ ' + basicInfo.YearMonth + '.xlsx'
 | ||
|           })
 | ||
|           if (that.excelDataCount === that.excelData.length) {
 | ||
|             var zip = new Zip()
 | ||
|             that.excelData.forEach((element) => {
 | ||
|               zip.file(element.fileName, element.data)
 | ||
|             })
 | ||
|             zip.generateAsync({ type: 'blob' }).then(function(content) {
 | ||
|               saveAs(
 | ||
|                 content,
 | ||
|                 'Monthly Payment Detail_' + basicInfo.YearMonth + '.zip'
 | ||
|               )
 | ||
|             })
 | ||
|             that.exportDetailLoading = false
 | ||
|           }
 | ||
|         })
 | ||
|     },
 | ||
| 
 | ||
|     handleExportExcel() {
 | ||
|       var workbook = new Excel.Workbook()
 | ||
|       var sheet = workbook.addWorksheet(this.listQuery.StatisticsDate)
 | ||
| 
 | ||
|       sheet.properties.defaultRowHeight = 22
 | ||
|       sheet.columns = [
 | ||
|         { key: 'Index', width: 5 },
 | ||
|         { key: 'LastName', width: 15 },
 | ||
|         { key: 'FirstName', width: 15 },
 | ||
|         { key: 'DoctorNameInBank', width: 15 },
 | ||
|         { key: 'Code', width: 15 },
 | ||
|         { key: 'IDCard', width: 20 },
 | ||
|         { key: 'Phone', width: 15 },
 | ||
|         { key: 'BankCardNumber', width: 25 },
 | ||
|         { key: 'BankName', width: 30 },
 | ||
|         { key: 'PaymentUSD', width: 20 },
 | ||
|         { key: 'ExchangeRate', width: 20 },
 | ||
|         { key: 'PaymentCNY', width: 20 },
 | ||
|         { key: 'IsLock', width: 20 }
 | ||
|       ]
 | ||
|       var that = this
 | ||
|       var tempTotalFee = 0
 | ||
|       var tempTotalFeeCNY = 0
 | ||
|       let index = 1
 | ||
|       var exportExcelData = this.list.filter(
 | ||
|         (item) => this.arrID.indexOf(item.DoctorId) > -1
 | ||
|       )
 | ||
|       exportExcelData.forEach((element) => {
 | ||
|         element.Index = index
 | ||
|         element.PaymentUSD = element.PaymentUSD + element.AdjustPaymentUSD
 | ||
|         element.PaymentCNY = element.PaymentCNY + element.AdjustPaymentCNY
 | ||
|         tempTotalFee += element.PaymentUSD
 | ||
|         tempTotalFeeCNY += element.PaymentCNY
 | ||
|         element.IsLock = element.IsLock ? 'Locked' : 'Pending'
 | ||
|         index++
 | ||
|       })
 | ||
|       // 处理标题
 | ||
|       sheet.mergeCells('A1', 'M2')
 | ||
|       sheet.getCell('A1').value =
 | ||
|         that.listQuery.StatisticsDate + ' Payment Summary'
 | ||
|       sheet.getCell('A1').alignment = {
 | ||
|         vertical: 'middle',
 | ||
|         horizontal: 'center'
 | ||
|       }
 | ||
|       sheet.getCell('A1').font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 13,
 | ||
|         bold: true
 | ||
|       }
 | ||
|       sheet.mergeCells('A3', 'M3')
 | ||
|       sheet.getCell('A3').value = 'Month:' + that.listQuery.StatisticsDate
 | ||
|       sheet.getCell('A3').alignment = {
 | ||
|         vertical: 'middle',
 | ||
|         horizontal: 'right'
 | ||
|       }
 | ||
| 
 | ||
|       sheet.getRow(4).values = [
 | ||
|         '',
 | ||
|         'Surname',
 | ||
|         'Given Name',
 | ||
|         'Name CN',
 | ||
|         'ID',
 | ||
|         'Resident ID',
 | ||
|         'Phone Number',
 | ||
|         'Account Number',
 | ||
|         'Bank',
 | ||
|         'Payment($)',
 | ||
|         'Exchange Rate',
 | ||
|         'Payment(¥)',
 | ||
|         'Status'
 | ||
|       ]
 | ||
|       sheet.getRow(4).font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 11,
 | ||
|         bold: true
 | ||
|       }
 | ||
|       sheet.getRow(4).alignment = { vertical: 'middle', horizontal: 'left' }
 | ||
| 
 | ||
|       sheet.addRows(exportExcelData)
 | ||
|       sheet.addRow([
 | ||
|         '',
 | ||
|         'Total',
 | ||
|         '',
 | ||
|         '',
 | ||
|         '',
 | ||
|         '',
 | ||
|         '',
 | ||
|         '',
 | ||
|         '',
 | ||
|         tempTotalFee,
 | ||
|         '',
 | ||
|         tempTotalFeeCNY,
 | ||
|         ''
 | ||
|       ])
 | ||
|       sheet.getRow(exportExcelData.length + 5).font = {
 | ||
|         name: 'SimSun',
 | ||
|         family: 4,
 | ||
|         size: 11,
 | ||
|         bold: true
 | ||
|       }
 | ||
| 
 | ||
|       sheet.getColumn(10).numFmt = '#,##0.00'
 | ||
|       sheet.getColumn(11).numFmt = '#,##0.00'
 | ||
|       sheet.getColumn(12).numFmt = '#,##0.00'
 | ||
| 
 | ||
|       sheet.eachRow((row, number) => {
 | ||
|         if (number > 3) {
 | ||
|           row.eachCell((cell, rowNumber) => {
 | ||
|             cell.alignment = { vertical: 'center', horizontal: 'left' }
 | ||
|             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,
 | ||
|               'Payment Summary_' + that.listQuery.StatisticsDate + '.xlsx'
 | ||
|             )
 | ||
|           } else {
 | ||
|             var a = document.createElement('a')
 | ||
| 
 | ||
|             var url = URL.createObjectURL(data)
 | ||
|             a.href = url
 | ||
|             a.download =
 | ||
|                 'Payment Summary_' + that.listQuery.StatisticsDate + '.xlsx'
 | ||
|             document.body.appendChild(a)
 | ||
|             a.click()
 | ||
|             setTimeout(function() {
 | ||
|               document.body.removeChild(a)
 | ||
|               window.URL.revokeObjectURL(url)
 | ||
|             }, 0)
 | ||
|           }
 | ||
|         })
 | ||
|     },
 | ||
|     ...mapMutations({
 | ||
|       setQueryParam: 'financials/SET_PAYMENTQUERYPARAM'
 | ||
|     })
 | ||
|   }
 | ||
| }
 | ||
| </script>
 | ||
| <style lang="scss" scoped>
 | ||
| .monthly-payment {
 | ||
|   height: 100%;
 | ||
|   .filter-container {
 | ||
|     display: flex;
 | ||
|     align-items: center;
 | ||
|   }
 | ||
|   .mr {
 | ||
|     margin-right: 5px;
 | ||
|     width: 150px;
 | ||
|   }
 | ||
|   .el-table {
 | ||
|     overflow: visible !important;
 | ||
|   }
 | ||
|   .el-table .cell {
 | ||
|     white-space: nowrap;
 | ||
|   }
 | ||
|   .list-container {
 | ||
|     margin-top: 10px;
 | ||
|     height: calc(100% - 100px);
 | ||
|   }
 | ||
| }
 | ||
| </style>
 |