This commit is contained in:
给我
2026-04-10 17:10:36 +08:00
parent 368ed7897b
commit ef83eeb5fe
767 changed files with 167713 additions and 0 deletions

View File

@ -0,0 +1,217 @@
<template>
<div style="padding-top: 13vw">
<TopNav navTitle="指令详情" :showRight="false" :showLeft="true" />
<div class="detailBox">
<div class="detailInfo">
<div class="detailInfo-left">
<!-- <div class="photo"><img :src="detailInfo.carImg" alt=""></div> -->
<div class="photo"><img :src="detailInfo.photo" alt=""></div>
<div class="title">预警</div>
</div>
<div class="detailInfo-right">
<div class="info-item"><van-icon name="coupon-o" />{{detailInfo.plateNumber}}</div>
<div class="info-item"><van-icon name="manager-o" />{{detailInfo.userName}}</div>
<div class="info-item"><van-icon name="coupon-o" />{{detailInfo.checkName}}</div>
<div class="info-item">
<van-icon name="location-o" />{{detailInfo.activityAddress}}
</div>
<div class="info-item">
<van-icon name="clock-o" />{{detailInfo.time}}
</div>
</div>
</div>
<div class="liucheng">
<Steps :data="stepsData">
<template v-slot:default="{ scope }">
<div class="content">
<div class="cont_l" v-if="scope.isQsStatus == '01'">
<span class="triangleleft"></span>
<div class="status">待签收</div>
<div class="btns">
<span @click="handelEvents('reback')">拒绝</span>
<span @click="handelEvents('receive')">签收</span>
</div>
</div>
<div class="cont_l" v-if="scope.isQsStatus == '02'">
<span class="triangleleft"></span>
<div class="text">已签收</div>
<div class="text">
<van-icon name="manager-o" />周瓜皮 特警大队
</div>
<div class="text">
<van-icon
name="location-o"
/>成都市武侯区高新成都市武侯区高新公安局公安局
</div>
</div>
<div class="cont_l" v-if="scope.isQsStatus == '03'">
<span class="triangleleft"></span>
<div class="text">
<van-icon name="manager-o" />周瓜皮 特警大队
</div>
<div class="text">
<van-icon
name="location-o"
/>成都市武侯区高新成都市武侯区高新公安局公安局
</div>
</div>
</div>
</template>
</Steps>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import TopNav from "../../../components/topNav.vue";
import Steps from "../../../components/Steps.vue";
import { updateDetail,getyjzlInfoDetail } from "../../../api/checkponit.js";
import { useRouter, useRoute } from "vue-router";
import { Form } from "vant";
const route = useRoute();
const router = useRouter();
const detailInfo = ref({})
const stepsData = ref([
{ time: route.query.time, isQsStatus: "01" },
]);
onMounted(() => {
detailInfo.value = route.query
getInfoDetail('01')
});
// 签收
function handelEvents(val){
switch(val){
case 'receive':
getInfoDetail('02')
break
case 'reback':
break
}
}
// 指令详情
function getDetail(zlId){
getyjzlInfoDetail(zlId).then(res=>{
})
}
function getInfoDetail(zlztdm){
let params = {
zlztsj:route.query.time,
zlztddxz:route.query.activityAddress,
zlztddjd:route.query.jd,
zlztddwd:route.query.wd,
zlid:route.query.id,
zlztbmdm:JSON.parse(window.localStorage.getItem("userInfo")).deptList[0].deptCode,
zlztbmmc:JSON.parse(window.localStorage.getItem("userInfo")).deptList[0].deptName,
zlztrysfzh:route.query.sfzh,
zlztryxm:route.query.userName,
ssfxjmc:'',
ssfxjdm:'',
ssdszmc:'',
ssdszdm:'',
zlztdm:zlztdm,
}
updateDetail(params).then(res=>{
getDetail(route.query.id)
})
}
</script>
<style lang="scss" scoped>
.detailBox {
background: #e9e9e9;
height: calc(100vh - 13vw);
padding: 2vw 4vw;
box-sizing: border-box;
.detailInfo {
display: flex;
width: 100%;
background: #fff;
font-size: 14px;
padding: 2vw;
box-sizing: border-box;
.detailInfo-left {
margin-right: 4vw;
.photo {
width: 90px;
height: 110px;
border: 1px solid #e9e9e9;
img{
width: 100%;
height: 100%;
}
}
.title {
text-align: center;
line-height: 8vw;
color: #000;
}
}
.detailInfo-right {
flex: 1;
.info-item {
line-height: 7vw;
.van-icon {
margin-right: 2vw;
}
}
}
}
.liucheng {
.content {
padding: 2vw;
box-sizing: border-box;
.cont_l {
position: relative;
padding: 2vw;
box-sizing: border-box;
background: #fff;
.status {
line-height: 10vw;
border-bottom: 1px solid #ccc;
}
.btns {
display: flex;
span {
flex: 1;
text-align: center;
margin-top: 4vw;
color: #3373fa;
}
span:nth-child(1) {
color: red;
}
}
.triangleleft {
position: absolute;
left: -16px;
top: 46%;
display: inline-block;
width: 0;
height: 0;
border: 8px solid transparent;
border-right-color: #fff;
}
.text {
line-height: 7vw;
.van-icon {
margin-right: 2vw;
}
}
}
}
}
}
::v-deep .main .item .item_l .icon {
top: 50%;
}
::v-deep .main .item .item_l {
padding-top: 13%;
box-sizing: border-box;
}
</style>

