Merge branch '2023年7月变更'

This commit is contained in:
lijiarao
2023-08-08 15:37:44 +08:00
25 changed files with 1759 additions and 298 deletions
+8 -4
View File
@@ -13,11 +13,14 @@ window._CONFIG["onlinePreviewDomainURL"] = "http://139.9.235.66:8012/onlinePrevi
// todo 需要改为企业端的报名地址 --- 139
// 会议管理报名二维码地址
window._CONFIG["singUpQRCodeURL"] = "http://bxxt.hzwlsoft.com/signupentrance"
// window._CONFIG["singUpQRCodeURL"] = "http://bxxt.hzwlsoft.com/signupentrance"
window._CONFIG["singUpQRCodeURL"] = "http://10.10.10.46:8066/signupentrance"
// 会议管理签到二维码地址 微信扫描二维码 跳转的 地址 要么全大写 要么全小写
window._CONFIG["singInQRCodeURL"] = "http://bxxt.hzwlsoft.com/signinurl"
// window._CONFIG["singInQRCodeURL"] = "http://bxxt.hzwlsoft.com/signinurl"
window._CONFIG["singInQRCodeURL"] = "http://10.10.10.46:8066/signinurl"
// 页面显示用的会议报名二维码连接
window._CONFIG["singInQRCodHref"]= 'http://139.9.235.66/signupentrance'
// window._CONFIG["singInQRCodHref"]= 'http://139.9.235.66/signupentrance'
window._CONFIG["singInQRCodHref"]= 'http://10.10.10.46:8066/signupentrance'
// 票据打印--寄件人单位名称
window._CONFIG["sendCompanyName"] = "中国汽车标准化研究院"
@@ -27,4 +30,5 @@ window._CONFIG["sendAddress"] = "天津市东丽区先锋东路68号"
window._CONFIG["sendPostCode"] = "300300"
// 查看物流信息
window._CONFIG["lookExpressDomainURL"] = "http://bxxt.hzwlsoft.com/lookExpressInfo";
// window._CONFIG["lookExpressDomainURL"] = "http://bxxt.hzwlsoft.com/lookExpressInfo";
window._CONFIG["lookExpressDomainURL"] = "http://10.10.10.46:8066/lookExpressInfo";
+8 -1
View File
@@ -101,6 +101,8 @@ const getTransitURL = url => `/sys/common/transitRESTful?url=${encodeURIComponen
// 通过文件的id获取文件的相应信息
const getFileInfo = (params) => getAction('/sys/oss/file/queryById', params)
// 通过多个文件的ids 获取文件的相应信息
const getFileInfoByIds = (params) => getAction('/sys/oss/file/queryByIds', params)
// 中转HTTP请求
export const transitRESTful = {
@@ -122,6 +124,9 @@ const companyAdminResetPassword = (param) => postAction('/payManagerManagement/r
// 企业管理员启用禁用
const companyAdminEnable= (param) => postAction('/payManagerManagement/frozenBatch', param)
// 通过企业id查询企业的相关发票信息
const queryCompanyInfoById= (param) => getAction('/company/payCompanyManagement/queryById', param)
// 加密获取key 与 iv
const getKeyIv = (param) => getAction('/sys/getEncryptedString',param)
@@ -186,11 +191,13 @@ export {
queryallRoles,
getContactsById,
getFileInfo,
getFileInfoByIds,
getKeyIv,
getContactsByCompanyNoLimit,
loginIdmPlatform,
companyAdminResetPassword,
companyAdminEnable
companyAdminEnable,
queryCompanyInfoById
}
+9 -1
View File
@@ -125,6 +125,11 @@ const addPayConfirm = (param) => postAction('/payConfirmPaymentRecord/add', para
// 编辑一个确认来款信息
const editPayConfirm = (param) => postAction('/payConfirmPaymentRecord/edit', param)
//2023-07-13 工作组相关功能的接口
// 判断当前节点 是否可以发邮件
const judgeEmailStatus = (param) => getAction('/sys/message/sysMessageTemplate/queryByCode', param)
export {
getWorkingGroupById,
getChargeNotice,
@@ -189,5 +194,8 @@ export {
getPayConfirmList,
addPayConfirm,
editPayConfirm
editPayConfirm,
judgeEmailStatus
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

+7 -1
View File
@@ -170,6 +170,10 @@
<label>银行账户</label>
<span>{{ otherCompanyInfo.bankAccount }}</span>
</a-col>
<a-col :span="12" class="detail-item">
<label>联行号</label>
<span>{{ otherCompanyInfo.linkBankNumber || '' }}</span>
</a-col>
</a-row>
</template>
</section>
@@ -406,7 +410,9 @@ export default {
computed: {
// 是否是第三方代付
hasOtherCompany() {
return this.isInvoicing && this.otherCompanyInfo.headerName && (this.otherCompanyInfo.headerName !== this.basicInfo.companyName)
// 去掉未审核 去判断的企业是否是标协会企业
let companyName = this.basicInfo.companyName.replaceAll('(未审核)','')
return this.isInvoicing && this.otherCompanyInfo.headerName && (this.otherCompanyInfo.headerName !== companyName)
}
},
components: {
+11 -1
View File
@@ -36,6 +36,12 @@ export default {
valueKey: {
type: String,
default: 'companyName'
},
// 是否返回企业的全部信息,如果是 则再change方法中以第二个参数返回
fullCompanyInfo: {
type: Boolean,
required: false,
default: false
}
},
components: {
@@ -70,7 +76,11 @@ export default {
* */
setCompanyVal(selectedVal) {
let {id, companyName} = selectedVal
this.$emit('change', {id, companyName})
if(this.fullCompanyInfo) {
this.$emit('change', {id, companyName}, {...selectedVal})
} else {
this.$emit('change', {id, companyName})
}
}
},
model: {
+15 -1
View File
@@ -7,4 +7,18 @@ export const ProjectTypeEnums = {
MEMBER_PRO: {name: '资料网员', value: 4},
STANDARD_MEMBER_PRO: {name: '标协会员项目', value: 5},
STANDARD_CERTIFICATE_PRO: {name: '标协证书项目', value: 6},
}
}
// 参会人员身份类型
export const MeetIdentifyTypeEnums = {
guest: { name: '嘉宾', index: 1 },
attendee: { name: '参会人', index: 2 },
internal: { name: '内部企业', index: 3 }
}
// 需要发票的类型
export const InvoiceTypeEnums = {
noNeed: { name: '不需要', index: 0 },
plain: { name: '增值税普通发票', index: 1 },
special: { name: '增值税专用发票', index: 2 }
}
@@ -174,6 +174,7 @@
:project-id="selectProjectId"
:project-type="selectProjectType"
:need-invoice="selectNeedInvoice"
:can-add-stage="canAddStage"
:visible.sync="arriveVisible"></arrive-stage-module>
<!-- 开票阶段-->
@@ -409,6 +410,12 @@ export default {
}
},
computed: {
// 批量来款是否可以新增阶段--会员缴费、证书缴费 不能新增阶段
canAddStage() {
return Number(this.selectProjectType) !== 5 && Number(this.selectProjectType) !== 6
}
},
methods: {
getPayConfirmList,
/**
@@ -80,7 +80,8 @@
<a-empty v-else></a-empty>
<template slot="footer">
<a-button type="primary" @click="handleAdd" v-preventclick v-if="Number(projectType) !== 5 && Number(projectType) !== 6">添加阶段</a-button>
<!--Number(projectType) !== 5 && Number(projectType) !== 6 -->
<a-button type="primary" @click="handleAdd" v-preventclick v-if="canAddStageFlag">添加阶段</a-button>
</template>
<arrive-module ref="arriveModal" :project-id="projectId" @ok="addArriveOk" v-bind="$attrs" :project-type="projectType"></arrive-module>
@@ -96,6 +97,7 @@ import {amountReceivedList, revokeIncome} from '../../../../api/incomePaymentsAp
import PreviewImgModal from '../../../../components/PreviewImgModal'
import PreviewFile from '../../../../components/jero/PreviewFile.vue'
import {ajaxGetDictItems} from '@api/api'
import { ProjectTypeEnums } from '../../../../enums/commonEnums'
export default {
name: 'ArriveStageModule',
@@ -117,6 +119,22 @@ export default {
type: [Number, String],
required: false,
default: null
},
// 是否能增加阶段-从外部进行模块的区分
canAddStage: {
type: Boolean,
required: false,
default: true
}
},
computed: {
canAddStageFlag() {
// 标协会员项目和证书项目 需要判断 当前的阶段是否有值,这两类项目只能来款一次
if(Number(this.projectType) === ProjectTypeEnums.STANDARD_CERTIFICATE_PRO.value || Number(this.projectType) === ProjectTypeEnums.STANDARD_MEMBER_PRO.value) {
return this.stageList.length === 0 && this.canAddStage
} else {
return this.canAddStage
}
}
},
data() {
@@ -58,7 +58,7 @@
<!-- 标协会员证书的缴费凭证类型根据paymentMethod字段决定1--图片2--pdf3--没有凭证 -->
<!-- proofType处理过的缴费凭证类型img--图片pdf--pdfnone--无缴费凭证 -->
<!-- <div class="info-item">-->
<a-form-item class="proof-form-item" :label="proofType==='pdf' ? '打包协议' : '缴费凭证'" :labelCol="labelCol"
<a-form-item v-if="proofType!=='pdf'" class="proof-form-item" :label="'缴费凭证'" :labelCol="labelCol"
:wrapperCol="wrapperCol">
<!-- <label>{{proofType==='pdf' ? '打包协议' : '缴费凭证'}}</label>-->
<div class="proof-img" v-if="proofType === 'img'">
@@ -68,9 +68,9 @@
</div>
</template>
</div>
<div v-if="proofType==='pdf'">
<preview-file :fileId="proofInfo.proof"></preview-file>
</div>
<!--<div v-if="proofType==='pdf'">-->
<!-- <preview-file :fileId="proofInfo.proof"></preview-file>-->
<!--</div>-->
<span v-if="proofType==='none'"></span>
</a-form-item>
<!-- </div>-->
@@ -133,6 +133,17 @@
</a-col>
</a-row>
<!-- 2023-07变更,添加会议文件字段 -->
<a-row :gutter="24" v-if="meetingType === '2' && tbMeetingType === 3">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="会议文件" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-upload :multiple="true"
:return-id="true"
v-decorator="['fileIds',validatorRules.fileIds]"></j-upload>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="会议通知" :labelCol="labelCol" :wrapperCol="wrapperCol">
@@ -714,7 +725,7 @@ export default {
this.$nextTick(() => {
// 加定时器是因为有可能赋值不成功
setTimeout(() => {
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
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', 'fileIds')), 200
})
// 如果是标协会议则回显 标协会议的字段
if (this.meetingType === '2') {
@@ -726,6 +737,7 @@ export default {
if(Number(record.tbMeetingType) === 3) {
// 信息交流会议
this.$refs.standardMeetingType.setCurrentDictOptions(arr.splice(2, 1))
this.tbMeetingType = Number(this.model.tbMeetingType)
}else {
this.model.isAddQuestion = Number(this.model.isAddQuestion)
this.isAddQuestion = this.model.isAddQuestion
@@ -212,6 +212,14 @@
dictCode="meeting_pay_type"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero">
<a-form-item label="发票项目">
<j-dict-select-tag
v-model="queryParam.invoiceProject"
placeholder="请选择发票项目"
dictCode="invoice_project"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search"
@@ -236,6 +244,9 @@
<a-button type="danger" icon="delete" @click="batchDel" v-has:[authorCode.batchDel]="'attendance:batchDel'">
批量删除
</a-button>
<a-button type="primary" @click="batchSetGuestsUploadFileFlag" v-has:[authorCode.guestsUploadFileFlag]="'attendance:guestsUploadFileFlag'">
批量设置资料状态
</a-button>
<!--当会议费用为0不需要合并开票 -->
<!-- 变更将此功能添加到到账开票了 暂时注释 2021-09-16 -->
<!-- <a-button type="primary" @click="batchInvoice" v-show="currentMeetingInfo.meetingCosts !== 0">合并开票</a-button>-->
@@ -274,9 +285,15 @@
<div v-else class="primary-color" @click="toSignUpDetail(record)">{{ text }}</div>
</template>
<!--<template slot="text" slot-scope="text">-->
<!-- <j-ellipsis v-if="text" :value="text" :length="20"></j-ellipsis>-->
<!-- <span v-else></span>-->
<!--</template>-->
<template slot="text" slot-scope="text">
<j-ellipsis v-if="text" :value="text" :length="20"></j-ellipsis>
<span v-else></span>
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<!-- 打包需要发票到账开票邮寄状态-->
@@ -302,7 +319,7 @@
<!-- 只有缴费方式为汇款并且上传了汇款凭证的的才会有审核按钮 审核报名信息通过后才能审核凭证 审核通过后不显示 审核凭证按钮 -->
<a @click="handleAudit(record)" v-if="(record.payMode === 1 || record.payMode === 2 ) && record.paymentRecord && record.checkResult !== 1"
v-has:[authorCode.auditRecord]="'attendance:auditCredentials'">审核凭证</a>
<!-- 只有工作组会议与分标委会议理事会会议才有审核报名信息-->
<!-- 只有工作组会议与分标委会议理事会会议 才有审核报名信息-->
<a @click="handleAuditSignUp(record)"
v-show="(currentMeetingInfo.meetingType === '1' || currentMeetingInfo.meetingType === '5' || currentMeetingInfo.meetingType === '6') && record.registerCheckResult === 0 "
v-has:[authorCode.auditSignUpInfo]="'attendance:auditSignUp'">审核报名信息</a>
@@ -310,6 +327,12 @@
<a @click="handleEdit(record)" v-if="record.registerCheckResult !== 2" v-has:[authorCode.edit]="'attendance:edit'">编辑</a>
<!--删除参会人需要判断改参会人是否与合同关联-->
<a @click="handleDelete(record.id)" v-has:[authorCode.delete]="'attendance:delete'">删除</a>
<!-- 只有嘉宾才可以设置 且报名信息不需要审核-->
<a
@click="setGuestsUploadFileFlag(record)"
v-show="record.identity === 1 && record.registerCheckResult !== 0"
v-has:[authorCode.guestsUploadFileFlag]="'attendance:guestsUploadFileFlag'"
>资料状态</a>
</span>
</a-table>
</div>
@@ -323,6 +346,8 @@
<project-detail-modal ref="projectDetailModal"></project-detail-modal>
<!--审核-->
<audit-modal ref="auditModal" @ok="modalFormOk"></audit-modal>
<!--设置资料状态--即嘉宾是否可以在企业端上传资料-->
<set-guess-upload-flag-modal ref="setGuessUploadFlagModal" :meeting-id="meetingId" :meeting-type="meetingTypeValue" @ok="modalFormOk"></set-guess-upload-flag-modal>
</a-card>
</div>
</template>
@@ -342,6 +367,8 @@ import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import StatusSlot from '@comp/tools/StatusSlot'
import PreviewFile from '@comp/jero/PreviewFile'
import JImageUpload from '@comp/jero/JImageUpload'
import SetGuessUploadFlagModal from './modules/SetGuessUploadFlagModal'
import { downloadFile } from '../../../api/manage'
export default {
@@ -358,7 +385,8 @@ export default {
PageHeaderTitle,
StatusSlot,
PreviewFile,
JImageUpload
JImageUpload,
SetGuessUploadFlagModal
},
data() {
return {
@@ -410,6 +438,18 @@ export default {
title: '是否签到',
align: 'center',
dataIndex: 'checkIn_dictText',
width: 80
},
{
title: '身份',
align: 'center',
dataIndex: 'identity_dictText',
width: 80
},
{
title: '发票项目',
align: 'center',
dataIndex: 'invoiceProject_dictText',
width: 100
},
{
@@ -471,7 +511,8 @@ export default {
edit: 'otherMeetingSituation:edit',
delete: 'otherMeetingSituation:delete',
auditRecord: 'otherMeetingSituation:auditCredentials',
auditSignUpInfo: 'otherMeetingSituation:auditSignUp'
auditSignUpInfo: 'otherMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'otherMeetingSituation:guestsUploadFileFlag'
},
// 分标委会议的参会情况权限编码
committeeMeetingCode: {
@@ -482,7 +523,8 @@ export default {
edit: 'committeeMeetingSituation:edit',
delete: 'committeeMeetingSituation:delete',
auditRecord: 'committeeMeetingSituation:auditCredentials',
auditSignUpInfo: 'committeeMeetingSituation:auditSignUp'
auditSignUpInfo: 'committeeMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'committeeMeetingSituation:guestsUploadFileFlag'
},
// 工作组会议的参会情况的权限编码
workGroupMeetingCode: {
@@ -493,7 +535,8 @@ export default {
edit: 'workGroupMeetingSituation:edit',
delete: 'workGroupMeetingSituation:delete',
auditRecord: 'workGroupMeetingSituation:auditCredentials',
auditSignUpInfo: 'workGroupMeetingSituation:auditSignUp'
auditSignUpInfo: 'workGroupMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'workGroupMeetingSituation:guestsUploadFileFlag'
},
// 国际研讨会的参会情况的权限编码
internalMeetingCode: {
@@ -504,7 +547,8 @@ export default {
edit: 'internalMeetingSituation:edit',
delete: 'internalMeetingSituation:delete',
auditRecord: 'internalMeetingSituation:auditCredentials',
auditSignUpInfo: 'internalMeetingSituation:auditSignUp'
auditSignUpInfo: 'internalMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'internalMeetingSituation:guestsUploadFileFlag'
},
// 标协会议的参会情况的权限编码
standardsMeetingCode: {
@@ -515,7 +559,8 @@ export default {
edit: 'standardsMeetingSituation:edit',
delete: 'standardsMeetingSituation:delete',
auditRecord: 'standardsMeetingSituation:auditCredentials',
auditSignUpInfo: 'standardsMeetingSituation:auditSignUp'
auditSignUpInfo: 'standardsMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'standardsMeetingSituation:guestsUploadFileFlag'
},
// 理事会的参会情况的权限编码
councilMeetingCode: {
@@ -526,7 +571,8 @@ export default {
edit: 'councilMeetingSituation:edit',
delete: 'councilMeetingSituation:delete',
auditRecord: 'councilMeetingSituation:auditCredentials',
auditSignUpInfo: 'councilMeetingSituation:auditSignUp'
auditSignUpInfo: 'councilMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'councilMeetingSituation:guestsUploadFileFlag'
},
disableMixinCreated: true,
// url: {
@@ -594,7 +640,9 @@ export default {
// 收款二维码
payMentQRCode: '',
// 会议费用
meetingCostBool: false
meetingCostBool: false,
meetingId: '',
meetingTypeValue: '',
}
},
created() {
@@ -605,6 +653,7 @@ export default {
const param = {
id: this.$route.query.id
}
getMeetInfoById(param).then(res => {
if (res.success) {
this.currentMeetingInfo = Object.assign({}, res.result)
@@ -645,6 +694,9 @@ export default {
}
})
this.filters.meetingId = this.$route.query.id
// 存储会议的基础信息
this.meetingId = this.$route.query.id
this.meetingTypeValue = Number(this.$route.query.meetingType)
if(this.disableMixinCreated){
this.loadData(1)
}
@@ -724,6 +776,19 @@ export default {
this.$refs.auditModal.title = '审核报名信息'
this.$refs.auditModal.open(record, true)
},
// 导出参会人信息
handleExportXls(fileName) {
if (!fileName || typeof fileName != 'string') {
fileName = '导出文件'
}
let param = this.getQueryParams()
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
param['selections'] = this.selectedRowKeys.join(',')
}
// 增加特有的企业名称排序
param.column = 'companyName'
downloadFile(this.url.exportXlsUrl, fileName + '.xlsx', param)
},
/*
* 导入参会人
* */
@@ -890,6 +955,28 @@ export default {
newInput.remove()
this.$message.success('复制成功')
},
// 行内 设置嘉宾是否可上传文件,只有参会方式是嘉宾的可以设置
setGuestsUploadFileFlag(record) {
// 参会人员不是嘉宾,直接返回
if(record.identity !== 1 || record.registerCheckResult === 0) return
this.$refs.setGuessUploadFlagModal.show(record)
},
// 批量设置嘉宾是否可上传文件,只有参会方式是嘉宾的可以设置
batchSetGuestsUploadFileFlag() {
if (this.selectedRowKeys.length <= 0) {
this.$message.warning('请选择一条记录!')
return
}
// 判断只能身份为嘉宾的数据 设置资料状态
let flag = this.selectionRows.some(item => {
return item.identity !== 1 || item.registerCheckResult === 0
})
if(flag) {
this.$message.warn('只有身份为嘉宾且报名信息审核通过的数据才可设置资料状态')
return
}
this.$refs.setGuessUploadFlagModal.showBatch(this.selectedRowKeys)
},
/*
* 通过会议类型设置权限编码
* type 会议类型
@@ -1,32 +1,5 @@
<template>
<a-form :form="form">
<!-- <div class="item-title">行程信息</div>-->
<!-- <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="['checkInHotel']">-->
<!-- <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">-->
<!-- <a-form-item label="抵达时间" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <j-date placeholder="请选择抵达时间" style="width: 100%;" v-decorator="['arrivalTime']" :trigger-change="true" :disabled-date="disabledStartDate"-->
<!-- date-format="YYYY-MM-DD"/>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- <a-col :xxl="8" :xl="12" :sm="24">-->
<!-- <a-form-item label="离开时间" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <j-date placeholder="请选择离开时间" :disabled-date="disabledEndDate" style="width: 100%;"-->
<!-- v-decorator="['departureTime']" :trigger-change="true"-->
<!-- date-format="YYYY-MM-DD"/>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- </a-row>-->
<!-- 选择嘉宾和内部企业缴费方式为打包也不显示-->
<!-- 会议费为0不显示 -->
<template v-if="!meetingCostBool">
<div class="item-title" v-if="identifyType === 2">缴费信息</div>
@@ -104,12 +77,87 @@
</template>
</template>
<!-- 其他会议选择嘉宾和内部企业缴费方式为打包也不显示-->
<!-- 会议费为0不显示 -->
<template v-if="!meetingCostBool && !needInvoiceBool ">
<div class="item-title" v-if="identifyType === 2 && !payModeBool ">邮寄信息</div>
<!-- 发票信息=== 会议费用不为0 且需要发票 身份为参会人 缴费方式不是打包 -->
<template v-if="!meetingCostBool && selectedInvoiceType && identifyType === MeetIdentifyTypeEnums.attendee.index && !payModeBool">
<div class="item-title">发票信息</div>
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24" v-if="identifyType === 2 && !payModeBool ">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="企业名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入企业名称"
v-decorator="['companyName',validatorRules.companyName]"
:maxLength='50'
disabled
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="信用代码" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入信用代码"
v-decorator="['dutyCode', validatorRules.dutyCode]"
:maxLength='18'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
<!--增值税专用发票 多5个信息-->
<template v-if="selectedInvoiceType === InvoiceTypeEnums.special.index">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="公司地址" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入公司地址"
v-decorator="['companyAddress', validatorRules.companyAddress]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="公司电话" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入公司电话"
v-decorator="['companyPhone', validatorRules.companyPhone]"
:maxLength='15'
@change="e => e.target.value = (e.target.value.replace(/[^0-9-]/g, '')).trim()"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="开户行" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入开户行"
v-decorator="['openingBank', validatorRules.openingBank]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="银行账号" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入银行账号"
v-decorator="['bankAccount', validatorRules.bankAccount]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :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>
</template>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="发票项目" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag style="width: 100%" dict-code="invoice_project"
v-decorator="['invoiceProject',validatorRules.invoiceProject]"
:trigger-change="true"
placeholder="请选择发票项目"></j-dict-select-tag>
</a-form-item>
</a-col>
</a-row>
</template>
<!-- 其他会议选择嘉宾和内部企业缴费方式为打包也不显示-->
<!-- 会议费用不为0 且需要发票 身份为参会人 缴费方式不是打包 -->
<template v-if="!meetingCostBool && selectedInvoiceType && identifyType === MeetIdentifyTypeEnums.attendee.index && !payModeBool ">
<div class="item-title">邮寄信息</div>
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="邮寄联系人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-contacts :selected-company="selectedCompany"
:init-contacts="selectPostPerson"
@@ -124,7 +172,7 @@
</a-form-item>
</a-col>
<!-- 选择嘉宾和内部企业缴费方式为打包也不显示-->
<a-col :xxl="8" :xl="12" :sm="24" v-if="identifyType === 2 && !payModeBool ">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="邮寄地址" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入邮寄地址"
:maxLength='50'
@@ -133,7 +181,7 @@
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24" v-if="identifyType === 2 && !payModeBool ">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="邮编" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入邮编"
:disabled="isEditBool"
@@ -158,6 +206,8 @@ import {getContactsById} from '@api/api'
import {money} from '@/utils/validate'
import {CalcAmountMixin} from '@/mixins/CalcAmountMixin'
import {addZero} from '@/utils/util'
import { InvoiceTypeEnums, MeetIdentifyTypeEnums } from '../../../enums/commonEnums'
export default {
name: 'OtherMeetingForm',
@@ -196,6 +246,8 @@ export default {
},
data() {
return {
InvoiceTypeEnums,
MeetIdentifyTypeEnums,
desription: '其他会议的参会情况的表单',
ysjeKey: 'amountReceivable',
form: this.$form.createForm(this),
@@ -262,12 +314,45 @@ export default {
rules: [{required: true, message: '请输入邮编'}],
validateTrigger: 'blur'
},
companyName: {
rules: [{ required: true, message: '请输入企业名称' }],
validateTrigger: 'blur'
},
dutyCode: {
rules: [{required: true, message: '请输入信用代码'}, {
pattern: /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/,
message: '请输入15位、18位的信用代码'
}],
validateTrigger: 'blur'
},
companyAddress: {
rules: [{ required: true, message: '请输入公司地址' }],
validateTrigger: 'blur'
},
companyPhone: {
rules: [{ required: true, validator: this.checkCompanyPhone }],
validateTrigger: 'blur'
},
openingBank: {
rules: [{ required: true, message: '请输入开户行' }],
validateTrigger: 'blur'
},
bankAccount: {
rules: [{ required: true, message: '请输入银行账号' }],
validateTrigger: 'blur'
},
linkBankNumber: { rules: [{ required: true, message: '请输入联行号' }], validateTrigger: 'blur' },
invoiceProject: {
rules: [{required: true, message: '请选择发票项目'}],
validateTrigger: 'change'
},
},
// 是否可编辑
isEditBool: false,
// 是否需要发票
needInvoiceBool: true,
needInvoiceBool: false,
selectedInvoiceType: 0, // 选择是否需要发票
// 是否已经到账
isCheckInBool: false,
}
@@ -319,6 +404,29 @@ export default {
handleOk() {
this.form.validateFields((err, values) => {
if (!err) {
// 如果需要发票,判断当前的发票信息是否进行了修改,用于最后提交的时候判断是否请求接口,减少冗余的请求
let needInvoice = Number(values.needInvoice)
if (needInvoice) {
let confirmArr = [
{name: '企业名称', key: 'companyName'},
{name: '信用代码', key: 'dutyCode'},
]
if(needInvoice === InvoiceTypeEnums.special.index) {
confirmArr = confirmArr.concat([
{name: '公司地址', key: 'companyAddress'},
{name: '公司电话', key: 'companyPhone'},
{name: '开户行', key: 'openingBank'},
{name: '银行账号', key: 'bankAccount'},
{name: '联行号', key: 'linkBankNumber'}
])
}
let changeInvoiceFlag = confirmArr.some(tt => {
if(this.selectedCompany[tt.key] !== values[tt.key]) {
return true
}
})
values.changeInvoiceFlag = changeInvoiceFlag
}
this.$emit('formData', values)
} else {
this.$emit('formData', {stop: true})
@@ -398,7 +506,10 @@ export default {
setFormVal(record) {
// this.isEditBool = record.checkResult === 1
this.isEditBool = false
this.needInvoiceBool = record.needInvoice === 0
// this.needInvoiceBool = Number(record.needInvoice) !== 0
this.changeInvoice(record.needInvoice)
// this.selectedInvoiceType = Number(record.needInvoice)
// 是否已经到账
this.isCheckInBool = record.inAccount === 1
// 回显邮寄联系人
@@ -424,7 +535,8 @@ export default {
'amountReceivable',
'taxRate',
'tax',
'noTaxAmount'
'noTaxAmount',
'invoiceProject' // 发票项目
))
})
@@ -434,11 +546,43 @@ export default {
* 选择发票
* */
changeInvoice(val) {
if (val === '0') {
this.selectedInvoiceType = Number(val)
if (this.selectedInvoiceType === 0) {
// 不需要发票
this.needInvoiceBool = true
// this.needInvoiceBool = false
} else {
this.needInvoiceBool = false
// this.needInvoiceBool = true
}
this.setInvoiceFormItem()
},
// 设置表单中发票的信息
setInvoiceFormItem() {
if (this.selectedInvoiceType === InvoiceTypeEnums.special.index) {
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.selectedCompany, 'companyName', 'dutyCode', 'companyAddress', 'companyPhone', 'bankAccount', 'openingBank', 'linkBankNumber'))
})
} else if(this.selectedInvoiceType === InvoiceTypeEnums.plain.index) {
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.selectedCompany, 'companyName', 'dutyCode'))
})
}
},
// 清空 发票信息的数据
clearInvoiceFormItem() {
this.form.resetFields(['companyName', 'dutyCode', 'companyAddress', 'companyPhone', 'bankAccount', 'openingBank', 'linkBankNumber'])
},
/*
* 验证发票信息-电话号码 的正确性
* */
checkCompanyPhone(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('请输入电话号码')
}
if (value && !reg.test(value)) {
callback(new Error('请输入正确格式的电话号码'))
} else {
callback()
}
},
addContactsOk() {
@@ -11,6 +11,7 @@
<a-form-item label="参会企业" :labelCol="labelCol" :wrapperCol="wrapperCol">
<add-meeting-company @change="changeCompany" v-decorator="['companyId',validatorRules.companyId]"
placeholder="请选择参会企业"
full-company-info
:disabled="model.checkResult === 1"
:maxLength='50'>
</add-meeting-company>
@@ -43,28 +44,10 @@
</a-form-item>
</a-col>
<!-- <a-col :xxl="8" :xl="12" :sm="24">-->
<!-- <a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <a-input placeholder="请输入职务"-->
<!-- :maxLength='50'-->
<!-- disabled-->
<!-- v-decorator="[ 'post']"></a-input>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<!-- <a-col :xxl="8" :xl="12" :sm="24">-->
<!-- <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <a-input placeholder="请输入邮箱"-->
<!-- :maxLength='50'-->
<!-- disabled-->
<!-- v-decorator="[ 'email',-->
<!-- validatorRules.email]"></a-input>-->
<!-- </a-form-item>-->
<!-- </a-col>-->
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-decorator="['identity',validatorRules.identify]" @change="changeIdentify">
<!--内部企业的时候不允许进行修改参会身份-->
<a-radio-group :disabled="identifyType === 3" v-decorator="['identity',validatorRules.identify]" @change="changeIdentify">
<a-radio :value="1">嘉宾</a-radio>
<a-radio :value="2">参会人</a-radio>
<a-radio :value="3" :disabled="!isInternalEnterprise">内部企业</a-radio>
@@ -114,6 +97,20 @@
<seminar-partner-form ref="seminarPartnerForm" @formData="getFormData"></seminar-partner-form>
</template>
<div class="item-title">其他信息</div>
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="备注" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入备注"
:auto-size="{ minRows: 3, maxRows: 6 }"
v-decorator="['remark']"
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
<div class="center">
<a-button class="submit" type="primary" @click="handleOk" v-preventclick>确定</a-button>
<a-button @click="handleCancel">取消</a-button>
@@ -137,6 +134,7 @@ import { judgeInternalEnterprise } from '../../../api/incomePaymentsApi'
import {httpAction} from '@api/manage'
import pick from 'lodash.pick'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import { queryCompanyInfoById } from '../../../api/api'
export default {
name: 'SignUpInfoEdit',
@@ -291,13 +289,28 @@ export default {
},
},
methods: {
// 通过企业的id获取企业管理中的基本信息,用于发票回显
queryCompanyInfoById(id) {
return new Promise(resolve => {
let result = {}
queryCompanyInfoById({id}).then(res => {
if(res.success) {
result = res.result || {}
result = pick(res.result, 'companyName', 'dutyCode', 'companyAddress', 'companyPhone', 'openingBank', 'bankAccount', 'linkBankNumber')
}
}).finally(() => {
resolve(result)
})
})
},
addContactsOk() {
this.$refs.selectContacts.getContactsList()
},
/*
* 编辑
* */
edit(record){
async edit(record){
this.isInternalEnterprise = false
this.form.resetFields()
this.model = Object.assign({},record)
@@ -310,10 +323,30 @@ export default {
// 参会单位回显
this.model.companyId = {
id:this.model.companyId,
companyName:this.model.companyName
companyName:this.model.companyName,
}
// 参会人回显
this.selectedCompany = this.model.companyId
// this.selectedCompany = this.model.companyId
// 如果当前的参会人信息中发票信息不全 则从企业管理中获取一下
// if(!this.model.dutyCode && !this.model.companyAddress)
// 从企业管理中获取全部的会议信息
let companyInfo = await this.queryCompanyInfoById(this.model.companyId.id)
// 判断当前数据中企业信息是否完整 将有数据的赋值到数据中
// 写入发票的信息,因为需要回显
// dutyCode:this.model.dutyCode, // 信用代码
// companyAddress:this.model.companyAddress, // 公司地址
// companyPhone:this.model.companyPhone, // 公司电话
// openingBank:this.model.openingBank, // 开户行
// bankAccount:this.model.bankAccount, // 银行账号
// linkBankNumber:this.model.linkBankNumber // 联行号
let invoiceKeys = ['dutyCode', 'companyAddress', 'companyPhone', 'openingBank', 'bankAccount', 'linkBankNumber']
let invoiceInfo = {}
invoiceKeys.map(key => {
if(this.model[key]) {
invoiceInfo[key] = this.model[key]
}
})
this.selectedCompany = Object.assign({}, companyInfo, this.model.companyId, invoiceInfo)
this.selectPerson = {
id:this.model.companyContactTemporaryId,
name:this.model.companyContactName
@@ -354,7 +387,8 @@ export default {
'email',
'post',
'identity',
'guestType'
'guestType',
'remark'
))
})
},
@@ -382,6 +416,10 @@ export default {
if (!err) {
this.confirmLoading = true
let submitData = Object.assign({},values,this.formData)
// 去掉所有的未审核字段,有中文的 有英文的
if(submitData.companyName) {
submitData.companyName = (submitData.companyName || '').replaceAll(' (未审核)','').replaceAll(' (未审核)','')
}
submitData.companyId = values.companyId.id
// 会议id
submitData.meetingId = this.$route.query.meetingId
@@ -438,7 +476,7 @@ export default {
this.guestType = null
}
this.$nextTick( ()=> {
this.$refs.formother.setFormVal(this.model)
this.$refs.formother.setFormVal(Object.assign({}, this.model, { identify: this.identifyType}))
})
},
/*
@@ -450,8 +488,9 @@ export default {
/*
* 选择参会企业
* */
changeCompany(value) {
this.selectedCompany = value
changeCompany(value, otherParams) {
// this.selectedCompany = value
this.selectedCompany = otherParams
// 去掉未审核 去判断的企业是否是标协会企业
let companyName = this.selectedCompany.companyName.replaceAll('(未审核)','')
@@ -480,10 +519,13 @@ export default {
this.form.resetFields(['companyContactId','phone'])
if(this.$refs.formother ){
this.$refs.formother.clearFormItem()
// 设置发票的相关信息
this.$refs.formother.setInvoiceFormItem()
}
// 判断当前企业是否是内部企业
console.log('-----this.selectedCompany-----', this.selectedCompany)
this.judgeInternalEnterprise(this.selectedCompany.id)
},
/*
* 选择联系人获取信息
@@ -0,0 +1,169 @@
<!--设置嘉宾上传文件的标识-->
<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>
<a-col :span="24">
<a-form-item label="嘉宾是否可上传文件" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-decorator="['guestsUploadFileFlag', validatorRules.guestsUploadFileFlag]"
:trigger-change="true"
placeholder="请选择状态"
dictCode="yn" />
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import { httpAction } from '@api/manage'
const requestUrlObj = {
workGroupMeetingUrl: '/meeting/workGroupMeetingSituation/setGuestsUploadFile', // 工作组
standardsMeetingUrl: '/meeting/standardsMeetingSituation/setGuestsUploadFile', // 标协会议
internalMeetingUrl: '/meeting/internalMeetingSituation/setGuestsUploadFile', // 国际研讨会的url
otherMeetingUrl: '/meeting/ohterMeetingSituation/setGuestsUploadFile', // 其他会议的url
committeeMeetingUrl: '/meeting/committeeMeetingSituation/setGuestsUploadFile', // 分标委会议的url
councilMeetingUrl: '/meeting/councilMeetingSituation/setGuestsUploadFile', // 理事会的url
}
export default {
name: 'SetGuessUploadFlagModal',
props: {
// 会议类型
meetingType: {
type: Number,
required: false
},
meetingId: {
type: String,
required: false
}
},
computed: {
requestUrl() {
switch (Number(this.meetingType)) {
case 1:
return requestUrlObj.workGroupMeetingUrl
case 2:
return requestUrlObj.standardsMeetingUrl
case 3:
return requestUrlObj.internalMeetingUrl
case 4:
return requestUrlObj.otherMeetingUrl
case 5:
return requestUrlObj.committeeMeetingUrl
case 6:
return requestUrlObj.councilMeetingUrl
// 为了解决控制台报错写的
default:return requestUrlObj.workGroupMeetingUrl
}
},
},
data() {
return {
title: '设置资料状态',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 14 }
},
validatorRules: {
guestsUploadFileFlag: {
rules: [{ required: true, message: '请选择状态' }],
validateTrigger: 'blur'
}
},
url: {
// setLabel: '/project/payWorkingGroupSubitem/setLabel'
}
}
},
methods: {
// 行内的展示
show(record) {
this.form.resetFields()
let params = {}
if(record) {
params.guestsUploadFileFlag = record.guestsUploadFileFlag || 0
this.selectedIds = [record.id]
} else {
params.guestsUploadFileFlag = 0
}
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(params)
})
},
// 批量处理
showBatch(ids) {
this.selectedIds = ids
this.show()
},
close() {
this.$emit('close')
this.visible = false
},
handleOk() {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let httpUrl = this.requestUrl
let method = 'post'
const formData = Object.assign({}, values)
formData.meetingId = that.meetingId
formData.meetingSituationIds = that.selectedIds.join(',')
this.confirmLoading = false
console.log('表单提交数据', formData)
httpAction(httpUrl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
handleCancel() {
this.close()
},
}
}
</script>
<style scoped>
</style>
@@ -12,12 +12,12 @@
<a-row>
<a-col :span="24">
<!--上传会议资料显示 -->
<a-form-item label="会议文件" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="type === '2' ">
<j-upload file-type-error-message="请上传会议文件" :multiple="true"
:return-id="true"
v-decorator="['fileIds']"
:trigger-change="true"></j-upload>
</a-form-item>
<!--<a-form-item label="会议文件" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="type === '2' ">-->
<!-- <j-upload file-type-error-message="请上传会议文件" :multiple="true"-->
<!-- :return-id="true"-->
<!-- v-decorator="['fileIds']"-->
<!-- :trigger-change="true"></j-upload>-->
<!--</a-form-item>-->
<!--上传会议纪要显示 -->
<a-form-item label="会议纪要" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="type === '1' ">
<j-upload file-type-error-message="请上传会议纪要" :multiple="true"
@@ -28,6 +28,42 @@
</a-col>
</a-row>
</a-form>
<!-- 以表格的形式展示 所有的文件 -->
<template v-if="type === '2' ">
<div class="table-operator">
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
:action="importExcelUrl" :beforeUpload="beforeUpload" @change="handleChange"
>
<a-button type="primary" icon="plus">新增</a-button>
</a-upload>
<a-button type="danger" icon="delete" @click="batchDel">
批量删除
</a-button>
</div>
<a-table
ref="table"
size="middle"
rowKey="id"
:scroll="{x:auto}"
:pagination="false"
:columns="columns"
:dataSource="fileList"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
class="j-table-force-nowrap"
>
<template slot="text" slot-scope="text">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<span slot="action" slot-scope="record" class="action-span-cell">
<a class="color-blue" @click="myDownload(record)">下载</a>
<a class="color-blue" @click="myPreview(record)">查看</a>
<a class="color-blue" @click="deleteFile(record)">删除</a>
</span>
</a-table>
</template>
</a-spin>
<email-error-msg-modal ref="emailError"></email-error-msg-modal>
</j-modal>
@@ -36,7 +72,38 @@
<script>
import JUpload from '@comp/jero/JUpload'
import {httpAction} from '@api/manage'
import {getFileInfoByIds} from '@/api/api'
import EmailErrorMsgModal from '@views/projectManagement/modules/EmailErrorMsgModal'
import Vue from 'vue'
import { downloadFile } from '../../../../api/manage'
import { ACCESS_TOKEN } from '../../../../store/mutation-types'
import { Modal } from 'ant-design-vue'
import store from '@/store'
const FILE_TYPE_ALL = 'all'
const columns = [
{
title: '文件名',
align: 'center',
dataIndex: 'fileName',
width: 200,
scopedSlots: { customRender: 'text' }
},
{
title: '上传人',
align: 'center',
dataIndex: 'createBy',
width: 100,
scopedSlots: { customRender: 'text' }
},
{
title: '操作',
align: 'center',
dataIndex: '',
scopedSlots: {customRender: 'action'},
width: 150
}
]
export default {
name: 'UploadMeetFileModal',
@@ -47,7 +114,7 @@ export default {
data() {
return {
title: '上传文件',
width: 400,
width: 1000,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
@@ -66,7 +133,22 @@ export default {
// 已经上传的会议文件
meetingFileIds: '',
validatorRules: {},
url: {}
url: {},
columns,
fileList: [],
/* table选中keys*/
selectedRowKeys: [],
fileType: FILE_TYPE_ALL
}
},
computed: {
//token header
tokenHeader() {
let head = {'X-Access-Token': Vue.ls.get(ACCESS_TOKEN)}
return head
},
importExcelUrl: function () {
return `${ window._CONFIG['domianURL'] }/sys/common/uploadByToken`
}
},
methods: {
@@ -74,7 +156,7 @@ export default {
this.edit({})
},
// type 1上传会议纪要 2上传会议资料
edit(record, type) {
async edit(record, type) {
this.visible = true
this.type = type
this.form.resetFields()
@@ -93,8 +175,9 @@ export default {
} else if (type === '2') {
this.meetingFileIds = this.model.meetingData ? this.model.meetingData : ''
if (this.meetingFileIds && this.meetingFileIds !== '') {
this.fileList = await this.getFileInfoArr(this.meetingFileIds)
this.$nextTick(() => {
this.form.setFieldsValue({'fileIds': this.meetingFileIds})
// this.form.setFieldsValue({'fileIds': this.meetingFileIds})
})
}
}
@@ -105,6 +188,7 @@ export default {
this.meetingFileIds = ''
this.type = ''
this.visible = false
this.confirmLoading = false
},
// uplodFile 上传会议资料的接口 uploadCouncilFile 上传会议纪要的接口
createUrlByMeetingType(meetingType) {
@@ -153,57 +237,249 @@ export default {
return
}
this.confirmLoading = true
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err && values.fileIds !== undefined) {
const params = {
fileIds: values.fileIds,
id: that.meetingId
}
let url
if (this.type === '1') {
// 上传会议纪要用会议纪要的接口
url = this.url.uploadCouncilFile
} else if (this.type === '2') {
url = this.url.uploadFile
}
httpAction(url, params, 'post').then(res => {
if (res.success) {
// 所有的数据验证后请求的回调方法
const callbackFunc = (url, params) => {
httpAction(url, params, 'post').then(res => {
if (res.success) {
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
that.$refs.emailError.open()
that.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}else {
that.$message.success(res.message)
}
that.$emit('ok')
this.confirmLoading = false
that.close()
} else {
this.$message.warn(res.message)
this.confirmLoading = false
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
that.$refs.emailError.open()
that.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}else {
that.$message.success(res.message)
}
}).catch((err) => {
console.log(err, 'err')
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
that.close()
that.$emit('ok')
this.confirmLoading = false
that.close()
} else {
this.$message.warn(res.message)
this.confirmLoading = false
}
}).catch((err) => {
console.log(err, 'err')
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
}
// 会议纪要-触发表单的验证
if(this.type === '1') {
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err && values.fileIds !== undefined) {
const params = {
fileIds: values.fileIds,
id: that.meetingId
}
let url = this.url.uploadCouncilFile
callbackFunc(url, params)
} else {
that.close()
}
})
} else if (this.type === '2'){
// 会议文件
let ids = this.fileList.map(tt => tt.id).join(',')
const params = {
fileIds: ids,
id: that.meetingId
}
})
let url = this.url.uploadFile
// 会议文件 不用对比开始与最后文件的差别,后端会自己比对
callbackFunc(url, params)
}
},
handleCancel() {
this.close()
},
/**
* 通过文件的id获取文件的相关信息
* @param id
*/
getFileInfoArr(ids) {
return new Promise(resolve => {
let result = {}
getFileInfoByIds({ids: ids}).then(res => {
if (res.success) {
result = res.result
}
}).finally(() => {
resolve(result)
})
})
},
onSelectChange(selectedRowKeys, selectionRows) {
this.selectedRowKeys = selectedRowKeys
this.selectionRows = selectionRows
},
onClearSelected() {
this.selectedRowKeys = []
this.selectionRows = []
},
/**
* 单个文件的下载功能
* @param file
*/
myDownload(file) {
downloadFile(`sys/common/download/${file.id}`, file.fileName)
},
/**
* 单个文件的预览功能
* @param file
*/
myPreview(file) {
if (file && file.url) {
const fileName = (file || {}).fileName
const fileNameNotType = fileName.substring(0, fileName.lastIndexOf('.'))
const previewUrl = (file || {}).url || ''
const previewName = previewUrl.substring(previewUrl.lastIndexOf(fileNameNotType))
const fileFullUrl = `${window._CONFIG['domianWebSocketURL']}/sys/common/download/${file.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${previewName}`
let url = `${window._CONFIG['onlinePreviewDomainURL']}?url=${encodeURIComponent(fileFullUrl)}`
window.open(url)
}
},
// 单个文件的删除
deleteFile(file) {
const that = this
this.$confirm({
title: '确认删除',
content: '确定要删除此条数据吗?',
onOk: function () {
let index = that.fileList.findIndex(tt => tt.id === file.id)
that.fileList.splice(index, 1)
that.onClearSelected()
}
})
},
batchDel() {
if (this.selectedRowKeys.length <= 0) {
this.$message.warning('请选择一条记录!')
return
}
const that = this
this.$confirm({
title: '确认删除',
content: '是否删除选中数据?',
onOk: function () {
that.fileList = that.fileList.filter(tt => !that.selectedRowKeys.includes(tt.id))
that.onClearSelected()
}
})
},
beforeUpload(file) {
this.uploadGoOn = true
file.uploadGoOn = true
const fileSize = file.size // 上传的文件大小
const fileType = file.type // 上传的文件类型
if (fileSize > 1024 * 1024 * 100) {
this.$message.warning('文件大小限制为100M')
this.uploadGoOn = false
file.uploadGoOn = false
return false
}
// 不等于全部类型可以上传的时候,对上传的文件进行判断
if (this.fileType !== FILE_TYPE_ALL) {
// filter(tt => fileType.indexOf(tt) > -1) 判断用户传的文件类型,和要求传的文件类型是否一致
// 当上传的图片格式为jpg时,在此组件中,会返回类型为 image/jpeg ElememntUI设计如此 所以需要把用户传下来的jpg强制改成jpeg
this.fileTypes = this.fileTypes.replace('jpg', 'jpeg')
const arr = this.fileTypes.split(',').filter(tt => fileType.indexOf(tt) > -1)
if (arr.length === 0) {
this.$message.warning(this.fileTypeErrorMessage || `请上传${this.fileTypes}文件`)
this.uploadGoOn = false
file.uploadGoOn = false
return false
}
}
return true
},
handleChange(info) {
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList)
}
if (info.file.status === 'done') {
if (info.file.response.success) {
// this.$message.success(`${info.file.name} 文件上传成功`);
if (info.file.response.code === 201) {
let {message, result: {msg, fileUrl, fileName}} = info.file.response
let href = window._CONFIG['domianURL'] + fileUrl
this.$warning({
title: message,
content: (<div>
<span>{msg}</span>
<br/>
<span>具体详情请
<a href={href} target="_blank" download={fileName}>点击下载</a>
</span>
</div>
)
})
} else {
this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
}
this.fileList.push(info.file.response.result)
} else {
this.messageLineFeed('文件导入错误', info.file.response.message)
}
} else if (info.file.status === 'error') {
if (info.file.response.status === 500) {
let data = info.file.response
const token = Vue.ls.get(ACCESS_TOKEN)
if (token && data.message.includes('Token失效')) {
Modal.error({
title: '登录已过期',
content: '很抱歉,登录已过期,请重新登录',
okText: '重新登录',
mask: false,
onOk: () => {
store.dispatch('Logout').then(() => {
Vue.ls.remove(ACCESS_TOKEN)
window.location.reload()
})
}
})
}
} else {
this.$message.error(`文件上传失败: ${info.file.msg} `)
}
}
},
/**
* 对包含<br/>的后端错误信息进行处理
* @param title
* @param content
*/
messageLineFeed(title, content) {
const messageArr = content.split('<br/>')
let htmlDom = []
messageArr.map(tt => {
if (tt) {
htmlDom.push((<div>{tt}</div>))
}
})
this.$warning({
title: title,
content: (h) => <div>
{htmlDom}
</div>
})
}
}
}
</script>
<style scoped>
<style scoped lang="less">
@import '~@assets/less/common.less';
/*表格滚动条*/
.ant-table-body {
overflow-x: auto!important;
}
</style>
@@ -24,6 +24,16 @@
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-textarea>
</a-form-item>
<!-- 2023-07变更设置消息提醒截止时间超出截止时间未读弹框提醒 -->
<a-form-item label="消息提醒截止时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-date-picker
placeholder="请选择消息提醒截止时间"
v-decorator="['deadline', validatorRules.deadline]"
show-time
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</a-form-item>
</a-form>
</a-spin>
</j-modal>
@@ -44,11 +54,11 @@ export default {
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 4 }
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 20 }
sm: { span: 19 }
},
url: '/send/message/sendAllUserMessage',
validatorRules: {
@@ -59,6 +69,10 @@ export default {
content: {
rules: [{ required: true, message: '请输入通知内容' }],
validateTrigger: 'blur'
},
deadline: {
rules: [{ required: true, message: '请选择消息提醒截止时间' }],
validateTrigger: 'change'
}
}
}
+144
View File
@@ -0,0 +1,144 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :xl="6" :lg="8" :md="8" :sm="24">
<a-form-item label="公告名称">
<a-input placeholder="请输入公告名称" v-model="queryParam.noticeName" :maxLength="50"></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="8" :md="8" :sm="24">
<a-form-item label="公告内容">
<a-input placeholder="请输入公告内容" v-model="queryParam.noticeContent"></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<!-- v-has="'template:list'"-->
<a-button type="primary" @click="searchQuery" icon="search" v-has="'sysNotice:pageList'">查询</a-button>
<a-button @click="searchReset" icon="reload" class="reset-button" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 操作按钮区域 -->
<div class="table-operator">
<!-- v-has="'template:add:systemNotifications'"-->
<a-button @click="handleAdd" type="primary" icon="plus" v-has="'sysNotice:add'">新增</a-button>
</div>
<!-- table区域-begin -->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
class="j-table-force-nowrap"
@change="handleTableChange">
<!-- 字符串超长截取省略号显示-->
<span slot="templateContent" slot-scope="text">
<a-tooltip>
<template slot="title">
<span v-html="text"></span>
</template>
<span v-html="myEllipsis(text,40)"></span>
</a-tooltip>
</span>
<template slot="text" slot-scope="text">
<j-ellipsis v-if="text" :length="20" :value="text"></j-ellipsis>
<span v-else></span>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record">
<!-- v-has="'template:list'"-->
<a @click="handleEdit(record)" v-has="'sysNotice:edit'">编辑</a>
<!-- v-has="'template:delete'"-->
<a @click="handleDelete(record.id)" v-has="'sysNotice:deleteById'">删除</a>
</span>
</a-table>
</div>
<!-- table区域-end -->
<!-- 表单区域 -->
<sys-notice-modal ref="modalForm" @ok="modalFormOk"></sys-notice-modal>
</a-card>
</div>
</template>
<script>
import {JeroListMixin} from '@/mixins/JeroListMixin'
import IconImg from '@/assets/imgs/icon/icon_notice.png'
import SysNoticeModal from './modules/SysNoticeModal'
import PageHeaderTitle from '../../../components/layouts/PageHeaderTitle'
export default {
name: 'SysNoticeList',
mixins: [JeroListMixin],
components: {SysNoticeModal, PageHeaderTitle},
data() {
return {
description: '公告管理页面',
IconImg,
// 表头
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '公告名称',
align: 'center',
dataIndex: 'noticeName',
scopedSlots: { customRender: 'text' },
width: 300
},
{
title: '公告内容',
align: 'center',
dataIndex: 'noticeContent',
scopedSlots: { customRender: 'text' },
width: 200
},
{
title: '操作',
dataIndex: 'action',
align: 'center',
scopedSlots: { customRender: 'action' },
width: 160
}
],
url: {
list: '/sysNotice/pageList',
delete: '/sysNotice/deleteById',
deleteBatch: '/sysNotice/deleteBatch'
}
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
</style>
@@ -0,0 +1,143 @@
<template>
<a-modal
:title="title"
:width="800"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="公告名称">
<a-input placeholder="请输入公告名称" v-decorator="['noticeName', validatorRules.noticeName]" :maxLength="50"/>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="公告内容">
<a-textarea placeholder="请输入发送内容" v-decorator="['noticeContent', validatorRules.noticeContent]"
:autoSize="{minRows: 3, maxRows: 6}" :maxLength="200"/>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="附件">
<j-upload :returnId="true" v-decorator="['noticeFile', validatorRules.noticeFile]"/>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="使用状态">
<a-switch checkedChildren="禁用" unCheckedChildren="启用" v-model="model.noticeStatus"/>
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import pick from 'lodash.pick'
import { httpAction } from '@/api/manage'
import JUpload from '@/components/jero/JUpload'
export default {
name: 'SysNoticeModal',
components: {JUpload},
data() {
return {
title: '操作',
visible: false,
disable: true,
model: {noticeStatus: false},
labelCol: {
xs: {span: 24},
sm: {span: 5},
},
wrapperCol: {
xs: {span: 24},
sm: {span: 16},
},
confirmLoading: false,
form: this.$form.createForm(this),
disableSubmit: false,
validatorRules: {
noticeName: {rules: [{required: true, message: '请输入公告名称!' }],validateTrigger: 'blur'},
noticeContent: {rules: [{required: true, message: '请选择公告内容!'}],validateTrigger: 'blur'},
noticeFile:{rules: [{required: false, message: '请上传附件!'}],validateTrigger: 'change'}
},
url: {
add: '/sysNotice/add',
edit: '/sysNotice/edit',
}
}
},
methods: {
add() {
this.disable = false
this.edit({})
},
edit(record) {
this.form.resetFields()
this.model = Object.assign({}, record)
if (this.model.id) {
this.model.noticeStatus = (this.model.noticeStatus === 1 ? true : false)
}
console.log(this.model)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'noticeName', 'noticeContent', 'noticeFile'))
})
},
close() {
this.$emit('close')
this.visible = false
this.disable = true
},
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let httpurl = ''
let method = 'post'
if (!this.model.id) {
httpurl += this.url.add
} else {
httpurl += this.url.edit
}
console.log(values)
let formData = Object.assign(this.model, values)
formData.noticeStatus = formData.noticeStatus ? 1 : 0
console.log(formData)
httpAction(httpurl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
} else {
that.$message.warning(res.message)
}
}).finally(() => {
that.confirmLoading = false
that.close()
})
}
})
},
handleCancel() {
this.close()
}
}
}
</script>
<style scoped>
</style>
@@ -132,7 +132,7 @@
<span slot="action" class="action-span-cell" slot-scope="text, record">
<a @click="incomePayment(record)" :disabled="Number(record.receivableAmount) === 0"
v-has="'packProject:incomePayment'">来款</a>
<a @click="cancelPack(record.id)" v-has="'packProject:cancelPack'">取消打包</a>
<a @click="cancelPack(record.id)" :disabled="Number(record.receivableAmount) === 0" v-has="'packProject:cancelPack'">取消打包</a>
<a @click="invoicing(record)" :disabled="record.needInvoice === 0 || Number(record.receivableAmount) === 0"
v-has="'packProject:invoicing'">开票</a>
<a v-has="'packProject:confirmPayment'" @click="confirmPayment(record)" :disabled="Number(record.receivableAmount) === 0">确认收入</a>
@@ -65,6 +65,11 @@
/>
</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.label" :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">
@@ -103,6 +108,7 @@
<a-button type="primary" @click="setDunningReminder" v-has="'workingGroupMember:setDunningReminder'"
v-if="canOperate">催款提醒
</a-button>
<a-button type="primary" @click="setLabel" v-has="'workingGroupMember:setLabel'">设置标签</a-button>
</div>
<!-- /操作按钮区域-end-->
@@ -170,6 +176,8 @@
@ok="modalFormOk"></working-group-member-set-charge-notice>
<email-error-msg-modal ref="emailError"></email-error-msg-modal>
<work-group-set-label ref="workGroupSetLabel" @ok="modalFormOk"></work-group-set-label>
</div>
</template>
@@ -186,6 +194,7 @@ import Vue from 'vue'
import { ACCESS_TOKEN } from '../../store/mutation-types'
import PreviewFile from '../../components/jero/PreviewFile'
import EmailErrorMsgModal from './modules/EmailErrorMsgModal'
import WorkGroupSetLabel from './modules/WorkGroupSetLabel'
// eslint-disable-next-line no-undef,no-unused-vars
const Base64 = require('js-base64').Base64
@@ -200,7 +209,8 @@ export default {
WorkingGroupMemberUnitModule,
WorkingGroupMemberSetChargeNotice,
PreviewFile,
EmailErrorMsgModal
EmailErrorMsgModal,
WorkGroupSetLabel
},
mixins: [JeroListMixin],
computed: {
@@ -288,13 +298,6 @@ export default {
width: 120,
dataIndex: 'contactsTemporaryNameOne',
scopedSlots: { customRender: 'text' }
}, {
// 2021-10-22需求变更新加
title: '收费通知号',
align: 'center',
width: 280,
dataIndex: 'chargeNoticeNo',
scopedSlots: { customRender: 'text' }
}, {
title: '待确收金额',
align: 'center',
@@ -311,33 +314,51 @@ export default {
customRender: (text, record) => (
<j-ellipsis value={ record.paidAmount + '元' } length={ 15 }></j-ellipsis>
)
}, {
title: '标签名称',
align: 'center',
dataIndex: 'label',
width: 100,
scopedSlots: { customRender: 'text' }
}, {
// 2021-10-22需求变更新加
title: '收费通知号',
align: 'center',
width: 280,
dataIndex: 'chargeNoticeNo',
scopedSlots: { customRender: 'text' }
}, {
title: '打包',
align: 'center',
fixed: 'right',
width: 80,
dataIndex: 'pack',
scopedSlots: { customRender: 'status-pack' }
}, {
title: '需要发票',
align: 'center',
fixed: 'right',
width: 80,
dataIndex: 'needInvoice',
scopedSlots: { customRender: 'status-pack' }
}, {
title: '到账',
align: 'center',
fixed: 'right',
width: 80,
dataIndex: 'inAccount',
scopedSlots: { customRender: 'status' }
}, {
title: '开票',
align: 'center',
fixed: 'right',
width: 80,
dataIndex: 'makeInvoice',
scopedSlots: { customRender: 'status-bill' }
}, {
title: '邮寄',
align: 'center',
fixed: 'right',
width: 80,
dataIndex: 'mail',
scopedSlots: { customRender: 'status-mail' }
@@ -517,6 +538,14 @@ export default {
let url = `${ window._CONFIG['onlinePreviewDomainURL'] }?url=${ encodeURIComponent(fileFullUrl) }`
window.open(url)
}
},
// 设置标签
setLabel() {
if (this.selectedRowKeys.length <= 0) {
this.$message.warning('请选择一条记录!')
return
}
this.$refs.workGroupSetLabel.show(this.selectedRowKeys)
}
// 2021 10 11 沟通后去掉了这个功能
// searchReset() {
@@ -78,6 +78,7 @@
import {JeroListMixin} from '@/mixins/JeroListMixin'
import {publishRemind,commitePublishRemind,councilPublishRemind} from '@api/incomePaymentsApi'
import EmailErrorMsgModal from '@views/projectManagement/modules/EmailErrorMsgModal'
import { judgeEmailStatus } from "../../../api/incomePaymentsApi";
export default {
@@ -121,7 +122,7 @@ export default {
scopedSlots: {customRender: 'text'}
},
{
title: '是否提醒',
title: '邮件提醒',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
@@ -155,7 +156,7 @@ export default {
scopedSlots: {customRender: 'text'}
},
{
title: '是否提醒',
title: '邮件提醒',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
@@ -189,7 +190,7 @@ export default {
scopedSlots: {customRender: 'text'}
},
{
title: '是否提醒',
title: '邮件提醒',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
@@ -215,6 +216,10 @@ export default {
newColumns: [],
// 提醒类型 1 是工作组 2 是分标委 3是理事会
remindType:'',
// 是否需要发邮件
needMail: false,
// 发消息需要验证的模板code码
mailTemplateCode: ''
}
},
methods: {
@@ -223,7 +228,8 @@ export default {
this.visible = true
// 保存选中的会议
this.selectedMetingList = [...meetingList]
// 设置请求的模板CODE 一样的
this.mailTemplateCode = 'QY_1_HYTZ_WORK_GROUP_CREATE'
// 分标委会议需要分标标委的id
if (this.$route.query.meetingType === '5') {
// 分标委
@@ -243,6 +249,7 @@ export default {
this.filters.workingGroupId = this.$route.query.workingGroupProjectId
// 工作组
this.remindType = 1
this.newColumns = [...this.columns]
}
// 发布提醒需要会议id 只有选择一个会议的时候 才会有这个参数
@@ -255,6 +262,7 @@ export default {
this.newColumns = this.newColumns.filter(item => item.dataIndex !== 'remind_dictText')
}
this.searchReset()
this.judgeEmailStatusFunc()
},
close() {
this.$emit('close')
@@ -270,85 +278,89 @@ export default {
this.$message.warn('请至少选择一个成员')
this.confirmLoading = false
return
} else {
}
// 定义请求成功的方法 sendEmailFlag 0-不发送 1-发送
const callbackFunc = (sendEmailFlag) => {
// TODO 分标委、理事会是否需要验证 再定
const param = {
meetingIds: this.selectedMetingList,
subitemIds: this.selectedRowKeys,
projectType:this.remindType
}
let requestFun
param.sendEmailFlag = sendEmailFlag
// 分标委用分标委的接口
if(this.$route.query.meetingType === '5' ){
commitePublishRemind(param).then(res => {
if (res.success) {
// this.$message.success(res.message)
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}
this.$emit('ok')
this.confirmLoading = false
this.handleCancel()
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
requestFun = commitePublishRemind
}else if(this.$route.query.meetingType === '6'){
// 理事会的用理事会的发布提醒
councilPublishRemind(param).then(res => {
if (res.success) {
// this.$message.success(res.message)
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}
this.$emit('ok')
this.confirmLoading = false
this.handleCancel()
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
requestFun = councilPublishRemind
} else {
// 工作组
param.workingGroupId = this.$route.query.workingGroupProjectId
publishRemind(param).then(res => {
if (res.success) {
// this.$message.success(res.result)
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}
this.$emit('ok')
this.confirmLoading = false
this.handleCancel()
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
requestFun = publishRemind
}
requestFun(param).then(res => {
if (res.success) {
if (sendEmailFlag && Array.isArray(res.result) && res.result.length > 0) {
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
} else {
this.$message.success(res.message)
}
this.$emit('ok')
this.confirmLoading = false
this.handleCancel()
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
}
if(this.needMail) {
this.$confirm({
title: '消息确认',
content: '确认要向选择的成员发送邮件吗?',
cancelText: '不发送',
okText: '确认发送',
onOk: function () {
callbackFunc(1)
},
onCancel: function() {
callbackFunc(0)
}
})
} else {
// 若全局没有配置则不发送邮件信息
callbackFunc(0)
}
},
handleCancel() {
this.close()
},
// 判断全局设置的是否需要发邮件
judgeEmailStatusFunc() {
this.needMail = false
if(!this.mailTemplateCode) return
// 工作组的会议通知模板 --QY_1_HYTZ_WORK_GROUP_CREATE
const params = {
code: this.mailTemplateCode
}
judgeEmailStatus(params).then(res => {
if(res.success) {
// 发送邮件的类型 1-短信 2-邮件 3-系统 数据字典codem sgType
this.needMail = (res.result || {}).templateType.indexOf(2) > -1
}
})
}
}
}
</script>
@@ -11,6 +11,28 @@
<a-spin :spinning="confirmLoading">
<template v-if="dataSourceInit.length > 0">
<!--查询条件 单个文件分发的时候才存在-->
<div class="table-page-search-wrapper" v-if="!isBatch">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="8" :lg="8" :md="8" :sm="24">
<a-form-item label="已提醒" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag style="width: 100%"
dict-code="yn"
v-model="queryParam.remind"
placeholder="请选择提醒类型"></j-dict-select-tag>
</a-form-item>
</a-col>
<a-col :xl="4" :lg="8" :md="8" :sm="24" >
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" @click="checkAll()">全选</a-button>
@@ -47,9 +69,112 @@
</template>
<script>
import { distribute, batchDistribute, distributeMemberList } from '../../../api/incomePaymentsApi'
import { distribute, batchDistribute, distributeMemberList, judgeEmailStatus } from '../../../api/incomePaymentsApi'
import EmailErrorMsgModal from '@views/projectManagement/modules/EmailErrorMsgModal.vue'
// 工作组发布提醒 表头
const columns = [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '联系人',
align: 'center',
width: 200,
dataIndex: 'name',
scopedSlots: {customRender: 'text'}
},
{
title: '成员单位',
align: 'center',
dataIndex: 'companyName',
width: 280,
scopedSlots: { customRender: 'text' }
},
{
title: '邮件通知',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
scopedSlots: {customRender: 'text'}
}
]
// 分标委发布提醒 表头
const commitColumns = [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '联系人',
align: 'center',
width: 200,
dataIndex: 'name',
scopedSlots: {customRender: 'text'}
},
{
title: '成员单位',
align: 'center',
dataIndex: 'companyName',
width: 280,
scopedSlots: { customRender: 'text' }
},
{
title: '邮件通知',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
scopedSlots: {customRender: 'text'}
}
]
// 理事会成员的表头
const councilColumns = [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '联系人',
align: 'center',
width: 200,
dataIndex: 'name',
scopedSlots: {customRender: 'text'}
},
{
title: '成员单位',
align: 'center',
dataIndex: 'companyName',
width: 280,
scopedSlots: { customRender: 'text' }
},
{
title: '邮件通知',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
scopedSlots: {customRender: 'text'}
}
]
export default {
name: 'WorkGroupDistributeModule',
components: { EmailErrorMsgModal },
@@ -96,24 +221,10 @@ export default {
title: '分发',
width: 1000,
confirmLoading: false,
columns: [
{
title: '联系人',
align: 'center',
dataIndex: 'name',
width: 280,
scopedSlots: { customRender: 'text' }
},
{
title: '成员单位',
align: 'center',
dataIndex: 'companyName',
width: 280,
scopedSlots: { customRender: 'text' }
}
],
columns: [],
dataSource: [], // 表格中显示的数据
dataSourceInit: [], // 所有分发单位的数据
dataSourceInitShow: [], // 拥有过滤条件后显示的所有数据
/* 分页参数 */
ipagination: {
current: 1,
@@ -127,7 +238,19 @@ export default {
total: 0
},
/* table选中keys*/
selectedRowKeys: []
selectedRowKeys: [],
// 查询条件
queryParam: {},
lastQueryParam: {},
labelCol: {
xs: {span: 24},
sm: {span: 6}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 18}
},
needMail: false // 消息模板中是否设置了可以发邮件 重要
}
},
methods: {
@@ -140,9 +263,14 @@ export default {
projectId: this.projectId,
projectType: this.projectType
}
// 非批量上传的时候传当前选中的文件id
if(!this.isBatch) {
param.fileId = this.recordId
}
distributeMemberList(param).then(res => {
if (res.success) {
this.dataSourceInit = res.result || []
this.dataSourceInitShow = res.result || []
this.loadData(1)
} else {
this.$message.warn(res.message)
@@ -158,11 +286,27 @@ export default {
* 初始化数据
*/
initData() {
console.log("-----------------")
this.checkedKeys = []
this.selectedRowKeys = []
this.ipagination.current = 1
this.ipagination.pageSize = 10
// 通过不同的项目类型 展示不同的columns 目前里面的信息是一致的
// 项目类型:1--工作组;2--分标委;3--理事会
if(this.projectType === 1) {
this.columns = [...columns]
} else if(this.projectType === 2) {
this.columns = [...commitColumns]
} else {
this.columns = [...councilColumns]
}
// 选择多个资料的时候不需要提醒字段 这样写是因为无法精准定位每一个人对应的每一个资料 这个人是否被提醒
if (this.isBatch) {
// 去掉列表的提醒字段
this.columns = this.columns.filter(item => item.dataIndex !== 'remind_dictText')
}
this.getMemberList()
this.judgeEmailStatusFunc()
},
handleTableChange(pagination) {
@@ -185,13 +329,27 @@ export default {
//加载数据 若传入参数1则加载第一页的内容
if (arg === 1) {
this.ipagination.current = 1
if(this.lastQueryParam.remind === undefined) {
this.dataSourceInitShow = this.dataSourceInit
} else {
this.dataSourceInitShow = this.dataSourceInit.filter(tt => tt.remind + '' === this.lastQueryParam.remind + '')
}
}
var params = this.getQueryParams()//查询条件
this.ipagination.total = this.dataSourceInit.length
this.dataSource = this.dataSourceInit.slice((params.pageNo - 1) * params.pageSize, (params.pageNo * params.pageSize))
this.ipagination.total = this.dataSourceInitShow.length
this.dataSource = this.dataSourceInitShow.slice((params.pageNo - 1) * params.pageSize, (params.pageNo * params.pageSize))
},
searchQuery() {
this.lastQueryParam = {...this.queryParam}
this.loadData(1)
},
searchReset() {
this.lastQueryParam = {}
this.queryParam = {}
this.loadData(1)
},
checkAll() {
this.selectedRowKeys = this.dataSourceInit.map(tt => tt.id)
this.selectedRowKeys = this.dataSourceInitShow.map(tt => tt.id)
},
close() {
this.$emit('update:visible', false)
@@ -212,68 +370,106 @@ export default {
this.confirmLoading = false
return
}
if (this.isBatch) {
let str = this.selectedRowKeys.join(',')
// 批量分发
const formData = {
contactsIds: str,
dataIds: this.recordId,
projectId: this.projectId,
projectType: this.projectType
// 定义请求成功的方法 sendEmailFlag 0-不发送 1-发送
const callbackFunc = (sendEmailFlag) => {
if (this.isBatch) {
let str = this.selectedRowKeys.join(',')
// 批量分发
const formData = {
contactsIds: str,
dataIds: this.recordId,
projectId: this.projectId,
projectType: this.projectType,
sendEmailFlag
}
batchDistribute(formData).then(res => {
if (res.success) {
// 发送邮件的时候才提醒 是否有邮件发送失败 有就给出提示信息
if (sendEmailFlag && Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
} else {
this.$message.success(res.message)
}
this.close()
this.$emit('ok')
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
// 单个分发
const formData = {
contactsIds: this.selectedRowKeys.join(','),
dataId: this.recordId,
projectId: this.projectId,
projectType: this.projectType,
sendEmailFlag
}
distribute(formData).then(res => {
if (res.success) {
if (sendEmailFlag && Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
} else {
this.$message.success(res.message)
}
this.close()
this.$emit('ok')
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
}
batchDistribute(formData).then(res => {
if (res.success) {
this.$message.success(res.message)
// 是否有邮件发送失败 有就给出提示信息
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}
this.close()
this.$emit('ok')
} else {
this.$message.warn(res.message)
}
if(this.needMail) {
this.$confirm({
title: '消息确认',
content: '确认要向选择的成员发送邮件吗?',
cancelText: '不发送',
okText: '确认发送',
onOk: function () {
callbackFunc(1)
},
onCancel: function() {
callbackFunc(0)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
// 单个分发
const formData = {
contactsIds: this.selectedRowKeys.join(','),
dataId: this.recordId,
projectId: this.projectId,
projectType: this.projectType
}
distribute(formData).then(res => {
if (res.success) {
this.$message.success(res.message)
if (Array.isArray(res.result) && res.result.length > 0) {
// msgWarn(this,res.result,0)
this.$refs.emailError.open()
this.$refs.emailError.msgList = res.result
console.log(this.$refs.emailError.msgList, 'this.$refs.emailError.msgList ')
}
this.close()
this.$emit('ok')
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
// 若全局没有配置则不发送邮件信息
callbackFunc(0)
}
},
handleCancel() {
this.close()
},
// 判断全局设置的是否需要发邮件
judgeEmailStatusFunc() {
this.needMail = false
// 非工作组项目的情况 不进行请求
// if(this.projectType !== 1) return
const params = {
code: 'QY_12_WJTZ_WORK_GROUP_SEND'
}
judgeEmailStatus(params).then(res => {
if(res.success) {
// 发送邮件的类型 1-短信 2-邮件 3-系统 数据字典codem sgType
this.needMail = (res.result || {}).templateType.indexOf(2) > -1
}
})
}
}
}
@@ -0,0 +1,113 @@
<!--工作组 设置标签-->
<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>
<a-col :span="24">
<a-form-item label="标签名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入标签名称"
v-decorator="['label',validatorRules.label]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import { httpAction } from '@api/manage'
export default {
name: 'WorkGroupSetLabel',
data() {
return {
title: '设置标签',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 14 }
},
validatorRules: {
label: {
rules: [{ required: true, message: '请输入标签名称' }],
validateTrigger: 'blur'
}
},
url: {
setLabel: '/project/payWorkingGroupSubitem/setLabel'
}
}
},
methods: {
show(ids) {
this.form.resetFields()
this.selectedIds = ids
this.visible = true
},
close() {
this.$emit('close')
this.visible = false
},
handleOk() {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let httpUrl = this.url.setLabel
let method = 'post'
const formData = Object.assign(this.model, values)
formData.subIds = that.selectedIds.join(',')
console.log('表单提交数据', formData)
httpAction(httpUrl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
handleCancel() {
this.close()
},
}
}
</script>
<style scoped>
</style>
+9 -3
View File
@@ -62,8 +62,10 @@
<!-- <a @click="handleDelete(record.id)" v-has="'sys:dict:del'">删除</a>-->
</span>
<template slot="text" slot-scope="text">
<span v-if="!text"></span>
<j-ellipsis :value="text" :length="10"></j-ellipsis>
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
</a-table>
@@ -108,7 +110,7 @@ export default {
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 120,
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
@@ -117,18 +119,21 @@ export default {
{
title: '字典名称',
align: 'left',
width: 120,
dataIndex: 'dictName',
scopedSlots: { customRender: 'text' }
},
{
title: '字典编号',
align: 'left',
width: 120,
dataIndex: 'dictCode',
scopedSlots: { customRender: 'text' }
},
{
title: '描述',
align: 'left',
width: 300,
dataIndex: 'description',
scopedSlots: { customRender: 'text' }
},
@@ -136,6 +141,7 @@ export default {
title: '操作',
dataIndex: 'action',
align: 'center',
width: 200,
scopedSlots: { customRender: 'action' }
}
],