This commit is contained in:
lcw
2025-09-15 20:55:33 +08:00
parent 3a34e83826
commit fa45f28c0b
15 changed files with 775 additions and 195 deletions

View File

@ -133,3 +133,35 @@ export const tbGsxtZdryAjxx = (id) => {
method: "delete",
});
}
// 新增或修改现实表现
export const tbGsxtZdryXsbxSaveOrUpdateXsbx = (data) => {
return request({
url: api + `/tbGsxtZdryXsbx/saveOrUpdateXsbx`,
method: "post",
data,
});
}
// 查询走访记录信息
export const tbGsxtZdryXsbxSelectZfjl = (params) => {
return request({
url: api + `/tbGsxtZdryXsbx/selectXsbx`,
method: "get",
params,
});
}
// 删除走访记录信息
export const tbGsxtZdryXsbx = (id) => {
return request({
url: api + `/tbGsxtZdryXsbx/${id}`,
method: "delete",
});
}
// 查询操作日志
export const tbGsxtZdryCzrzSelectCzrz = (params) => {
return request({
url: api + `/tbGsxtZdryCzrz/selectCzrz`,
method: "get",
params,
});
}

View File

@ -0,0 +1,70 @@
<template>
<!-- 添加 -->
<el-dialog v-model="modelValue" :title="title" width="40%" :before-close="handleClose">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
</FormMessage>
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { defineProps, defineEmits, ref, watch, reactive, getCurrentInstance } from 'vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
const { proxy } = getCurrentInstance();
const props = defineProps({
data: {
type: Object,
default: () => { }
},
modelValue: {
type: Boolean,
default: false
},
title: {
type: String,
default: '走访信息'
},
dict: {
type: Object,
default: () => { }
}
})
const emit = defineEmits(['update:modelValue', 'comfirm'])
const listQuery = ref({})
const formData = ref([
{ label: "案件名称", prop: "ajmc", type: "input", width: '100%' },
{ label: "案件时间", prop: "sasj", type: "date", width: '100%' },
{ label: "案件编码", prop: "ajbm", type: "input", width: '100%' },
])
const rules = reactive({
ajmc: [{ required: true, message: "请输入案件名称", trigger: "blur" }],
sasj: [{ required: true, message: "请输入案件时间", trigger: "change" }],
ajbm: [{ required: true, message: "请输入案件编码", trigger: "blur" }],
})
const elform=ref(null)
const submitForm = () => {
elform.value.submit((val) => {
if (val) {
emit('comfirm', val)
handleClose()
}
})
}
watch(
() => props.data,
(val) => {
listQuery.value = val ? { ...val } : {}
},
{ deep: true }
)
// 取消:关闭弹窗
const handleClose = () => {
listQuery.value = {}
emit('update:modelValue', false)
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,306 @@
<template>
<el-dialog :title="titleValue" width="800px" :model-value="modelValue" append-to-body @close="closed">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
<template #rrry>
<el-input v-model="listQuery.rrry" :placeholder="`请输入民警姓名`" readonly @click="changeShow" />
</template>
<template #fjxx>
<!-- 文件列表区域 -->
<div class="file-attachment-section">
<div class="section-title">相关附件</div>
<div class="file-list-container">
<div v-if="listQuery.fileList.length === 0" class="empty-file-list">暂无附件</div>
<div v-else class="file-list">
<div v-for="(file, index) in listQuery.fileList" :key="index" class="file-item">
<div class="file-info">
<span class="file-name">{{ file.originalName }}</span>
<span class="file-time">{{ file.uploadTime }}</span>
</div>
<div class="file-actions">
<el-button type="text" size="small" @click="downloadFile(file)" title="下载文件" :disabled="disabled">
<el-icon>
<Download />
</el-icon>
</el-button>
<el-button type="text" size="small" @click="deleteFile(index)" title="删除文件" class="delete-btn"
:disabled="disabled">
<el-icon>
<Delete />
</el-icon>
</el-button>
</div>
</div>
</div>
</div>
<!-- 上传按钮区域 -->
<div class="upload-btn-container">
<el-upload v-model:file-list="listQuery.fileList" class="upload-demo" :show-file-list="false" multiple
:http-request="handleUploadRequest" :on-remove="handleRemove" :limit="3" :on-exceed="handleExceed">
<el-button type="primary" :disabled="disabled">上传文件</el-button>
</el-upload>
</div>
</div>
</template>
</FormMessage>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<el-button type="primary" @click="onComfirm">确认</el-button>
</div>
</template>
</el-dialog>
<ChooseUser :Single="true" v-model="chooseMarksVisible" @choosedUsers="addMarks" :roleIds="roleIds" />
</template>
<script setup>
import { ref, onMounted, reactive, watch, getCurrentInstance } from "vue";
import { generateRandom10Digits } from '@/utils/tools'
import { uploadMultipleFiles } from '@/views/backOfficeSystem/DeploymentDisposal/mpvGroup/model/fileUp.js'
import { ElMessage } from 'element-plus';
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
titleValue: {
type: String,
default: "研判记录"
},
data: {
type: Object,
default: () => { }
}
});
const emits = defineEmits(["update:modelValue", "comfirm"]);
const formData = ref([
{ label: "录入人员", prop: "rrry", type: "slot", width: '100%' },
{ label: "录入时间", prop: "lrsj", type: "date", width: '100%' },
{ label: "表现内容", prop: "bxnr", type: "textarea", width: '100%' },
{ label: "附件信息", prop: "fjxx", type: "slot", width: '100%' },
])
const rules = reactive({
rrry: [{ required: true, message: "请选择民警姓名", trigger: "blur" }],
lrsj: [{ required: true, message: "请输入录入时间", trigger: "change" }],
bxnr: [{ required: true, message: "请输入表现内容", trigger: "blur" }],
})
const listQuery = ref({fileList:[]})
const roleIds=ref([])
const chooseMarksVisible=ref(false)
const changeShow = () => {
chooseMarksVisible.value = true
}
const addMarks = (val) => {
listQuery.value.rrry = val[0].userName
roleIds.value = val.map(item => item.id)
}
const closed = () => {
listQuery.value={}
listQuery.value.fileList = []
emits("update:modelValue", false);
};
const onComfirm = () => {
emits("comfirm", {...listQuery.value,fjxx:listQuery.value.fileList.length>0?JSON.stringify(listQuery.value.fileList):null });
emits("update:modelValue", false);
}
watch(() => props.data, (val) => {
if (val) {
listQuery.value={...val,fileList:val.fjxx}
}
},{deep: true})
// 下载文件
const downloadFile = (file) => {
// 实际项目中这里应该调用下载API
console.log('下载文件:', file.name)
// 示例window.open(file.url)
}
// 删除文件
const deleteFile = (index) => {
// 实际项目中这里应该先调用删除API成功后再从列表中移除
listQuery.value.fileList.splice(index, 1)
ElMessage.success('文件已删除')
}
// 上传相关方法
const handleUploadRequest = async (options) => {
try {
// 调用uploadMultipleFiles进行文件上传
const result = await uploadMultipleFiles(options.file, {
uploadedFiles: listQuery.value.fileList,
fjIds: [], // 如果需要保存文件ID列表可以在这里传递
compressImage: null // 可选的图片压缩函数
});
// 更新文件列表,添加上传时间信息
const index = listQuery.value.fileList.findIndex(f => f.originalName === options.file.name);
if (index !== -1) {
listQuery.value.fileList[index].uploadTime = new Date().toLocaleString('zh-CN');
}
// 调用成功回调
if (options.onSuccess) {
options.onSuccess(result);
}
} catch (error) {
console.error('文件上传失败:', error);
// 调用失败回调
if (options.onError) {
options.onError(error);
}
}
}
const handleRemove = (uploadFile, uploadFiles) => {
// 实际项目中这里应该先调用删除API成功后再从列表中移除
const index = listQuery.value.fileList.findIndex(f => f.name === uploadFile.name);
if (index !== -1) {
listQuery.value.fileList.splice(index, 1);
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
</style>
<style>
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
.file-attachment-section {
margin-top: 15px;
width: 100%;
}
.section-title {
font-size: 14px;
font-weight: 500;
color: #303133;
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 1px solid #ebeef5;
}
.file-list-container {
max-height: 100px;
overflow-y: auto;
border: 1px solid #ebeef5;
border-radius: 4px;
background-color: #ffffff;
margin-bottom: 10px;
}
/* 自定义滚动条样式 */
.file-list-container::-webkit-scrollbar {
width: 6px;
}
.file-list-container::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.file-list-container::-webkit-scrollbar-thumb {
background: #c0c4cc;
border-radius: 3px;
}
.file-list-container::-webkit-scrollbar-thumb:hover {
background: #909399;
}
.empty-file-list {
padding: 20px;
text-align: center;
color: #909399;
font-size: 12px;
}
.file-list {
padding: 5px;
}
.file-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 10px;
margin-bottom: 2px;
background-color: #f8f9fa;
border-radius: 4px;
transition: all 0.3s ease;
cursor: pointer;
}
.file-item:hover {
background-color: #e6f7ff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
.file-info {
flex: 1;
display: flex;
align-items: center;
gap: 15px;
min-width: 0;
}
.file-name {
flex: 1;
font-size: 12px;
color: #303133;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-size {
font-size: 11px;
color: #909399;
min-width: 60px;
}
.file-time {
font-size: 11px;
color: #909399;
}
.file-actions {
display: flex;
align-items: center;
gap: 5px;
margin-left: 10px;
}
.file-actions .el-button {
padding: 0 5px;
margin: 0;
color: #606266;
transition: color 0.3s ease;
}
.file-actions .el-button:hover {
color: #409eff;
}
.delete-btn:hover {
color: #f56c6c !important;
}
.upload-btn-container {
display: flex;
justify-content: center;
margin-top: 10px;
}
</style>

View File

@ -15,27 +15,27 @@
<li @click="scrollToSection('backinfo-section')"
:class="activeSection === 'backinfo-section' ? 'active' : ''">人员标签</li>
<li @click="scrollToSection('groupLabels-section')"
:class="activeSection === 'groupLabels-section' ? 'active' : ''">关联车辆</li>
:class="activeSection === 'groupLabels-section' ? 'active' : ''" v-if="!butShow">关联车辆</li>
<li @click="scrollToSection('character-section')"
:class="activeSection === 'character-section' ? 'active' : ''">背景信息</li>
<li @click="scrollToSection('controlInfo-section')"
:class="activeSection === 'controlInfo-section' ? 'active' : ''">管控信息</li>
:class="activeSection === 'controlInfo-section' ? 'active' : ''" v-if="!butShow">管控信息</li>
<li @click="scrollToSection('featinfo-section')"
:class="activeSection === 'featinfo-section' ? 'active' : ''">全要素布控</li>
:class="activeSection === 'featinfo-section' ? 'active' : ''" v-if="!butShow">全要素布控</li>
<li @click="scrollToSection('demandsInfo-section')"
:class="activeSection === 'demandsInfo-section' ? 'active' : ''">密切联系人</li>
:class="activeSection === 'demandsInfo-section' ? 'active' : ''" v-if="!butShow">密切联系人</li>
<li @click="scrollToSection('requestInfo-section')"
:class="activeSection === 'requestInfo-section' ? 'active' : ''">动态轨迹</li>
:class="activeSection === 'requestInfo-section' ? 'active' : ''" v-if="!butShow">动态轨迹</li>
<li @click="scrollToSection('personnel-section')"
:class="activeSection === 'personnel-section' ? 'active' : ''">行为信息</li>
:class="activeSection === 'personnel-section' ? 'active' : ''" v-if="!butShow">行为信息</li>
<li @click="scrollToSection('judgmentRecord-section')"
:class="activeSection === 'judgmentRecord-section' ? 'active' : ''">走访记录</li>
:class="activeSection === 'judgmentRecord-section' ? 'active' : ''" v-if="!butShow">走访记录</li>
<li @click="scrollToSection('historyAssembly-section')"
:class="activeSection === 'historyAssembly-section' ? 'active' : ''">案件信息</li>
:class="activeSection === 'historyAssembly-section' ? 'active' : ''" v-if="!butShow">案件信息</li>
<li @click="scrollToSection('joblogging-section')"
:class="activeSection === 'joblogging-section' ? 'active' : ''">显示表现</li>
:class="activeSection === 'joblogging-section' ? 'active' : ''" v-if="!butShow">显示表现</li>
<li @click="scrollToSection('joblogging-joblog')"
:class="activeSection === 'joblogging-joblog' ? 'active' : ''">操作日志</li>
:class="activeSection === 'joblogging-joblog' ? 'active' : ''" v-if="!butShow">操作日志</li>
</ul>
</div>
<div class="right_box" ref="rightBox">
@ -45,64 +45,76 @@
<div id="backinfo-section">
<PersonnelTags ref="personnelTags" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="groupLabels-section">
<div id="groupLabels-section" v-if="!butShow">
<Vehicle ref="vehicle" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="character-section">
<BackInfo ref="backInfo" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="controlInfo-section">
<div id="controlInfo-section" v-if="!butShow">
<ControlInfo ref="controlInfo" title="重点人" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="deployment-section">
<div id="featinfo-section" v-if="!butShow">
<Deployment ref="deployment" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="contact-section">
<div id="demandsInfo-section" v-if="!butShow">
<Contact ref="contact" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="dynamicTrajectory-section">
<div id="requestInfo-section" v-if="!butShow">
<DynamicTrajectory ref="dynamicTrajectory" :disabled="disabled" :showBut="showBut" />
</div>
<div id="requestInfo-section">
<div id="personnel-section" v-if="!butShow">
<BehaviorInfo ref="behaviorInfo" :disabled="disabled" :showBut="showBut" />
</div>
<div id="visitRecord-section">
<div id="judgmentRecord-section" v-if="!butShow">
<VisitRecord ref="visitRecord" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="caseInfo-section">
<div id="historyAssembly-section" v-if="!butShow" >
<CaseInfo ref="caseInfo" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div id="actualPerformance-section">
<div id="joblogging-section" v-if="!butShow">
<ActualPerformance ref="actualPerformance" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<!-- <div class="behaviorInfo" style="">
<h3>操作日志</h3>
<div id="joblogging-joblog" v-if="!butShow" >
<CzModel ref="czModel" :disabled="disabled" :showBut="showBut" :dataList="listQuery" />
</div>
<div class="list-container">
<div class="list-header">
<span>账号名称</span>
<span>操作时间</span>
<span>操作记录</span>
</div>
<div class="list-body">
<div class="list-item" v-for="i in 30" :key="i">
<span>张三</span>
<span>2020-3030-2202</span>
<span>新增操作记录</span>
</div>
</div>
</div> -->
</div>
</div>
</div>
<!-- <ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" /> -->
</template>
<script setup>
import { getItem } from "@/utils/storage";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { tbGsxtZdrySelectVoById,tbGsxtZdrySave } from "@/api/zdr.js";
import { tbGsxtZdrySelectVoById, tbGsxtZdrySave } from "@/api/zdr.js";
import ControlInfo from '../../mpvGroup/model/controlInfo.vue'
import Info from "../model/info.vue";
import PersonnelTags from '../model/personnelTags.vue'
@ -115,6 +127,7 @@ import BehaviorInfo from '../model/behaviorInfo.vue'
import VisitRecord from '../model/visitRecord.vue'
import CaseInfo from '../model/caseInfo.vue'
import ActualPerformance from '../model/actualPerformance.vue'
import CzModel from '../model/czModel.vue'
import { ref, onUnmounted } from "vue";
const emit = defineEmits(["updateDate"]);
const chooseMarksVisible = ref(false);
@ -125,6 +138,7 @@ const showBut = ref(false)
const listQuery = ref({});
const butShow = ref(false)
const title = ref('新增')
const showData=ref(false)
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
@ -134,9 +148,10 @@ const init = (type, row) => {
disabled.value = false
showBut.value = false
} else {
butShow.value = false
tbGsxtZdrySelectVoById({ id: row.id }).then(res => {
listQuery.value={...res}
listQuery.value = { ...res }
})
if (type == 'edit') {
showBut.value = true
@ -179,7 +194,7 @@ const handleScroll = () => {
'info-section', 'backinfo-section', 'groupLabels-section',
'character-section', 'controlInfo-section', 'featinfo-section',
'demandsInfo-section', 'requestInfo-section', 'personnel-section',
'judgmentRecord-section', 'historyAssembly-section', 'joblogging-section'
'judgmentRecord-section', 'historyAssembly-section', 'joblogging-section', "czModel-section"
];
for (let i = sections.length - 1; i >= 0; i--) {

View File

@ -2,23 +2,12 @@
<div>
<div class="headClass" style="">
<h3>现实表现</h3>
<!-- <el-button type="primary" :disabled="disabled" @click="AddPore">选择</el-button> -->
</div>
<div class="headSelect">
<el-button @click="add" type="primary">新增</el-button>
<el-button @click="AddPore" type="primary" v-if="showBut">新增</el-button>
</div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #clys="{ row }">
<DictTag :tag="false" :value="row.clys" :options="D_BZ_CLYS" />
</template>
<template #cllx="{ row }">
<DictTag :tag="false" :value="row.cllx" :options="D_BZ_CLLX" />
</template>
<template #clpp="{ row }">
<DictTag :tag="false" :value="row.clpp" :options="D_BZ_CLPP" />
<template #showSolt="{ row }">
<span v-for="(item,index) in row.fjxx" :key="index">{{ item.originalName }}<span v-if="index < row.fjxx.length - 1"></span></span>
</template>
<!-- 操作 -->
<template #controls="{ row }">
@ -27,20 +16,23 @@
</template>
</MyTable>
</div>
<VehiclDoing v-model="chooseMarksVisible" @comfirm="addMarks" :data="dataModel"
:dict="{ D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP }" />
<!-- <VehiclDoing v-model="JudgmentShow" @comfirm="addMarks" :data="dataModel"
:dict="{ D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP }" /> -->
<JudgmentRecord v-model="JudgmentShow" @comfirm="onComfirm" :data="dataModel" />
</template>
<script setup>
import { identityCardRule } from "@/utils/rules"
import { ref, reactive, watch, toRaw, getCurrentInstance, onMounted, onUnmounted } from "vue";
import { ref, reactive, watch, toRaw, getCurrentInstance, onMounted, onUnmounted } from "vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import VehiclDoing from "../component/vehiclDoing.vue";
import { tbZdryClxxAdd, tbZdryClxxBatchAdd, tbZdryClxxDelete, tbZdryClxxSelectPage, tbZdryClxxUpdate } from '@/api/zdr.js'
import JudgmentRecord from "../component/judgmentRecord.vue";
import { tbGsxtZdryXsbxSaveOrUpdateXsbx,tbGsxtZdryXsbxSelectZfjl,tbGsxtZdryXsbx } from '@/api/zdr.js'
import { ElMessage, ElMessageBox } from "element-plus";
const { proxy } = getCurrentInstance();
const { D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP } = proxy.$dict("D_BZ_CLLX", "D_BZ_CLYS", "D_BZ_CLPP"); //获取字典数据
const chooseMarksVisible = ref(false)
const JudgmentShow = ref(false)
const props = defineProps({
dataList: {
type: Object,
@ -66,20 +58,17 @@ watch(() => props.dataList, (val) => {
const pageData = reactive({
tableData: [],
tableColumn: [{
prop: 'cph',
prop: 'rrry',
label: '录入人员',
}, {
prop: 'cllx',
prop: 'lrsj',
label: '录入时间',
showSolt: true,
prop: 'clpp',
}, {
showSolt: true,
prop: 'clys',
prop: 'bxnr',
label: '表现内容',
}, {
showSolt: true,
prop: 'clpp',
prop: 'fjxx',
label: '附件信息',
}],
tableHeight: '200px',
@ -97,45 +86,40 @@ const pageData = reactive({
},
controlsWidth: 200,
})
// 表单数据
const formData = reactive({
username: "",
ID: ""
})
const rulesForm = ref(identityCardRule({ validator: true }, 'rySfzh'))
// 修改数据接口
const dataModel = ref()
const addMarks = (val) => {
const onComfirm = (val) => {
const params = {
...val,
zdrid: listData.value.id,
zdryId: listData.value.id,
}
if (props.showBut && !props.disabled) {
if (addUpd.value) {
tbZdryClxxAdd(params).then(res => {
console.log(params);
// if (props.showBut && !props.disabled) {
// if (addUpd.value) {
tbGsxtZdryXsbxSaveOrUpdateXsbx(params).then(res => {
gettbZdryClxxSelectPage()
proxy.$message({
message: '关联车辆添加成功',
type: 'success'
})
})
}
else {
tbZdryClxxUpdate(params).then(res => {
gettbZdryClxxSelectPage()
proxy.$message({
message: '关联车辆修改成功',
type: 'success'
})
})
}
} else {
pageData.tableData.push(val)
}
// }
// else {
// tbZdryClxxUpdate(params).then(res => {
// gettbZdryClxxSelectPage()
// proxy.$message({
// message: '关联车辆修改成功',
// type: 'success'
// })
// })
// }
// } else {
// pageData.tableData.push(val)
// }
}
onMounted(() => {
})
// 删除车辆
const delDictItem = (val) => {
@ -150,10 +134,10 @@ const delDictItem = (val) => {
}
)
.then(() => {
tbZdryClxxDelete({ ids: [val] }).then(res => {
tbGsxtZdryXsbx(val).then(res => {
gettbZdryClxxSelectPage()
proxy.$message({
message: '关联车辆删除成功',
message: '表现信息删除成功',
type: 'success'
})
})
@ -171,24 +155,26 @@ const delDictItem = (val) => {
}
const updDictItem = (val) => {
chooseMarksVisible.value = true
JudgmentShow.value = true
addUpd.value = false
dataModel.value = val
}
const AddPore = () => {
chooseMarksVisible.value = true
dataModel.value = {}
JudgmentShow.value = true
addUpd.value = true
}
// 查询车辆
const gettbZdryClxxSelectPage = () => {
const promes = {
pageCurrent: 1,
pageSize: 20,
zdrid: listData.value.id
}
tbZdryClxxSelectPage(promes).then(res => {
pageData.tableData = res.records
tbGsxtZdryXsbxSelectZfjl(promes).then(res => {
pageData.tableData = res.map(item => {
return {
...item,
fjxx: item.fjxx ? JSON.parse(item.fjxx) : []
}
})
})
}
// 抛出数据并验证标签列表不为空
@ -237,6 +223,9 @@ defineExpose({
}
.headClass {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 18px;
font-weight: 600;
color: #303133;

View File

@ -4,35 +4,7 @@
<h3>行为信息</h3>
</div>
<!-- 搜索区域 -->
<!-- <div class="search-container">
<el-form :inline="true" :model="searchForm" class="demo-form-inline">
<el-form-item label="行为类型">
<el-select v-model="searchForm.behaviorType" placeholder="请选择">
<el-option label="全部" value=""></el-option>
<el-option label="购票" value="ticket"></el-option>
<el-option label="入住" value="hotel"></el-option>
<el-option label="出入境" value="border"></el-option>
<el-option label="基站认证" value="baseStation"></el-option>
</el-select>
</el-form-item>
<el-form-item label="时间范围">
<el-date-picker
v-model="searchForm.timeRange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button @click="resetSearch">重置</el-button>
</el-form-item>
</el-form>
</div> -->
<!-- 列表区域 -->
<div class="list-container">

View File

@ -2,41 +2,28 @@
<div>
<div class="headClass" style="">
<h3>案件信息</h3>
<!-- <el-button type="primary" :disabled="disabled" @click="AddPore">选择</el-button> -->
<el-button @click="AddPore" type="primary" v-if="showBut">新增</el-button>
</div>
<div class="headSelect">
<el-button @click="add" type="primary">新增</el-button>
</div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #clys="{ row }">
<DictTag :tag="false" :value="row.clys" :options="D_BZ_CLYS" />
</template>
<template #cllx="{ row }">
<DictTag :tag="false" :value="row.cllx" :options="D_BZ_CLLX" />
</template>
<template #clpp="{ row }">
<DictTag :tag="false" :value="row.clpp" :options="D_BZ_CLPP" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
<el-link type="danger" @click="updDictItem(row)">修改</el-link>
</template>
</MyTable>
</div>
<VehiclDoing v-model="chooseMarksVisible" @comfirm="addMarks" :data="dataModel"
:dict="{ D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP }" />
<CaseLodig v-model="chooseMarksVisible" @comfirm="addMarks" :data="dataModel" />
</template>
<script setup>
import { identityCardRule } from "@/utils/rules"
import { ref, reactive, watch, toRaw, getCurrentInstance, onMounted, onUnmounted } from "vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import VehiclDoing from "../component/vehiclDoing.vue";
import {tbGsxtZdryAjxxSaveOrUpdateAjxx, tbGsxtZdryAjxx, tbGsxtZdryAjxxselectAjxx } from '@/api/zdr.js'
import CaseLodig from "../component/caseLodig.vue";
import { tbGsxtZdryAjxxSaveOrUpdateAjxx, tbGsxtZdryAjxx, tbGsxtZdryAjxxselectAjxx } from '@/api/zdr.js'
import { ElMessage, ElMessageBox } from "element-plus";
const { proxy } = getCurrentInstance();
const { D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP } = proxy.$dict("D_BZ_CLLX", "D_BZ_CLYS", "D_BZ_CLPP"); //获取字典数据
@ -71,10 +58,7 @@ const pageData = reactive({
}, {
prop: 'ajmc',
label: '案件名称',
showSolt: true,
prop: 'clpp',
}, {
showSolt: true,
prop: 'sasj',
label: '受案时间',
},],
@ -98,30 +82,16 @@ const dataModel = ref()
const addMarks = (val) => {
const params = {
...val,
zdrid: listData.value.id,
}
if (props.showBut && !props.disabled) {
if (addUpd.value) {
tbGsxtZdryAjxxSaveOrUpdateAjxx(params).then(res => {
gettbZdryClxxSelectPage()
proxy.$message({
message: '关联车辆添加成功',
type: 'success'
})
})
}
else {
tbZdryClxxUpdate(params).then(res => {
gettbZdryClxxSelectPage()
proxy.$message({
message: '关联车辆修改成功',
type: 'success'
})
})
}
} else {
pageData.tableData.push(val)
zdryId: listData.value.id,
}
tbGsxtZdryAjxxSaveOrUpdateAjxx(params).then(res => {
gettbZdryClxxSelectPage()
proxy.$message({
message: '案件信息操作成功',
type: 'success'
})
})
}
onMounted(() => {
})
@ -174,7 +144,7 @@ const gettbZdryClxxSelectPage = () => {
zdrid: listData.value.id
}
tbGsxtZdryAjxxselectAjxx(promes).then(res => {
pageData.tableData = res.records
pageData.tableData = res
})
}
// 抛出数据并验证标签列表不为空
@ -224,6 +194,9 @@ defineExpose({
.headClass {
font-size: 18px;
display: flex;
justify-content: space-between;
align-items: center;
font-weight: 600;
color: #303133;
margin: 20px 0 10px 0;

View File

@ -2,15 +2,10 @@
<div>
<div class="headClass" style="">
<h3>密切联系人</h3>
<el-button type="primary" @click="openDialog('新增密切联系人', {}, true)">新增</el-button>
<el-button type="primary" @click="openDialog('新增密切联系人', {}, true)" v-if="showBut">新增</el-button>
</div>
<div class="headSelect">
<el-form :model="formData" :inline="true" ref="formRef" :rules="rulesForm" class="form-inline">
<!-- 姓名 -->
<!-- <el-form-item label="姓名">
<el-input v-model="formData.username" placeholder="请输入姓名" />
</el-form-item> -->
<!-- 身份证号码 -->
<el-form-item label="身份证号码">
<el-input v-model="formData.rySfzh" placeholder="请输入身份证号码" />
</el-form-item>

View File

@ -0,0 +1,222 @@
<template>
<div class="backinfo-container">
<div class="headClass">
<h3>操作日志</h3>
</div>
<!-- 列表区域 -->
<div class="list-container">
<div v-loading="loading" class="behavior-list">
<div class="behavior-list-inner">
<div
v-for="(item, index) in behaviorList"
:key="item.id"
class="behavior-item"
>
<div class="behavior-item-header">
<span class="behavior-index">{{ index + 1 }}.</span>
<el-tag :type="getTagType(item.behaviorType)">{{ item.zhmc }}</el-tag>
<span class="behavior-time">{{ item.czsj }}</span>
</div>
<div class="behavior-item-content">
<p class="behavior-description">{{ item.czjl }}</p>
<p class="behavior-location"><i class="el-icon-location-outline"></i> {{ item.bz }}</p>
</div>
</div>
<div v-if="!loading && behaviorList.length === 0" class="empty-state">
<el-empty description="暂无操作记录" />
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, getCurrentInstance, onMounted,watch } from 'vue'
import GdMap from "@/components/GdMap/index.vue";
import {tbGsxtZdryCzrzSelectCzrz} from '@/api/zdr'
const { proxy } = getCurrentInstance();
const props = defineProps({
dataList: {
type: Object,
default: () => { },
}, disabled: {
type: Boolean,
default: false
},
showBut: {
type: Boolean,
default: false
},
})
const listData = ref({})
watch(() => props.dataList, (val) => {
if (val) {
listData.value = val
fetchData()
}
}, { deep: true })
// 列表数据
const behaviorList = ref([])
const loading = ref(false)
// 获取数据
const fetchData = () => {
loading.value = true
tbGsxtZdryCzrzSelectCzrz({ zdrid: listData.value.id }).then(res => {
behaviorList.value = res
}).finally(() => {
loading.value = false
})
}
// 页面加载时获取数据
onMounted(() => {
})
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.backinfo-container {
padding-top: 20px;
width: 100%;
background-color: #f5f7fa;
}
.headClass {
font-size: 18px;
font-weight: 600;
color: #303133;
margin: 0 0 20px 0;
padding-bottom: 15px;
border-bottom: 2px solid #409eff;
position: relative;
}
h3 {
margin: 0;
}
.search-container {
background-color: #fff;
padding: 16px;
border-radius: 6px;
margin-bottom: 16px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
.demo-form-inline {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 16px;
}
.list-container {
background-color: #fff;
padding: 16px;
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
.behavior-list {
max-height: 600px;
overflow: hidden; /* 完全禁止滚动条 */
position: relative;
}
.behavior-list-inner {
max-height: 600px;
overflow-y: auto;
overflow-x: hidden;
padding-right: 10px; /* 为滚动条留出空间但不显示 */
}
.behavior-item {
padding: 16px;
border-bottom: 1px solid #f0f0f0;
transition: all 0.3s ease;
position: relative;
left: 0; /* 初始位置 */
}
.behavior-item:hover {
background-color: #fafafa;
left: 5px; /* 使用left属性代替transform避免触发滚动条 */
}
.behavior-item:last-child {
border-bottom: none;
}
.behavior-item-header {
display: flex;
align-items: center;
margin-bottom: 12px;
}
.behavior-index {
font-weight: 600;
color: #606266;
margin-right: 12px;
min-width: 20px;
}
.behavior-time {
margin-left: auto;
color: #909399;
font-size: 13px;
}
.behavior-item-content {
padding-left: 32px;
}
.behavior-description {
margin: 0 0 8px 0;
color: #303133;
line-height: 1.5;
}
.behavior-location {
margin: 0;
color: #606266;
font-size: 13px;
line-height: 1.5;
}
.empty-state {
padding: 60px 0;
text-align: center;
}
::v-deep .el-tag {
margin-right: 0;
}
::v-deep .el-date-editor .el-range-separator {
color: #606266;
}
@media (max-width: 768px) {
.backinfo-container {
padding: 10px;
}
.demo-form-inline {
flex-direction: column;
align-items: stretch;
}
.demo-form-inline .el-form-item {
margin-bottom: 10px;
}
.pagination-container {
justify-content: center;
}
}
</style>

View File

@ -6,11 +6,18 @@
</div>
<div class="marginBox">
<div>身份证号码{{ listData.rySfzh }} <span>({{ listData.zdrBkZt ? '已布控' : '未布控' }})</span></div>
<div>手机号码{{ listData.ryLxdh?.[0] }} <span>({{ listData.zdrBkZt ? '已布控' : '未布控' }})</span>
<div v-if="listData.ryLxdh&&listData.ryLxdh.length>0"> 手机号码
<span style="color: #000;" v-for="(item, index) in listData.ryLxdh" :key="index">{{ item }}
<span v-if="index != listData.ryLxdh.length - 1"></span>
</span>
<div> {{ listData.ryLxdh?.[1] }}<span>({{ listData.zdrBkZt ? '已布控' : '未布控' }})</span></div>
</div>
<div>车牌号码{{ listData.clHm }} <span>({{ listData.zdrBkZt ? '已布控' : '未布控' }})</span></div>
<div v-if="listData.clxxList">车牌号码
<span style="color: #000;" v-for="(item, index) in listData.clxxList" :key="index">{{ item.cph }}
<span v-if="index != listData.clxxList.length - 1"></span>
</span>
<span>({{ listData.zdrBkZt ? '已布控' : '未布控' }})</span>
</div>
</div>
</div>
@ -67,30 +74,28 @@ onMounted(() => {
}
&>:nth-child(1) {
width: 300px;
// width: 300px;
height: 30px;
display: flex;
align-items: center;
justify-content: space-between;
}
&>:nth-child(2) {
width: 400px;
// width: 400px;
height: 30px;
display: flex;
align-items: center;
justify-content: space-between;
// justify-content: space-between;
}
&>:nth-child(3) {
width: 210px;
// width: 210px;
height: 30px;
display: flex;
align-items: center;
justify-content: space-between;
}
}
</style>

View File

@ -18,7 +18,7 @@
<el-button @click="resetForm">重置</el-button>
</div>
<div class="mapBox">
<!-- <GdMap /> -->
<GdMap />
</div>
</div>

View File

@ -171,6 +171,8 @@ const gettbGsxtZdryUpdate = () => {
...listQuery.value,
ryzp: listQuery.value.ryzp.length > 0 ? listQuery.value.ryzp.toString() : "",
ryLxdh: listQuery.value.ryLxdh,
zdrSjjz:JSON.stringify(listQuery.value.zdrSjjz),
}
tbGsxtZdryUpdate(promes).then((res) => {
listQuery.value.ryzp = []

View File

@ -2,7 +2,7 @@
<div>
<div class="headClass" style="">
<h3>关联车辆</h3>
<el-button type="primary" :disabled="disabled" @click="AddPore">选择</el-button>
<el-button type="primary" :disabled="disabled" @click="AddPore" v-if="showBut">选择</el-button>
</div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
@ -30,7 +30,7 @@
import { ref, reactive, watch, toRaw, getCurrentInstance, onMounted, onUnmounted } from "vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import VehiclDoing from "../component/vehiclDoing.vue";
import { tbZdryClxxAdd, tbZdryClxxBatchAdd, tbZdryClxxDelete, tbZdryClxxSelectPage, tbZdryClxxUpdate } from '@/api/zdr.js'
import { tbZdryClxxAdd, tbZdryClxxDelete, tbZdryClxxSelectPage, tbZdryClxxUpdate } from '@/api/zdr.js'
import { ElMessage, ElMessageBox } from "element-plus";
const { proxy } = getCurrentInstance();
const { D_BZ_CLLX, D_BZ_CLYS, D_BZ_CLPP } = proxy.$dict("D_BZ_CLLX", "D_BZ_CLYS", "D_BZ_CLPP"); //获取字典数据

View File

@ -2,7 +2,7 @@
<div>
<div class="headClass" style="">
<h3>走访记录</h3>
<el-button @click="AddPore" type="primary">新增</el-button>
<el-button @click="AddPore" type="primary" v-if="showBut">新增</el-button>
</div>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">

View File

@ -11,7 +11,6 @@ const loginDialog = ref(false);
const deptList = ref([]);
const store = useStore();
function redirectAuth() {
let token = location.hash.slice(20) || null;
if (token != null) {
token = token.replace(/\ +/g, "");