zhgdyun/src/views/projectFront/laborManage/electronicFence.vue
2023-09-08 17:45:24 +08:00

591 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<vue-scroll>
<div class="container-box">
<el-button type="primary" @click="showDialogFn" size="medium">
{{
$t("message.laborMange.add") + $t("message.laborMange.attendanceArea")
}}
</el-button>
<el-button type="primary" @click="getAttendenceTypeFn" size="medium">
{{ $t("message.laborMange.attendanceMode") }}
</el-button>
<div class="listBox">
<div class="fence-info" v-for="(item, index) in list" :key="index">
<div class="fence-info-image">
<img src="@/assets/images/map.png" />
</div>
<div class="fence-info-label">
<div class="fence-info-title">
{{ $t("message.laborMange.attendanceArea") }}{{ index + 1 }}
</div>
<div class="fence-info-text">
{{ $t("message.laborMange.addressDetails") }}{{ item.addr }}
</div>
<div class="fence-info-text">
{{ $t("message.laborMange.effectiveRange") }}{{
item.areaType == 1
? item.standArea + $t("message.laborMange.meter")
: $t("message.laborMange.custom")
}}
</div>
</div>
<div class="fence-info-close" @click="deleteFn(item.id)">
<i class="el-icon-close"></i>
</div>
</div>
</div>
<el-dialog
:modal-append-to-body="false"
:title="
$t('message.laborMange.add') + $t('message.laborMange.attendanceArea')
"
:visible.sync="cardDialog"
width="667px"
>
<div class="dialog_content">
<div class="mapBox">
<div class="coordinate-picking">
<div style="width: calc(100% - 160px)">
<el-input
size="medium"
v-model="addForm.addr"
id="tipinput"
:placeholder="$t('message.laborMange.pleaseChoose')"
>
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
<!-- <el-button type="primary" size="medium" @click="search">查询</el-button> -->
</div>
<div v-show="addForm.areaType == 2">
<span
@click="
mapOperateType = 1;
exitEditFn();
"
>
<img
v-show="mapOperateType == 1"
src="@/assets/images/map-operate-move.png"
alt=""
/>
<img
v-show="mapOperateType != 1"
src="@/assets/images/map-operate-move2.png"
alt=""
/>
</span>
<span
@click="
mapOperateType = 2;
drawRectangle();
"
>
<img
v-show="mapOperateType == 2"
src="@/assets/images/map-operate-rect.png"
alt=""
/>
<img
v-show="mapOperateType != 2"
src="@/assets/images/map-operate-rect2.png"
alt=""
/>
</span>
<span
@click="
mapOperateType = 3;
drawPolygon();
"
>
<img
v-show="mapOperateType == 3"
src="@/assets/images/map-operate-polygon.png"
alt=""
/>
<img
v-show="mapOperateType != 3"
src="@/assets/images/map-operate-polygon2.png"
alt=""
/>
</span>
</div>
</div>
<div id="container"></div>
</div>
<div class="addrTitle">{{ addForm.addr }}</div>
<el-form size="medium" :model="addForm" ref="cardForm">
<el-form-item :label="$t('message.laborMange.rangeType')" prop="areaType">
<el-radio-group v-model="addForm.areaType" @change="changeAreaType">
<el-radio :label="1">{{$t('message.laborMange.criticalDistrict')}}</el-radio>
<el-radio :label="2">{{$t('message.laborMange.custom')+$t('message.laborMange.area')}}</el-radio>
</el-radio-group>
<el-select
v-model="addForm.standArea"
:placeholder="$t('message.laborMange.pleaseChoose')"
style="margin-left: 40px"
v-show="addForm.areaType == 1"
@change="drawCircle()"
>
<el-option
v-for="item in options"
:key="item"
:label="item + $t('message.laborMange.meter')"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('message.laborMange.companies')" prop="enterpriseId">
<el-select
v-model="addForm.enterpriseId"
:placeholder="$t('message.laborMange.notSelectedThisApplies')"
filterable
:clearable="true"
>
<el-option
v-for="item in companyList"
:key="item.id"
:label="item.enterpriseName"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<div class="dialog-footer">
<el-button
class="cancleBtn"
@click="cardDialog = false"
icon="el-icon-circle-close"
size="medium"
>{{ $t("message.personnelPosition.cancel") }}
</el-button>
<el-button
type="primary"
icon="el-icon-circle-check"
@click="saveCardFn"
size="medium"
>{{ $t("message.personnelPosition.determine") }}
</el-button>
</div>
</el-form>
</div>
</el-dialog>
<el-dialog
:modal-append-to-body="false"
:title="$t('message.laborMange.attendanceMode')"
:visible.sync="configDialog"
width="667px"
>
<div class="dialog_content">
<el-form size="medium" :inline="true">
<el-form-item :label="$t('message.laborMange.clockInWay')">
<el-radio-group
v-model="needPhotoForAttend"
@change="saveAttendType"
>
<el-radio :label="0">{{$t('message.laborMange.positioningPunching')}}</el-radio>
<el-radio :label="1">{{$t('message.laborMange.positioningPunching')}}+{{$t('message.laborMange.faceRecognition')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('message.laborMange.similarityGreaterThan')" v-show="needPhotoForAttend == 1">
<el-input-number
v-model="faceScore"
@change="saveAttendType"
:min="50"
:max="100"
:label="$t('message.laborMange.linkText')"
:controls="false"
:placeholder="$t('message.laborMange.default60')"
style="width: 80px; margin-right: 15px"
></el-input-number>
<!-- <el-input v-model="faceScore" class="input" placeholder="默认60" style="width: 80px;margin-right: 15px" type="number" max="100" min="1" @blur="saveAttendType"></el-input>
%认为是同一人否则不是同一人-->%{{$t('message.laborMange.canBeSuccessful')}}
</el-form-item>
</el-form>
</div>
</el-dialog>
</div>
</vue-scroll>
</template>
<script>
import {
electricFenceListApi,
electricFenceAddApi,
electricFenceDeleteApi,
} from "@/assets/js/api/laborPerson";
import {
editProjectConfigListApi,
getProjectConfigListApi,
} from "@/assets/js/api/project";
import { getCooperatorListApi } from "@/assets/js/api/cooperationUnit";
var mouseTool;
var objs = [];
export default {
data() {
return {
list: [],
cardDialog: false,
addForm: {
addr: "",
areaType: 1,
locationList: [
{
fenceId: 0,
id: 0,
latitude: "",
longitude: "",
sortNum: 0,
},
],
projectSn: "",
standArea: 100,
enterpriseId: "",
},
locationList: [],
options: [30, 50, 100, 200, 300],
map: null,
mapOperateType: 1,
needPhotoForAttend: 0, //手机打卡是否需要图片0否1是
configDialog: false,
faceScore: 60,
companyList: [],
};
},
mounted() {
this.getCooperatorList();
this.loadData();
},
methods: {
//获取企业列表数据
getCooperatorList() {
let data = {
projectSn: this.$store.state.projectSn,
pageNo: 1,
pageSize: 100,
// enterpriseTypeId: this.enterpriseTypeId,
enterpriseName: "",
};
getCooperatorListApi(data).then((res) => {
this.companyList = res.result.records;
});
},
getAttendenceTypeFn() {
this.configDialog = true;
getProjectConfigListApi({ projectSn: this.$store.state.projectSn }).then(
(res) => {
if (res.result) {
this.needPhotoForAttend = res.result[0].phoneClockImageType;
this.faceScore = res.result[0].faceScore;
}
}
);
},
saveAttendType() {
editProjectConfigListApi({
projectSn: this.$store.state.projectSn,
phoneClockImageType: this.needPhotoForAttend,
faceScore: this.faceScore,
}).then((res) => {
this.$message.success(this.$t('message.laborMange.saveSuccess'));
});
},
showDialogFn() {
this.cardDialog = true;
this.addForm.areaType=1
var detail = this.$store.state.currentProDetail;
this.addForm.addr =
detail.provinceName +
detail.cityName +
detail.areaName +
detail.projectAddress;
this.$nextTick(() => {
this.initMap();
});
},
loadData() {
electricFenceListApi({ projectSn: this.$store.state.projectSn }).then(
(res) => {
this.list = res.result;
}
);
},
initMap() {
var that = this;
//地图加载
this.map = new AMap.Map("container", {
resizeEnable: true,
});
var geocoder = new AMap.Geocoder({});
//输入提示
var autoOptions = {
input: "tipinput",
};
this.auto = new AMap.Autocomplete(autoOptions);
this.placeSearch = new AMap.PlaceSearch({
map: this.map,
}); //构造地点查询类
AMap.event.addListener(this.auto, "select", this.select); //注册监听,当选中某条记录时会触发
mouseTool = new AMap.MouseTool(this.map);
mouseTool.on("draw", function (event) {
// event.obj 为绘制出来的覆盖物对象
console.log("覆盖物对象绘制完成", event.obj.getPath());
let overlaysList = that.map.getAllOverlays("polygon");
if (overlaysList.length > 1) {
that.map.remove(overlaysList[0]);
}
that.locationList = [];
var pathArr = event.obj.getPath();
pathArr.forEach((element) => {
that.locationList.push({
longitude: element.lng,
latitude: element.lat,
});
});
});
geocoder.getLocation(this.addForm.addr, function (status, result) {
if (status === "complete" && result.geocodes.length) {
var lnglat = result.geocodes[0].location;
console.log(result.geocodes[0]);
// var arr = lnglat.split(',')
that.locationList = [
{
longitude: lnglat.lng,
latitude: lnglat.lat,
},
];
that.drawCircle();
} else {
alert("error");
}
});
this.map.on("click", (e) => {
console.log(
"您在 [ " +
e.lnglat.getLng() +
"," +
e.lnglat.getLat() +
" ] 的位置单击了地图!"
);
if (this.addForm.areaType == 1) {
this.locationList = [];
this.locationList.push({
longitude: e.lnglat.getLng(),
latitude: e.lnglat.getLat(),
});
var lnglatXY = new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat());
geocoder.getAddress(lnglatXY, function (status, result) {
console.log(status, result);
that.addForm.addr = result.regeocode.formattedAddress;
});
this.drawCircle();
} else {
this.locationList.push({
longitude: e.lnglat.getLng(),
latitude: e.lnglat.getLat(),
});
}
});
},
select(e) {
console.log("select", e);
this.placeSearch.setCity(e.poi.adcode);
this.placeSearch.search(e.poi.name); //关键字查询查询
},
//清空地图
clearFn() {
this.map.clearMap();
},
changeAreaType() {
this.locationList = [];
this.clearFn();
},
//添加点标记
addMarker() {
// 创建一个 Icon
var startIcon = new AMap.Icon({
// 图标尺寸
size: new AMap.Size(25, 34),
// 图标的取图地址
image:
"//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
// 图标所用图片大小
imageSize: new AMap.Size(25, 34),
// 图标取图偏移量
// imageOffset: new AMap.Pixel(-9, -3)
});
var marker = new AMap.Marker({
icon: startIcon,
position: [
this.locationList[0].longitude,
this.locationList[0].latitude,
],
size: new AMap.Size(25, 34),
// offset: new AMap.Pixel(-13, -30)
});
marker.setMap(this.map);
},
exitEditFn() {
mouseTool.close();
},
//画圆
drawCircle() {
if (this.locationList.length == 0) {
return;
}
this.clearFn();
this.addMarker();
var circle = new AMap.Circle({
center: [this.locationList[0].longitude, this.locationList[0].latitude],
radius: this.addForm.standArea, //半径
borderWeight: 2,
strokeColor: "#6caffc",
strokeOpacity: 1,
strokeWeight: 2,
fillOpacity: 0.6,
strokeStyle: "solid",
// strokeDasharray: [10, 10],
// 线样式还支持 'dashed'
fillColor: "#6caffc",
zIndex: 50,
});
circle.setMap(this.map);
// 缩放地图到合适的视野级别
this.map.setFitView([circle]);
},
//绘制矩形
drawRectangle() {
this.clearFn();
mouseTool.rectangle({
strokeColor: "#6caffc",
// strokeOpacity: 0.5,
strokeWeight: 2,
fillColor: "#6caffc",
fillOpacity: 0.6,
// strokeStyle还支持 solid
strokeStyle: "solid",
// strokeDasharray: [30,10],
});
},
drawPolygon() {
this.clearFn();
mouseTool.polygon({
strokeColor: "#6caffc",
strokeOpacity: 1,
strokeWeight: 2,
// strokeOpacity: 0.2,
fillColor: "#6caffc",
fillOpacity: 0.6,
// 线样式还支持 'dashed'
strokeStyle: "solid",
// strokeStyle是dashed时有效
// strokeDasharray: [30,10],
});
},
saveCardFn() {
if (this.locationList.length == 0) {
this.$message.error(this.$t('message.laborMange.noAttendanceAreaSet'));
return;
}
this.addForm.locationList = this.locationList;
this.addForm.projectSn = this.$store.state.projectSn;
let json = JSON.parse(JSON.stringify(this.addForm));
if (json.enterpriseId == null || json.enterpriseId == "") {
json.enterpriseId = 0;
}
electricFenceAddApi(json).then((res) => {
this.cardDialog = false;
this.loadData();
});
},
deleteFn(id) {
this.$confirm(this.$t('message.laborMange.deleteAreaHint'), this.$t('message.laborMange.hint'), {
confirmButtonText: this.$t('message.laborMange.confirm'),
cancelButtonText: this.$t('message.laborMange.cancel'),
type: "warning",
})
.then(() => {
electricFenceDeleteApi({ id: id }).then((res) => {
this.$message({
type: "success",
message:this.$t('message.laborMange.deleteSuccess'),
});
this.loadData();
});
})
.catch(() => {
// this.$message({
// type: "info",
// message: "已取消删除",
// });
});
},
},
};
</script>
<style lang="less" scoped>
.fence-info {
border: 1px solid #e6e6e6;
border-radius: 4px;
box-shadow: 6px 6px 20px rgba(0, 0, 0, 0.1);
margin-top: 20px;
overflow: hidden;
position: relative;
display: flex;
background-color: white;
.fence-info-image {
font-size: 0;
margin-right: 30px;
}
.fence-info-label {
display: flex;
flex-direction: column;
justify-content: center;
color: #666;
line-height: 1;
}
.fence-info-close {
cursor: pointer;
position: absolute;
top: 20px;
right: 20px;
}
.fence-info-title {
font-size: 16px;
margin-bottom: 30px;
}
.fence-info-text {
margin-bottom: 16px;
}
}
.coordinate-picking {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
// .el-input {
// width: 20%;
// margin: 0 10px 0 5px;
// }
// .el-button {
// margin-right: 10px;
// }
}
#container {
width: 100%;
height: 400px;
}
.addrTitle {
font-size: 16px;
line-height: 56px;
border-bottom: 1px solid #e6e6e6;
margin-bottom: 20px;
}
</style>