flat: 添加天地图、回访等

This commit is contained in:
Apcallover
2024-07-30 16:53:48 +08:00
parent f48e08ac5c
commit f68d4bb917
13 changed files with 477 additions and 20 deletions

View File

@@ -3,3 +3,4 @@ VUE_APP_LOGIN_ERROR = http://10.160.7.216:9920/casserver/login
VUE_APP_REPLACE_STR = {"{oss_file_url}": "http://10.165.0.173:8000", "https://dy12333.org.cn/api/jobslink-api/front/file": "http://10.165.0.173:8000/jobslink-api/front/file"}
VUE_APP_LOGIN_NEXT = http://10.160.7.216:9920/casserver/login?service=http://10.165.0.173/manage/login&stService=http%3A%2F%2F10.165.0.173%2Fmanage%2Flogin
VUE_APP_SUPPER_MAP = http://10.165.0.44:1205/proxy/rest/maps/c02c6f51f3ab4190bffd5e3e54cf5ac4/111013e9067749488d44841208771768
VUE_APP_TIANDITU_APIKEY = e4266a5e84fe6c10f60c559967f0a03f

View File

@@ -3,3 +3,4 @@ VUE_APP_LOGIN_ERROR = http://10.160.7.216:9920/casserver/login
VUE_APP_REPLACE_STR = {"{oss_file_url}": "http://10.165.0.173:8000", "https://dy12333.org.cn/api/jobslink-api/front/file": "http://10.165.0.77:8000/jobslink-api/front/file"}
VUE_APP_LOGIN_NEXT = http://10.160.7.216:9920/casserver/login?service=http://10.165.0.54:8300/manage/login&stService=http%3A%2F%2F10.165.0.54%3A8300%2Fmanage%2Flogin
VUE_APP_SUPPER_MAP = http://10.165.0.44:1205/proxy/rest/maps/c02c6f51f3ab4190bffd5e3e54cf5ac4/111013e9067749488d44841208771768
VUE_APP_TIANDITU_APIKEY = e4266a5e84fe6c10f60c559967f0a03f

BIN
public/img/point.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -1,4 +1,5 @@
import request from "@/router/axios";
import axios from 'axios';
/*逆地址解析*/
export const getcoder = (location, key, get_poi) => {
return request({
@@ -23,3 +24,19 @@ export const querySearch = (keyword, key) => {
}
});
};
export const tiandituQuerySearch = (params, baseUrl) => {
return axios({
method: 'get',
url: baseUrl + '/tianditu/v2/search',
params: params,
})
};
export const tiandituGeocoder = (params, baseUrl) => {
return axios({
method: 'get',
url: baseUrl + '/tianditu/geocoder',
params: params,
})
};

View File

@@ -295,3 +295,19 @@ export const updateGroupServeInfo = (data) => {
data
});
};
export const getPhoneList = (params) => {
return request({
url: "/api/jobslink-api/serve/phoneList",
method: "get",
params
});
}
export const phoneUpdate = (params) => {
return request({
url: "/api/jobslink-api/serve/phoneUpdate",
method: "post",
params
});
};

View File

