Files
income_payments_client/src/views/financialManagement/arriveAndInvoicing/modules/AuditProofModule.vue
T
2022-12-13 16:34:30 +08:00

600 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
okText="保存"
cancelText="关闭">
<div class="project-name">
<div>{{ model.chargeProject }}</div>
<div>{{ model.chargeCompanyTemporaryName }}</div>
</div>
<a-form :form="form">
<h3 class="title">凭证信息</h3>
<div class="basic-info-div">
<!--标协会员项目的缴费 显示-->
<template v-if="model.projectType === 5 || model.projectType === 6 ">
<a-form-item label="会员缴费金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.memberPaymentAmount || ''}}<span v-if="!!proofInfo.memberPaymentAmount">元</span></div>
</a-form-item>
<a-form-item label="证书缴费金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.certificatePaymentAmount || '' }}<span v-if="!!proofInfo.certificatePaymentAmount">元</span></div>
</a-form-item>
<a-form-item label="其他缴费金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.otherPaymentAmount || ''}}<span v-if="!!proofInfo.otherPaymentAmount">元</span></div>
</a-form-item>
</template>
<!--其他项目的显示 -->
<template v-else>
<a-form-item label="缴费金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.amountReceived }}元</div>
</a-form-item>
</template>
<a-form-item label="缴费日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.paymentDate }}</div>
</a-form-item>
<a-form-item label="申请人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.applicantName }}</div>
</a-form-item>
<!-- <div class="info-item">-->
<!-- <label>缴费金额:</label>-->
<!-- <div>{{ proofInfo.amountReceived }}元</div>-->
<!-- </div>-->
<!-- <div class="info-item">-->
<!-- <label>缴费日期:</label>-->
<!-- <div>{{ proofInfo.paymentDate }}</div>-->
<!-- </div>-->
<!-- <div class="info-item">-->
<!-- <label>申请人:</label>-->
<!-- <div>{{ proofInfo.applicantName }}</div>-->
<!-- </div>-->
<!-- 标协会员、证书的缴费凭证类型根据paymentMethod字段决定:1--图片;2--pdf;3--没有凭证 -->
<!-- proofType处理过的缴费凭证类型:img--图片;pdf--pdf;none--无缴费凭证 -->
<!-- <div class="info-item">-->
<a-form-item class="proof-form-item" :label="proofType==='pdf' ? '打包协议' : '缴费凭证'" :labelCol="labelCol"
:wrapperCol="wrapperCol">
<!-- <label>{{proofType==='pdf' ? '打包协议' : '缴费凭证'}}:</label>-->
<div class="proof-img" v-if="proofType === 'img'">
<template v-if="proofInfo.proof && proofInfo.proof !== ''">
<div class="proof-img-item" v-for="(item, index) in proofInfo.proof.split(',')" :key="index">
<img :src="proofSrc(item)" @click="previewImg(item)">
</div>
</template>
</div>
<div v-if="proofType==='pdf'">
<preview-file :fileId="proofInfo.proof"></preview-file>
</div>
<span v-if="proofType==='none'">无</span>
</a-form-item>
<!-- </div>-->
<a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-textarea
placeholder="请输入备注"
v-decorator="['remark']"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</div>
<!-- 当前的缴费凭证是否是标协会员、证书缴费 时展示 付款信息,用户财务人员核实 -->
<template
v-if="model.projectType && (model.projectType.toString() === '5' || model.projectType.toString() === '6')">
<h3 class="title">付款信息</h3>
<div class="pay-info-div">
<a-row>
<a-col :span="12">
<a-form-item label="发票" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<j-dict-select-tag
@change="invoiceRequirementsChange"
type="list"
v-decorator="['invoiceRequirements',{ rules: validatorRules.invoiceRequirements.rules, initialValue:proofInfo.invoiceRequirements, validateTrigger: 'change'},]"
:trigger-change="true"
dictCode="invoice_type"
placeholder="请选择发票"/>
</a-form-item>
</a-col>
</a-row>
<a-row v-if="currentSelectInvoiceType">
<a-col :span="12">
<a-form-item label="付款单位发票抬头" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
v-decorator="['headerName',{ rules: validatorRules.headerName.rules, validateTrigger: 'blur',initialValue:proofInfo.headerName}]"
:trigger-change="true"
@change="event => event.target.value = event.target.value.trim()"
placeholder="请输入付款单位发票抬头"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="社会统一代码/税号" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
@change="event => event.target.value = event.target.value.trim()"
v-decorator="['taxNumber',{ rules: validatorRules.taxNumber.rules, validateTrigger: 'blur', initialValue:proofInfo.taxNumber},]"
placeholder="请输入社会统一代码/税号"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
</a-row>
<template v-if="currentSelectInvoiceType === 2">
<a-row>
<a-col :span="12">
<a-form-item label="单位地址" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
@change="event => event.target.value = event.target.value.trim()"
v-decorator="['invoiceAddress',{ rules: validatorRules.invoiceAddress.rules, validateTrigger: 'blur', initialValue:proofInfo.invoiceAddress}]"
placeholder="请输入单位地址"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="电话号码" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
v-decorator="['invoicePhone',{ rules: validatorRules.invoicePhone.rules, validateTrigger: 'blur', initialValue:proofInfo.invoicePhone}]"
:trigger-change="true"
@change="(e) => {e.target.value = e.target.value.replace(/[^0-9|-]/g,'')}"
placeholder="请输入电话号码"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-form-item label="开户银行" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
@change="event => event.target.value = event.target.value.trim()"
v-decorator="['depositBank',{ rules: validatorRules.depositBank.rules, validateTrigger: 'blur', initialValue:proofInfo.depositBank}]"
placeholder="请输入开户银行"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="银行账户" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
@change="(e) => {e.target.value = e.target.value.trim()}"
v-decorator="['bankAccount',{ rules: validatorRules.bankAccount.rules, validateTrigger: 'blur', initialValue:proofInfo.bankAccount}]"
placeholder="请输入银行账户"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="联行号" :labelCol="labelPayCol" :wrapperCol="wrapperPayCol">
<a-input
@change="(e) => {e.target.value = e.target.value.trim()}"
v-decorator="['linkBankNumber',{ rules: validatorRules.linkBankNumber.rules, validateTrigger: 'blur', initialValue:proofInfo.linkBankNumber}]"
placeholder="请输入联行号"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
</a-row>
</template>
</div>
</template>
<h3 class="title">审核</h3>
<div>
<a-form-item label="审核人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入审核人"
v-decorator="['reviewerName',validatorRules.reviewerName]"
:maxLength='50'
:disabled="true"
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
<a-form-item label="审核" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-decorator="['paymentStatus', validatorRules.paymentStatus]" @change="paymentStatusChange">
<a-radio value="completed">同意</a-radio>
<a-radio value="rejected">拒绝</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="说明" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="showInstructions">
<a-textarea
placeholder="请输入说明"
v-decorator="['reviewInstructions', validatorRules.reviewInstructions]"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</div>
</a-form>
<!-- 缴费凭证预览-->
<preview-img-modal ref="previewImg"></preview-img-modal>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import {postAction} from '../../../../api/manage'
import Vue from 'vue'
import {USER_INFO} from '../../../../store/mutation-types'
import {
getLastProofInfo,
getStanderMemberLastProofInfo,
getCertificateLastProofInfo,
incomingUpdatePayment,
incomingUpdateCertificate
} from '../../../../api/incomePaymentsApi'
import PreviewFile from '../../../../components/jero/PreviewFile.vue'
import PreviewImgModal from '@/components/PreviewImgModal'
const labelCol = {
xs: {span: 24},
sm: {span: 3}
}
const wrapperCol = {
xs: {span: 24},
sm: {span: 21}
}
const labelPayCol = {
sm: {span: 4}
}
const wrapperPayCol = {
sm: {span: 20}
}
export default {
name: 'AuditProofModule',
components: {PreviewFile, PreviewImgModal},
data() {
return {
title: '来款信息',
width: 600,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol,
wrapperCol,
labelPayCol: {
xs: {span: 24},
sm: {span: 8}
},
wrapperPayCol: {
xs: {span: 24},
sm: {span: 16}
},
validatorRules: {
reviewerName: {
rules: [{required: true, message: '请输入审核人'}],
validateTrigger: 'blur'
},
paymentStatus: {
rules: [{required: true, message: '请选择审核状态'}],
validateTrigger: 'blur'
},
reviewInstructions: {
rules: [{required: true, message: '请输入说明'}],
validateTrigger: 'blur'
},
invoiceRequirements: {
rules: [{
required: true, message: '请选择发票'
}]
},
// 会员发票信息的回显
headerName: {
rules: [
{required: true, message: '请输入付款单位发票抬头', validateTrigger: 'blur'},
{min: 1, max: 50, message: '长度不超过50个字符'}
],
validateTrigger: 'blur'
},
taxNumber: {
rules: [
{required: true, message: '请输入社会统一代码/税号', validateTrigger: 'blur'},
{
pattern: /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/,
message: '请输入15位、18位的社会统一代码/税号'
}
],
validateTrigger: 'blur'
},
invoiceAddress: {rules: [{required: true, message: '请输入单位地址'}], validateTrigger: 'blur'},
invoicePhone: {rules: [{required: true, validator: this.handleInvoicePhoneCheck}], validateTrigger: 'blur'},
depositBank: {rules: [{required: true, message: '请输入开户银行'}], validateTrigger: 'blur'},
bankAccount: {rules: [{required: true, message: '请输入银行账户'}], validateTrigger: 'blur'},
linkBankNumber: {rules: [{required: false, message: '请输入联行号'}], validateTrigger: 'blur'}
},
// 项目缴费凭证信息
proofInfo: {},
// 是否显示说明
showInstructions: false,
auditUrl: '/paymentCheck/payPaymentCheck/check',
// 缴费凭证的类型,默认为img,标协会员、证书根据paymentMethod字段决定:1--图片;2--pdf;3--没有凭证
proofType: 'img',
// 标协会员、证书缴费 使用-发票选择
invoiceRequirementsFlag: false,
// 标协会员、证书缴费 使用-当前选择是否需要发票的值,用于dom的判断 0-无 1-普通发票 2-增值税发票
currentSelectInvoiceType: 0,
}
},
methods: {
async open(record) {
if (record.projectType.toString() === '5' || record.projectType.toString() === '6') {
// 会员缴费、证书缴费 模态框调整宽度
this.width = 1000
this.labelCol = labelPayCol
this.wrapperCol = wrapperPayCol
} else {
this.labelCol = labelCol
this.wrapperCol = wrapperCol
this.width = 600
}
let flag = await this.getProofInfo(record)
if (!flag) {
this.$message.warn('项目已审核')
return
}
this.form.resetFields()
let userInfo = Vue.ls.get(USER_INFO)
// 默认隐藏说明
this.showInstructions = false
this.model = Object.assign({}, record)
this.model.reviewerName = userInfo.realname
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'reviewerName'))
})
},
/**
* 获取缴费凭证类型
* @param record
*/
getProofType(record) {
if (record.projectType && (record.projectType.toString() === '5' || record.projectType.toString() === '6')) {
if (this.proofInfo.paymentMethod.toString() === '1') {
this.proofType = 'img'
return
}
if (this.proofInfo.paymentMethod.toString() === '2') {
this.proofType = 'pdf'
return
}
if (this.proofInfo.paymentMethod.toString() === '3') {
this.proofType = 'none'
return
}
} else {
this.proofType = 'img'
}
},
/**
* 获取项目缴费凭证相关信息
* @param record
*/
getProofInfo(record) {
if (record && record.id) {
let param = {
projectId: record.id
}
let httpMethod
// 标协会员、证书和普通项目、工作组项目、资料网员使用的接口不一致
if (record.projectType.toString() === '5') {
httpMethod = getStanderMemberLastProofInfo
} else if (record.projectType.toString() === '6') {
httpMethod = getCertificateLastProofInfo
} else {
httpMethod = getLastProofInfo
}
return new Promise(resolve => {
httpMethod(param).then(res => {
if (res.success && res.result !== '无数据') {
this.proofInfo = res.result || {}
// 标协会员、证书的缴费凭证文件、缴费金额、缴费日期、申请人字段和普通项目、工作组项目、资料网员的不一致
if (record.projectType.toString() === '5' || record.projectType.toString() === '6') {
this.proofInfo.proof = res.result.paymentRecord
this.proofInfo.amountReceived = res.result.amountReceivable
this.proofInfo.paymentDate = res.result.submissionTime
this.proofInfo.applicantName = res.result.liaisonMan
this.currentSelectInvoiceType = Number(res.result.invoiceRequirements)
if (this.currentSelectInvoiceType) {
this.invoiceRequirementsFlag = false
} else {
this.invoiceRequirementsFlag = true
}
this.$nextTick(() => {
this.form.setFieldsValue(pick(res.result, 'invoiceRequirements', 'headerName', 'taxNumber', 'invoiceAddress', 'invoicePhone', 'depositBank', 'bankAccount'))
})
}
this.getProofType(record)
resolve(true)
} else {
resolve(false)
}
})
})
}
},
updateMemberPaymentInfo(params, projectType) {
return new Promise(resolve => {
let request = projectType === 5 && incomingUpdatePayment || incomingUpdateCertificate
let isSuccess = false
request(params).then(res => {
if (res.success) {
isSuccess = true
} else {
this.$message.warn(res.message)
}
}).finally(() => {
resolve(isSuccess)
})
})
},
handleOk() {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
this.form.validateFields(async (err, values) => {
if (!err) {
values.projectId = this.model.id
values.projectType = this.model.projectType
// 当选了同意则把说明清空,防止出现错误信息
if (values.paymentStatus === 'completed') {
values.reviewInstructions = null
}
const formData = Object.assign(this.proofInfo, values)
console.log(formData)
// 标协会员缴费、证书缴费 需要先调用 编辑的接口,编辑成功后在调用审核的接口
if (this.proofInfo.projectType + '' === '5' || this.proofInfo.projectType + '' === '6') {
let updateResult = await this.updateMemberPaymentInfo(formData, Number(this.proofInfo.projectType))
if (!updateResult) {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
return
}
}
postAction(this.auditUrl, formData).then(res => {
if (res.success) {
this.$message.success(res.message)
this.$emit('ok')
this.close()
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
handleCancel() {
this.close()
},
close() {
this.visible = false
},
/**
* 审核通过拒绝变化
* @param value
*/
paymentStatusChange(e) {
if (e.target.value === 'rejected') {
this.showInstructions = true
} else {
this.showInstructions = false
}
},
/**
* 缴费凭证 src
*/
proofSrc(imgId) {
return `${window._CONFIG['domianURL']}/sys/common/download/${imgId}`
},
/**
* 预览缴费凭证
*/
previewImg(imgId) {
this.$refs.previewImg.title = '缴费凭证'
this.$refs.previewImg.imgId = imgId
this.$refs.previewImg.visible = true
},
/*
* 验证发票信息-电话号码 的正确性
* */
handleInvoicePhoneCheck(rule, value, callback) {
const reg = /^((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(17[0135678])|(18[0-9])|(19[8|9])|(16[6]))\d{8}$|^([0-9]{3,4}-)[0-9]{7,8}$/
if (!value) {
callback(new Error('请输入电话号码'))
}
if (value && !reg.test(value)) {
callback(new Error('请输入正确格式的电话号码'))
} else {
callback()
}
},
/* 选择发票*/
invoiceRequirementsChange(value) {
this.currentSelectInvoiceType = Number(value)
// 0 代表发票选择无
if (this.currentSelectInvoiceType === 0) {
this.invoiceRequirementsFlag = false
} else {
this.invoiceRequirementsFlag = true
}
},
}
}
</script>
<style scoped lang="less">
.ant-form-item {
margin-bottom: 10px;
}
.project-name {
font-size: 16px;
line-height: 30px;
font-weight: 700;
padding-bottom: 10px;
}
h3 {
position: relative;
}
h3.title::before {
position: absolute;
top: 4px;
left: -10px;
content: "";
height: 20px;
width: 2px;
background: #069f99;
}
.info-item {
display: flex;
padding: 5px 0;
label {
color: #666666;
flex-shrink: 0;
display: inline-block;
width: 4.5rem;
text-align: right;
}
div {
color: black;
}
}
// 将缴费凭证的图片部分提出
.proof-img {
display: flex;
width: calc(100% - 4rem);
&-item {
width: 35%;
img {
max-width: 100%;
max-height: 150px;
cursor: pointer;
}
}
}
// 修改缴费基础信息的样式
.basic-info-div {
/deep/ .ant-form-item:not(.proof-form-item) {
margin-bottom: 0;
}
}
</style>