View File

@ -0,0 +1,365 @@
<template>
<div style="padding-top: 13vw">
<TopNav navTitle="指令列表" :showRight="false" :showLeft="true" />
<div class="search">
<div class="sort">
<van-icon name="arrow-up" />
<van-icon name="arrow-down" />
时间排序
</div>
<span class="search-filter" @click="showRight = true">过滤筛选 <van-icon name="filter-o" /></span>
</div>
<!-- 列表 -->
<ul class="listBox">
<van-pull-refresh v-model="loadingPull" @refresh="onRefresh">
<van-list v-model:loading="loading" :finished="finished" finished-text="" @load="onLoad" offset="1"
:immediate-check="false">
<li class="listBox-item" v-for="(item, index) in yjList" :key="index" @click="handelDetail(item)">
<YjzlItem :data="item" />
</li>
<van-empty description="暂无信息" image="default" v-if="yjList.length <= 0 && !loading" />
</van-list>
</van-pull-refresh>
</ul>
<!-- 弹出层 -->
<van-popup v-model:show="showRight" position="right" :style="{ width: '60%', height: '100%' }">
<div class="popup-content">
<div class="popup-title">过滤筛选</div>
<ul class="popup-box">
<li class="popup-item yjlx-info">
<van-field v-model="form.warnType" label-width="60px" label="预警类型:" readonly placeholder="请选择预警类型"
@click.stop="chooseYjlx()"></van-field>
<ul class="select-box" v-if="showLx">
<span class="triangleup"></span>
<li class="select-box-li" :class="isActive == 0 ? 'active' : ''" @click="cilickLx(0)">
车辆
</li>
<li class="select-box-li" :class="isActive == 1 ? 'active' : ''" @click="cilickLx(1)">
人员
</li>
</ul>
</li>
<li class="popup-item">
<van-field v-model="form.beginDate" label-width="60px" label="开始时间:" input-align="left"
placeholder="请选择开始时间" readonly @click.stop="onClickTime('start')"></van-field>
</li>
<li class="popup-item">
<van-field v-model="form.endDate" label-width="60px" input-align="left" label="结束时间:"
@click.stop="onClickTime('end')" placeholder="请选择结束时间" readonly></van-field>
</li>
</ul>
<div style="padding: 4vw 2vw">
<van-button block plain @click="(form = {}), (form.beginDate = dateFormat())"
style="margin-bottom: 2vw">重置</van-button>
<van-button block type="primary" @click="onSubmit" loading-type="spinner"
loading-text="登录中...">查询</van-button>
</div>
</div>
</van-popup>
<!-- 时间选择器 -->
<SelectTime :timeType="timeType" v-if="timeShow" @update:time="onSelectTime"
@update:cancelTime="timeShow = false" />
<!-- 时间提示框 -->
<van-popup v-model:show="alertInfo" round :style="{ width: '80%' }">
<div class="alertInfoBox">
<div class="alert">结束时间必须大于开始时间</div>
<div class="alertBtn" @click="alertInfo = false">确定</div>
</div>
</van-popup>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import TopNav from "../../../components/topNav.vue";
import YjzlItem from "../../../components//yjzlItem.vue";
import SelectTime from "../../../components//SelectTime.vue";
import { useRouter, useRoute } from "vue-router";
import { getyjzlList } from "../../../api/checkponit.js";
import { dateFormat } from "../../../utils/tools.js";
import { Loading } from "vant";
const route = useRoute();
const router = useRouter();
const showRight = ref(false);
const form = ref({ beginDate: dateFormat() });
const isActive = ref(-1);
const showLx = ref(false); //显示类型
const timeType = ref("start");
const timeShow = ref(false); //是否显示时间选择器
const page = ref(1); //分页
const pageSize = ref(10); //分页数
const total = ref(0); //总数
const yjList = ref([]);
const loadingPull = ref(false); //下拉刷新
const loading = ref(true); //数据加载中
const finished = ref(false); //数据加载完成
const alertInfo = ref(false) //消息提示
onMounted(() => {
getYjList();
});
// 触底加载数据
function onLoad() {
if (yjList.value.length < total.value) {
page.value++;
getYjList();
} else {
loading.value = false;
finished.value = true;
}
}
//下拉刷新
function onRefresh() {
loading.value = false;
loadingPull.value = false;
finished.value = false;
page.value = 1;
getYjList();
}
// 查询
function onSubmit() {
let date1 = new Date(form.value.beginDate); //开始
let date2 = new Date(form.value.endDate); //结束
if (date1 > date2) {
alertInfo.value = true
} else {
yjList.value = [];
showRight.value = false;
page.value = 1;
loading.value = true
getYjList();
}
}
// 获取预警指令列表
function getYjList() {
let warnType =
form.value.warnType == "车辆"
? "1"
: form.value.warnType == "人员"
? "2"
: "";
let params = {
currentPage: page.value,
pageSize: pageSize.value,
beginDate: '2022-01-01',
// beginDate: form.value.beginDate,
checkpointCode: route.query.kkid,
warnType: warnType,
endDate: form.value.endDate,
};
getyjzlList(params)
.then((res) => {
if (page.value == 1) {
yjList.value = res.records;
} else {
yjList.value = yjList.value.concat(res.records);
}
page.value = res.current;
pageSize.value = res.size;
total.value = res.total;
loading.value = false;
})
.catch(() => {
loading.value = false;
});
}
//查看详情
function handelDetail(item) {
let data = {
time: item.warnningTime,
label: item.label,
plateNumber: item.plateNumber,
checkName: item.checkName,
activityAddress: item.activityAddress,
id: item.id,
carImg: item.carImg,
userName: item.userName,
photo: item.idcardPhoto,
jd: item.jd,
wd: item.wd,
sfzh: item.idcard
}
router.push({ path: '/lmjHome/zlJczDetail', query: data })
}
// 时间点击
function onClickTime(val) {
timeType.value = val;
timeShow.value = true;
}
// 时间选中
function onSelectTime(val) {
if (timeType.value == "start") {
form.value.beginDate = val;
} else {
form.value.endDate = val;
}
timeShow.value = false;
}
// 选则类型
function chooseYjlx() {
showLx.value = !showLx.value;
}
// 选中类型
function cilickLx(val) {
isActive.value = val;
switch (val) {
case 0:
form.value.warnType = "车辆";
break;
case 1:
form.value.warnType = "人员";
break;
}
showLx.value = !showLx.value;
}
</script>
<style lang="scss" scoped>
.search {
padding: 2vw 2vw 0;
box-sizing: border-box;
height: 11vw;
line-height: 5vw;
font-size: 12px;
background: #f1f1f1;
.sort {
float: left;
padding: 1vw 3vw 1vw 6vw;
border: 1px solid #e9e9e9;
position: relative;
background: #fff;
.van-icon-arrow-up {
position: absolute;
left: 4px;
top: 2px;
}
.van-icon-arrow-down {
position: absolute;
left: 4px;
bottom: 2px;
}
}
.search-filter {
float: right;
color: #3373fa;
line-height: 8vw;
.van-icon {
font-size: 13px;
}
}
}
.listBox {
height: calc(100vh - 24vw);
overflow: hidden;
overflow-y: auto;
// .van-pull-refresh{
// height: 100%;
// overflow-y: auto;
// }
.listBox-item {}
}
// 弹窗
.popup-content {
.popup-title {
height: 40px;
line-height: 40px;
text-align: center;
background: #fff;
color: #000;
}
.popup-box {
border-top: 1px solid #e5e5e5;
font-size: 12px;
line-height: 11vw;
color: #000;
.popup-item {
border-bottom: 1px solid #e5e5e5;
.popup-name {
display: inline-block;
width: 60px;
text-align-last: justify;
}
}
}
.yjlx-info {
position: relative;
.select-box {
position: absolute;
z-index: 99;
width: 50%;
background: #fff;
border: 1px solid #ccc;
top: 50px;
right: 20px;
.select-box-li {
padding-left: 2vw;
box-sizing: border-box;
border-bottom: 1px solid #e9e9e9;
}
.active {
background: rgb(22, 220, 255);
color: #fff;
}
.select-box-li:last-child {
border: none;
}
}
.triangleup {
position: absolute;
left: 50px;
top: -13px;
display: inline-block;
width: 0;
height: 0;
border: 6px solid transparent;
border-bottom-color: #ccc;
}
}
}
.alertInfoBox {
padding: 2vw;
.alert {
line-height: 10vw;
text-align: center;
color: #8f8f94;
border-bottom: 1px solid #ddd;
}
.alertBtn {
text-align: center;
height: 12vw;
line-height: 12vw;
margin: 4vw 0;
background: #eee;
color: #8f8f94
}
}
</style>