@@ -0,0 +1,290 @@
<template>
<div class="app-content">
<el-input
v-model="addressLocation"
@input="searchValue"
v-if="showInput"
:placeholder="placeholder || '如北京市延庆区延庆镇莲花池村前街50夕阳红养老院'"
></el-input>
<div class="mapDiv" id="mapDiv" style="width: 100%;height: 300px;"></div>
</div>
</template>
<script>
import {debounce} from '@/util/util';
import {tiandituGeocoder} from '@/api/tenant/map'
import {baseUrl} from "@/config/env";
const script = document.createElement('script')
script.src = 'http://10.165.0.173/tianditu/api?v=4.0&tk=' + process.env.VUE_APP_TIANDITU_APIKEY
script.onload = () => console.warn('-----------天地图加载完成-----------')
document.head.appendChild(script)
let Tmap = null;
export default {
data() {
return {
options: [],
addressLocation: '',
baseUrl: '',
isInput: true,
}
},
props: {
placeholder: String,
latitude: {
required: false,
// default: 31.126855,
},
longitude: {
required: false,
// default: 104.397894,
},
zoom: {
type: Number,
required: false,
default: 10,
},
maxZoom: {
type: Number,
required: false,
default: 20,
},
minZoom: {
type: Number,
required: false,
default: 0,
},
ScaleZoom: {
type: Boolean,
required: false,
default: false,
},
MapUrl: { // 瓦片地图URL
type: String,
required: false,
default: process.env.VUE_APP_SUPPER_MAP,
},
flagTip: {
type: Boolean,
required: false,
default: false,
},
open: {
type: Boolean,
required: false,
default: false,
},
isCanEdit: {
type: Boolean,
required: false,
default: false,
},
address: {
required: false,
default: '',
},
type: {
required: false,
default: 'custom',
}
},
computed: {
showInput() {
if (this.type === 'view' || this.type === 'select') {
return false
}
if (this.type === 'add') {
this.addressLocation = ''
}
return true
}
},
watch: {
address() {
if (!this.isInput) return;
console.log(2, this.type, this.address, this.longitude, this.latitude)
if (this.address && this.longitude > 0 && this.latitude > 0) {
this.addressLocation = this.address
this.createTmap(this.longitude, this.latitude)
} else {
this.getlocation()
}
}
},
created() {
console.log(1, this.type, this.address, this.longitude, this.latitude)
this.baseUrl = window.location.origin.search('localhost') ? 'http://10.165.0.173/' : window.location.origin;
T.Protocol.value = this.baseUrl
},
mounted() {
if (this.address && this.longitude > 0 && this.latitude > 0) {
this.addressLocation = this.address
this.createTmap(this.longitude, this.latitude)
} else {
this.getlocation()
}
},
methods: {
geolocation() {
},
getlocation() {
const _this = this
// 31.12494749933168, 经度: 104.40371173671055
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
let latitude = position.coords.latitude;
let longitude = position.coords.longitude;
_this.createTmap(longitude, latitude)
}, function (error) {
_this.createTmap(104.40371173671055, 31.12494749933168)
_this.$message.info('无法获取地理位置')
});
} else {
_this.$message.info('浏览器不支持地理定位')
}
},
searchValue: debounce(function (val) {
if (!this.isInput) {
this.isInput = true
return
}
if (this.type !== 'view') {
this.$emit('input', val)
}
let params = {
ds: {
keyWord: val,
},
tk: process.env.VUE_APP_TIANDITU_APIKEY
}
const _this = this
axios({
method: 'get',
url: this.baseUrl + '/tianditu/geocoder',
params: params,
}).then(({data}) => {
if (data.status === '0') {
const {keyWord, lon, lat, level} = data.location
if (!Tmap) {
this.createTmap(lon, lat)
} else {
Tmap.centerAndZoom(new T.LngLat(lon, lat), 15);
this.setIcon(lon, lat);
this.$emit('addAddress', {
address: this.addressLocation,
lng: lon,
lat: lat
})
}
}
}).catch((err) => {
_this.$message.info('无法获取地理位置')
})
}, 1000),
createTmap(lng, lat) {
const _this = this
this.$nextTick(() => {
if (!Tmap) {
Tmap = new T.Map('mapDiv', {
projection: 'EPSG:4326',
minZoom: this.minZoom,
maxZoom: this.maxZoom
});
}
Tmap.addEventListener('click', (e) => {
_this.nextPoint(e.lnglat)
});
Tmap.centerAndZoom(new T.LngLat(lng, lat), 15);
this.setIcon(lng, lat);
})
},
setIcon(lng, lat) {
Tmap.clearOverLays()
const icon = new T.Icon({
iconUrl: '/img/point.png',
iconSize: new T.Point(30, 30),
iconAnchor: new T.Point(15, 30)
});
const marker = new T.Marker(new T.LngLat(lng, lat), {
icon
});
Tmap.addOverLay(marker);
},
nextPoint(lnglat) {
var that = this;
let params = {
postStr: JSON.stringify({
lon: lnglat.lng,
lat: lnglat.lat,
ver: 1,
}),
type: 'geocode',
tk: process.env.VUE_APP_TIANDITU_APIKEY
}
axios({
method: 'get',
url: this.baseUrl + '/tianditu/geocoder',
params: params,
}).then((res) => {
if (res.data.status === '0') {
that.setIcon(lnglat.lng, lnglat.lat)
const info = that.formatterAdressLocation(res.data.result, 1)
this.isInput = false
this.$emit('addAddress', {
address: info.address,
lng: info.location.lon,
lat: info.location.lat
})
this.addressLocation = info.address
this.$nextTick(() => {
this.isInput = true
})
}
})
},
formatterAdressLocation(obj, type) {
switch (type) {
case 1:
return {
address: obj.formatted_address,
name: '',
location: obj.location,
infomation: obj.addressComponent
}
break;
case 2:
const [lon, lat] = obj.lonlat.split(',')
return {
address: obj.address,
name: obj.name,
location: {
lon,
lat
},
infomation: obj
}
break
case 3:
return {
address: obj.location.keyWord,
name: '',
location: {
lon: obj.location.lon,
lat: obj.location.lat,
},
infomation: obj.location
}
default:
break;
}
}
}
}
</script>
<style scoped>
.mapDiv {
width: 100%;
height: fit-content;
}
</style>

