This commit is contained in:
2026-04-11 19:12:10 +08:00
parent 023108c623
commit 9f18435238
5 changed files with 184 additions and 78 deletions

View File

@ -46,10 +46,18 @@
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"> @chooseData="chooseData">
<template #dktp="{ row }"> <template #dktp="{ row }">
<el-image :append-to-body="true" :preview-src-list="[ <el-image v-if="row.dktp" :append-to-body="true" :preview-src-list="[
`/mosty-api/mosty-base/minio/image/download/${row.dktp}` `/mosty-api/mosty-base/minio/image/download/${row.dktp}`
]" style="width: 75px; height: 75px" :src="`/mosty-api/mosty-base/minio/image/download/${row.dktp}`" ]" style="width: 75px; height: 75px" :src="`/mosty-api/mosty-base/minio/image/download/${row.dktp}`"
fit="cover" lazy /> fit="cover" lazy />
<span v-else>-</span>
</template>
<template #lktp="{ row }">
<el-image v-if="row.lktp" :append-to-body="true" :preview-src-list="[
`/mosty-api/mosty-base/minio/image/download/${row.lktp}`
]" style="width: 75px; height: 75px" :src="`/mosty-api/mosty-base/minio/image/download/${row.lktp}`"
fit="cover" lazy />
<span v-else>-</span>
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row, index }"> <template #controls="{ row, index }">
@ -206,8 +214,11 @@ const init = (type, row) => {
{ label: "点位名称", prop: "bxdMc", showOverflowTooltip: true }, { label: "点位名称", prop: "bxdMc", showOverflowTooltip: true },
{ label: "经度", prop: "jd", showOverflowTooltip: true }, { label: "经度", prop: "jd", showOverflowTooltip: true },
{ label: "维度", prop: "wd", showOverflowTooltip: true }, { label: "维度", prop: "wd", showOverflowTooltip: true },
{ label: "打卡人", prop: "dkr", showOverflowTooltip: true },
{ label: "打卡时间", prop: "dksj", showOverflowTooltip: true }, { label: "打卡时间", prop: "dksj", showOverflowTooltip: true },
{ label: "图片", prop: "dktp", showOverflowTooltip: true, showSolt: true }, { label: "打卡图片", prop: "dktp", showOverflowTooltip: true, showSolt: true },
{ label: "离开时间", prop: "lksj", showOverflowTooltip: true },
{ label: "离开图片", prop: "lktp", showOverflowTooltip: true, showSolt: true },
] ]
pageData.tableConfiger.haveControls = false pageData.tableConfiger.haveControls = false
} }

View File

