Compare commits
4 Commits
c024fc8ca2
...
9f2acfee68
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f2acfee68 | ||
|
|
063ab62109 | ||
|
|
cc4bbc4dbe | ||
|
|
687b196fbe |
BIN
public/jzTemplate/候车厅校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/候车厅校准平台模板.xlsx
Normal file
Binary file not shown.
BIN
public/jzTemplate/写字楼校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/写字楼校准平台模板.xlsx
Normal file
Binary file not shown.
BIN
public/jzTemplate/地铁校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/地铁校准平台模板.xlsx
Normal file
Binary file not shown.
BIN
public/jzTemplate/车库灯箱校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/车库灯箱校准平台模板.xlsx
Normal file
Binary file not shown.
BIN
public/jzTemplate/道闸校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/道闸校准平台模板.xlsx
Normal file
Binary file not shown.
BIN
public/jzTemplate/门禁校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/门禁校准平台模板.xlsx
Normal file
Binary file not shown.
BIN
public/jzTemplate/高铁校准平台模板.xlsx
Normal file
BIN
public/jzTemplate/高铁校准平台模板.xlsx
Normal file
Binary file not shown.
|
|
@ -97,6 +97,7 @@ export function updateUserPwd(oldPassword, newPassword) {
|
|||
return request({
|
||||
url: '/system/user/profile/updatePwd',
|
||||
method: 'put',
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1175,7 +1175,9 @@ h6 {
|
|||
.myInsertForm .el-tabs__item.is-active,
|
||||
.myDetailForm .el-tabs__item.is-active,
|
||||
.my_dialog .el-tabs__item.is-active,
|
||||
.el-tabs__item:hover {
|
||||
.myInsertForm .el-tabs__item:hover,
|
||||
.myDetailForm .el-tabs__item:hover,
|
||||
.my_dialog .el-tabs__item:hover {
|
||||
font-family: Microsoft YaHei;
|
||||
font-weight: 600;
|
||||
font-size: 22px;
|
||||
|
|
|
|||
|
|
@ -18,8 +18,24 @@
|
|||
<img :src="icon_feedback" class="custom-icon" @click="handleFeedBack" />
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" />
|
||||
<span class="user-nickname"> {{ userStore.name }} </span>
|
||||
<!-- <img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" /> -->
|
||||
<el-dropdown @command="handleCommand" class="avatar-container right-menu-item hover-effect" trigger="hover">
|
||||
<div class="avatar-wrapper">
|
||||
<img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" />
|
||||
<span class="user-nickname"> {{ userStore.name }} </span>
|
||||
</div>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<router-link to="/user/profile">
|
||||
<el-dropdown-item>个人中心</el-dropdown-item>
|
||||
</router-link>
|
||||
<!-- <el-dropdown-item divided command="logout">
|
||||
<span>退出登录</span>
|
||||
</el-dropdown-item> -->
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
|
||||
<div class="logout_icon">
|
||||
<el-tooltip class="box-item" effect="dark" content="退出" placement="bottom-start">
|
||||
<img :src="logout_icon" class="custom-icon" @click="logout" />
|
||||
|
|
@ -70,10 +86,10 @@ import useSettingsStore from '@/store/modules/settings'
|
|||
import { addSysReaddBusProblemFeedbackgion } from "@/api/problemFeedback"
|
||||
|
||||
const appStore = useAppStore()
|
||||
const userStore = useUserStore()
|
||||
const userStore = useUserStore()
|
||||
const settingsStore = useSettingsStore()
|
||||
const { proxy } = getCurrentInstance()
|
||||
|
||||
|
||||
function toggleSideBar() {
|
||||
appStore.toggleSideBar()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,8 +15,8 @@ const useSettingsStore = defineStore(
|
|||
state: () => ({
|
||||
title: '',
|
||||
theme: storageSetting.theme || '#409EFF',
|
||||
sideTheme: storageSetting.sideTheme || sideTheme,
|
||||
showSettings: showSettings,
|
||||
sideTheme: 'theme-light', //storageSetting.sideTheme || sideTheme,
|
||||
showSettings: false, //showSettings,
|
||||
topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
|
||||
tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
|
||||
tagsIcon: storageSetting.tagsIcon === undefined ? tagsIcon : storageSetting.tagsIcon,
|
||||
|
|
@ -25,7 +25,7 @@ const useSettingsStore = defineStore(
|
|||
dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle,
|
||||
footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible,
|
||||
footerContent: footerContent,
|
||||
isDark: isDark.value
|
||||
isDark: false, // isDark.value
|
||||
}),
|
||||
actions: {
|
||||
// 修改布局设置
|
||||
|
|
@ -42,8 +42,8 @@ const useSettingsStore = defineStore(
|
|||
},
|
||||
// 切换暗黑模式
|
||||
toggleTheme() {
|
||||
this.isDark = !this.isDark
|
||||
toggleDark()
|
||||
// this.isDark = !this.isDark
|
||||
// toggleDark()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
</el-checkbox-group>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="媒体报价信息" name="second">
|
||||
<el-button-group class="mb10">
|
||||
<el-button-group class="exportGroup mb10">
|
||||
<el-button v-for="(item, index) in ToolOptions" :key="index"
|
||||
:type="activeIndex === index ? 'primary' : 'default'" @click="handleChangeType(index)">
|
||||
{{ item }}
|
||||
|
|
@ -81,6 +81,170 @@ const exportOpen = ref(false)
|
|||
const activeName = ref('first')
|
||||
const curDeptIds = ref(null)
|
||||
|
||||
// 优势基础字段
|
||||
const ysBaseFild = ref([
|
||||
{
|
||||
displayName: "媒体名称",
|
||||
propertyPath: "mediaName"
|
||||
},
|
||||
{
|
||||
displayName: "媒体类型",
|
||||
propertyPath: "mediaTypeStr"
|
||||
},
|
||||
{
|
||||
displayName: "媒体大类",
|
||||
propertyPath: "mediaCategoryStr"
|
||||
},
|
||||
{
|
||||
displayName: "展示形式",
|
||||
propertyPath: "displayFormStr"
|
||||
},
|
||||
{
|
||||
displayName: "是否照明",
|
||||
propertyPath: "hasLighting"
|
||||
},
|
||||
{
|
||||
displayName: "播放时间",
|
||||
propertyPath: "playbackTime"
|
||||
},
|
||||
{
|
||||
displayName: "媒体尺寸",
|
||||
propertyPath: "mediaSize"
|
||||
},
|
||||
{
|
||||
displayName: "MR",
|
||||
propertyPath: "mr"
|
||||
},
|
||||
{
|
||||
displayName: "日均车流量",
|
||||
propertyPath: "dailyAvgVehicleFlow"
|
||||
},
|
||||
{
|
||||
displayName: "媒体朝向",
|
||||
propertyPath: "mediaOrientation"
|
||||
},
|
||||
{
|
||||
displayName: "省",
|
||||
propertyPath: "provinceName"
|
||||
},
|
||||
{
|
||||
displayName: "市",
|
||||
propertyPath: "cityName"
|
||||
},
|
||||
{
|
||||
displayName: "区",
|
||||
propertyPath: "areaName"
|
||||
},
|
||||
{
|
||||
displayName: "镇",
|
||||
propertyPath: "townName"
|
||||
},
|
||||
{
|
||||
displayName: "商圈",
|
||||
propertyPath: "businessDistrictName"
|
||||
},
|
||||
{
|
||||
displayName: "地址",
|
||||
propertyPath: "address"
|
||||
},
|
||||
{
|
||||
displayName: "纬度",
|
||||
propertyPath: "mapY"
|
||||
},
|
||||
{
|
||||
displayName: "经度",
|
||||
propertyPath: "mapX"
|
||||
},
|
||||
{
|
||||
displayName: "最小购买周期",
|
||||
propertyPath: "minPurchaseCycle"
|
||||
},
|
||||
{
|
||||
displayName: "首次制作安装费",
|
||||
propertyPath: "firstInstallFee"
|
||||
},
|
||||
{
|
||||
displayName: "换刊制作安装费",
|
||||
propertyPath: "changeInstallFee"
|
||||
},
|
||||
{
|
||||
displayName: "状态",
|
||||
propertyPath: "state"
|
||||
},
|
||||
{
|
||||
displayName: "作废原因",
|
||||
propertyPath: "invalidReason"
|
||||
},
|
||||
{
|
||||
displayName: "业务部门",
|
||||
propertyPath: "dataScopeDeptName"
|
||||
}
|
||||
])
|
||||
|
||||
// 网络基础字段
|
||||
const wlBaseFild = ref([
|
||||
{
|
||||
displayName: "媒体名称",
|
||||
propertyPath: "mediaName"
|
||||
},
|
||||
{
|
||||
displayName: "媒体类型",
|
||||
propertyPath: "mediaTypeStr"
|
||||
},
|
||||
{
|
||||
displayName: "媒体大类",
|
||||
propertyPath: "mediaCategoryStr"
|
||||
},
|
||||
{
|
||||
displayName: "展示形式",
|
||||
propertyPath: "displayFormStr"
|
||||
},
|
||||
{
|
||||
displayName: "省",
|
||||
propertyPath: "provinceName"
|
||||
},
|
||||
{
|
||||
displayName: "市",
|
||||
propertyPath: "cityName"
|
||||
},
|
||||
{
|
||||
displayName: "区",
|
||||
propertyPath: "areaName"
|
||||
},
|
||||
{
|
||||
displayName: "镇",
|
||||
propertyPath: "townName"
|
||||
},
|
||||
{
|
||||
displayName: "商圈",
|
||||
propertyPath: "businessDistrictName"
|
||||
},
|
||||
{
|
||||
displayName: "地址",
|
||||
propertyPath: "address"
|
||||
},
|
||||
{
|
||||
displayName: "纬度",
|
||||
propertyPath: "mapY"
|
||||
},
|
||||
{
|
||||
displayName: "经度",
|
||||
propertyPath: "mapX"
|
||||
},
|
||||
{
|
||||
displayName: "状态",
|
||||
propertyPath: "state"
|
||||
},
|
||||
{
|
||||
displayName: "作废原因",
|
||||
propertyPath: "invalidReason"
|
||||
},
|
||||
{
|
||||
displayName: "业务部门",
|
||||
propertyPath: "dataScopeDeptName"
|
||||
}
|
||||
])
|
||||
|
||||
// 优势报价字段
|
||||
const ysPriceFild = ref([
|
||||
{
|
||||
|
|
@ -1150,7 +1314,7 @@ const ckdxPriceFild = ref([
|
|||
const exportForm = ref({
|
||||
ids: undefined,
|
||||
exportBaseFields: undefined,
|
||||
exportPriceFields: false,
|
||||
mediaTypeExport: [],
|
||||
hasFiles: false
|
||||
})
|
||||
|
||||
|
|
@ -1159,7 +1323,7 @@ const baseFieldCheckAll = ref(false)
|
|||
const baseFieldIsIndeterminate = ref(false)
|
||||
// 基础字段
|
||||
const baseFields = ref([])
|
||||
const _baseFields = ref(null)
|
||||
// const _baseFields = ref(null)
|
||||
// 已选择的基础字段
|
||||
const checkedBaseFields = ref([])
|
||||
|
||||
|
|
@ -1195,20 +1359,88 @@ const handleCheckedBaseFieldChange = (value) => {
|
|||
baseFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < baseFields.value.length
|
||||
}
|
||||
// 报价字段全选操作
|
||||
const handleCheckAllPriceFieldChange = (val) => {
|
||||
const handleCheckAllPriceFieldChange = (val) => {
|
||||
checkedPriceFields.value = []
|
||||
if (val) {
|
||||
priceFields.value.forEach(element => {
|
||||
checkedPriceFields.value.push(element.propertyPath)
|
||||
});
|
||||
|
||||
if (ToolOptions.value.length == 8) {
|
||||
// 查找指定类型的报价字段
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == activeIndex.value);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = [...checkedPriceFields.value] // 使用数组索引
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 7) {
|
||||
let jsType = activeIndex.value + 1
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == jsType);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = [...checkedPriceFields.value] // 使用数组索引
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 0) {
|
||||
// 查找指定类型的报价字段
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == 0);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = [...checkedPriceFields.value] // 使用数组索引
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ToolOptions.value.length == 8) {
|
||||
// 查找指定类型的报价字段
|
||||
const curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == activeIndex.value);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = []
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 7) {
|
||||
let jsType = activeIndex.value + 1
|
||||
const curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == jsType);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = []
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 0) {
|
||||
const curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == 0);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = []
|
||||
}
|
||||
}
|
||||
}
|
||||
priceFieldIsIndeterminate.value = false
|
||||
// 更新选择状态
|
||||
checkPriceFieldSelectStatus()
|
||||
}
|
||||
// 单个选择报价字段
|
||||
const handleCheckedPriceFieldChange = (value) => {
|
||||
const handleCheckedPriceFieldChange = (value) => {
|
||||
const checkedCount = value.length
|
||||
priceFieldCheckAll.value = checkedCount === priceFields.value.length
|
||||
priceFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < priceFields.value.length
|
||||
|
||||
// 同步更新到 exportForm
|
||||
if (ToolOptions.value.length == 8) {
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == activeIndex.value);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = [...value]
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 7) {
|
||||
let jsType = activeIndex.value + 1
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == jsType);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = [...value]
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 0) {
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == 0);
|
||||
if (curPriceFields.length > 0) {
|
||||
curPriceFields[0].exportPriceFields = [...value]
|
||||
}
|
||||
}
|
||||
// 更新选择状态
|
||||
checkPriceFieldSelectStatus()
|
||||
}
|
||||
|
||||
// 选择是否包含附件
|
||||
|
|
@ -1224,7 +1456,7 @@ const handleClick = (tab, event) => {
|
|||
// 执行导出
|
||||
const handleSubmitExport = () => {
|
||||
exportForm.value.exportBaseFields = checkedBaseFields
|
||||
exportForm.value.exportPriceFields = checkedPriceFields
|
||||
exportForm.value.mediaTypeExport = exportForm.value.mediaTypeExport.filter(item => item.exportPriceFields.length > 0)
|
||||
exportMediaExcel(exportForm.value).then(res => {
|
||||
const downLoadName = '媒体信息_' + getCurrentTime() + '.xlsx'
|
||||
// 通过a标签打开新页面下载文件
|
||||
|
|
@ -1255,20 +1487,15 @@ const getCurrentTime = () => {
|
|||
|
||||
// 获取基础信息字段
|
||||
const getMediaExcelBaseField = () => {
|
||||
mediaExcelBaseField().then(res => {
|
||||
if (curDeptIds.value && curDeptIds.value.length == 2) baseFields.value = res.data
|
||||
else if (curDeptIds.value && curDeptIds.value.length == 1) {
|
||||
if (curDeptIds.value[0] == '219') {
|
||||
// 网络媒体
|
||||
_baseFields.value = "媒体名称,媒体类型,媒体大类,展示形式,省,市,区,镇,商圈,地址,经度,纬度,状态,废除原因, 部门"
|
||||
} else {
|
||||
_baseFields.value = "媒体名称,媒体类型,媒体大类,展示形式,是否照明,播放时间,媒体尺寸,mr,日均车流量,媒体朝向,省,市,区,镇,商圈,地址,经度,纬度,最小购买周期,首次制作安装费,换刊制作安装费,状态,废除原因, 部门"
|
||||
}
|
||||
baseFields.value = [...new Set( // 去重
|
||||
res.data.filter(item => _baseFields.value.includes(item.displayName))
|
||||
)];
|
||||
if (curDeptIds.value && curDeptIds.value.length == 2) baseFields.value = ysBaseFild.value
|
||||
else if (curDeptIds.value && curDeptIds.value.length == 1) {
|
||||
if (curDeptIds.value[0] == '219') {
|
||||
// 网络媒体
|
||||
baseFields.value = wlBaseFild.value
|
||||
} else {
|
||||
baseFields.value = ysBaseFild.value
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
// 获取报价信息字段
|
||||
const getMediaExcelPriceField = () => {
|
||||
|
|
@ -1276,93 +1503,148 @@ const getMediaExcelPriceField = () => {
|
|||
ToolOptions.value = ['优势报价', '门禁', '候车厅', '道闸', '地铁', '高铁', '写字楼', '车库灯箱']
|
||||
activeIndex.value = 0
|
||||
priceFields.value = ysPriceFild.value
|
||||
handleCheckPriceField(0)
|
||||
}
|
||||
else if (curDeptIds.value && curDeptIds.value.length == 1) {
|
||||
if (curDeptIds.value[0] == '219') {
|
||||
ToolOptions.value = ['门禁', '候车厅', '道闸', '地铁', '高铁', '写字楼', '车库灯箱']
|
||||
activeIndex.value = 0
|
||||
priceFields.value = mjPriceFild.value
|
||||
handleCheckPriceField(1)
|
||||
} else {
|
||||
ToolOptions.value = []
|
||||
activeIndex.value = 0
|
||||
priceFields.value = ysPriceFild.value
|
||||
handleCheckPriceField(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 判断报价信息是否存在指定类型数据
|
||||
const handleCheckPriceField = (_mediaType) => {
|
||||
// 获取当前的所有要导出的报价字段
|
||||
const currentMediaTypeExport = [...exportForm.value.mediaTypeExport]; // 创建副本以避免直接修改原数组
|
||||
// 过滤掉指定类型的旧数据
|
||||
const filteredFields = currentMediaTypeExport.filter(item => item.type !== _mediaType);
|
||||
// 判断是否有指定类型数据
|
||||
const _mediaTypeArr = currentMediaTypeExport.filter(item => item.type == _mediaType);
|
||||
// 如果数据不存在
|
||||
if (_mediaTypeArr.length == 0) {
|
||||
filteredFields.push({ type: _mediaType, exportPriceFields: [] }); // 使用 push 追加新文件
|
||||
exportForm.value.mediaTypeExport = [...filteredFields]; // 更新 ref
|
||||
}
|
||||
}
|
||||
// 类型切换
|
||||
const handleChangeType = (_type) => {
|
||||
activeIndex.value = _type
|
||||
priceFieldCheckAll.value = false
|
||||
priceFieldIsIndeterminate.value = false
|
||||
|
||||
// 先获取当前类型的已选字段
|
||||
let currentCheckedFields = []
|
||||
if (ToolOptions.value.length == 8) {
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == _type);
|
||||
if (curPriceFields.length > 0) {
|
||||
currentCheckedFields = [...curPriceFields[0].exportPriceFields]
|
||||
}
|
||||
}
|
||||
if (ToolOptions.value.length == 7) {
|
||||
let wlType = _type + 1
|
||||
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == wlType);
|
||||
if (curPriceFields.length > 0) {
|
||||
currentCheckedFields = [...curPriceFields[0].exportPriceFields]
|
||||
}
|
||||
}
|
||||
|
||||
if (ToolOptions.value.length == 8) {
|
||||
switch (_type) {
|
||||
case 0:
|
||||
priceFields.value = ysPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 1:
|
||||
priceFields.value = mjPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 2:
|
||||
priceFields.value = hctPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 3:
|
||||
priceFields.value = dzPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 4:
|
||||
priceFields.value = dtPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 5:
|
||||
priceFields.value = gtPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 6:
|
||||
priceFields.value = xzlPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 7:
|
||||
priceFields.value = ckdxPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
}
|
||||
handleCheckPriceField(_type)
|
||||
}
|
||||
if (ToolOptions.value.length == 7) {
|
||||
switch (_type) {
|
||||
case 0:
|
||||
priceFields.value = mjPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 1:
|
||||
priceFields.value = hctPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 2:
|
||||
priceFields.value = dzPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 3:
|
||||
priceFields.value = dtPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 4:
|
||||
priceFields.value = gtPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 5:
|
||||
priceFields.value = xzlPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
case 6:
|
||||
priceFields.value = ckdxPriceFild.value
|
||||
checkedPriceFields.value = []
|
||||
checkedPriceFields.value = currentCheckedFields
|
||||
break;
|
||||
}
|
||||
let wlType = _type + 1
|
||||
handleCheckPriceField(wlType)
|
||||
}
|
||||
|
||||
// 新增:检查当前类型是否全选
|
||||
checkPriceFieldSelectStatus()
|
||||
}
|
||||
// 新增方法:检查报价字段选择状态
|
||||
const checkPriceFieldSelectStatus = () => {
|
||||
const checkedCount = checkedPriceFields.value.length
|
||||
const totalCount = priceFields.value.length
|
||||
|
||||
priceFieldCheckAll.value = checkedCount === totalCount
|
||||
priceFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < totalCount
|
||||
}
|
||||
// 新增方法:检查基础字段选择状态
|
||||
const checkBaseFieldSelectStatus = () => {
|
||||
const checkedCount = checkedBaseFields.value.length
|
||||
const totalCount = baseFields.value.length
|
||||
|
||||
baseFieldCheckAll.value = checkedCount === totalCount
|
||||
baseFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < totalCount
|
||||
}
|
||||
// 初始化
|
||||
const initExportExcel = (_mediaIds, _curDeptIds) => {
|
||||
|
|
@ -1372,6 +1654,10 @@ const initExportExcel = (_mediaIds, _curDeptIds) => {
|
|||
exportOpen.value = true
|
||||
getMediaExcelBaseField()
|
||||
getMediaExcelPriceField()
|
||||
|
||||
// 初始化时检查选择状态
|
||||
checkBaseFieldSelectStatus()
|
||||
checkPriceFieldSelectStatus()
|
||||
}
|
||||
|
||||
// 暴露方法\属性给父组件
|
||||
|
|
@ -1381,24 +1667,24 @@ defineExpose({
|
|||
</script>
|
||||
|
||||
<style lang='scss'>
|
||||
.el-button-group>.el-button {
|
||||
.exportGroup>.el-button {
|
||||
float: left;
|
||||
position: relative;
|
||||
height: 38px;
|
||||
border: 1px solid #DFDFDF;
|
||||
background: #ffffff;
|
||||
font-family: Microsoft YaHei;
|
||||
font-weight: 400;
|
||||
font-size: 18px;
|
||||
text-align: center;
|
||||
color: #000000;
|
||||
height: 30px;
|
||||
border: 1px solid #9C9C9C;
|
||||
background: #9c9c9c1a;
|
||||
}
|
||||
|
||||
.el-button-group>.el-button--primary {
|
||||
background: #1f1f1f;
|
||||
font-family: Microsoft YaHei;
|
||||
font-weight: 600;
|
||||
color: #FFFFFF;
|
||||
border: 1px solid #1f1f1f;
|
||||
.exportGroup>.el-button--primary {
|
||||
background: #1a75e6;
|
||||
border: 1px solid #1A75E6;
|
||||
}
|
||||
|
||||
.exportGroup .el-button--primary:last-child {
|
||||
border-left-color: #1A75E6;
|
||||
}
|
||||
|
||||
.exportGroup .el-button--primary:first-child {
|
||||
border-right-color: #1A75E6;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -13,7 +13,8 @@
|
|||
value-format="YYYY-MM-DD HH:mm:ss" type="date" placeholder="结束时间" @change="validateEndTime" />
|
||||
</el-form-item>
|
||||
<el-form-item label="类型:" v-if="!readonly">
|
||||
<el-select v-model="mediaType" placeholder="请选择" style="min-width: 120px;" clearable @change="handleChangeMediaType" >
|
||||
<el-select v-model="mediaType" placeholder="请选择" style="min-width: 120px;" clearable
|
||||
@change="handleChangeMediaType">
|
||||
<el-option v-for="item in mediaTypes" :key="item.value" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
|
|
@ -216,7 +217,14 @@ const initHistoryCharLine = () => {
|
|||
_historyChar.value.setOption({
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: "{b} : {c} 元/天" //鼠标放上去 展示内容
|
||||
// formatter: "{b} : {c} 元/天" //鼠标放上去 展示内容
|
||||
formatter: function (params) {
|
||||
// 从原始数据中获取时间
|
||||
const originalData = historyList.value; // 你的原始数据
|
||||
const time = originalData[params.dataIndex].createTime;
|
||||
|
||||
return `${params.name}: ${params.value} 元/天<br/>时间: ${time}`;
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
|
|
@ -304,7 +312,14 @@ const initHistoryCharBar = () => {
|
|||
_historyChar.value.setOption({
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: "{b} : {c} 元/天" //鼠标放上去 展示内容
|
||||
// formatter: "{b} : {c} 元/天" //鼠标放上去 展示内容
|
||||
formatter: function (params) {
|
||||
// 从原始数据中获取时间
|
||||
const originalData = historyList.value; // 你的原始数据
|
||||
const time = originalData[params.dataIndex].createTime;
|
||||
|
||||
return `${params.name}: ${params.value} 元/天<br/>时间: ${time}`;
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
|
|
@ -388,7 +403,7 @@ const initHistoryCharBar = () => {
|
|||
// _historyChar.value.resize()
|
||||
// })
|
||||
}
|
||||
const handleChangeMediaType = (val) => {
|
||||
const handleChangeMediaType = (val) => {
|
||||
getMediaPriceList()
|
||||
}
|
||||
const handleChangeType = (val) => {
|
||||
|
|
@ -424,8 +439,6 @@ const getMediaPriceList = () => {
|
|||
itemYDate = (convertIntTotalRegularPrice / (item.buyCycle * 7)).toFixed(2)
|
||||
} else {
|
||||
const repliceValue = parseInt(item.buyCycle.replace('个月', '').replace('月', ''))
|
||||
console.log('会输入月份的原始值', item.buyCycle)
|
||||
console.log('替换会输入月份的结果', repliceValue)
|
||||
itemYDate = (convertIntTotalRegularPrice / (repliceValue * 31)).toFixed(2)
|
||||
}
|
||||
}
|
||||
|
|
@ -463,7 +476,7 @@ const validateEndTime = (val) => {
|
|||
}
|
||||
};
|
||||
// 对外暴漏方法
|
||||
const initHistoryData = (_mediaId, _readonly) => {
|
||||
const initHistoryData = (_mediaId, _readonly) => {
|
||||
historyDataOpen.value = true
|
||||
readonly.value = _readonly
|
||||
nextTick(() => {
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="媒体形式/名称" prop="business_department">
|
||||
<el-form-item label="供应商/媒体形式/名称" prop="business_department">
|
||||
{{ detailForm.mediaName }}
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
@ -113,7 +113,7 @@
|
|||
</el-row>
|
||||
<div class="splineBar" />
|
||||
<el-row :gutter="30" class="my_form_row">
|
||||
<el-col :span="18">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="城市" prop="business_department">
|
||||
<span v-if="detailForm.provinceName">{{ detailForm.provinceName }}</span>
|
||||
<span v-if="detailForm.cityName">-{{ detailForm.cityName }}</span>
|
||||
|
|
@ -121,7 +121,7 @@
|
|||
<span v-if="detailForm.townName">-{{ detailForm.townName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="商圈" prop="business_department">
|
||||
{{ detailForm.businessDistrictName }}
|
||||
</el-form-item>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
</el-icon>
|
||||
</div>
|
||||
</template>
|
||||
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px" class="myInsertForm">
|
||||
<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">
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="媒体形式/名称" prop="mediaName">
|
||||
<el-form-item label="供应商/媒体形式/名称" prop="mediaName" >
|
||||
<el-input v-model="ruleForm.mediaName" placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,26 @@
|
|||
<div class="tool-content">
|
||||
<el-row :gutter="20" style="margin: 0 -10px 30px -10px;">
|
||||
<el-col :span="24">
|
||||
<div class="toolItemTitle mb20">上传文件</div>
|
||||
<div class="toolItemTitle mb20">
|
||||
上传文件
|
||||
<el-dropdown placement="bottom">
|
||||
<el-button class="downloadTemplateBtnDrow" text>下载模板</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item @click="downloadExcelTemplate('mj')">门禁校准模板</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
@click="downloadExcelTemplate('hct')">候车厅校准模板</el-dropdown-item>
|
||||
<el-dropdown-item @click="downloadExcelTemplate('dz')">道闸校准模板</el-dropdown-item>
|
||||
<el-dropdown-item @click="downloadExcelTemplate('dt')">地铁校准模板</el-dropdown-item>
|
||||
<el-dropdown-item @click="downloadExcelTemplate('gt')">高铁校准模板</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
@click="downloadExcelTemplate('xzl')">写字楼校准模板</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
@click="downloadExcelTemplate('ckdx')">车库灯箱校准模板</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</div>
|
||||
<el-upload class="my-upload-demo" drag action="#" :http-request="requestDocUpload"
|
||||
:file-list="docUploadList" :before-upload="beforeDocUpload" :on-remove="removeDocUpload">
|
||||
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
|
||||
|
|
@ -47,6 +66,7 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作时间" align="center" prop="createTime" width="210" />
|
||||
<el-table-column label="异常信息" align="center" prop="errorMessage" width="210" />
|
||||
<el-table-column label="操作" :width="160" align="center">
|
||||
<template #default="scope">
|
||||
<el-button v-if="scope.row.progress == 100" link type="primary"
|
||||
|
|
@ -177,7 +197,7 @@
|
|||
<el-table-column label="总净价" align="right" prop="totalRegularPrice" width="120" />
|
||||
<el-table-column label="总净价单位" align="center" prop="totalRegularPriceUnit" width="130" />
|
||||
<el-table-column label="底价" align="right" prop="floorPrice" width="120" />
|
||||
<el-table-column label="低价总" align="right" prop="minPrice" width="120" />
|
||||
<el-table-column label="底价总" align="right" prop="minPrice" width="120" />
|
||||
<el-table-column label="制作费" align="right" prop="makeFee" width="130" />
|
||||
<el-table-column label="媒体费总价" align="right" prop="mediaFeeTotalPrice" width="130" />
|
||||
<el-table-column label="单日覆盖人流量" align="center" prop="dailyAvgPeopleFlow" width="150" />
|
||||
|
|
@ -347,6 +367,41 @@ const getTaskRecordPageList = () => {
|
|||
loading.value = false
|
||||
})
|
||||
}
|
||||
// 模板下载
|
||||
const downloadExcelTemplate = (tempLateType) => {
|
||||
const link = document.createElement('a')
|
||||
if (tempLateType == 'mj') {
|
||||
link.href = '/jzTemplate/门禁校准平台模板.xlsx'
|
||||
link.download = '门禁校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
if (tempLateType == 'hct') {
|
||||
link.href = '/jzTemplate/候车厅校准平台模板.xlsx'
|
||||
link.download = '候车厅校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
if (tempLateType == 'dz') {
|
||||
link.href = '/jzTemplate/道闸校准平台模板.xlsx'
|
||||
link.download = '道闸校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
if (tempLateType == 'dt') {
|
||||
link.href = '/jzTemplate/地铁校准平台模板.xlsx'
|
||||
link.download = '地铁校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
if (tempLateType == 'gt') {
|
||||
link.href = '/jzTemplate/高铁校准平台模板.xlsx'
|
||||
link.download = '高铁校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
if (tempLateType == 'xzl') {
|
||||
link.href = '/jzTemplate/写字楼校准平台模板.xlsx'
|
||||
link.download = '写字楼校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
if (tempLateType == 'ckdx') {
|
||||
link.href = '/jzTemplate/车库灯箱校准平台模板.xlsx'
|
||||
link.download = '车库灯箱校准平台模板.xlsx' // 设置下载文件名
|
||||
}
|
||||
document.body.appendChild(link)
|
||||
link.click()
|
||||
document.body.removeChild(link)
|
||||
}
|
||||
|
||||
// 自定义上传经纬度文件
|
||||
const requestDocUpload = (options) => {
|
||||
|
|
@ -427,7 +482,7 @@ const handleExportCalibraTionResult = () => {
|
|||
document.body.appendChild(a)
|
||||
a.click()
|
||||
document.body.removeChild(a)
|
||||
|
||||
|
||||
proxy.$modal.msgSuccess("导出成功")
|
||||
handleCloseModal()
|
||||
})
|
||||
|
|
@ -581,4 +636,21 @@ defineExpose({
|
|||
font-size: 16px;
|
||||
color: #67C23A;
|
||||
}
|
||||
|
||||
.downloadTemplateBtnDrow {
|
||||
width: 100px;
|
||||
height: 36px;
|
||||
font-family: Microsoft YaHei;
|
||||
font-weight: 700;
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
color: #409eff !important;
|
||||
background: transparent !important;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.downloadTemplateBtnDrow:hover {
|
||||
background: transparent !important;
|
||||
color: #409eff !important;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -77,6 +77,7 @@
|
|||
<span>{{ moment(scope.row.created_at, "ddd, DD MMM YYYY HH:mm:ss [GMT]").format('YYYY-MM-DD HH:mm:ss') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="异常信息" align="center" prop="errorMessage" width="210" />
|
||||
<el-table-column label="操作" :width="160" align="center">
|
||||
<template #default="scope">
|
||||
<el-button v-if="scope.row.progress == 100" link type="primary"
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@
|
|||
<div class="app-container">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="6" :xs="24">
|
||||
<el-card class="box-card">
|
||||
<el-card class="box-card" style="min-height: calc(100vh - 100px);">
|
||||
<template v-slot:header>
|
||||
<div class="clearfix">
|
||||
<span>个人信息</span>
|
||||
</div>
|
||||
<div class="clearfix">
|
||||
<span>个人信息</span>
|
||||
</div>
|
||||
</template>
|
||||
<div>
|
||||
<div class="text-center">
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
</div>
|
||||
<ul class="list-group list-group-striped">
|
||||
<li class="list-group-item">
|
||||
<svg-icon icon-class="user" />用户名称
|
||||
<svg-icon icon-class="user" />用户账号
|
||||
<div class="pull-right">{{ state.user.userName }}</div>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
|
|
@ -27,7 +27,8 @@
|
|||
</li>
|
||||
<li class="list-group-item">
|
||||
<svg-icon icon-class="tree" />所属部门
|
||||
<div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>
|
||||
<div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{
|
||||
state.postGroup }}</div>
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
<svg-icon icon-class="peoples" />所属角色
|
||||
|
|
@ -42,13 +43,13 @@
|
|||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="18" :xs="24">
|
||||
<el-card>
|
||||
<el-card style="min-height: calc(100vh - 100px);">
|
||||
<template v-slot:header>
|
||||
<div class="clearfix">
|
||||
<span>基本资料</span>
|
||||
</div>
|
||||
<div class="clearfix">
|
||||
<span>基本资料</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-tabs v-model="selectedTab">
|
||||
<el-tabs class="demo-tabs" v-model="selectedTab">
|
||||
<el-tab-pane label="基本资料" name="userinfo">
|
||||
<userInfo :user="state.user" />
|
||||
</el-tab-pane>
|
||||
|
|
@ -66,29 +67,33 @@
|
|||
import userAvatar from "./userAvatar"
|
||||
import userInfo from "./userInfo"
|
||||
import resetPwd from "./resetPwd"
|
||||
import otherbg from '@/assets/images/otherbg.png'
|
||||
import { getUserProfile } from "@/api/system/user"
|
||||
import { useBackgroundStore } from '@/store/modules/background'
|
||||
|
||||
const bgStore = useBackgroundStore()
|
||||
const route = useRoute()
|
||||
const selectedTab = ref("userinfo")
|
||||
const state = reactive({
|
||||
user: {},
|
||||
roleGroup: {},
|
||||
postGroup: {}
|
||||
user: {},
|
||||
roleGroup: {},
|
||||
postGroup: {}
|
||||
})
|
||||
|
||||
function getUser() {
|
||||
getUserProfile().then(response => {
|
||||
state.user = response.data
|
||||
state.roleGroup = response.roleGroup
|
||||
state.postGroup = response.postGroup
|
||||
})
|
||||
getUserProfile().then(response => {
|
||||
state.user = response.data
|
||||
state.roleGroup = response.roleGroup
|
||||
state.postGroup = response.postGroup
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
const activeTab = route.params && route.params.activeTab
|
||||
if (activeTab) {
|
||||
selectedTab.value = activeTab
|
||||
}
|
||||
getUser()
|
||||
bgStore.setBgImage(otherbg)
|
||||
const activeTab = route.params && route.params.activeTab
|
||||
if (activeTab) {
|
||||
selectedTab.value = activeTab
|
||||
}
|
||||
getUser()
|
||||
})
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<template>
|
||||
<el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="用户昵称" prop="nickName">
|
||||
<el-input v-model="form.nickName" maxlength="30" />
|
||||
<el-form-item label="用户姓名" prop="realName">
|
||||
<el-input v-model="form.realName" maxlength="30" />
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号码" prop="phonenumber">
|
||||
<el-input v-model="form.phonenumber" maxlength="11" />
|
||||
|
|
@ -35,7 +35,7 @@ const { proxy } = getCurrentInstance()
|
|||
|
||||
const form = ref({})
|
||||
const rules = ref({
|
||||
nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
|
||||
realName: [{ required: true, message: "用户姓名不能为空", trigger: "blur" }],
|
||||
email: [{ required: true, message: "邮箱地址不能为空", trigger: "blur" }, { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
|
||||
phonenumber: [{ required: true, message: "手机号码不能为空", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }],
|
||||
})
|
||||
|
|
@ -61,7 +61,7 @@ function close() {
|
|||
// 回显当前登录用户信息
|
||||
watch(() => props.user, user => {
|
||||
if (user) {
|
||||
form.value = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
|
||||
form.value = { realName: user.realName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
|
||||
}
|
||||
},{ immediate: true })
|
||||
</script>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user