View File

@ -0,0 +1,165 @@
<template>
<div style="padding-top: 13vw">
<TopNav navTitle="选择执勤卡点" :showRight="false" :showLeft="true" />
<div class="heckpointBox">
<!-- 查询 -->
<Search
v-model="jczValue"
placeholder="请输入搜索关键词"
@update:modelValue="onSearch"
></Search>
<!-- 列表 -->
<ul class="list">
<li class="item" v-for="(item, index) in List" :key="index">
<div class="title">{{ item.areaName }}</div>
<div class="item-li">
<van-radio-group v-model="cheaked" @change="chooseJcz(item.areaName)">
<van-radio
v-for="itemChid in item.checkList"
:name="itemChid.checkCode"
:key="itemChid.checkCode"
>{{ itemChid.pointName }}</van-radio
>
</van-radio-group>
</div>
</li>
<van-empty v-if="List.length<=0" description="暂无数据"/>
</ul>
<!-- 弹窗 -->
<van-popup
v-model:show="peoplePopupShow"
round
:style="{ width: '80%' }"
close-icon="close"
:overlay="true"
>
<div class="info">
<div class="info_title">是否选择{{selectTitle}}?</div>
<div class="info-btns">
<span @click="handlePClose"></span>
<span @click="handlePass"></span>
</div>
</div>
</van-popup>
</div>
</div>
</template>
<script setup>
import TopNav from "../../components/topNav.vue";
import Search from "../../components/search.vue";
import router from "../../router/index.js";
import { getJczList } from "../../api/checkponit.js";
import { ref, reactive, onMounted, onUnmounted, onActivated } from "vue";
const jczValue = ref(""); //搜索关键字
const List = ref([]); //检查站列表
const cheaked = ref(null); //选择的检查站
const peoplePopupShow = ref(false); //弹窗
const selectTitle = ref(''); //弹窗标题
onMounted(() => {
getList(); //获取列表
});
// 搜索
function onSearch() {
}
// 获取列表
function getList() {
let user = JSON.parse(window.localStorage.getItem("userInfo"));
getJczList({ username: user.idEntityCard }).then((res) => {
List.value = handellArray(res);
});
}
// 处理数据
function handellArray(array) {
let arrWrap = [],resuleArr = [];
array.forEach((item) => {
if (!arrWrap.includes(item.areaCode)) {
let obj = {
areaName: item.areaName,
checkList: [],
};
obj.checkList.push(item);
resuleArr.push(obj);
arrWrap.push(item.areaCode);
} else {
resuleArr[arrWrap.indexOf(item.areaCode)].checkList.push(item);
}
});
return resuleArr;
}
// 选择检查站
function chooseJcz(val) {
peoplePopupShow.value = true
List.value.forEach(item=>{
if(item.areaName == val){
item.checkList.forEach(child=>{
if(child.checkCode == cheaked.value) selectTitle.value = child.pointName
})
}
})
}
// 确定弹窗
function handlePass(){
peoplePopupShow.value = false
router.push({path:'/',query:{kkid:cheaked.value,kkmc:selectTitle.value}});
}
// 关闭弹窗
function handlePClose() {
peoplePopupShow.value = false
}
</script>
<style lang="scss" scoped>
.heckpointBox {
.list {
.title {
height: 50px;
font-size: 20px;
line-height: 50px;
background: #ddd;
padding: 0 6vw;
box-sizing: border-box;
color: #999;
}
.item-li {
padding: 0 6vw;
box-sizing: border-box;
.van-radio {
height: 46px;
line-height: 46px;
border-bottom: 1px solid #e9e9e9;
}
}
}
}
// 提示数据
.info{
.info_title{
text-align: center;
line-height: 15vw;
border: 1px solid #e9e9e9;
padding:'10px';
box-sizing: border-box;
font-size: 17px;
}
.info-btns{
display: flex;
justify-content: space-around;
align-items: center;
height: 11vw;
span{
flex: 1;
text-align: center;
color: #007aff;
}
}
}
</style>