@ -10,7 +10,7 @@ import { qcckPost, qcckGet } from "@/api/qcckApi.js";
const searchConfiger = reactive([ const searchConfiger = reactive([
{ {
showType: "input", showType: "input",
prop: "dkrXm", prop: "dkr",
placeholder: "请输入打卡人姓名", placeholder: "请输入打卡人姓名",
label: "打卡人姓名" label: "打卡人姓名"
} }
@ -34,28 +34,28 @@ const pageData = reactive({
tableColumn: [ tableColumn: [
{ {
label: "打卡人姓名", label: "打卡人姓名",
prop: "dkrXm" prop: "dkr"
}, },
{ {
label: "必到点位置", label: "打卡点名称",
prop: "bddMc" prop: "bxdMc"
}, },
{ {
label: "开始时间", label: "打卡时间",
prop: "dkKsSj" prop: "dksj"
}, },
{ {
label: "打卡开始附件", label: "打卡图片",
prop: "dkKsFj", prop: "dktp",
showSolt: true showSolt: true
}, },
{ {
label: "结束时间", label: "离开时间",
prop: "dkJsSj" prop: "lksj"
}, },
{ {
label: "打卡结束附件", label: "离开图片",
prop: "dkJsFj", prop: "lktp",
showSolt: true showSolt: true
} }
] ]
@ -77,7 +77,7 @@ const tabHeightFn = () => {
const getListData = async (params = {}) => { const getListData = async (params = {}) => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
qcckGet({...pageData.pageConfiger,...params}, "/mosty-yjzl/tbZdxlFgdwBddxlrwJl/getPageList") qcckGet({...pageData.pageConfiger,...params}, "/mosty-yjzl/tbZdyrw/selectDkList")
.then((res) => { .then((res) => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
@ -127,26 +127,28 @@ onMounted(() => {
:tableConfiger="pageData.tableConfiger" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth" :controlsWidth="pageData.controlsWidth"
> >
<template #dkKsFj="{ row }"> <template #dktp="{ row }">
<el-image <el-image
v-if="row.dktp"
:append-to-body="true" :append-to-body="true"
:preview-src-list="[ :preview-src-list="[
`/mosty-api/mosty-base/minio/image/download/${row.dkKsFj}` `/mosty-api/mosty-base/minio/image/download/${row.dktp}`
]" ]"
style="width: 75px; height: 75px" style="width: 75px; height: 75px"
:src="`/mosty-api/mosty-base/minio/image/download/${row.dkKsFj}`" :src="`/mosty-api/mosty-base/minio/image/download/${row.dktp}`"
fit="cover" fit="cover"
lazy lazy
/> />
</template> </template>
<template #dkJsFj="{ row }"> <template #lktp="{ row }">
<el-image <el-image
v-if="row.lktp"
:append-to-body="true" :append-to-body="true"
:preview-src-list="[ :preview-src-list="[
`/mosty-api/mosty-base/minio/image/download/${row.dkJsFj}` `/mosty-api/mosty-base/minio/image/download/${row.lktp}`
]" ]"
style="width: 75px; height: 75px" style="width: 75px; height: 75px"
:src="`/mosty-api/mosty-base/minio/image/download/${row.dkJsFj}`" :src="`/mosty-api/mosty-base/minio/image/download/${row.lktp}`"
fit="cover" fit="cover"
lazy lazy
/> />

View File

@ -6,35 +6,39 @@
</div> </div>
<ul class="warningList" ref="gjyjList"> <ul class="warningList" ref="gjyjList">
<li v-for="item in warningList" :key="item.id"> <li v-for="item in warningList" :key="item.id">
<div>打卡人{{ item.dkrXm }}</div> <div class="task-title">任务名称{{ item.fgRwmc }}</div>
<div>必到点位置{{ item.bddMc }}</div> <div>领取人{{ item.fgrwlqr }}</div>
<div>打卡开始时间{{ item.dkKsSj }}</div> <div class="bxds-box" v-for="bxd in item.bxds" :key="bxd.bxdid">
<div class="fj_box"> <div class="bxd-title">点位{{ bxd.bxdMc }}</div>
<div>打卡开始附件</div> <div>打卡状态{{ bxd.dkzt }}</div>
<el-image <div>打卡时间{{ bxd.dksj }}</div>
:append-to-body="true" <div class="fj_box" v-if="bxd.dktp">
:preview-src-list="[ <div>打卡图片</div>
`/mosty-api/mosty-base/minio/image/download/${item.dkKsFj}` <el-image
]" :append-to-body="true"
style="width: 75px; height: 75px" :preview-src-list="[
:src="`/mosty-api/mosty-base/minio/image/download/${item.dkKsFj}`" `/mosty-api/mosty-base/minio/image/download/${bxd.dktp}`
fit="cover" ]"
lazy style="width: 75px; height: 75px"
/> :src="`/mosty-api/mosty-base/minio/image/download/${bxd.dktp}`"
</div> fit="cover"
<div>打卡结束时间{{ item.dkJsSj }}</div> lazy
<div class="fj_box"> />
<div>打卡结束附件</div> </div>
<el-image <div v-if="bxd.lksj">离开时间{{ bxd.lksj }}</div>
:append-to-body="true" <div class="fj_box" v-if="bxd.lktp">
:preview-src-list="[ <div>离开图片</div>
`/mosty-api/mosty-base/minio/image/download/${item.dkJsFj}` <el-image
]" :append-to-body="true"
style="width: 75px; height: 75px" :preview-src-list="[
:src="`/mosty-api/mosty-base/minio/image/download/${item.dkJsFj}`" `/mosty-api/mosty-base/minio/image/download/${bxd.lktp}`
fit="cover" ]"
lazy style="width: 75px; height: 75px"
/> :src="`/mosty-api/mosty-base/minio/image/download/${bxd.lktp}`"
fit="cover"
lazy
/>
</div>
</div> </div>
</li> </li>
<el-empty <el-empty
@ -94,13 +98,13 @@ function close() {
emit("close", false); emit("close", false);
} }
//获取轨迹预警列表 //获取打卡情况列表
function _getSelectTrack(id) { function _getSelectTrack(id) {
loading.value = true; loading.value = true;
qcckGet({ xfbbId: id }, "/mosty-yjzl/tbZdxlFgdwBddxlrwJl/getRwjlByXfbbId") qcckGet({ bbid: id }, "/mosty-yjzl/tbZdyrw/getFgrwListByBbid")
.then((res) => { .then((res) => {
loading.value = false; loading.value = false;
warningList.value = res; warningList.value = res || [];
}) })
.catch((err) => { .catch((err) => {
loading.value = false; loading.value = false;
@ -124,6 +128,25 @@ function _getSelectTrack(id) {
padding: 10px; padding: 10px;
box-sizing: border-box; box-sizing: border-box;
border-radius: 10px; border-radius: 10px;
.task-title {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
.status-tag {
color: #3ad2d4;
}
}
.bxds-box {
margin-top: 10px;
padding: 8px;
background: rgba(20, 52, 123, 0.5);
border-radius: 6px;
.bxd-title {
color: #3ad2d4;
margin-bottom: 5px;
}
}
} }
.photo { .photo {
width: 60px; width: 60px;

View File

@ -53,6 +53,12 @@
</div> </div>
<!-- 指令时间按钮 --> <!-- 指令时间按钮 -->
<div class="addBox transition" :style="{ right: showClassR ? '0px' : '394px' }"> <div class="addBox transition" :style="{ right: showClassR ? '0px' : '394px' }">
<div @click="clickPatrolBlock" class="imgBox">
<span>巡逻方块</span>
</div>
<div @click="clickTaskIssue" class="imgBox">
<span>任务下发</span>
</div>
<div @click="clickXfzl" class="imgBox"> <div @click="clickXfzl" class="imgBox">
<span>下发指令</span> <span>下发指令</span>
</div> </div>
@ -80,6 +86,7 @@ import { qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js"; import emitter from "@/utils/eventBus.js";
import router from "@/router/index.js"; import router from "@/router/index.js";
import { getSelectVigilant } from "@/api/dpApi/home.js"; import { getSelectVigilant } from "@/api/dpApi/home.js";
import { getPatrolBlockList } from "@/api/basicsmanage/patrolBlock.js";
import GdMap from "@/components/Map/GdMap/index.vue"; import GdMap from "@/components/Map/GdMap/index.vue";
import Header from "./layout/header.vue"; import Header from "./layout/header.vue";
import CheckBox from "@/components/checkBox/index"; import CheckBox from "@/components/checkBox/index";
@ -143,6 +150,8 @@ const timeList = ref({
hasChoose: [], hasChoose: [],
}) })
const isShowCount = ref(false) //是否展示统计 const isShowCount = ref(false) //是否展示统计
const isShowPatrolBlock = ref(false) //是否展示巡逻方块
const patrolBlockList = ref([]) //巡逻方块数据
watch(() => showClassR.value, watch(() => showClassR.value,
(val) => { emitter.emit("followUp", !val); } (val) => { emitter.emit("followUp", !val); }
); );
@ -228,6 +237,49 @@ function clickXfzl() {
emitter.emit("closeAllDialog"); emitter.emit("closeAllDialog");
emitter.emit("showZlxf"); emitter.emit("showZlxf");
} }
//点击巡逻方块
function clickPatrolBlock() {
if (isShowPatrolBlock.value) {
// 隐藏方块
emitter.emit("deletePointArea", "patrolBlockLarge");
isShowPatrolBlock.value = false;
patrolBlockList.value = [];
} else {
// 显示方块
getPatrolBlockList({ pageCurrent: 1, pageSize: 1000 }).then((res) => {
if (res.records && res.records.length > 0) {
patrolBlockList.value = res.records;
let cc = [];
const coords = res.records.map((el, index) => {
let centerPoint = [el.zxX, el.zxY];
if (index == 0) cc = centerPoint;
let position = [
[Number(el.x1), Number(el.y1)],
[Number(el.x2), Number(el.y2)]
];
let text = el.mc;
return { position, text, id: el.id, userData: el };
});
emitter.emit("echoPlane", {
fontColor: "#12fdb8",
coords: coords,
type: "rectangle",
flag: "patrolBlockLarge",
color: "rgba(2,20,51,0.5)",
linecolor: "#1C97FF"
});
emitter.emit("setMapCenter", { location: cc, zoomLevel: 12 });
isShowPatrolBlock.value = true;
} else {
proxy.$message.warning("暂无巡逻方块数据");
}
});
}
}
//点击任务下发
function clickTaskIssue() {
window.open('#/taskPage/IssueTasks', '_blank');
}
//点击犯罪预测 //点击犯罪预测
function clickAddEvent() { function clickAddEvent() {
showVisible.value = !showVisible.value showVisible.value = !showVisible.value
@ -461,4 +513,13 @@ function handleFzyc() {
background: url('~@/assets/home/cj_total.png')no-repeat; background: url('~@/assets/home/cj_total.png')no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
} }
.addBox {
display: flex;
flex-direction: column;
gap: 8px;
.imgBox {
position: relative;
}
}
</style> </style>

View File

@ -86,31 +86,7 @@
<button class="dp-default small" v-else @click="getKfdData">检查站</button> <button class="dp-default small" v-else @click="getKfdData">检查站</button>
<button class="dp-default small" @click="onClickZbyj">周边预警</button> <button class="dp-default small" @click="onClickZbyj">周边预警</button>
<button class="dp-default small" @click="onClickSpsd">视频随动</button> <button class="dp-default small" @click="onClickSpsd">视频随动</button>
<el-popover placement="bottom" :visible="visible" :width="476" :append-to-body="false"> <button class="dp-default small" :class="{ active: isGjhfActive }" @click="toggleGjhf">轨迹回放</button>
<template #reference>
<button class="dp-default small" @click="visible = !visible">轨迹回放</button>
</template>
<div class="timeBox">
<div class="time1">{{ dateRange[0] }}</div>
<el-slider
class="playtime-slider"
v-model="playTime"
id="playtimeSlider"
:range="true"
:min="sliderMIn"
:max="sliderMax"
:format-tooltip="playTimeFormat"
@change="playTimeChange"
:key="videoTndex"
>
</el-slider>
<div class="time1">{{ dateRange[1] }}</div>
</div>
<div style="text-align: center; width: 100%">
<el-button @click.stop="chooseTime">确定</el-button>
<el-button @click.stop="onClickGjhf">回放</el-button>
</div>
</el-popover>
<button class="dp-default small" @click="getDkqkData">打卡情况</button> <button class="dp-default small" @click="getDkqkData">打卡情况</button>
</div> </div>
</div> </div>
@ -137,6 +113,7 @@ const props = defineProps({
} }
}); });
const visible = ref(false); const visible = ref(false);
const isGjhfActive = ref(false);
const times = ref(null); const times = ref(null);
const router = useRouter(); const router = useRouter();
@ -206,6 +183,7 @@ function getZFJLY(item) {
function close() { function close() {
emitter.emit("deletePointArea", "largeIcon"); emitter.emit("deletePointArea", "largeIcon");
visible.value = false; visible.value = false;
isGjhfActive.value = false;
emitter.emit("showJzInfo", false); emitter.emit("showJzInfo", false);
emitter.emit("deletePointArea", "xfq"); emitter.emit("deletePointArea", "xfq");
emitter.emit("deletePointArea", "route"); emitter.emit("deletePointArea", "route");
@ -230,6 +208,33 @@ function playTimeChange(val) {
function _getTbWzXfwzSelectTrack() { function _getTbWzXfwzSelectTrack() {
getTbWzXfwzSelectTrack().then((res) => {}); getTbWzXfwzSelectTrack().then((res) => {});
} }
// 切换轨迹回放
function toggleGjhf() {
if (isGjhfActive.value) {
// 取消选中,清除轨迹
emitter.emit("deletePointArea", "route");
isGjhfActive.value = false;
} else {
// 选中,获取轨迹
let params = {
bbId: props.data.id,
kssj: dateRange.value.length > 0 ? dateRange.value[0] : "",
jssj: dateRange.value.length > 0 ? dateRange.value[1] : ""
};
emitter.emit("deletePointArea", "route");
qcckPost(params, "/mosty-wzzx/tbWzXfwz/selectLswz").then((res) => {
let arr = res || [];
let points = [];
arr.forEach((item) => { points.push([item.jd, item.wd]) });
if (points.length > 0) {
emitter.emit("drawLineAnimation", {coords:points,isClear:true,flag:'route'});
isGjhfActive.value = true;
} else {
proxy.$message({ type: "warning", message: `没有轨迹数据` });
}
});
}
}
// 根据时间来画轨迹 // 根据时间来画轨迹
function chooseTime() { function chooseTime() {
let params = { let params = {
@ -448,4 +453,8 @@ const getDkqkData=()=>{
::v-deep .el-popper.is-light{ ::v-deep .el-popper.is-light{
transform: translate(5px, 336px) !important; transform: translate(5px, 336px) !important;
} }
.btnBox .active {
background: #1c97ff !important;
border-color: #1c97ff !important;
}
</style> </style>