Files
income_payments_client/src/views/incomePayments/memberManage/modules/SafeguardStardsMemberModal.vue
T
2024-03-14 16:58:38 +08:00

642 lines
22 KiB
Vue

<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭"
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item
label="会员单位"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<company-select
placeholder="请选择会员单位"
v-decorator="['companyId', validatorRules.companyId]"
@change="companyChange"
:maxLength="50"
:disabled="disabledCompany"
>
</company-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item
label="企业联系人"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<select-contacts
:selected-company="selectedCompany"
:init-contacts="selectPerson"
placeholder="请选择企业联系人"
@change="changetPerson"
v-decorator="['liaisonManId',validatorRules.liaisonManId,]"
:maxLength="50"
ref="selectContacts"
@ok="addContactsOk"
></select-contacts>
</a-form-item>
</a-col>
<a-col :xl="12" :sm="24">
<a-form-item
label="邮寄联系人"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<select-contacts
:selected-company="selectedCompany"
:init-contacts="selectMailPerson"
placeholder="请选择邮寄联系人"
v-decorator="['postContactId', validatorRules.postContactId]"
:maxLength="50"
ref="selectMailContacts"
@ok="addContactsOk"
></select-contacts>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item
label="会员性质"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<j-dict-select-tag
placeholder="请选择会员性质"
v-decorator="['memberNature', validatorRules.memberNature]"
dict-code="member_nature"
:triggerChange="true"
@change="memberNatureChange"
></j-dict-select-tag>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item
label="待确收金额"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<a-row :gutter="10">
<a-col :span="20">
<a-input
ref="amountReceivableRef"
placeholder="请输入待确收金额"
:maxLength="50"
@change="changeReceivableAmount"
v-decorator="['amountReceivable',validatorRules.amountReceivable]"
@blur="addZero"
></a-input>
</a-col>
<a-col :span="1"></a-col>
</a-row>
</a-form-item>
</a-col>
<a-col :xl="12" :sm="24">
<a-form-item label="税率" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag @change="changeRate" placeholder="请选择税率" dict-code="rate" :trigger-change="true"
v-decorator="['taxRate',validatorRules.taxRate]"></j-dict-select-tag>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item label="税额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-row :gutter="10">
<a-col :span="20">
<a-input placeholder="请输入税额"
v-decorator="['tax',validatorRules.tax]"
:maxLength='50'
@blur="addZero"
read-only
disabled
@change="(e) => {e.target.value = (e.target.value.replace(/[^0-9.]/g,'')).trim()}"></a-input>
</a-col>
<a-col :span="1"></a-col>
</a-row>
</a-form-item>
</a-col>
<a-col :xl="12" :sm="24">
<a-form-item label="未税金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-row :gutter="10">
<a-col :span="20">
<a-input placeholder="请输入未税金额"
v-decorator="['noTaxAmount',validatorRules.noTaxAmount]"
:maxLength='50'
disabled
@blur="addZero"
read-only
@change="(e) => {e.target.value = (e.target.value.replace(/[^0-9.]/g,'')).trim()}"></a-input>
</a-col>
<a-col :span="1"></a-col>
</a-row>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择预估到账日期"
style="width: 100%;"
v-decorator="['estimatedArrivalDate', validatorRules.estimatedArrivalDate]"
:trigger-change="true"
date-format="YYYY-MM-DD"
/>
</a-form-item>
</a-col>
<a-col :xl="12" :sm="24">
<a-form-item
label="需要发票"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<j-dict-select-tag
v-decorator="['invoiceRequirements', validatorRules.invoiceRequirements]"
:triggerChange="true"
placeholder="请输入发票类型"
dictCode="invoice_type"
/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item
label="来款方式"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<a-radio-group
v-decorator="['paymentMethod', validatorRules.paymentMethod]"
@change="changePaymentMethod"
:disabled="isAssociatedContract"
>
<a-radio :value="1"></a-radio>
<a-radio :value="2">合同</a-radio>
<a-radio :value="3">收费通知</a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<!-- incomePaysType 2 是合同·-->
<a-col :xl="12" :sm="24" v-show="incomePaysType === 2">
<a-form-item
label="合同号"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<select-revenue-contract
:company="selectedCompany"
placeholder="请选择合同号"
v-decorator="['contractNum', validatorRules.contractNum]"
:disabled="isAssociatedContract">
</select-revenue-contract>
</a-form-item>
</a-col>
</a-row>
<!-- incomePaysType 3 是收费通知·-->
<a-row :gutter="24" v-show="incomePaysType === 3">
<a-col :xl="12" :sm="24">
<a-form-item
label="收费通知号"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<a-input
placeholder="请输入收费通知号"
:maxLength="50"
v-decorator="['chargeNoticeNo', validatorRules.chargeNoticeNo]"
@change="(e) => {e.target.value = (e.target.value + '').trim()}"
></a-input>
</a-form-item>
</a-col>
<a-col :xl="12" :sm="24">
<a-form-item
label="收费通知"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<j-upload
file-type="pdf"
file-type-error-message="请上传收费通知"
:multiple="false"
:return-id="true"
:number="1"
v-decorator="['chargeNoticeId']"
:trigger-change="true"
></j-upload>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col>
<a-form-item
label="备注"
:labelCol="remarksLabelCol"
:wrapperCol="remarksWrapperCol"
>
<a-textarea
placeholder="请输入备注"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength="200"
v-decorator="['remark']"
@change="(e) => {e.target.value = (e.target.value + '').trim()}"
/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import JUpload from '@/components/jero/JUpload'
import JDate from '@/components/jero/JDate'
import JDictSelectTag from '@/components/dict/JDictSelectTag'
import CompanySelect from '@/components/company/CompanySelect'
import SelectContacts from '@/components/company/SelectContacts'
import SelectRevenueContract from '@/components/tools/SelectRevenueContract'
import pick from 'lodash.pick'
import { addZero } from '@/utils/util'
import { money } from '@/utils/validate'
import { httpAction } from '@/api/manage'
import { MemberNature, IncomeMethod } from '@/enums/commonEnums'
import {checkAssociatedProject} from '@/utils/projectCheck'
import { CalcAmountMixin } from '@/mixins/CalcAmountMixin'
export default {
name: 'SafeguardStardsMemberModal',
mixins: [CalcAmountMixin],
components: {
JUpload,
JDate,
JDictSelectTag,
CompanySelect,
SelectContacts,
SelectRevenueContract
},
props: {
// 会员基本信息
baseInfo: {
type: Object,
required: false,
default: () => {
return {}
}
},
// 会员项目id
projectId: {
type: String,
required: false,
default: ''
}
},
data() {
return {
title: '操作',
width: 900,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 }
},
remarksLabelCol: {
xs: { span: 24 },
sm: { span: 3 }
},
remarksWrapperCol: {
xs: { span: 24 },
sm: { span: 21 }
},
validatorRules: {
companyId: {
rules: [{ required: true, message: '请选择会员单位' }],
validateTrigger: 'blur'
},
contractNum: {
rules: [{ required: false, message: '请选择合同号' }],
validateTrigger: 'change'
},
liaisonManId: {
rules: [{ required: true, message: '请选择企业联系人' }],
validateTrigger: 'change'
},
postContactId: {
rules: [{ required: true, message: '请选择邮寄联系人' }],
validateTrigger: 'change'
},
memberNature: {
rules: [{ required: true, message: '请选择会员性质' }],
validateTrigger: ['blur', 'change']
},
paymentMethod: {
rules: [{ required: true, message: '请选择来款方式' }],
validateTrigger: ['blur', 'change'],
initialValue: 3
},
// 待确收金额
amountReceivable: {
rules: [
{ required: true, validator: this.validateMoney }
],
validateTrigger: ['blur']
},
taxRate: {
rules: [{ required: true,message: '请选择税率' }],
validateTrigger: 'change',initialValue:'0.06'
},
chargeNoticeNo: {
rules: [{ required: false, message: '请输入收费通知号' }],
validateTrigger: 'blur'
},
invoiceRequirements: {
rules: [{ required: true, message: '请选择发票类型' }],
validateTrigger: ['change', 'blur'],
initialValue: 0
},
estimatedArrivalDate: {
rules: [{ required: true, message: '请选择预估到账日期' }],
validateTrigger: 'change'
}
},
ysjeKey: 'amountReceivable',
// 来款方式
incomePaysType: 3,
// 选中的会员单位
selectedCompany: null,
// 选中的联系人
selectPerson: null,
// 回显的邮寄联系人
selectMailPerson: null,
timer: null,
url: {
add: '/member/tbMemberProjectSubitem/add',
edit: '/member/tbMemberProjectSubitem/edit'
},
disabledCompany: false, // 企业是否可以编辑
isAssociatedContract: false // 是否已关联合同
}
},
methods: {
addZero,
add() {
this.edit({})
},
edit(record) {
// 清除定时器
if (this.timer) {
clearTimeout(this.timer)
}
this.form.resetFields()
// 判断企业是否可以编辑,项目来款、开票、邮寄、打包、关联合同后,企业不可更改
if (record.id) {
// 验证项目是否关联收入合同
checkAssociatedProject(record.id).then(res => {
this.disabledCompany = this.disabledChargeCompany || res || (!!record.inAccount && record.inAccount !== 0) || (!!record.makeInvoice && record.makeInvoice !== 0) || (!!record.mail && record.mail !== 0)
this.isAssociatedContract = res
})
} else {
this.disabledCompany = this.disabledChargeCompany
}
// 合同作废后合同号是null,这里置为undefined
record.contractNum = record.contractNum || undefined
this.model = Object.assign({}, record)
// 编辑状态下的企业与联系人的回显
if (record.companyId) {
this.model.companyId = {
id: record.companyId,
companyName: record.companyName
}
this.selectedCompany = Object.assign({}, this.model.companyId)
// this.selectPerson = {
// id: this.model.liaisonManId,
// name: this.model.liaisonManId_dictText
// }
// this.selectMailPerson = {
// id: this.model.postContactId,
// name: this.model.postContactId_dictText
// }
// 修改来款方式 控制dom对应显示隐藏
this.incomePaysType = record.paymentMethod
}
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(
pick(
this.model,
'companyId',
'liaisonManId',
'postContactId',
'memberNature',
'amountReceivable',
'taxRate',
'tax',
'noTaxAmount',
'estimatedArrivalDate',
'invoiceRequirements',
'paymentMethod',
'contractNo',
'chargeNoticeNo',
'chargeNoticeId',
'remark'
)
)
// 查找企业联系人,找不到就置空
this.$refs.selectContacts.getContactsList().finally(() => {
if (!this.$refs.selectContacts.contactsList.find(item => item.id === this.model.liaisonManId)) {
this.form.setFieldsValue({ liaisonManId: undefined })
}
})
// 查找邮寄联系人,找不到就置空
this.$refs.selectMailContacts.getContactsList().finally(() => {
if (!this.$refs.selectMailContacts.contactsList.find(item => item.id === this.model.postContactId)) {
this.form.setFieldsValue({ postContactId: undefined })
}
})
})
},
validateMoney(rule, value, callback) {
if (value === undefined || value === '' || value === null) {
callback('请输入待确收金额')
}
if (value && money(value)) {
callback()
} else {
callback('请输入合法的金额数字,最多2位小数,10位整数')
}
},
// 会员性质改变
memberNatureChange (value) {
console.log(this.baseInfo, value)
if (value === MemberNature.viceChairmanUnit.value) {
// 是副理事长单位, 带出会员信息的理事会收费标准、理事会收费通知号、理事会收费通知作为待确收金额,收费通知号,收费通知
// 待确收金额带入会员的理事会收费标准
if (this.baseInfo.councilChargeStandard) {
this.form.setFieldsValue({
amountReceivable: this.baseInfo.councilChargeStandard
})
this.changeReceivableAmount({target: {value: this.baseInfo.councilChargeStandard}})
}
// 来款方式是收费通知,带出会员信息的理事会收费通知号、理事会收费通知作为收费通知号,收费通知
if (this.form.getFieldValue('paymentMethod') === IncomeMethod.noticeOfCharge.value) {
this.form.setFieldsValue({
chargeNoticeId: this.baseInfo.councilChargeNoticeFileId,
chargeNoticeNo: this.baseInfo.councilChargeNoticeNo
})
}
} else {
// 是历史单位或者会员单位, 带出会员信息的收费标准、收费通知号、收费通知作为待确收金额,收费通知号,收费通知
// 待确收金额带入会员的收费标准
if (this.baseInfo.councilChargeStandard) {
this.form.setFieldsValue({
amountReceivable: this.baseInfo.chargeStandard
})
this.changeReceivableAmount({target: {value: this.baseInfo.chargeStandard}})
}
// 来款方式是收费通知,带出会员信息的收费通知号、收费通知作为收费通知号,收费通知
if (this.form.getFieldValue('paymentMethod') === IncomeMethod.noticeOfCharge.value) {
this.form.setFieldsValue({
chargeNoticeId: this.baseInfo.chargeNoticeFileId,
chargeNoticeNo: this.baseInfo.chargeNoticeNo
})
}
}
},
// 选择企业联系人 带出邮寄联系人
changetPerson(val) {
// 只有邮寄联系人没有值的时候才去联动复制
if (this.form.getFieldValue('postContactId') === undefined) {
this.form.setFieldsValue({ 'postContactId': val })
}
},
close() {
this.incomePaysType = 3
this.$emit('close')
this.disabledCompany = false
this.isAssociatedContract = false
this.visible = false
clearTimeout(this.timer)
},
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let httpurl = ''
const formData = Object.assign({}, values)
if (!this.model.id) {
httpurl += this.url.add
} else {
httpurl += this.url.edit
formData.id = this.model.id
}
formData.chargeNoticeId = formData.chargeNoticeId || ''
formData.chargeNoticeNo = formData.chargeNoticeNo || ''
formData.contractNo = formData.contractNo || ''
formData.projectId = this.projectId
formData.companyName = formData.companyId.companyName
formData.companyId = formData.companyId.id
httpAction(httpurl, formData, 'post').then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.confirmLoading = false
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
that.confirmLoading = false
})
}
})
},
/*
* 来款方式
* */
changePaymentMethod(e) {
// 不清空,并且判断用v-if的话,切换来款方式从收费通知变成无,再改到收费通知,收费通知没选但是再次编辑的时候能回显最开始的
if (e.target.value === IncomeMethod.contract.value) {
// 是合同,清空收费通知号,收费通知
this.form.resetFields(['chargeNoticeNo', 'chargeNoticeId'])
this.validatorRules.chargeNoticeNo.rules[0].required = false
this.validatorRules.contractNum.rules[0].required = true
} else if (e.target.value === IncomeMethod.noticeOfCharge.value) {
// 是收费通知,清空合同号
this.form.resetFields(['contractNum'])
this.validatorRules.contractNum.rules[0].required = false
this.validatorRules.chargeNoticeNo.rules[0].required = true
} else {
// 是无,清空合同号和收费通知号
this.form.resetFields(['contractNum', 'chargeNoticeNo', 'chargeNoticeId'])
this.validatorRules.chargeNoticeNo.rules[0].required = false
this.validatorRules.contractNum.rules[0].required = false
}
this.incomePaysType = e.target.value
},
/*
* 选择会员单位
* */
companyChange(val) {
// 当前选中的企业和之前选中的企业一致,就不修改了
if (this.selectedCompany && val && this.selectedCompany.id === val.id) {
return
}
// 清除合同号
this.form.setFieldsValue({ contractNo: undefined })
this.selectedCompany = Object.assign({}, val)
// 切换企业清空两个联系人
this.form.setFieldsValue({
liaisonManId: undefined,
postContactId: undefined
})
},
handleCancel() {
this.selectedCompany = null
this.close()
},
/*
* 筛选
* */
filterOption(input, option) {
console.log('inp', option)
},
/*
* 新增联系人后刷新下拉框数据
* */
addContactsOk() {
this.$refs.selectContacts.getContactsList()
this.$refs.selectMailContacts.getContactsList()
}
}
}
</script>
<style scoped>
</style>