<template> <view class="view"> <view class="block"> <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 企业名称 </view> <view class="value"> <uni-easyinput type="text" placeholder="请输入企业名称" :inputBorder="false" style="text-align: center" :value="form.enterprisesName" @blur="proofName" :clearable="false" :autoHeight="true" ref="nameRef" ></uni-easyinput> <u-icon name="arrow-right"></u-icon> </view> </view> <view class="block"> <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 企业地址 </view> <view class="value" @tap="chooseAddress"> <input class="input-value" type="text" placeholder-class="txt" placeholder="请选择企业地址" v-model="form.address" disabled /> <u-icon name="map"></u-icon> </view> </view> <view class="block"> <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 企业介绍 </view> <view class="value" @tap="goIntruduce"> <view class="input-textarea" v-if="form.introduction"> {{ form.introduction }} </view> <view class="input-textarea" style="color: #808080" v-else> 请输入企业介绍 </view> <u-icon name="arrow-right"></u-icon> </view> </view> <view class="upload-wrapper"> <view class="wd-flex" style=" justify-content: space-between; align-items: center; width: 100%; " > <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 企业照片 </view> <view style="color: #808080">最多可传3张</view> </view> <u-upload :fileList="form.photo" @afterRead="addEnterprisePhoto" @delete="delEnterprisePhoto" multiple :maxCount="3" width="101" height="101" ></u-upload> </view> <view class="block"> <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 企业标签 </view> <view class="value" @tap="goTags"> <view class="input-textarea" v-if="Object.keys(form.tags).length"> {{ Object.values(form.tags) .map(tag => tag.name) .join('、') }} </view> <view class="input-textarea" style="color: #808080" v-else> 请选择企业标签 </view> <u-icon name="arrow-right"></u-icon> </view> </view> <view class="block"> <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 企业负责人 </view> <view class="value"> <uni-easyinput type="text" placeholder="请输入企业负责人" :inputBorder="false" v-model="form.contactName" :clearable="false" :autoHeight="true" ></uni-easyinput> <u-icon name="arrow-right"></u-icon> </view> </view> <view class="block"> <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 负责人电话 </view> <view class="value"> <uni-easyinput type="text" placeholder="请输入负责人电话" :inputBorder="false" style="text-align: center" :value="form.environmentalContactPhone" @blur="proofphone" :clearable="false" :autoHeight="true" ></uni-easyinput> <u-icon name="arrow-right"></u-icon> </view> </view> <view class="upload-wrapper"> <view class="wd-flex" style=" justify-content: space-between; align-items: center; width: 100%; " > <view style=""> <text style="color: #f8285a; margin-right: 4px">*</text> 相关资质 </view> <view class="wd-flex" style="color: #17c653; gap: 4px; align-items: center" @tap="addProve" > <u-icon name="plus-circle" color="#17C653" size="14"></u-icon> <text style="line-height: 1rem">新增资质</text> </view> </view> <view class="prove" v-for="(p, index) in prove" :key="index" v-if="prove.length > 0" @tap="editProve(p)" > <image :src="p.photo[0].url" style="width: 90px; height: 70px" mode="widthFix" ></image> <view class="info"> <view class="wd-flex" style="gap: 8px; align-items: center"> <text class="label">资质名称</text> <view class="wd-font-800"> {{ $dict.echoDicValue( dictMap.enterprise_qua, p.qualificationName.toString() ) }} </view> </view> <view class="wd-flex" style="gap: 8px; align-items: center"> <text class="label">资质编号</text> <view class="wd-font-800"> {{ p.enterpriseAuth }} </view> </view> <view class="wd-flex" style="gap: 8px; align-items: center"> <text class="label">资质到期</text> <view class="wd-font-800"> {{ $util.formatDate(p.expiryDate, 'YYYY/M/D') }} </view> </view> </view> </view> </view> <cs-bottom-wrapper> <view class="operation"> <button class="btn green" @tap="submit">提交审核</button> </view> </cs-bottom-wrapper> </view> </template> <script> import { uploadFile } from '@/api/system/file.js' import { getDictBatchByType } from '@/api/system/dict.js' import { createEnterPrise, vertifyName, c } from '@/api/enterprise/index.js' export default { data() { return { form: { enterprisesName: '', address: '', gpsLocation: '', introduction: '', photo: [], tags: {}, environmentalContactPhone: '', contactName: '', id: '' }, dictMap: {}, prove: [], inviteId: '' } }, onLoad(res) { this.inviteId = res.inviteId this.getDict() }, onShow() { uni.$on('enterpriseIntroduce', data => { this.form.introduction = data.introduce }) uni.$on('enterpriseTag', data => { this.form.tags = data }) uni.$on('prove', data => { this.prove.push(data) }) }, methods: { proofName(v) { if (v.detail.value == '') return uni.showLoading({ title: '加载中' }) vertifyName({ pageSize: -1, pageNo: 1, onlyEnterprisesName: v.detail.value }).then(res => { if (res.data.total > 0) { uni.showToast({ title: '企业名已存在', icon: 'none' }) this.form.enterprisesName = '' } else { this.form.enterprisesName = v.detail.value } uni.hideLoading() }) }, proofphone(v) { // 校验手机号 const mobilePattern = /^1[3-9]\d{9}$/ // 中国手机号正则表达式 if (!mobilePattern.test(v.detail.value)) { uni.showToast({ title: '请输入有效的手机号', icon: 'none' }) this.form.environmentalContactPhone = '' } else { this.form.environmentalContactPhone = v.detail.value } }, /** * 获取字典 */ async getDict() { const dict = await getDictBatchByType({ type: ['enterprise_qua'].join(',') }) this.dictMap = { ...dict.data } }, chooseAddress() { uni.chooseLocation({ success: res => { this.form.address = res.address this.form.gpsLocation = res.latitude + ',' + res.longitude } }) }, goIntruduce() { uni.navigateTo({ url: `/sub/invite/enterpriseIntroduce?introduce=${this.form.introduction}` }) }, goTags() { uni.navigateTo({ url: `/sub/invite/enterpriseTags?tags=${JSON.stringify( this.form.tags )}` }) }, /** * 选择图片并上传 * @param {Object} e */ async addEnterprisePhoto(e) { uni.showLoading({ title: '上传中...' }) e.file.forEach(p => { this.form.photo.push({ ...p, status: 'uploading', message: '上传中' }) }) // 使用promise.all()方法上传到后端做统一接收 await Promise.all( this.form.photo.map(async (p, i) => { if (p.status == 'uploading') { const res = await uploadFile({ name: `file`, filePath: p.url }) return { ...res.data, status: 'success', message: '' } } return p }) ).then(res => { this.form.photo = res uni.hideLoading() }) }, /** * 删除图片 * @param {Object} e */ delEnterprisePhoto(e) { this.form.photo.splice(e.index, 1) }, addProve() { uni.navigateTo({ url: '/sub/invite/prove' }) }, editProve(prove) { uni.navigateTo({ url: `/sub/invite/prove?prove=${JSON.stringify(prove)}` }) }, async submit() { const valide = await this.verifyForm() if (!valide) return const data = { ...this.form } data.region = data.tags.qy.id // data.type = data.tags.qy.id data.tagIds = [data.tags.hy.id, data.tags.st.id, data.tags.wr.id] data.fileIds = data.photo.map(i => i.id) // data.userId = this.inviteId data.userId = 162 data.qualis = this.prove.map(i => { return { ...i, expiryDate: new Date(i.expiryDate).getTime(), files: i.photo.map(f => f.id) } }) if (this.form.id) { } else { console.log(data) createEnterPrise(data).then(res => { uni.showToast({ icon: 'none', title: '操作成功' }) uni.navigateBack() }) } }, async verifyForm() { const msgMap = { enterprisesName: '请输入企业名', address: '请选择企业地址', gpsLocation: '请选择企业地址', introduction: '请填写企业介绍', photo: '最少上传一张企业照片', tags: '请选择企业标签', prove: '请填写企业资质', environmentalContactPhone: '请输入企业负责人', contactName: '请输入负责人电话' } const msg = [] Object.keys(this.form).forEach(i => { if (!this.form[i] && i != 'id') { msg.push(msgMap[i]) } if (typeof this.form[i] == 'Object' && this.form[i].length == 0) { msg.push(msgMap[i]) } }) if (this.prove.length == 0) { msg.push(msgMap.prove) } if (msg.length > 0) { uni.showToast({ icon: 'none', title: msg.join('\n') }) return false } return true } } } </script> <style lang="scss" scoped> .view { padding: 12px; display: flex; flex-flow: column nowrap; gap: 12px; overflow: hidden; overflow-y: scroll; max-height: 100vh; padding-bottom: 12vh; } .block { display: flex; flex-flow: row nowrap; background-color: #fff; padding: 12px; border-radius: 8px; justify-content: space-between; align-items: center; gap: 12px; .value { flex: 1; display: flex; flex-flow: row nowrap; justify-content: space-between; gap: 4px; .input-value { flex: 1; text-align: right; white-space: nowrap; text-overflow: ellipsis; cursor: auto; display: block; font-family: UICTFontTextStyleBody; height: 1.4rem; min-height: 1.4rem; overflow: hidden; } .input-textarea { flex: 1; display: -webkit-box; overflow: hidden; text-align: right; max-height: 3rem; text-overflow: ellipsis; -webkit-line-clamp: 3; -webkit-box-orient: vertical; word-break: break-all; cursor: auto; display: block; font-family: UICTFontTextStyleBody; height: 1.4rem; min-height: 1.4rem; overflow: hidden; } } } .prove { border-radius: var(--Number-12px, 12px); border: 1px solid var(--LightMode-Grey-Grey-100, #f9f9f9); background: var(--LightMode-Light-Light, #fff); display: flex; padding: var(--Number-12px, 12px); align-items: center; gap: var(--Number-12px, 12px); font-size: 28rpx; flex-flow: row nowrap; .info { height: 72px; display: flex; flex-flow: column nowrap; justify-content: space-between; } } .upload-wrapper { display: flex; flex-flow: column nowrap; background-color: #fff; padding: 12px; border-radius: 8px; gap: 12px; } ::v-deep .uni-easyinput__content-input { flex: 1; text-align: right; white-space: nowrap; text-overflow: ellipsis; cursor: auto; display: block; font-family: UICTFontTextStyleBody; height: 1.4rem; min-height: 1.4rem; overflow: hidden; padding-right: 0; } ::v-deep .uni-easyinput__placeholder-class { flex: 1; text-align: right; white-space: nowrap; text-overflow: ellipsis; cursor: auto; display: block; font-family: UICTFontTextStyleBody; height: 1.4rem; min-height: 1.4rem; font-size: 14px; overflow: hidden; } .operation { padding: 12px; display: flex; align-items: center; justify-content: center; gap: 12px; .btn { flex: 1; border-radius: 8px; display: flex; padding: 12px 0; align-items: center; justify-content: center; } .green { background-color: $cs-color-main; color: #fff; } } </style>