YouKeChuanMei_VUE/src/views/mediaLibrary/mediaForm.vue
2025-11-14 18:03:57 +08:00

1232 lines
60 KiB
Vue

<template>
<el-card class="myMediaFormCard">
<template #header>
<div class="card-header">
<span>{{ formTitle }}</span>
<el-icon style="float: right;cursor: pointer;" @click="handleClose" v-if="showClose">
<Close />
</el-icon>
</div>
</template>
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="180px" class="myInsertForm">
<el-collapse class="my-collapse" v-model="activeNames" @change="handleChange">
<el-collapse-item title="业务部门" name="1">
<el-row :gutter="30" class="my_form_row">
<el-col :span="6">
<el-form-item label="业务部门" prop="dataScopeDeptId">
<el-select v-model="ruleForm.dataScopeDeptId" placeholder="请选择"
@change="handleChangeDept" clearable style="min-width: 30px;">
<el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName"
:value="item.deptId" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="媒体基础信息" name="2">
<el-row :gutter="30" class="my_form_row">
<el-col :span="6" v-if="ruleForm.id">
<el-form-item label="媒体编号">
<el-input v-model="ruleForm.mediaCode" placeholder="请输入" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="供应商/媒体形式/名称" prop="mediaName">
<el-input v-model="ruleForm.mediaName" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="供应商名称">
<el-select class="filterSelect" v-model="ruleForm.belongSupplierId"
@change="handleChoseSupplier" filterable remote reserve-keyword
:remote-method="getSupplierList" :loading="selectLoading" placeholder="请输入"
remote-show-suffix clearable style="min-width: 70px;">
<el-option v-for="item in supplierList" :key="item.supplierId"
:label="item.supplierName" :value="item.supplierId" />
<template #footer>
<div class="select-footer">
<el-button v-if="!isAddSuppliering" @click="onAddSupplierOption"
type="primary" text
style="justify-content: flex-start; width: 100%; color: #1a75e6;">
添加供应商
</el-button>
<template v-else>
<el-input v-model="addSupplierName" class="option-input"
placeholder="请输入供应商名称" />
<div class="footer-buttons">
<el-button class="my-confirm-btn" type="primary"
@click="onSupplierConfirm">确认</el-button>
<el-button class="my-cancel-btn"
@click="clearSupplier">取消</el-button>
</div>
</template>
</div>
</template>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="6">
<el-form-item label="媒体类型" prop="mediaType">
<el-select v-model="ruleForm.mediaType" placeholder="请选择" @change="getMediaTypeTwo"
clearable style="min-width: 30px">
<el-option v-for="item in mediaTypeOne" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="媒体大类" prop="mediaCategory">
<el-select v-model="ruleForm.mediaCategory" placeholder="请选择"
@change="getMediaTypeThree" clearable style="min-width: 30px">
<el-option v-for="item in mediaTypeTwo" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="展示形式" prop="displayForm">
<el-select v-model="ruleForm.displayForm" placeholder="请选择" clearable
style="min-width: 30px">
<el-option v-for="item in mediaTypeThree" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="6">
<el-form-item label="是否有照明" prop="hasLighting">
<el-select v-model="ruleForm.hasLighting" placeholder="请选择" style="min-width: 30px;"
clearable>
<el-option v-for="dict in whether_lighting" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="播放时间" prop="playbackTime">
<el-input v-model="ruleForm.playbackTime" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="MR">
<el-input v-model="ruleForm.mr" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="媒体流量">
<el-input v-model="ruleForm.dailyAvgVehicleFlow" placeholder="请输入"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="12">
<el-form-item label="媒体尺寸" prop="mediaSize">
<el-input v-model="ruleForm.mediaSize" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="媒体朝向" prop="mediaOrientation">
<el-input v-model="ruleForm.mediaOrientation" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="18">
<el-form-item label="城市" prop="mediaCity" style="margin-bottom: 0;">
<el-row :gutter="20" class="my_form_row">
<el-col :span="6">
<el-select v-model="ruleForm.provinceCode" placeholder="请选择"
@change="getCityList" clearable style="min-width: 30px">
<el-option v-for="item in province" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-col>
<el-col :span="6">
<el-select v-model="ruleForm.cityCode" placeholder="请选择" @change="getCountyList"
clearable style="min-width: 30px">
<el-option v-for="item in city" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-col>
<el-col :span="6">
<el-select v-model="ruleForm.areaCode" placeholder="请选择" @change="getTownList"
clearable style="min-width: 30px">
<el-option v-for="item in county" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-col>
<el-col :span="6">
<el-select v-model="ruleForm.townCode" placeholder="请选择" @change="setTown"
clearable style="min-width: 30px">
<el-option v-for="item in town" :key="item.id" :label="item.name"
:value="item.id" />
</el-select>
</el-col>
</el-row>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="区域属性" prop="businessDistrictId">
<el-select v-model="ruleForm.businessDistrictId" placeholder="请选择"
@change="handleChosebusiness" clearable style="min-width: 30px;">
<el-option v-for="item in businessAreaList" :key="item.id" :label="item.name"
:value="item.id" />
<template #footer>
<div class="select-footer">
<el-button v-if="!isAdding" @click="onAddOption" type="primary" text
style="justify-content: flex-start; width: 100%; color: #1a75e6;">
添加区域属性
</el-button>
<template v-else>
<el-input v-model="optionName" class="option-input"
placeholder="请输入区域属性名称" />
<div class="footer-buttons">
<el-button class="my-confirm-btn" type="primary"
@click="onConfirm">确认</el-button>
<el-button class="my-cancel-btn" @click="clear">取消</el-button>
</div>
</template>
</div>
</template>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="地址">
<el-input v-model="ruleForm.address" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="地理位置">
<el-input v-model="latVal" placeholder="请获取经纬度" readonly>
<template #append>
<el-button type="info" @click="handlePickLat">
<el-icon style="top: -4px">
<LocationInformation />
</el-icon>
</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="8">
<el-form-item label="最小购买周期">
<el-input v-model="ruleForm.minPurchaseCycle" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="首次制作安装费" prop="firstInstallFee">
<el-input v-model="ruleForm.firstInstallFee" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="换刊制作安装费" prop="changeInstallFee">
<el-input v-model="ruleForm.changeInstallFee" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="媒体报价信息" name="3">
<div v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<competitiveOffer ref="competitiveOfferRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</div>
<div v-if="ruleForm.dataScopeDeptName == '网络媒体事业部'">
<el-tabs v-model="activePriceType" @tab-click="handlePriceTypeClick">
<el-tab-pane label="门禁" name="门禁">
<accessControlPrice ref="accessControlPriceRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
<el-tab-pane label="候车厅" name="候车厅">
<waitingHallPrice ref="waitingHallPriceRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
<el-tab-pane label="道闸" name="道闸">
<barrierGatePrice ref="barrierGatePriceRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
<el-tab-pane label="地铁" name="地铁">
<subwayPrice ref="subwayPriceRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
<el-tab-pane label="高铁" name="高铁">
<highSpeedRailway ref="highSpeedRailwayRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
<el-tab-pane label="写字楼" name="写字楼">
<officeBuilding ref="officeBuildingRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
<el-tab-pane label="车库灯箱" name="车库灯箱">
<garageLightBox ref="garageLightBoxRef"
@setCompetOfferMediaPrice="handleSetCompetOfferMediaPrice" />
</el-tab-pane>
</el-tabs>
</div>
</el-collapse-item>
<el-collapse-item title="媒体深度信息" name="4">
<el-row :gutter="30" class="my_form_row">
<el-col :span="6">
<el-form-item label="媒体归属名称">
<el-input v-model="ruleForm.belongName" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="联系人">
<el-input v-model="ruleForm.contactUserName" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="联系电话" prop="business">
<el-input v-model="ruleForm.contactUserPhone" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="媒体是否有改造" prop="business">
<el-select v-model="ruleForm.hasReform" placeholder="请选择" style="min-width: 30px;"
clearable>
<el-option v-for="item in hasReformList" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="6">
<el-form-item label="发票类型">
<el-select v-model="ruleForm.invoiceType" placeholder="请选择" style="min-width: 30px;"
clearable>
<el-option v-for="dict in invoice_type" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="税点">
<el-input v-model="ruleForm.taxRate" placeholder="请输入">
<template #suffix>
<span>%</span>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="付款要求">
<el-input v-model="ruleForm.paymentRequirements" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="媒体公司名称" prop="business">
<el-input v-model="ruleForm.mediaCompanyName" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="6">
<el-form-item label="物业公司名称" prop="business">
<el-input v-model="ruleForm.propertyCompanyName" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审批部门" prop="business">
<el-input v-model="ruleForm.approvalDept" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="批文情况">
<el-select v-model="ruleForm.approvalSituation" placeholder="请选择" clearable
style="min-width: 30px;">
<el-option v-for="dict in approval_document_status" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="批文发布时间">
<el-date-picker v-model="ruleForm.approvalReleaseTime" style="width: 100%;" type="date"
placeholder="请选择" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="6">
<el-form-item label="媒体独家授权" prop="business">
<el-input v-model="ruleForm.soleAgentAuth" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="独家授权时间">
<el-date-picker v-model="ruleForm.soleAgentAuthTime" style="width: 100%;" type="date"
placeholder="请选择" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="媒体行业授权" prop="business">
<el-input v-model="ruleForm.industryAuth" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="媒体行业授权时间">
<el-date-picker v-model="ruleForm.industryAuthTime" style="width: 100%;" type="date"
placeholder="请选择" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="行业限制" prop="business">
<el-input v-model="ruleForm.industryLimit" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="媒体曾经经营公司" prop="business">
<el-input v-model="ruleForm.everManagerCompany" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="媒体时间线" prop="business">
<el-input v-model="ruleForm.mediaTimeline" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="曾经媒体情况" prop="business">
<el-input v-model="ruleForm.everMediaSituation" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="媒体历史事件" prop="business">
<el-input v-model="ruleForm.mediaHistory" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '网络媒体事业部'">
<el-col :span="24">
<el-form-item label="同类媒体公司" prop="business">
<el-input v-model="ruleForm.equalsMediaCompany" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="其他" prop="business">
<el-input v-model="ruleForm.other" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="批文文件">
<multiFileUpload ref="approvalDocumentRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="独家授权文件">
<multiFileUpload ref="exclusiveLicenseFileRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="媒体行业授权文件">
<multiFileUpload ref="mediaLicenseFileRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '网络媒体事业部'">
<el-col :span="24">
<el-form-item label="媒体归属附件">
<multiFileUpload ref="mediaOwnershipRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="曾经媒体照片">
<multiFileUpload ref="onceMediaPhotoRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="其他信息" name="5">
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="优势">
<el-input v-model="ruleForm.advantages" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="ruleForm.remark" :rows="5" type="textarea"
placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="图片上传">
<multiFileUpload ref="mediaPicRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row">
<el-col :span="24">
<el-form-item label="视频上传">
<multiFileUpload ref="mediaVideoRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="盖章刊例">
<multiFileUpload ref="stampedPublicationRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="资质文件">
<multiFileUpload ref="qualificationFileRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="媒体链条">
<multiFileUpload ref="mediaChainRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '优势媒体事业部'">
<el-col :span="24">
<el-form-item label="刊例照片">
<multiFileUpload ref="journalCataloguePhotoRef" @set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30" class="my_form_row" v-if="ruleForm.dataScopeDeptName == '网络媒体事业部'">
<el-col :span="24">
<el-form-item label="MR和制作要求">
<multiFileUpload ref="mRProductionRequirementsRef"
@set-form-file="handleSetMediaFile" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
<template #footer>
<el-button type="primary" class="submitBtn" @click="handleSubmit">提交信息</el-button>
</template>
<pickLat ref="pickLatRef" @closePickLat="handleClosePickLat" />
</el-card>
</template>
<script setup>
import { onMounted, nextTick, defineEmits, ref } from 'vue'
import { Close, LocationInformation } from '@element-plus/icons-vue'
import { addBusSupplier, listBusSupplier, getBusSupplier } from "@/api/supplier"
import { sysRegionListByPid } from "@/api/system/administrativeRegion"
import { sysMediaTypeListByPid } from "@/api/system/mediaType"
import { listDept } from "@/api/system/dept"
import { busTradingAreaPage, addBusTradingArea } from "@/api/system/businessArea"
import { addMedia, updateMedia, mediaDetail } from "@/api/mediaLibrary"
import multiFileUpload from '../../components/FileUpload/multiFileUpload.vue'
import pickLat from './pickLat.vue'
import competitiveOffer from './components/competitiveOffer.vue'
import accessControlPrice from './components/accessControlPrice.vue'
import waitingHallPrice from './components/waitingHallPrice.vue'
import barrierGatePrice from './components/barrierGatePrice.vue'
import subwayPrice from './components/subwayPrice.vue'
import highSpeedRailway from './components/highSpeedRailway.vue'
import officeBuilding from './components/officeBuilding.vue'
import garageLightBox from './components/garageLightBox.vue'
const { proxy } = getCurrentInstance()
const emit = defineEmits(['handleShowList']);
const showClose = ref(true)
// 表单标题
const formTitle = ref('新建')
// 网络报价类型
const activePriceType = ref('门禁')
// 选择的经纬度
const latVal = ref(null)
const pickLatRef = ref(null)
// 报价信息列表
const mediaPrice = ref([])
// 优势媒体报价组件
const competitiveOfferRef = ref(null)
// 网络媒体门禁报价组件
const accessControlPriceRef = ref(null)
// 网络媒体门候车厅报价组件
const waitingHallPriceRef = ref(null)
// 网络媒体道闸报价组件
const barrierGatePriceRef = ref(null)
// 网络媒体地铁报价组件
const subwayPriceRef = ref(null)
// 网络媒体高铁报价组件
const highSpeedRailwayRef = ref(null)
// 网络媒体写字楼报价组件
const officeBuildingRef = ref(null)
// 网络媒体车库灯箱报价组件
const garageLightBoxRef = ref(null)
// 附件信息
const mediaFile = ref([])
// 批文文件组件
const approvalDocumentRef = ref(null)
// 独家授权文件
const exclusiveLicenseFileRef = ref(null)
// 媒体行业授权文件
const mediaLicenseFileRef = ref(null)
// 媒体归属附件
const mediaOwnershipRef = ref(null)
// 曾经媒体照片
const onceMediaPhotoRef = ref(null)
// 图片上传
const mediaPicRef = ref(null)
// 视频上传
const mediaVideoRef = ref(null)
// 盖章刊例
const stampedPublicationRef = ref(null)
// 资质文件
const qualificationFileRef = ref(null)
// 媒体链条
const mediaChainRef = ref(null)
// 刊例照片
const journalCataloguePhotoRef = ref(null)
// MR和制作要求
const mRProductionRequirementsRef = ref(null)
// 自定义添加区域属性
const isAdding = ref(false)
const optionName = ref('')
// 自定义添加供应商
const isAddSuppliering = ref(false)
const addSupplierName = ref('')
// 媒体类型数据
const mediaTypeOne = ref([])
const mediaTypeTwo = ref([])
const mediaTypeThree = ref([])
// 省、市、县、镇数据
const province = ref([])
const city = ref([])
const county = ref([])
const town = ref([])
// 业务部门
const deptList = ref([])
// 归属选项
const supplierList = ref([])
const selectLoading = ref(false)
// 区域属性信息列表
const businessAreaList = ref([])
// 是否有改造
const hasReformList = ref([
{ value: 0, label: '否' },
{ value: 1, label: '是' }
])
const data = reactive({
ruleForm: {},
rules: {
dataScopeDeptId: [{ required: true, message: "业务部门不能为空", trigger: "change" }],
mediaName: [{ required: true, message: "媒体形式/名称不能为空", trigger: "blur" }],
mediaType: [{ required: true, message: "媒体类型不能为空", trigger: "change" }],
mediaCategory: [{ required: true, message: "媒体大类不能为空", trigger: "change" }],
hasLighting: [{ required: true, message: "是否有照明不能为空", trigger: "change" }],
playbackTime: [{ required: true, message: "播放时间不能为空", trigger: "change" }],
mediaSize: [{ required: true, message: "媒体尺寸不能为空", trigger: "blur" }],
mediaOrientation: [{ required: true, message: "媒体朝向不能为空", trigger: "blur" }],
mediaCity: [{ required: true, message: "城市不能为空", trigger: "change" }],
businessDistrictId: [{ required: true, message: "区域属性不能为空", trigger: "change" }],
firstInstallFee: [{ required: true, message: "首次制作安装费不能为空", trigger: "blur" }],
changeInstallFee: [{ required: true, message: "换刊制作安装费不能为空", trigger: "blur" }],
},
})
const { ruleForm, rules } = toRefs(data)
const { whether_lighting, invoice_type, approval_document_status } = proxy.useDict("whether_lighting", "invoice_type", "approval_document_status")
const activeNames = ref(['1', '2', '3', '4', '5'])
// 折叠面板点击
const handleChange = (val) => {
activeNames.value = val
}
// 报价类型切换
const handlePriceTypeClick = (tab, event) => {
activePriceType.value = tab.props.name
if (activePriceType.value == '门禁') accessControlPriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (activePriceType.value == '候车厅') waitingHallPriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (activePriceType.value == '道闸') barrierGatePriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (activePriceType.value == '地铁') subwayPriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (activePriceType.value == '高铁') highSpeedRailwayRef.value.getMediaPrice(ruleForm.value.id, true)
if (activePriceType.value == '写字楼') officeBuildingRef.value.getMediaPrice(ruleForm.value.id, true)
if (activePriceType.value == '车库灯箱') garageLightBoxRef.value.getMediaPrice(ruleForm.value.id, true)
}
// 打开拾取经纬度弹窗
const handlePickLat = () => {
pickLatRef.value.loadMap()
}
const handleClosePickLat = (backValue) => {
latVal.value = backValue.lat + ',' + backValue.lng
ruleForm.value.mapX = backValue.lng //经度
ruleForm.value.mapY = backValue.lat //纬度
}
// 业务部门切换
const handleChangeDept = (val) => {
const choseDep = deptList.value.filter(item => item.deptId == val)[0]
ruleForm.value.dataScopeDeptId = choseDep?.deptId
ruleForm.value.dataScopeDeptName = choseDep?.deptName
nextTick(() => {
if (ruleForm.value.dataScopeDeptName == '优势媒体事业部' && competitiveOfferRef.value) competitiveOfferRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '门禁') accessControlPriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '候车厅') waitingHallPriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '道闸') barrierGatePriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '地铁') subwayPriceRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '高铁') highSpeedRailwayRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '写字楼') officeBuildingRef.value.getMediaPrice(ruleForm.value.id, true)
if (ruleForm.value.dataScopeDeptName == '网络媒体事业部' && activePriceType.value == '车库灯箱') garageLightBoxRef.value.getMediaPrice(ruleForm.value.id, true)
// 批文文件-1,独家授权文件-2,媒体行业授权文件-3,媒体归属附件-4,曾经媒体照片-5,图片上传-6,视频上传-7,盖章刊例-8, 资质文件-9, 媒体链条-10, 刊例照片-11,MR和制作要求-12
if (approvalDocumentRef.value) approvalDocumentRef.value._fileType = 1;
if (exclusiveLicenseFileRef.value) exclusiveLicenseFileRef.value._fileType = 2;
if (mediaLicenseFileRef.value) mediaLicenseFileRef.value._fileType = 3;
if (mediaOwnershipRef.value) mediaOwnershipRef.value._fileType = 4;
if (onceMediaPhotoRef.value) onceMediaPhotoRef.value._fileType = 5;
if (mediaPicRef.value) mediaPicRef.value._fileType = 6;
if (mediaVideoRef.value) mediaVideoRef.value._fileType = 7;
if (stampedPublicationRef.value) stampedPublicationRef.value._fileType = 8;
if (qualificationFileRef.value) qualificationFileRef.value._fileType = 9;
if (mediaChainRef.value) mediaChainRef.value._fileType = 10;
if (journalCataloguePhotoRef.value) journalCataloguePhotoRef.value._fileType = 11;
if (mRProductionRequirementsRef.value) mRProductionRequirementsRef.value._fileType = 12;
})
}
// 选择区域属性
const handleChosebusiness = (val) => {
const choseBusiness = businessAreaList.value.filter(item => item.id == val)[0]
ruleForm.value.businessDistrictName = choseBusiness?.name
}
// 打开添加区域属性输入框
const onAddOption = () => {
isAdding.value = true
}
// 确认添加区域属性
const onConfirm = () => {
if (optionName.value) {
const paramsForm = {
provinceId: ruleForm.value.provinceCode,
cityId: ruleForm.value.cityCode,
countyId: ruleForm.value.areaCode,
townId: ruleForm.value.townCode,
name: optionName.value
}
addBusTradingArea(paramsForm).then(response => {
clear()
getbusinessAreaList()
})
}
}
// 取消添加区域属性
const clear = () => {
optionName.value = ''
isAdding.value = false
}
// 打开添加供应商输入框
const onAddSupplierOption = () => {
isAddSuppliering.value = true
}
// 确认添加供应商
const onSupplierConfirm = () => {
if (addSupplierName.value) {
const paramsForm = {
supplierName: addSupplierName.value
}
addBusSupplier(paramsForm).then(response => {
clearSupplier()
supplierList.value = []
listBusSupplier({ keyword: addSupplierName.value }).then(res => {
supplierList.value = res.data
})
})
}
}
// 取消添加供应商
const clearSupplier = () => {
addSupplierName.value = ''
isAddSuppliering.value = false
}
// 选择供应商
const handleChoseSupplier = (val) => {
const choseSupplier = supplierList.value.filter(item => item.supplierId == val)[0]
ruleForm.value.belongSupplierId = choseSupplier?.supplierId
ruleForm.value.belongSupplierName = choseSupplier?.supplierName
}
// 获取一级媒体类型
const getMediaTypeOne = () => {
sysMediaTypeListByPid({ parentId: 0 }).then(res => {
ruleForm.value.mediaCategory = undefined
mediaTypeOne.value = res.data
})
}
// 获取二级媒体类型
const getMediaTypeTwo = (value) => {
sysMediaTypeListByPid({ parentId: value }).then(res => {
ruleForm.value.displayForm = undefined
mediaTypeTwo.value = res.data
})
}
// 获取三级媒体类型
const getMediaTypeThree = (value) => {
sysMediaTypeListByPid({ parentId: value }).then(res => {
mediaTypeThree.value = res.data
})
}
// 获取业务部门
const getDepList = () => {
listDept({ businessFlag: 1 }).then(response => {
deptList.value = response.data
})
}
// 查询条件获取供应商
const getSupplierList = (queryText) => {
if (queryText) {
selectLoading.value = true
listBusSupplier({ keyword: queryText }).then(res => {
supplierList.value = res.data
selectLoading.value = false
})
} else {
selectLoading.value = false
supplierList.value = []
}
}
// 获取省/直辖市数据
const getProvinceList = () => {
sysRegionListByPid({ parentId: '0' }).then(res => {
province.value = res.data
})
}
// 获取地级市/区数据
const getCityList = (value) => {
var choseProvince = province.value.filter(item => item.id == value)[0]
if (choseProvince) {
ruleForm.value.mediaCity = choseProvince.name
ruleForm.value.provinceName = choseProvince.name
} else {
ruleForm.value.mediaCity = undefined
ruleForm.value.provinceCode = undefined
ruleForm.value.provinceName = undefined
ruleForm.value.cityCode = undefined
ruleForm.value.cityName = undefined
ruleForm.value.areaCode = undefined
ruleForm.value.areaName = undefined
ruleForm.value.townCode = undefined
ruleForm.value.townName = undefined
}
sysRegionListByPid({ parentId: value }).then(res => {
ruleForm.value.cityCode = undefined
ruleForm.value.cityName = undefined
ruleForm.value.areaCode = undefined
ruleForm.value.areaName = undefined
ruleForm.value.townCode = undefined
ruleForm.value.townName = undefined
city.value = res.data
})
getbusinessAreaList()
}
// 获取区/县数据
const getCountyList = (value) => {
var choseCity = city.value.filter(item => item.id == value)[0]
if (choseCity) {
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + choseCity.name
ruleForm.value.cityName = choseCity.name
} else {
ruleForm.value.cityCode = undefined
ruleForm.value.cityName = undefined
ruleForm.value.areaCode = undefined
ruleForm.value.areaName = undefined
ruleForm.value.townCode = undefined
ruleForm.value.townName = undefined
}
sysRegionListByPid({ parentId: value }).then(res => {
ruleForm.value.areaCode = undefined
ruleForm.value.areaName = undefined
ruleForm.value.townCode = undefined
ruleForm.value.townName = undefined
county.value = res.data
})
getbusinessAreaList()
}
// 获取镇数据
const getTownList = (value) => {
var choseCounty = county.value.filter(item => item.id == value)[0]
if (choseCounty) {
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + ruleForm.value.cityName + '/' + choseCounty.name
ruleForm.value.areaName = choseCounty.name
} else {
ruleForm.value.areaCode = undefined
ruleForm.value.areaName = undefined
ruleForm.value.townCode = undefined
ruleForm.value.townName = undefined
}
sysRegionListByPid({ parentId: value }).then(res => {
ruleForm.value.townCode = undefined
ruleForm.value.townName = undefined
town.value = res.data
})
getbusinessAreaList()
}
// 设置末级城市
const setTown = (value) => {
var choseTown = town.value.filter(item => item.id == value)[0]
if (choseTown) {
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + ruleForm.value.cityName + '/' + ruleForm.value.areaName + '/' + choseTown.name
ruleForm.value.townName = choseTown.name
} else {
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + ruleForm.value.cityName + '/' + ruleForm.value.areaName
ruleForm.value.townName = undefined
}
getbusinessAreaList()
}
// 详情信息联动 设置区/县数据
const getCityList2 = (value) => {
sysRegionListByPid({ parentId: value }).then(res => {
city.value = res.data
})
}
const getCountyList2 = (value) => {
sysRegionListByPid({ parentId: value }).then(res => {
county.value = res.data
})
}
const getTownList2 = (value) => {
sysRegionListByPid({ parentId: value }).then(res => {
town.value = res.data
})
}
// 依据省市县镇查询区域属性
const getbusinessAreaList = (val) => {
const _params = {
pageIndex: 1,
pageSize: 200,
provinceId: ruleForm.value.provinceCode,
cityId: ruleForm.value.cityCode,
countyId: ruleForm.value.areaCode,
townId: ruleForm.value.townCode,
}
busTradingAreaPage(_params).then(res => {
if (res.code == 200) {
businessAreaList.value = res.data.list
}
})
}
// 详情信息设置媒体类型
const getMediaTypeTwo2 = (value) => {
sysMediaTypeListByPid({ parentId: value }).then(res => {
mediaTypeTwo.value = res.data
})
}
const getMediaTypeThree2 = (value) => {
sysMediaTypeListByPid({ parentId: value }).then(res => {
mediaTypeThree.value = res.data
})
}
// 设置文件结果
const handleSetMediaFile = (_fileType, _files) => {
// 获取当前的所有文件
const currentFiles = [...mediaFile.value]; // 创建副本以避免直接修改原数组
// 过滤掉指定类型的旧文件
const filteredFiles = currentFiles.filter(item => item.fileType !== _fileType);
// 如果新文件存在,则添加到过滤后的数组中
if (_files.length > 0) {
filteredFiles.push(..._files); // 使用 push 追加新文件
mediaFile.value = filteredFiles; // 更新 ref
} else {
// 如果没有新文件,仍然需要更新 mediaFile.value 以反映过滤结果
mediaFile.value = filteredFiles;
}
}
// 设置媒体价格
const handleSetCompetOfferMediaPrice = (mediaType, _priceList) => {
// 先按类型去除旧的报价数据
const cachPriceList = mediaPrice.value.filter(item => item.mediaType !== mediaType)
// 将新的数据追加进结果
if (_priceList.length > 0) mediaPrice.value = cachPriceList.concat(_priceList)
else mediaPrice.value = cachPriceList
}
const handleSubmit = () => {
proxy.$refs["ruleFormRef"].validate(valid => {
if (valid) {
if (ruleForm.value.dataScopeDeptName == '优势媒体事业部') {
mediaFile.value = mediaFile.value.filter(item => [1, 2, 3, 5, 6, 7, 8, 9, 10, 11].includes(item.fileType))
ruleForm.value.mediaPrice = mediaPrice.value.filter(item => item.mediaType == 0)
} else if (ruleForm.value.dataScopeDeptName == '网络媒体事业部') {
mediaFile.value = mediaFile.value.filter(item => [4, 5, 6, 7, 12].includes(item.fileType))
ruleForm.value.mediaPrice = mediaPrice.value.filter(item => [1, 2, 3, 4, 5, 6, 7].includes(item.mediaType))
}
ruleForm.value.mediaFile = mediaFile.value
ruleForm.value.displayForm = ruleForm.value.displayForm ? ruleForm.value.displayForm : -1
if (ruleForm.value.id != undefined) {
updateMedia(ruleForm.value).then(response => {
proxy.$modal.msgSuccess("修改成功")
emit('handleShowList')
})
} else {
addMedia(ruleForm.value).then(response => {
proxy.$modal.msgSuccess("新增成功")
emit('handleShowList')
})
}
}
})
}
const handleClose = () => {
emit('handleShowList')
}
// 获取供应商详情,设置供应商名称反渲染
const getSupplierInfo = () => {
getBusSupplier(ruleForm.value.belongSupplierId).then(res => {
supplierList.value = [{ supplierId: res.data.supplierId, supplierName: res.data.supplierName }]
})
}
// 获取媒体详情
const getMediaInfo = () => {
mediaDetail({ mediaId: ruleForm.value.id }).then(res => {
ruleForm.value = res.data
mediaFile.value = ruleForm.value.mediaFile
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + ruleForm.value.cityName + '/' + ruleForm.value.areaName + '/' + ruleForm.value.townName
if (ruleForm.value.mapY && ruleForm.value.mapX) latVal.value = ruleForm.value.mapY + ',' + ruleForm.value.mapX
if (ruleForm.value.belongSupplierId) getSupplierInfo()
handleChangeDept(res.data.dataScopeDeptId)
if (ruleForm.value.mediaFile && ruleForm.value.mediaFile.length > 0) {
if (approvalDocumentRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 1)
approvalDocumentRef.value.setFileInfo(fileList)
}
if (exclusiveLicenseFileRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 2)
exclusiveLicenseFileRef.value.setFileInfo(fileList)
}
if (mediaLicenseFileRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 3)
mediaLicenseFileRef.value.setFileInfo(fileList)
}
if (mediaOwnershipRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 4)
mediaOwnershipRef.value.setFileInfo(fileList)
}
if (onceMediaPhotoRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 5)
onceMediaPhotoRef.value.setFileInfo(fileList)
}
if (mediaPicRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 6)
mediaPicRef.value.setFileInfo(fileList)
}
if (mediaVideoRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 7)
mediaVideoRef.value.setFileInfo(fileList)
}
if (stampedPublicationRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 8)
stampedPublicationRef.value.setFileInfo(fileList)
}
if (qualificationFileRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 9)
qualificationFileRef.value.setFileInfo(fileList)
}
if (mediaChainRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 10)
mediaChainRef.value.setFileInfo(fileList)
}
if (journalCataloguePhotoRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 11)
journalCataloguePhotoRef.value.setFileInfo(fileList)
}
if (mRProductionRequirementsRef.value) {
const fileList = ruleForm.value.mediaFile.filter(item => item.fileType == 12)
mRProductionRequirementsRef.value.setFileInfo(fileList)
}
}
handleResponse(res)
})
}
// 刷新联动数据
async function handleResponse(response) {
const promises = [];
if (response.data.provinceCode) {
promises.push(getCityList2(response.data.provinceCode));
}
if (response.data.cityCode) {
promises.push(getCountyList2(response.data.cityCode));
}
if (response.data.areaCode) {
promises.push(getTownList2(response.data.areaCode));
}
if (response.data.mediaType) {
promises.push(getMediaTypeTwo2(response.data.mediaType));
}
if (response.data.mediaCategory) {
promises.push(getMediaTypeThree2(response.data.mediaCategory));
}
getbusinessAreaList()
// 等待所有请求完成
await Promise.all(promises);
}
// 初始化
const initForm = (_formTitle, _ruleForm) => {
showClose.value = true
formTitle.value = _formTitle
ruleForm.value = _ruleForm
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + ruleForm.value.cityName + '/' + ruleForm.value.areaName + '/' + ruleForm.value.townName
if (ruleForm.value.mapY && ruleForm.value.mapX) latVal.value = ruleForm.value.mapY + ',' + ruleForm.value.mapX
getDepList()
getMediaTypeOne()
getProvinceList()
if (ruleForm.value.id) getMediaInfo()
}
// 工作台链接过来的
const linkInitForm = (_formTitle, _ruleForm) => {
showClose.value = false
formTitle.value = _formTitle
ruleForm.value = _ruleForm
ruleForm.value.mediaCity = ruleForm.value.provinceName + '/' + ruleForm.value.cityName + '/' + ruleForm.value.areaName + '/' + ruleForm.value.townName
if (ruleForm.value.mapY && ruleForm.value.mapX) latVal.value = ruleForm.value.mapY + ',' + ruleForm.value.mapX
getDepList()
getMediaTypeOne()
getProvinceList()
if (ruleForm.value.id) getMediaInfo()
}
// 暴露方法\属性给父组件
defineExpose({
initForm,
linkInitForm
});
</script>
<style lang='scss'>
.el-upload--picture-card {
width: 80px;
height: 80px;
border-radius: 4px;
}
.viewFile {
width: 80px;
height: 80px;
border: 1px solid #dedede;
border-radius: 4px;
}
.upload-container {
position: relative;
display: inline-block;
}
.image-wrapper {
position: relative;
width: 80px;
height: 80px;
margin-right: 20px;
overflow: hidden;
}
.avatar {
object-fit: cover;
}
.actions {
position: absolute;
top: 0;
right: 0;
display: none;
}
.image-wrapper:hover .actions {
display: block;
}
.delete {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
background: rgba(0, 0, 0, 0.5);
color: white;
border-radius: 50%;
cursor: pointer;
margin: 5px;
transition: background 0.3s;
&:hover {
background: rgba(0, 0, 0, 0.7);
}
}
.pickMapContainer {
width: 100%;
height: calc(100vh - 316px);
background: #3f8bff;
}
.select-footer {
padding: 0px;
display: flex;
flex-direction: column;
gap: 0px;
}
.option-input {
margin-bottom: 10px;
}
.footer-buttons {
display: flex;
gap: 30px;
}
</style>