View File

@@ -23,7 +23,7 @@ import cityLabelCascader from './components/city-cascader/label'
import goBack from './components/go-back/main'
import tagSelect from './components/tag-select/main'
import tooltip from './components/tooltip/index'
import superMapView from './components/map/selectLocation2';
import superMapView from './components/map/selectLocation3';
import i18n from './lang' // Internationalization
import axios from './router/axios';
import router from './router/router';

View File

@@ -17,19 +17,23 @@ import {Message} from 'element-ui';
import {Base64} from 'js-base64';
import NProgress from 'nprogress';
const service = axios.create({
// baseURL: 'https://jibaoadmin.qemcap.com/api',
timeout: 60000
})
const replaceStr = JSON.parse(process.env.VUE_APP_REPLACE_STR)
//默认超时时间
axios.defaults.timeout = 60000;
service.defaults.timeout = 60000;
//返回其他状态码
axios.defaults.validateStatus = function (status) {
service.defaults.validateStatus = function (status) {
return status >= 200 && status <= 500;
};
//跨域请求允许保存cookie
axios.defaults.withCredentials = true;
service.defaults.withCredentials = true;
// NProgress 配置
NProgress.configure({showSpinner: false});
// http request拦截
axios.interceptors.request.use(config => {
service.interceptors.request.use(config => {
//开启 progress bar
NProgress.start();
const meta = (config.meta || {});
@@ -49,7 +53,7 @@ axios.interceptors.request.use(config => {
return Promise.reject(error)
});
// http response 拦截
axios.interceptors.response.use(
service.interceptors.response.use(
res => {
//关闭 progress bar
NProgress.done();
@@ -116,4 +120,4 @@ function transformReplaceStr(props) {
return result;
}
export default axios;
export default service;

View File

@@ -336,6 +336,12 @@ export default {
this.getLeftUserList('serveCopy')
console.log('leftpages:', this.leftPages)
},
refLeftSearch(userName) {
this.leftPages.currentPage = 1
this.formInline.userName = userName
this.getLeftUserList('serveCopy')
console.log('leftpages:', this.leftPages)
},
leftCurrentPageChange(current) {
this.leftPages.currentPage = current
this.getLeftUserList()

View File

@@ -61,17 +61,29 @@
<el-button type="primary" size="small" @click="selectPushService">推送服务</el-button>
</template>
<template slot-scope="{row,index}" slot="menu">
<!-- <el-button type="text"-->
<!-- icon="el-icon-document"-->
<!-- size="small"-->
<!-- @click="matchWorkStation(row)"-->
<!-- >查看匹配岗位-->
<!-- </el-button>-->
<!-- <el-button type="text"-->
<!-- icon="el-icon-document"-->
<!-- size="small"-->
<!-- @click="matchPolicy(row)"-->
<!-- >查看匹配政策-->
<!-- </el-button>-->
<el-button type="text"
icon="el-icon-document"
size="small"
@click="matchWorkStation(row)"
>查看匹配岗位
@click="phoneDataList(row)"
>回访
</el-button>
<el-button type="text"
icon="el-icon-document"
size="small"
@click="matchPolicy(row)"
>查看匹配政策
@click="selectPushUserService(row)"
>推送服务
</el-button>
<el-button type="text"
icon="el-icon-document"
@@ -204,11 +216,37 @@
<PushService
:visible.sync="PushServiceVisible"
:rowData="selectPushServiceData"
ref="pushRef"
></PushService>
<mission-view :visible.sync="viewDrawer" :model="view"></mission-view>
<work-view :visible.sync="workViewDrawer" :model="workViewModel"></work-view>
<el-dialog
title="回访"
append-to-body
:visible.sync="phoneDialogVisible"
width="30%"
:before-close="handlePhoneClose">
<el-form :model="phoneForm" label-position="top" label-width="100px">
<el-form-item label="验证手机号">
<el-checkbox-group
v-model="phoneForm.list"
:min="0"
:max="1">
<el-checkbox v-for="phone in phoneList" :label="phone" :key="phone">{{ phone }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="输入手机号">
<el-input v-model="phoneForm.phone" :disabled="phoneForm.list.length" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handlePhoneClose">取 消</el-button>
<el-button type="primary" @click="handelPhoneConfirm">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
@@ -220,7 +258,7 @@ import {
getListAllPolicy,
getListAllTalents, getMatchPolicy, getMatchServeList, getMatchWorkStation,
getServeListTalents,
removeDept, removeServeLog, updateServeLog
removeDept, removeServeLog, updateServeLog, getPhoneList, phoneUpdate
} from "@/api/tenant/serve";
import {mapGetters} from "vuex";
import addGroups from "./Dialog/addGroup";
@@ -268,6 +306,13 @@ export default {
selectUserServeLog: null,
selectPushServiceData: null,
PushServiceVisible: false,
phoneDialogVisible: false,
phoneList: [],
phoneForm: {
phone: '',
list: []
},
phoneItem: null,
}
},
computed: {
@@ -315,7 +360,7 @@ export default {
editBtn: false,
delBtn: false,
addBtn: false,
viewBtn: true,
viewBtn: false,
border: true,
refreshBtn: false,
searchBtn: true,
@@ -551,6 +596,17 @@ export default {
label: '服务对象',
prop: 'toName',
display: false,
}, {
label: '服务类型',
prop: 'serveType',
type: 'select',
dicData: [
{label: '普通日志', value: 0},
{label: '回访日志', value: 1},
{label: '推送岗位日志', value: 2},
{label: '推送政策日志', value: 3},
],
display: false,
}, {
label: '服务主题',
prop: 'serveTheme',
@@ -587,8 +643,60 @@ export default {
this.getListAllPolicyTree()
this.getLabelList()
this.ListAllTalents()
},
methods: {
selectPushUserService(row) {
this.selectPushService().then(() => {
this.$nextTick(() => {
console.log(this.$refs.pushRef, row.name)
this.$refs.pushRef.refLeftSearch(row.name)
})
})
},
handelPhoneConfirm() {
let _this = this
let phone = ''
if (this.phoneForm.list.length) phone = this.phoneForm.list[0];
if (/^1[3-9]{1}\d{9}/.test(this.phoneForm.phone)) phone = this.phoneForm.phone;
if (phone) {
this.$confirm(`手机号为:${phone}`, {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async (res) => {
let params = {
idNumber: _this.phoneItem.idNumber,
phone
}
let resData = await phoneUpdate(params)
if (resData.data.code === 200) {
_this.$message.success("手机号更新成功");
_this.handlePhoneClose()
}
})
} else {
this.$message.error("请选择或输入用户手机号!");
}
},
handlePhoneClose() {
this.phoneDialogVisible = false
this.phoneForm.phone = ''
this.phoneForm.list = []
},
async phoneDataList(item) {
let params = {
idNumber: item.idNumber
}
let resData = await getPhoneList(params)
if (resData.data.code === 200) {
this.phoneList = resData.data.data
this.phoneItem = item
this.phoneDialogVisible = true
} else {
this.$message.error("用户数据异常!");
}
},
/*点击分组加载相应人才列表*/
nodeClick(data) {
if (data.children) return;
@@ -883,11 +991,14 @@ export default {
policyCurrentChange() {
},
selectPushService() {
detail(this.selectInfo.id).then((res) => {
if (res.data.code === 200) {
this.selectPushServiceData = res.data.data
this.PushServiceVisible = true
}
return new Promise((resolve, reject) => {
detail(this.selectInfo.id).then((res) => {
if (res.data.code === 200) {
this.selectPushServiceData = res.data.data
this.PushServiceVisible = true
resolve()
}
})
})
// this.selectPushServiceData = deepClone(this.selectInfo)
// this.PushServiceVisible = true

View File

@@ -338,6 +338,17 @@ export default {
label: '服务对象',
prop: 'toName',
display: false,
}, {
label: '服务类型',
prop: 'serveType',
type: 'select',
dicData: [
{label: '普通日志', value: 0},
{label: '回访日志', value: 1},
{label: '推送岗位日志', value: 2},
{label: '推送政策日志', value: 3},
],
display: false,
}, {
label: '服务主题',
prop: 'serveTheme',

View File

@@ -1404,7 +1404,7 @@ export default {
this.obj = res;
// this.obj.workSkills = []
// console.log(res.worktypeIds)
this.obj.workSkills = res.worktypeIds.split(',')
this.obj.workSkills = !res.worktypeIds || res.worktypeIds.split(',')
console.log(res, this.obj)
// this.obj.workSkills.push(res.worktypeIds)
// this.obj.workSkills.push(res.skillIds)

View File

@@ -192,7 +192,7 @@
:max-zoom="20"
:flag-tip="false"
placeholder="请输入详细地址"
:type="'view'"
:type="'edit'"
></super-map-view>
</el-col>
</el-row>