Merge branch 'change0706'

This commit is contained in:
lijiarao
2022-08-19 10:43:00 +08:00
16 changed files with 1288 additions and 136 deletions
+8 -1
View File
@@ -116,6 +116,11 @@ const getContactsByCompany = (params) => getAction('/company/payContactsManageme
const getContactsByCompanyNoLimit = (params) => getAction('/company/payContactsManagement/queryByCompanyMeeting', params)
// 通过联系人id获取联系人信息
const getContactsById = (param) => getAction('/company/payContactsManagement/queryByIdMeeting', param)
// 企业管理员重置密码
const companyAdminResetPassword = (param) => postAction('/payManagerManagement/resetPassword', param)
// 企业管理员启用禁用
const companyAdminEnable= (param) => postAction('/payManagerManagement/frozenBatch', param)
// 加密获取key 与 iv
const getKeyIv = (param) => getAction('/sys/getEncryptedString',param)
@@ -183,7 +188,9 @@ export {
getFileInfo,
getKeyIv,
getContactsByCompanyNoLimit,
loginIdmPlatform
loginIdmPlatform,
companyAdminResetPassword,
companyAdminEnable
}
+6 -1
View File
@@ -26,6 +26,10 @@ const addGenerateCodeList = (params) => postAction('/meeting/randomCode/add', pa
// 国际研讨会--列表页编辑一条随机码数据
const editGenerateCodeList = (params) => postAction('/meeting/randomCode/edit', params)
// 标协会议-问题征集详情-查询标准号下拉框数据
const getStandardNumberList = (params) => getAction('/meeting/standardsMeeting/getStandardNumberList', params)
export {
getUserInfo,
getMeetInfoById,
@@ -37,5 +41,6 @@ export {
getGeneratedCodeList,
generateCode,
addGenerateCodeList,
editGenerateCodeList
editGenerateCodeList,
getStandardNumberList
}
+6 -2
View File
@@ -108,6 +108,10 @@
<label>银行账号</label>
<span>{{ basicInfo.bankAccount }}</span>
</a-col>
<a-col :span="12" class="detail-item">
<label>联行号</label>
<span>{{ basicInfo.linkBankNumber || '' }}</span>
</a-col>
</a-row>
</section>
<!--企业信息end-->
@@ -117,7 +121,7 @@
<h3 class="title">第三方垫付信息</h3>
<a-row :gutter="24">
<a-col :span="12" class="detail-item">
<label>关联付款发票名称</label>
<label>付款单位发票抬头</label>
<span><j-ellipsis :value="otherCompanyInfo.headerName" :length="20"></j-ellipsis></span>
</a-col>
<a-col :span="12" class="detail-item">
@@ -289,7 +293,7 @@ import { queryCommonProjectById, getStanderMemberLastProofInfo, getCertificateLa
import JEllipsis from '@comp/jero/JEllipsis'
import PreviewFile from './jero/PreviewFile'
import { ProjectTypeEnums } from '@/enums/commonEnums'
import pick from 'lodash.pick'
// import pick from 'lodash.pick'
// import {getAction} from "@api/manage";
const columns = [
{
@@ -0,0 +1,212 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<!-- <a-col :xl="6" :lg="7" :md="8" :sm="24">-->
<!-- <a-form-item label="手机号" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <a-input placeholder="请输入手机号" v-model="queryParam.phone" :maxLength='50'></a-input>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="用户姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入用户姓名" v-model="queryParam.name" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="企业名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入企业名称" v-model="queryParam.companyName" :maxLength='11'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery" v-has="'companyadmin:page'">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 查询区域-end-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="plus" @click="handleAdd" v-has="'companyadmin:add'">新增</a-button>
<a-button type="primary" icon="export" @click="handleExportXls('企业管理员')" v-has="'companyadmin:export'">导出
</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'companyadmin:deleteBatch'">批量删除</a-button>
</div>
<!-- 操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<template slot="text" slot-scope="text">
<j-ellipsis :value="text" :length="18"></j-ellipsis>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record">
<a @click="handleUse(record)"
:class="{'color-red':record.status === 1}"
v-has="'companyadmin:use'">{{ record.status === 1 ? '禁用' : '启用' }}</a>
<a @click="handleEdit(record)" v-has="'companyadmin:edit'">编辑</a>
<a @click="resetPassword(record)" v-has="'companyadmin:resetPassword'">重置密码</a>
<a @click="handleDelete(record.id)" v-has="'companyadmin:delete'">删除</a>
</span>
</a-table>
</div>
<company-admin-module ref="modalForm" @ok="modalFormOk"></company-admin-module>
</a-card>
</div>
</template>
<script>
import {JeroListMixin} from '@/mixins/JeroListMixin'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import CompanyAdminModule from '@views/businessManagement/modules/CompanyAdminModule'
import IconImg from '@/assets/imgs/icon/icon_company_management.png'
import {companyAdminEnable, companyAdminResetPassword} from '@api/api'
export default {
name: 'CompanyAdmin',
components: {CompanyAdminModule, PageHeaderTitle},
mixins: [JeroListMixin],
computed: {
importExcelUrl: function () {
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
}
},
data() {
return {
IconImg,
labelCol: {
xs: {span: 24},
sm: {span: 5}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 10}
},
url: {
list: '/payManagerManagement/page',
delete: '/payManagerManagement/delete',
deleteBatch: '/payManagerManagement/deleteBatch',
exportXlsUrl: '/payManagerManagement/exportXls',
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
}, {
title: '企业名称',
align: 'center',
dataIndex: 'companyName',
scopedSlots: {customRender: 'text'}
},
{
title: '用户姓名',
align: 'center',
dataIndex: 'name',
scopedSlots: {customRender: 'text'}
},
{
title: '手机号',
align: 'center',
dataIndex: 'phone',
scopedSlots: {customRender: 'text'}
},
{
title: '状态',
align: 'center',
dataIndex: 'status_dictText'
},
{
title: '操作',
dataIndex: 'action',
align: 'center',
scopedSlots: {customRender: 'action'}
}
]
}
},
methods: {
/**
* 重置密码
* */
resetPassword(record) {
const that = this
this.$confirm({
title: '确认重置密码',
content: '是否重置该用户密码',
onOk: function () {
const param = {
id: record.id
}
companyAdminResetPassword(param).then(res => {
if (res.success) {
that.$message.success(res.message)
that.loadData()
} else {
that.$message.warning(res.message)
}
})
}
})
},
/**
* 启用禁用
* */
handleUse(record) {
let status
if (record.status === 1) {
status = 2
} else if (record.status === 2) {
status = 1
}
const param = {
ids: record.id,
status
}
companyAdminEnable(param).then(res => {
if (res.success) {
this.$message.success(res.message)
this.loadData()
} else {
this.$message.warning(res.message)
}
})
}
},
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.color-red {
color: red;
}
</style>
@@ -83,6 +83,16 @@
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :xl="12" :sm="24">
<a-form-item label="联行号" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入联行号"
v-decorator="['linkBankNumber', validatorRules.linkBankNumber]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col>
<a-form-item label="备注" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
@@ -178,7 +188,11 @@ export default {
dutyCode: {
rules: [{ required: true, validator: this.checkDutyCode }],
validateTrigger: 'blur'
}
},
linkBankNumber: {
rules: [{ required: true, message: '请输入联行号' }],
validateTrigger: 'blur'
},
},
url: {
add: '/company/payCompanyManagement/add',
@@ -201,7 +215,7 @@ export default {
this.model = Object.assign({}, record)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'companyName', 'companyAddress', 'companyPhone', 'postalCode', 'bankAccountName', 'openingBank', 'bankAccount', 'dutyCode', 'remarks'))
this.form.setFieldsValue(pick(this.model, 'companyName', 'companyAddress', 'companyPhone', 'postalCode', 'bankAccountName', 'openingBank', 'bankAccount', 'dutyCode','linkBankNumber', 'remarks'))
})
},
close() {
@@ -0,0 +1,230 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-row :gutter="24">
<a-col :xl="24" :sm="24">
<a-form-item label="公司名称" :labelCol="labelCol"
:wrapperCol="wrapperCol">
<company-select placeholder="请选择公司" @change="changeCompany"
v-decorator="['companyId',validatorRules.companyId]"></company-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xl="24" :sm="24">
<a-form-item label="用户姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入用户姓名"
@change="event => event.target.value = event.target.value.trim()" :maxLength="50"
v-decorator="['name',validatorRules.name]"></a-input>
</a-form-item>
</a-col>
</a-row>
<!-- <a-row :gutter="24">-->
<!-- <a-col :xl="24" :sm="24">-->
<!-- <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <a-input placeholder="请输入用户账号"-->
<!-- @change="event => event.target.value = event.target.value.trim()" :maxLength="50"-->
<!-- v-decorator="['username',validatorRules.username]"></a-input>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- </a-row>-->
<a-row :gutter="24">
<a-col :xl="24" :sm="24">
<a-form-item label="手机号" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入手机号"
@change="(e) => {e.target.value = e.target.value.replace(/[^0-9]/g,'')}"
:maxLength="11"
v-decorator="['phone',validatorRules.phone]"></a-input>
</a-form-item>
<span class="notice">更改手机号,需要重新登录企业端设置密码</span>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import { httpAction } from '@api/manage'
import CompanySelect from '@comp/company/CompanySelect'
import {getRSAPublicKey} from '@api/login'
import {JSEncrypt} from 'jsencrypt'
import {phoneReg} from '@/utils/validate'
export default {
name: 'CompanyAdminModule',
components:{
CompanySelect,
},
data() {
return {
title: '操作',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
c:'',// 加密公钥
model: {},
selectedCompany:null,// 选择的公司
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: 'change'
},
name: {
rules: [{ required: true, message: '请输入用户姓名' }],
validateTrigger: 'blur'
},
username: {
rules: [{ required: true, message: '请输入用户账号' }],
validateTrigger: 'blur'
},
phone: {
rules: [{ required: true, validator: this.validatePhone }],
validateTrigger: 'blur'
},
},
url: {
add: '/payManagerManagement/add',
edit: '/payManagerManagement/edit'
}
}
},
methods: {
add() {
this.edit({})
},
edit(record) {
this.form.resetFields()
this.getRSAPublicKeyFunc()
this.model = Object.assign({}, record)
// 回显企业
this.model.companyId = {
id:this.model.companyId,
companyName:this.model.companyName
}
// 回显姓名
this.selectedCompany = this.model.companyId
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model,'username','phone','companyId','name'))
})
},
/**
* 选择公司
* */
changeCompany(value){
this.selectedCompany = value
console.log(value,'选择公司')
},
/**
* 获取公钥
* */
getRSAPublicKeyFunc() {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
})
},
close() {
this.$emit('close')
this.visible = false
this.selectedCompany = null
},
handleOk: function () {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
let httpurl = ''
let method = 'post'
if (!this.model.id) {
httpurl += this.url.add
} else {
httpurl += this.url.edit
}
const formData = Object.assign(this.model, values)
formData.companyName = this.selectedCompany.companyName
formData.companyId = this.selectedCompany.id
let encrypt = new JSEncrypt()
encrypt.setPublicKey(this.rsaPublicKey)
formData.phone = encrypt.encrypt(values.phone)
formData.rsaPublicKey = this.rsaPublicKey
httpAction(httpurl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok', res.result)
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
handleCancel() {
this.close()
},
/**
* 手机号校验
* */
validatePhone(rule,value,callback){
if(!value){
callback(new Error('请输入手机号'))
}
if(value && phoneReg(value)) {
callback()
}else {
callback(new Error('手机号格式不正确'))
}
}
}
}
</script>
<style scoped lang="less">
.notice {
position: absolute;
color:red;
left: 26%;
bottom: -17%;
}
</style>
@@ -9,6 +9,9 @@
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<span class="prompt-message">
说明1.负责人A为该分标委的主负责人负责人B为该分标委的辅助负责人
</span>
<a-form :form="form">
<a-row :gutter="10">
<a-col :xl="12" :sm="24">
@@ -31,6 +34,22 @@
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-form-item label="负责人A" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-principal placeholder="请选择负责人A"
v-decorator="['principalIdA',validatorRules.principalIdA]"
:maxLength='50'></select-principal>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="负责人B" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-principal placeholder="请选择负责人B"
v-decorator="['principalIdB',validatorRules.principalIdB]"
:maxLength='50'></select-principal>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col>
<a-form-item label="目标简述" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
@@ -50,10 +69,13 @@
<script>
import pick from 'lodash.pick'
import SelectPrincipal from '@comp/company/SelectPrincipal'
import { httpAction } from '@api/manage'
import {isRepeat} from '../../../../utils/util'
export default {
name: 'CommitteeModule',
components: { SelectPrincipal },
data() {
return {
title: '操作',
@@ -87,6 +109,14 @@ export default {
rules: [{ required: true, message: '请输入分标委简称' }],
validateTrigger: 'blur'
},
principalIdA: {
rules: [{ required: true, validator: this.validatePrincipal }],
validateTrigger: 'change'
},
principalIdB: {
rules: [{ required: false, validator: this.validatePrincipal }],
validateTrigger: 'change'
},
remarks: {
rules: [{ required: true, message: '请输入目标简述' }],
validateTrigger: 'blur'
@@ -107,13 +137,38 @@ export default {
this.model = Object.assign({}, record)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'name', 'abbreviation', 'remarks'))
this.form.setFieldsValue(pick(this.model, 'name', 'abbreviation', 'remarks', 'principalIdA', 'principalIdB'))
})
},
close() {
this.$emit('close')
this.visible = false
},
/**
* 校验负责人是否重复
* @param rule
* @param value
* @param callback
*/
validatePrincipal(rule, value, callback) {
if (rule.field === 'principalIdA') {
if (!value) {
callback('请选择负责人A')
}
}
if (value) {
const principalObj = this.form.getFieldsValue(['principalIdA', 'principalIdB'])
const principalArr = Object.values(principalObj)
principalArr.filter(tt => tt !== undefined)
if (isRepeat(principalArr)) {
callback('请选择不同的负责人')
} else {
callback()
}
return
}
callback()
},
handleOk() {
if (this.confirmLoading) {
return
@@ -175,4 +230,12 @@ export default {
padding: 0 10px 0 5px;
}
}
.prompt-message {
float: left;
color: red;
margin-bottom: 10px;
&-line2 {
padding-left: 2.7rem;
}
}
</style>
@@ -60,6 +60,12 @@
<j-dict-select-tag v-model="queryParam.paidInvoicStatus" placeholder="请选择来款开票状态"
dictCode="paid_invoic_status"/>
</a-form-item>
</a-col>>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="确认收入状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-model="queryParam.affirmIncome" placeholder="请选择确认收入状态"
dictCode="affirmi_ncome"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
@@ -221,6 +227,7 @@ import AuditProofModule from './modules/AuditProofModule'
import AuditModal from '@views/incomePayments/meetManage/modules/AuditModal'
import ConfirmStageModule from './modules/ConfirmStageModule'
import {getPayConfirmList} from '../../../api/incomePaymentsApi'
import JDictSelectTag from "@comp/dict/JDictSelectTag";
// 项目类型 数据字典 的定义 和数据库的保持一致
const ProjectTypeEnums = {
@@ -238,6 +245,7 @@ export default {
components: {
PageHeaderTitle,
JYearDate,
JDictSelectTag,
StatusSlot,
ArriveStageModule,
InvoicingStageModule,
@@ -17,9 +17,25 @@
<a-form :form="form">
<h3 class="title">凭证信息</h3>
<div class="basic-info-div">
<a-form-item label="缴费金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.amountReceived }}</div>
</a-form-item>
<!--标协会员项目的缴费 显示-->
<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>
@@ -27,23 +43,24 @@
<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>-->
<!-- <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--pdf3--没有凭证 -->
<!-- proofType处理过的缴费凭证类型img--图片pdf--pdfnone--无缴费凭证 -->
<!-- <div class="info-item">-->
<a-form-item class="proof-form-item" :label="proofType==='pdf' ? '打包协议' : '缴费凭证'" :labelCol="labelCol" :wrapperCol="wrapperCol">
<!-- <label>{{proofType==='pdf' ? '打包协议' : '缴费凭证'}}</label>-->
<!-- <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">
@@ -56,7 +73,7 @@
</div>
<span v-if="proofType==='none'"></span>
</a-form-item>
<!-- </div>-->
<!-- </div>-->
<a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-textarea
placeholder="请输入备注"
@@ -67,7 +84,8 @@
</a-form-item>
</div>
<!-- 当前的缴费凭证是否是标协会员证书缴费 时展示 付款信息用户财务人员核实 -->
<template v-if="model.projectType && (model.projectType.toString() === '5' || model.projectType.toString() === '6')">
<template
v-if="model.projectType && (model.projectType.toString() === '5' || model.projectType.toString() === '6')">
<h3 class="title">付款信息</h3>
<div class="pay-info-div">
<a-row>
@@ -79,18 +97,18 @@
v-decorator="['invoiceRequirements',{ rules: validatorRules.invoiceRequirements.rules, initialValue:proofInfo.invoiceRequirements, validateTrigger: 'change'},]"
:trigger-change="true"
dictCode="invoice_type"
placeholder="请选择发票" />
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-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="请输入关联付款发票名称"
placeholder="请输入付款单位发票抬头"
:maxLength="50"></a-input>
</a-form-item>
</a-col>
@@ -145,6 +163,15 @@
: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>
@@ -182,10 +209,16 @@
<script>
import pick from 'lodash.pick'
import { postAction } from '../../../../api/manage'
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 {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'
@@ -207,7 +240,7 @@ const wrapperPayCol = {
export default {
name: 'AuditProofModule',
components: { PreviewFile, PreviewImgModal },
components: {PreviewFile, PreviewImgModal},
data() {
return {
title: '来款信息',
@@ -219,24 +252,24 @@ export default {
labelCol,
wrapperCol,
labelPayCol: {
xs: { span: 24 },
sm: { span: 8 }
xs: {span: 24},
sm: {span: 8}
},
wrapperPayCol: {
xs: { span: 24 },
sm: { span: 16 }
xs: {span: 24},
sm: {span: 16}
},
validatorRules: {
reviewerName: {
rules: [{ required: true, message: '请输入审核人' }],
rules: [{required: true, message: '请输入审核人'}],
validateTrigger: 'blur'
},
paymentStatus: {
rules: [{ required: true, message: '请选择审核状态' }],
rules: [{required: true, message: '请选择审核状态'}],
validateTrigger: 'blur'
},
reviewInstructions: {
rules: [{ required: true, message: '请输入说明' }],
rules: [{required: true, message: '请输入说明'}],
validateTrigger: 'blur'
},
invoiceRequirements: {
@@ -247,14 +280,14 @@ export default {
// 会员发票信息的回显
headerName: {
rules: [
{ required: true, message: '请输入付款单位发票抬头', validateTrigger: 'blur' },
{ min: 1, max: 50, message: '长度不超过50个字符' }
{required: true, message: '请输入付款单位发票抬头', validateTrigger: 'blur'},
{min: 1, max: 50, message: '长度不超过50个字符'}
],
validateTrigger: 'blur'
},
taxNumber: {
rules: [
{ required: true, message: '请输入社会统一代码/税号', validateTrigger: 'blur' },
{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位的社会统一代码/税号'
@@ -263,10 +296,12 @@ export default {
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' }
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: {},
@@ -282,19 +317,19 @@ export default {
}
},
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
}
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){
if (!flag) {
this.$message.warn('项目已审核')
return
}
@@ -314,7 +349,7 @@ export default {
* @param record
*/
getProofType(record) {
if (record.projectType && (record.projectType.toString() === '5' || record.projectType.toString() === '6')) {
if (record.projectType && (record.projectType.toString() === '5' || record.projectType.toString() === '6')) {
if (this.proofInfo.paymentMethod.toString() === '1') {
this.proofType = 'img'
return
@@ -349,7 +384,7 @@ export default {
} else {
httpMethod = getLastProofInfo
}
return new Promise(resolve => {
return new Promise(resolve => {
httpMethod(param).then(res => {
if (res.success && res.result !== '无数据') {
this.proofInfo = res.result || {}
@@ -360,7 +395,7 @@ export default {
this.proofInfo.paymentDate = res.result.submissionTime
this.proofInfo.applicantName = res.result.liaisonMan
this.currentSelectInvoiceType = Number(res.result.invoiceRequirements)
if(this.currentSelectInvoiceType) {
if (this.currentSelectInvoiceType) {
this.invoiceRequirementsFlag = false
} else {
this.invoiceRequirementsFlag = true
@@ -371,7 +406,7 @@ export default {
}
this.getProofType(record)
resolve(true)
}else{
} else {
resolve(false)
}
})
@@ -384,7 +419,7 @@ export default {
let request = projectType === 5 && incomingUpdatePayment || incomingUpdateCertificate
let isSuccess = false
request(params).then(res => {
if(res.success) {
if (res.success) {
isSuccess = true
} else {
this.$message.warn(res.message)
@@ -410,9 +445,9 @@ export default {
const formData = Object.assign(this.proofInfo, values)
console.log(formData)
// 标协会员缴费、证书缴费 需要先调用 编辑的接口,编辑成功后在调用审核的接口
if(this.proofInfo.projectType + '' === '5' || this.proofInfo.projectType + '' === '6') {
if (this.proofInfo.projectType + '' === '5' || this.proofInfo.projectType + '' === '6') {
let updateResult = await this.updateMemberPaymentInfo(formData, Number(this.proofInfo.projectType))
if(!updateResult) {
if (!updateResult) {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
@@ -458,7 +493,7 @@ export default {
* 缴费凭证 src
*/
proofSrc(imgId) {
return `${ window._CONFIG['domianURL'] }/sys/common/download/${ imgId }`
return `${window._CONFIG['domianURL']}/sys/common/download/${imgId}`
},
/**
* 预览缴费凭证
@@ -538,13 +573,15 @@ h3.title::before {
color: black;
}
}
// 将缴费凭证的图片部分提出
.proof-img {
display: flex;
width:calc(100% - 4rem);
width: calc(100% - 4rem);
&-item {
width: 50%;
img {
max-width: 100%;
max-height: 150px;
@@ -552,9 +589,10 @@ h3.title::before {
}
}
}
// 修改缴费基础信息的样式
.basic-info-div{
/deep/.ant-form-item:not(.proof-form-item){
.basic-info-div {
/deep/ .ant-form-item:not(.proof-form-item) {
margin-bottom: 0;
}
}
@@ -46,9 +46,12 @@
<!-- 编辑的时候按照不同的类型显示不同的数据: 标准宣贯、学习培训一起显示; 信息交流会单独显示 -->
<j-dict-select-tag
ref="standardMeetingType"
v-decorator="['tbMeetingType',validatorRules.tbMeetingType]" :trigger-change="true"
style="width: 100%" dict-code="standard_meeting_type"
v-decorator="['tbMeetingType',validatorRules.tbMeetingType]"
:trigger-change="true"
style="width: 100%"
dict-code="standard_meeting_type"
placeholder="请选择标协会议类型"
@change="tbMeetingTypeChange"
></j-dict-select-tag>
</a-form-item>
</a-col>
@@ -96,19 +99,19 @@
<a-row>
<a-col :xxl='8' :xl="12" :sm="24">
<a-form-item label="召开地点" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-area-linkage
type="cascader"
placeholder="请选择省市"
:has-error="hasError"
@change="changeConvoke"
v-decorator="['convokeLocale',validatorRules.convokeLocale]"
></j-area-linkage>
<!-- <j-area-linkage-->
<!-- type="cascader"-->
<!-- placeholder="请选择省市"-->
<!-- :has-error="hasError"-->
<!-- @change="changeConvoke"-->
<!-- v-decorator="['convokeLocale',validatorRules.convokeLocale]"-->
<!-- ></j-area-linkage>-->
<a-input placeholder="请输入召开地点/腾讯会议" v-decorator="['venue',validatorRules.venue]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl='8' :xl="12" :sm="24">
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入详细地址"
class="address"
<a-input placeholder="请输入详细地址/腾讯会议号"
v-decorator="['address',validatorRules.address]"
@change="event => event.target.value = event.target.value.trim()"
:maxLength='50'
@@ -139,7 +142,73 @@
</a-row>
<!--会议信息end-->
<!-- 会议问题征集--只有标协会议存在 -->
<section v-if="meetingType === '2' && (tbMeetingType === 1 || tbMeetingType === 2)" >
<!-- 选择是否需要问题征集-->
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="问题征集" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-decorator="['isAddQuestion',validatorRules.isAddQuestion]"
@change="changeIsAddQuestion">
<a-radio :value="1">需要</a-radio>
<a-radio :value="0">不需要</a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24" v-if="isAddQuestion">
<a-form-item label="征集截止时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date
placeholder="请选择征集截止时间"
style="width: 100%;"
v-decorator="['endTimeAddQuestion',validatorRules.endTimeAddQuestion]"
:trigger-change="true"
date-format="YYYY-MM-DD HH:mm:00"
:show-time="true"
/>
</a-form-item>
</a-col>
</a-row>
<div class="item-title" v-if="isAddQuestion" >问题征集列表</div>
<!-- 问题征集的详细信息-->
<section v-if="isAddQuestion">
<a-row :gutter="24" v-for="(question, index) in model.questionList" :key="index">
<!-- 存儲初始化的id-->
<a-col v-show="false">
<a-form-item :label="'标准号id ' + (index + 1) " :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input
@change="event => event.target.value = event.target.value.trim()"
:maxLength="50"
v-decorator="['questionList['+index+'].id']"
placeholder="请输入标准号id"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="10" :sm="24">
<a-form-item :label="'标准号 ' + (index + 1) " :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input
@change="event => event.target.value = event.target.value.trim()"
:maxLength="50"
v-decorator="['questionList['+index+'].standardNumber', validatorRules.standardNumber]"
placeholder="请输入标准号"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="10" :sm="24">
<a-form-item label="标准名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input
@change="event => event.target.value = event.target.value.trim()"
:maxLength="11"
v-decorator="['questionList['+index+'].standardName',validateInviteCode.standardName]"
placeholder="请输入标准名称"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="4" :sm="24">
<a-form-item>
<a-button icon="plus" @click="addQuestionNew"></a-button>
<a-button icon="minus" @click="removeQuestion(index)" style="margin-left: 8px;"></a-button>
</a-form-item>
</a-col>
</a-row>
</section>
</section>
<!--邀请码begin-->
<!-- 国际研讨会出现-->
@@ -390,7 +459,7 @@ import JYearDate from '@comp/jero/JYearDate'
import JUpload from '@comp/jero/JUpload'
import JDate from '@comp/jero/JDate'
import SelectPrincipal from '@comp/company/SelectPrincipal'
import JAreaLinkage from '@comp/jero/JAreaLinkagePca'
// import JAreaLinkage from '@comp/jero/JAreaLinkagePca'
import AreaPca from '@comp/_util/AreaPca'
import moment from 'moment'
import pick from 'lodash.pick'
@@ -410,7 +479,7 @@ export default {
JUpload,
JDate,
SelectPrincipal,
JAreaLinkage,
// JAreaLinkage,
PageHeaderTitle,
JImageUpload
},
@@ -508,7 +577,11 @@ export default {
// 召开地点border颜色控制
hasError: false,
// 会议类型
meetingType: ''
meetingType: '',
// 是否需要 问题征集
isAddQuestion: 0,
// 标协会议类型
tbMeetingType: undefined,
}
},
computed: {
@@ -593,6 +666,14 @@ export default {
meetingContactsPhone: undefined
}]
}
if((this.model.questionList || []).length === 0) {
// 问题征集列表
this.model.questionList = [{
standardNumber: undefined,
standardName: undefined
}]
}
this.model.isAddQuestion = this.model.isAddQuestion || 0 // 处理历史数据的问题
} else {
this.title = '新增会议'
// 所有的会议都显示酒店联系人
@@ -605,10 +686,16 @@ export default {
meetingContactsId: undefined,
meetingContactsPhone: ''
}]
// 问题征集列表
this.model.questionList = [{
standardNumber: undefined,
standardName: undefined
}]
// 新增取路由参数
this.meetingType = this.$route.query.meetingType
// 新增根据路由参数 会议类型更换不同的接口
this.url = this.createUrlByMeetingType(this.meetingType)
this.model.isAddQuestion = 0 // 默认不需要问题征集
}
console.log(this.model)
// 召开时间回显
@@ -627,12 +714,12 @@ export default {
this.$nextTick(() => {
// 加定时器是因为有可能赋值不成功
setTimeout(() => {
this.form.setFieldsValue(pick(this.model, 'notice', 'hotelContactsList', 'hotelName', 'hotelAddress', 'paymentQrCode', 'meetingName', 'meetingType', 'convokeTime', 'particularYear', 'estimatedNumber', 'meetingFiles', 'registerDeadline', 'meetingContent', 'convokeLocale', 'address', 'meetingCosts', 'directorId', 'remark', 'directorPhone','meetingContactsList')), 200
this.form.setFieldsValue(pick(this.model,'venue', 'notice', 'hotelContactsList', 'hotelName', 'hotelAddress', 'paymentQrCode', 'meetingName', 'meetingType', 'convokeTime', 'particularYear', 'estimatedNumber', 'meetingFiles', 'registerDeadline', 'meetingContent', 'convokeLocale', 'address', 'meetingCosts', 'directorId', 'remark', 'directorPhone','meetingContactsList')), 200
})
// 如果是标协会议则回显 标协会议的字段
if (this.meetingType === '2') {
console.log('this.model', this.model)
this.form.setFieldsValue(pick(this.model, 'signInTime', 'tbMeetingType', 'meetingCostsVip'))
let otherKeys = []
// 编辑情况下 判断类型改变“标协会议类型”选择框的下拉框数
if (this.model.id) {
let arr = this.$refs.standardMeetingType.getCurrentDictOptions()
@@ -640,10 +727,19 @@ export default {
// 信息交流会议
this.$refs.standardMeetingType.setCurrentDictOptions(arr.splice(2, 1))
}else {
this.model.isAddQuestion = Number(this.model.isAddQuestion)
this.isAddQuestion = this.model.isAddQuestion
if(this.model.isAddQuestion) {
otherKeys = ['endTimeAddQuestion', 'questionList']
}
this.tbMeetingType = Number(this.model.tbMeetingType)
// 标准宣贯或者学习培训
this.$refs.standardMeetingType.setCurrentDictOptions(arr.splice(0, 2))
}
}
setTimeout(() => {
this.form.setFieldsValue(pick(this.model, 'signInTime', 'tbMeetingType', 'meetingCostsVip', 'isAddQuestion', ...otherKeys))
})
}
// 如果是工作组会议 赋值工作组
if (this.meetingType === '1') {
@@ -663,6 +759,7 @@ export default {
handleOk() {
const that = this
this.form.validateFields((err, values) => {
console.log(values)
// 这是设置召开时间不选择的边框颜色为红色
if (err && Object.prototype.hasOwnProperty.call(err, 'convokeLocale')) {
this.hasError = true
@@ -676,8 +773,13 @@ export default {
} else {
httpurl = this.url.add
}
let placeName = values.convokeLocale
const formData = Object.assign(this.model, values, {venue: this.getPcaText(placeName)})
// 判断问题征集的列表 如果没有则增加key
if(!values.questionList) {
values.questionList = null
}
// let placeName = values.convokeLocale
//{venue: this.getPcaText(placeName)}
const formData = Object.assign(this.model, values)
// 如果会议的费用为0 不能上传缴费凭证
if (values.meetingCosts === '0.00') {
delete formData.paymentQrCode
@@ -713,6 +815,8 @@ export default {
formData.startSignInTime = this.newSignInTime[0]
formData.endSignInTime = this.newSignInTime[1]
}
formData.convokeLocale = '10001'
console.log('表单提交数据', formData)
httpAction(httpurl, formData, method).then((res) => {
if (res.success) {
@@ -766,6 +870,19 @@ export default {
}
},
/*
* 监听标协会议类型变化
* */
tbMeetingTypeChange(val) {
this.tbMeetingType = Number(val)
// 标准宣贯、学习培训 有问题征集功能
if (this.tbMeetingType === 1 || this.tbMeetingType === 2) {
this.isAddQuestion = 0
this.$nextTick(() => {
this.form.setFieldsValue({ isAddQuestion: this.isAddQuestion })
})
}
},
/*
* 会议负责人
* */
selectPerson(val) {
@@ -915,6 +1032,51 @@ export default {
}
},
/*
* 添加问题征集信息
* */
addQuestionNew(index) {
if (this.model.questionList.length >= 20) {
this.$message.warning('最多添加20个问题')
return
}
const {form} = this
const obj = {
standardNumber: undefined,
standardName: undefined
}
const keys = form.getFieldValue('questionList')
// 增加数据后重新赋值
this.model.questionList.splice(index + 1, 0, obj)
// keys.splice(index , 0, obj)
this.$nextTick(() => {
form.setFieldsValue({
questionList: keys
})
})
},
/*
* 删减问题征集信息
* */
removeQuestion(k) {
// 如果长度是1的话则不进行删除操作
if (this.model.questionList.length === 1) {
return
}
const {form} = this
// // can use data-binding to get
const questionList = form.getFieldValue('questionList')
// 把循环的dom元素删除
this.model.questionList.splice(k, 1)
// 把绑定在dom里面的值删除
questionList.splice(k, 1)
this.$nextTick(() => {
// 重新赋值
form.setFieldsValue({
questionList
})
})
},
/*
* 召开地点吗转换
* */
getPcaText(code) {
@@ -932,6 +1094,10 @@ export default {
changeSignTime(date, dateString) {
this.newSignInTime = dateString
},
// 是否需要问题征集 单选框改变事件
changeIsAddQuestion(e) {
this.isAddQuestion = e.target.value
},
/*
* 根据会议类型返回不同的会议新增与编辑接口
* */
@@ -47,6 +47,21 @@
<a-col :xxl="8" :xl="12" :sm="24">
<label>预计参加人数</label><span>{{ currentMeetingInfo.estimatedNumber }}</span>
</a-col>
<!-- 标协会议标准宣贯学习培训是有 问题征集相关操作 和信息的-->
<template v-if="currentMeetingInfo.meetingType === '2' && (currentMeetingInfo.tbMeetingType === '1' || currentMeetingInfo.tbMeetingType === '2')">
<a-col :xxl="8" :xl="12" :sm="24">
<label>问题征集</label><span>{{ currentMeetingInfo.isAddQuestion === '1' ? '需要' : '不需要' }}</span>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24" v-if="currentMeetingInfo.isAddQuestion === '1'">
<label>征集截止时间</label><span>{{ currentMeetingInfo.endTimeAddQuestion }}</span>
</a-col>
<a-row class="flex-col mul-row-row" v-if="currentMeetingInfo.isAddQuestion === '1'">
<label class="label">标准号及标准名称</label>
<span class="mul-row-content">
<span class="content" v-for="(item,index) of currentMeetingInfo.questionList" :key="index">{{item.standardNumber + ' ( ' + item.standardName + ' ) '}}</span>
</span>
</a-row>
</template>
<a-col :xxl="8" :xl="12" :sm="24">
<label>酒店名称</label><span>{{ currentMeetingInfo.hotelName }}</span>
</a-col>
@@ -965,6 +980,7 @@ export default {
display: block;
.content{
display: block;
white-space: pre-wrap;
}
}
</style>
@@ -1,98 +1,128 @@
export default {
meetingType: {
rules: [
{ required: true, message: '请选择会议类型' },
{required: true, message: '请选择会议类型'},
],
validateTrigger:['blur','change']
validateTrigger: ['blur', 'change']
},
convokeTime: {
rules: [
{ required: true, message: '请选择召开时间' },
{required: true, message: '请选择召开时间'},
],
validateTrigger:['change']
validateTrigger: ['change']
},
meetingFiles:{
meetingFiles: {
rules: [
{ required: false, message: '请上传会议通知' },
{required: false, message: '请上传会议通知'},
],
validateTrigger:['change']
validateTrigger: ['change']
},
meetingContent:{
meetingContent: {
rules: [
{ required: true, message: '请输入会议内容' },
{required: true, message: '请输入会议内容'},
],
validateTrigger:['blur']
validateTrigger: ['blur']
},
meetingContactsList:{
meetingContactsList: {
rules: [
{ required: true, message: '请选择会议联系人' },
{required: true, message: '请选择会议联系人'},
],
validateTrigger:['change']
validateTrigger: ['change']
},
registerDeadline:{
registerDeadline: {
rules: [
{ required: true, message: '请选择报名截止时间' },
{required: true, message: '请选择报名截止时间'},
],
validateTrigger:['blur','change']
validateTrigger: ['blur', 'change']
},
convokeLocale: {
rules: [
{ required: true, message: '请选择省市' },
{required: true, message: '请选择省市'},
],
validateTrigger:['change']
validateTrigger: ['change']
},
address:{
venue: {
rules: [
{ required: true, message: '请输入详细地址' },
{required: true, message: '请输入召开地点/腾讯会议'},
],
validateTrigger:['blur']
validateTrigger: ['blur']
},
meetingCosts:{
address: {
rules: [
{ required: true, message: '请输入会议费用' },
{required: true, message: '请输入详细地址/腾讯会议号'},
],
validateTrigger:['blur']
validateTrigger: ['blur']
},
directorId:{
meetingCosts: {
rules: [
{ required: true, message: '请选择会议负责人' },
{required: true, message: '请输入会议费用'},
],
validateTrigger:['blur','change']
validateTrigger: ['blur']
},
tbMeetingType:{
directorId: {
rules: [
{ required: true, message: '请选择标协会议类型' },
{required: true, message: '请选择会议负责人'},
],
validateTrigger:['blur','change']
validateTrigger: ['blur', 'change']
},
signInTime:{
tbMeetingType: {
rules: [
{ required: true, message: '请选择注册签到时间' },
{required: true, message: '请选择标协会议类型'},
],
validateTrigger:['change']
validateTrigger: ['blur', 'change']
},
meetingCostsVip:{
signInTime: {
rules: [
{ required: true, message: '请输入会议费用' },
{required: true, message: '请选择注册签到时间'},
],
validateTrigger:['blur','change']
validateTrigger: ['change']
},
hotelName:{
meetingCostsVip: {
rules: [
{ required: false, message: '请输入酒店名称' },
{required: true, message: '请输入会议费用'},
],
validateTrigger:['blur']
validateTrigger: ['blur', 'change']
},
hotelAddress:{
hotelName: {
rules: [
{ required: false, message: '请输入酒店地址' },
{required: false, message: '请输入酒店名称'},
],
validateTrigger:['blur']
validateTrigger: ['blur']
},
contactPerson:{
hotelAddress: {
rules: [
{ required: false, message: '请输入酒店联系人' },
{required: false, message: '请输入酒店地址'},
],
validateTrigger:['blur']
validateTrigger: ['blur']
},
contactPerson: {
rules: [
{required: false, message: '请输入酒店联系人'},
],
validateTrigger: ['blur']
},
isAddQuestion: {
rules: [
{required: true, message: '请选择'},
],
validateTrigger: ['change']
},
endTimeAddQuestion: {
rules: [
{required: true, message: '请选择征集截止时间'},
],
validateTrigger: ['change']
},
standardNumber: {
rules: [
{required: true, message: '请输入标准号'},
],
validateTrigger: ['blur']
},
standardName: {
rules: [
{required: true, message: '请输入标准名称'},
],
validateTrigger: ['blur']
}
}
@@ -0,0 +1,247 @@
<template>
<div>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="问题征集截止时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
<span>{{model.registerDeadline}}</span>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
<span>{{model.addQuestionStatue_dictText}}</span>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="标准号" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-select style="width:100%" placeholder="请选择标准号" v-model="queryParam.standardNumber" show-search allowClear>
<a-select-option v-for="item in standardNumberArr" :key="item" :value="item">{{item}}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="提问人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入提问人" v-model="queryParam.creater" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" v-has="'standardsMeeting:problemCollection:search'" @click="searchQuery">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 查询区域-end-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="export" v-has="'standardsMeeting:problemCollection:export'" @click="handleExportXls('问题征集')">导出</a-button>
</div>
<!-- 操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 1200}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<template slot="text" slot-scope="text">
<a-tooltip>
<template v-if="text" slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<template slot="name-text" slot-scope="text">
<a-tooltip overlayClassName="name-text-tooltip">
<template v-if="text" slot="title">{{ text }}</template>
<div class="table-text table-name-text">{{ text }}</div>
</a-tooltip>
</template>
</a-table>
</div>
</a-card>
</div>
</template>
<script>
import {JeroListMixin} from '@/mixins/JeroListMixin'
import {getStandardNumberList} from '../../../../api/incomeMeetingApi'
import {downloadPostFile } from '../../../../api/manage'
export default {
name: 'ProblemCollectionList',
components: {},
mixins: [JeroListMixin],
computed: {
importExcelUrl: function () {
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
}
},
data() {
return {
model: {},
labelCol: {
xs: {span: 24},
sm: {span: 5}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 10}
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
}, {
title: '标准号',
align: 'center',
width: 280,
dataIndex: 'standardNumber',
scopedSlots: {customRender: 'text'}
},
{
title: '标准名称',
align: 'center',
width: 250,
dataIndex: 'standardName',
scopedSlots: {customRender: 'text'}
},
{
title: '章条编号',
align: 'center',
width: 200,
dataIndex: 'number',
scopedSlots: {customRender: 'text'}
},
{
title: '问题描述',
align: 'center',
width: 250,
dataIndex: 'questionName',
scopedSlots: {customRender: 'name-text'}
},
{
title: '提问人',
align: 'center',
width: 100,
dataIndex: 'creater',
scopedSlots: {customRender: 'text'}
},
{
title: '提问人邮箱',
align: 'center',
width: 180,
dataIndex: 'email',
scopedSlots: {customRender: 'text'}
}
],
url: {
list: '/payMeetingQuestion/payMeetingQuestion/list',
exportXlsUrl: '/payMeetingQuestion/payMeetingQuestion/exportXls',
},
// 标准号下拉框的数据
standardNumberArr: [],
disableMixinCreated: true // 禁止初始化请求接口
}
},
methods: {
// 刷新列表页
refresh(record) {
this.initData(record)
this.getStandardNumberListFunc()
this.loadData(1)
},
/*
* 当前时间是否超过征集截止时间
* */
compareCurrentTime(time) {
let date = new Date()
let compareTime = new Date(time)
if (date.getTime() > compareTime.getTime()) {
return true
} else {
return false
}
},
// 初始化数据
initData(record) {
this.lastQueryParam = {}
this.queryParam = {}
if(record.endTimeAddQuestion && !record.addQuestionStatue_dictText) {
let canOpe = !this.compareCurrentTime(record.endTimeAddQuestion)
record.addQuestionStatue_dictText = canOpe ? '征集中' : '已结束'
}
this.model = Object.assign({}, record)
this.filters.meetingId = record.id
},
// 获取 标准类别名称
getStandardNumberListFunc() {
this.standardNumberArr = []
getStandardNumberList({meetingId: this.model.id}).then(res => {
if(res.success) {
this.standardNumberArr = res.result || []
}
})
},
// 导出
handleExportXls(fileName) {
if (!fileName || typeof fileName != 'string') {
fileName = '导出文件'
}
let param = this.getQueryParams()
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
param['selections'] = this.selectedRowKeys.join(',')
}
console.log('导出参数', param)
downloadPostFile(this.url.exportXlsUrl, fileName + '.xlsx', param)
},
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.table-name-text {
//white-space: pre-wrap;
}
.table-text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/*表格滚动条*/
/deep/.ant-table-body {
overflow-x: auto!important;
}
</style>
<style>
.name-text-tooltip .ant-tooltip-inner {
white-space: pre-wrap;
}
</style>
@@ -0,0 +1,58 @@
<!--问题征集的模态框-->
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
fullscreen
:footer="null"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<problem-collection-list ref="problemCollectionList"></problem-collection-list>
</a-spin>
</j-modal>
</template>
<script>
import ProblemCollectionList from './ProblemCollectionList'
export default {
name: 'ProblemCollectionModal',
components: {
ProblemCollectionList
},
data() {
return {
title: '问题征集详情',
width: 1200,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
}
},
methods: {
show(record) {
this.visible = true
this.title = `${record.meetingName}问题征集详情`
this.$nextTick(() => {
this.$refs.problemCollectionList.refresh(record)
})
},
close() {
this.$emit('close')
this.visible = false
},
handleCancel() {
this.close()
},
}
}
</script>
<style scoped>
</style>
@@ -143,12 +143,15 @@
<!-- <a @click="applyMsg">报名信息</a>-->
<a @click="handleEdit(record)" v-has:[authorCode.edit]="'committeeMeeting:edit'">编辑</a>
<a @click="handleDelete(record.id)" v-has:[authorCode.delete]="'committeeMeeting:delete'">删除</a>
<!-- 标协会议(标准宣贯学习培训 且需要问题征集)的时候 有问题征集 功能-->
<a v-if="meetingType === '2'" v-show="(record.tbMeetingType === 1 || record.tbMeetingType === 2) && Number(record.isAddQuestion)" @click="problemCollectionDetail(record)" v-has="'standardsMeeting:problemCollection'">问题征集</a>
</span>
</a-table>
</div>
<publish-remind-modal ref="publishRemindModal" @ok="modalFormOk"></publish-remind-modal>
<upload-meet-file-modal ref="modalForm" @ok="modalFormOk"></upload-meet-file-modal>
</a-card>
<problem-collection-modal ref="problemCollectionModal"></problem-collection-modal>
</div>
</template>
@@ -163,6 +166,8 @@ import PublishRemindModal from '@views/projectManagement/modules/PublishRemindMo
import UploadMeetFileModal from '@views/incomePayments/meetManage/modules/UploadMeetFileModal'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import '@/assets/less/TableExpand.less'
// 问题征集 组件
import ProblemCollectionModal from '../incomePayments/meetManage/modules/ProblemCollectionModal'
export default {
name: 'CommitteeMeeting',
@@ -172,7 +177,8 @@ export default {
JDictSelectTag,
PublishRemindModal,
UploadMeetFileModal,
PageHeaderTitle
PageHeaderTitle,
ProblemCollectionModal
},
mixins: [JeroListMixin, RangeDateMixin],
data() {
@@ -497,6 +503,14 @@ export default {
this.lastQueryParam = {...this.queryParam}
this.loadData(1)
},
/*
* 问题征集按钮点击后的回调
* */
problemCollectionDetail(record) {
if(!Number(record.isAddQuestion) || !this.meetingType === '2') return
if(!(record.tbMeetingType === 1 || record.tbMeetingType === 2)) return
this.$refs.problemCollectionModal.show(record)
}
}
}
</script>
@@ -36,6 +36,24 @@
</a-select>
</a-form-item>
</a-col>
<a-col :xxl="6" :xl="10" :lg="12" :md="12" :sm="24">
<a-form-item
label="部门"
:labelCol="labelCol"
:wrapperCol="wrapperCol">
<a-tree-select
:multiple="false"
show-search
tree-default-expand-all
tree-node-filter-prop="title"
style="width:100%"
:dropdownStyle="{ maxHeight: '200px',maxWidth:'100px','overflow-x':'hidden',' overflo-y': 'auto' }"
:treeData="treeDepartData"
v-model="queryParam.departId"
placeholder="请选择部门">
</a-tree-select>
</a-form-item>
</a-col>
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="应收款项" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input
@@ -170,6 +188,7 @@ import JYearDate from '../../../components/jero/JYearDate'
import { getAction } from '../../../api/manage'
import {formatMoney} from '@/utils/formatMoney'
import { MonthData } from '../statisticData'
import {queryDepartTreeList} from '@api/api'
const defaultTableColumns = [
{
@@ -269,6 +288,7 @@ export default {
},
columns: [firstColumnTop, ...defaultTableColumns],
dataSource: [],
treeDepartData:[],// 组织机构
// 总计表头,与主表表头一致
columnsFooter: [firstColumnFooter, ...defaultTableColumns],
// 给定当年作为来款年份默认查询条件
@@ -282,6 +302,9 @@ export default {
footerDataSource: []
}
},
created() {
this.loadDepartTreeData()
},
methods: {
formatMoney,
loadData(arg) {
@@ -324,6 +347,23 @@ export default {
this.loading = false
})
},
/*
* 组织机构下拉数据
* */
loadDepartTreeData() {
const that = this
queryDepartTreeList().then((res) => {
if (res.success) {
that.treeDepartData = []
let treeList = res.result
for (let a = 0; a < treeList.length; a++) {
let temp = treeList[a]
temp.isLeaf = temp.leaf
that.treeDepartData.push(temp)
}
}
})
},
searchReset() {
this.lastQueryParam = {
year: new Date().getFullYear().toString()