This commit is contained in:
lcw
2026-01-23 19:57:10 +08:00
parent 5b62d707ff
commit c12bda629a
43 changed files with 6721 additions and 223 deletions

View File

@ -0,0 +1,561 @@
<template>
<div class="dialog">
<div class="form-container">
<div class="form-content" v-loading="loading">
<!-- <div class="form_cnt"> -->
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<!-- <template #jbxx>
<div>
<h3 class="tags-title">报送情况</h3>
<div style="display: flex;justify-content:space-between;width: 200%;">
<div>录入人{{ userName }}</div>
<div>录入单位{{ userInfo.deptName }}</div>
<div>本年度报送信息量{{ tjcll.cnl || 0 }}</div>
<div>采纳量{{ tjcll.sbsl || 0 }}</div>
</div>
</div>
</template> -->
<template #shzt>
<div v-if="disabled">
<h3 class="tags-title">审核状态</h3>
<div style="display: flex;justify-content:space-between;width: 200%;">
<div style="display: flex;">
市审核状态
<DictTag v-model:value="listQuery.sldshzt" :options="D_BZ_SSSHZT" :tag="false" />
</div>
<div style="display: flex;">
县审核状态
<DictTag v-model:value="listQuery.xldshzt" :options="D_BZ_SSSHZT" :tag="false" />
</div>
</div>
</div>
</template>
</FormMessage>
<!-- </div> -->
<div class="tags-section" v-if="disabled">
<h3 class="tags-title">关注部门</h3>
<div class="tags-container">
<div v-for="(tag, index) in listQuery.gzbmList" :key="tag.id || index" class="tag-item">
<div class="tag-content">
{{ tag.ssbm }}
</div>
</div>
<span v-if="!listQuery.gzbmList || listQuery.gzbmList.length === 0" class="no-tags">
暂无标签
</span>
</div>
</div>
<div class="tags-section" v-if="disabled">
<h3 class="tags-title">关联标签</h3>
<div class="tags-container">
<div v-for="(tag, index) in listQuery.glbqList" :key="tag.id || index" class="tag-item">
<div class="tag-content">
{{ tag.bqmc }}
</div>
</div>
<span v-if="!listQuery.glbqList || listQuery.glbqList.length === 0" class="no-tags">
暂无标签
</span>
</div>
</div>
<div class="tags-section" v-if="disabled">
<h3 class="tags-title">续报信息</h3>
<div class="list-container">
<div v-for="(item, index) in dataList.xb" :key="item.id || index" class="list-item">
<div class="list-content">
{{ item.bcnr }}
</div>
</div>
<span v-if="!dataList.xb || dataList.xb.length === 0" class="no-tags">
暂无续报信息
</span>
</div>
</div>
<div class="tags-section" v-if="disabled">
<h3 class="tags-title">补充信息</h3>
<div class="list-container">
<div v-for="(item, index) in dataList.bc" :key="item.id || index" class="list-item">
<div class="list-content">
{{ item.bcnr }}
</div>
</div>
<span v-if="!dataList.bc || dataList.bc.length === 0" class="no-tags">
暂无补充信息
</span>
</div>
</div>
</div>
<div class="ml50 mr50 timeline-container" v-if="disabled">
<div class="timeline-title">信息流程展示</div>
<el-timeline class="timeline-full-width">
<el-timeline-item :timestamp="item.czsj" placement="top" v-for="(item, index) in lcList" :key="index">
<el-card class="process-card">
<div class="process-info">
<div class="info-label">处置人</div>
<div class="info-value">{{ item.czrxm || '未记录' }}</div>
</div>
<div class="process-info">
<div class="info-label">处置结果</div>
<div class="info-value">
<DictTag :tag="false" :value="item.czzt" :options="D_BZ_LCZT" />
</div>
</div>
</el-card>
</el-timeline-item>
</el-timeline>
<MOSTY.Empty :show="lcList.length == 0" :imgSize="100"></MOSTY.Empty>
</div>
</div>
</div>
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { xxcjSelectByid, xxcjSelectCzlcList, xxcjSelectListBc } from "@/api/xxcj.js"
import { ref, defineExpose, onMounted, defineEmits, watch, getCurrentInstance } from "vue"
import { getItem } from '@//utils/storage.js'
import { useRoute, useRouter } from 'vue-router'
import * as MOSTY from "@/components/MyComponents/index";
const { proxy } = getCurrentInstance()
const {D_BZ_SSSHZT,D_BZ_LCZT} =proxy.$dict('D_BZ_SSSHZT','D_BZ_LCZT')
const route=useRoute()
const emit = defineEmits(["getList"]);
const props = defineProps({
dict: Object,
titleData: {
type: String,
default: ""
},
showBc: {
type: Boolean,
default: false
}
});
const loading = ref(false)
const formData = ref([
{ label: "情报标题", prop: "qbmc", type: "input", width: '45%' },
{ label: "情报内容", prop: "qbnr", type: "textarea", width: '100%', rows: 100 },
{ label: "附件上传", prop: "fjdz", type: "upload", width: '100%', isImg: false },
{ label: "", prop: "jbxx", type: "slot", width: '100%', },
{ label: "", prop: "shzt", type: "slot", width: '100%' },
]);
const rules = ref({
qbmc: [{ required: true, message: "请输入情报标题", trigger: "blur" }],
qbnr: [{ required: true, message: "请输入情报内容", trigger: "blur" }],
bcnr: [{ required: true, message: "请输入续报内容", trigger: "blur" }],
})
const fjdz = ref()
const listQuery = ref({}); //表单
const disabled = ref(false)
/** 类型 add 新增 info 详情 edit 编辑 followUpReport 续报*/
onMounted(() => {
init()
})
// 初始化数据
const init = () => {
const id= route.query.id
disabled.value = true
fjdz.value = []
getqbcjPldb(id)
getxxcjSelectListBc(id, '01')
getxxcjSelectListBc(id, '02')
getDataById(id);
};
// 根据id查询详情
const getDataById = (id) => {
xxcjSelectByid({ id }).then((res) => {
lcList.value = res.czlcList || []
listQuery.value = res;
listQuery.value.fjdz = res.fjdz ? res.fjdz?.split(",") : []
});
};
const lcList = ref([])
const getqbcjPldb = (id) => {
xxcjSelectCzlcList({ qbid: id }).then(res => {
lcList.value = res || []
})
.catch(() => {
})
}
//
const dataList = ref({
xb: [],
bc: [],
})
const getxxcjSelectListBc = (id, lx) => {
xxcjSelectListBc({ qbid: id, czlx: lx }).then(res => {
if (lx == '01') {
dataList.value.xb = res || []
} else {
dataList.value.bc = res || []
}
})
}
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: 99%;
height: 225px;
margin-top: 10px;
overflow: hidden;
}
::v-deep .avatar-uploader {
display: flex;
align-items: center;
}
::v-deep .el-upload-list {
margin-left: 20px;
display: flex;
align-items: center;
}
::v-deep .el-upload-list__item-name .el-icon {
top: 3px;
}
.form_cnt {
// width: 75%;
flex: 1;
}
.person {
padding-left: 20px;
width: 25%;
// height: 100vh;
}
/* 补充信息样式 */
.supplement-title {
font-size: 14px;
font-weight: 500;
color: #333;
margin: 16px 0 10px 0;
padding-left: 5px;
border-left: 3px solid #24b6dd;
}
.supplement-list {
margin-left: 5px;
}
.supplement-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
background-color: #f5f7fa;
border: 1px solid #e4e7ed;
border-radius: 4px;
margin-bottom: 8px;
margin-right: 10px;
transition: all 0.3s ease;
}
.supplement-item:hover {
background-color: #ecf5ff;
border-color: #c6e2ff;
}
.supplement-content {
flex: 1;
font-size: 14px;
color: #606266;
line-height: 1.5;
}
.supplement-actions {
display: flex;
gap: 12px;
}
.action-icon {
// font-size: 24px;
cursor: pointer;
transition: all 0.3s ease;
}
.edit-icon {
color: #24b6dd;
}
.edit-icon:hover {
color: #409eff;
transform: scale(1.1);
}
.delete-icon {
color: #f56c6c;
}
.delete-icon:hover {
color: #f78989;
transform: scale(1.1);
}
/* 时间线标题样式 */
.timeline-title {
font-size: 16px;
font-weight: 600;
color: #303133;
padding: 12px 16px;
margin-bottom: 10px;
background-color: #f5f7fa;
border-bottom: 1px solid #ebeef5;
border-radius: 4px 4px 0 0;
}
/* 时间线样式优化 */
.el-timeline {
margin-top: 20px;
}
/* 处置流程卡片样式 */
.process-card {
border: none;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
transition: all 0.3s ease;
margin-bottom: 16px;
border-left: 3px solid #409EFF;
}
.process-card:hover {
box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.12);
transform: translateY(-2px);
}
/* 卡片内部信息样式 */
.process-info {
display: flex;
align-items: flex-start;
margin-bottom: 12px;
flex-wrap: wrap;
}
.process-info:last-child {
margin-bottom: 0;
}
.info-label {
font-size: 14px;
font-weight: 600;
color: #409EFF;
margin-right: 8px;
min-width: 65px;
}
.info-value {
font-size: 14px;
color: #606266;
line-height: 1.6;
flex: 1;
word-break: break-word;
}
/* 时间戳样式 */
.el-timeline-item__timestamp {
font-size: 13px;
color: #909399;
margin-bottom: 8px;
}
/* 时间线节点样式 */
.el-timeline-item__node {
background-color: #409EFF;
}
::v-deep .el-textarea__inner {
height: 50vh !important;
}
/* 容器类样式 */
.form-container {
display: flex;
width: 100%;
}
.form-content {
// display: flex;
width: 80%;
}
.timeline-container {
border: 1px solid #ebeef5;
flex: 1;
margin: 0 10px;
}
/* 时间线宽度 */
.timeline-full-width {
width: 100%;
}
/* 标签区域样式 */
.tags-section {
margin-top: 20px;
}
/* 标签标题样式 */
.tags-title {
font-size: 14px;
font-weight: 600;
color: #303133;
margin-bottom: 8px;
padding-left: 5px;
border-left: 3px solid #409EFF;
}
/* 标签容器样式 */
.tags-container {
padding: 12px;
background-color: #f5f7fa;
border-radius: 4px;
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
}
/* 标签项目样式 */
.tag-item {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
background-color: #ecf5ff;
border-radius: 4px;
border: 1px solid #d9ecff;
transition: all 0.3s ease;
}
/* 标签项目悬停效果 */
.tag-item:hover {
background-color: #e6f7ff;
border-color: #91d5ff;
box-shadow: 0 2px 8px rgba(0, 123, 255, 0.15);
}
/* 标签内容样式 */
.tag-content {
margin: 0;
font-size: 14px;
color: #303133;
font-weight: 500;
}
/* 标签操作按钮样式 */
.tag-actions {
display: flex;
// align-items: flex-start;
gap: 8px;
}
/* 操作图标样式 */
.action-icon {
font-size: 18px;
cursor: pointer;
transition: all 0.3s ease;
padding: 6px 8px;
border-radius: 4px;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* 编辑图标样式 */
.edit-icon {
color: #409EFF;
background-color: #ecf5ff;
}
.edit-icon:hover {
color: #66B1FF;
background-color: #e6f7ff;
transform: scale(1.05);
box-shadow: 0 2px 4px rgba(64, 158, 255, 0.2);
}
/* 列表容器样式 */
.list-container {
padding: 12px;
background-color: #f5f7fa;
border-radius: 4px;
}
/* 列表项样式 */
.list-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 12px;
background-color: #ffffff;
border-radius: 4px;
margin-bottom: 8px;
border: 1px solid #e4e7ed;
transition: all 0.3s ease;
}
/* 列表项悬停效果 */
.list-item:hover {
background-color: #f5f7fa;
border-color: #dcdfe6;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}
/* 列表内容样式 */
.list-content {
margin: 0;
font-size: 14px;
color: #303133;
font-weight: 500;
}
/* 删除图标样式 */
.delete-icon {
color: #F56C6C;
background-color: #fef0f0;
}
.delete-icon:hover {
color: #F78989;
background-color: #fde2e2;
transform: scale(1.05);
box-shadow: 0 2px 4px rgba(245, 108, 108, 0.2);
}
/* 无标签提示样式 */
.no-tags {
color: #909399;
font-size: 14px;
font-style: italic;
}
</style>

View File

@ -27,11 +27,14 @@
<DictTag :tag="false" :value="row.sldshzt" :options="D_BZ_SSSHZT" />
</template>
<template #controls="{ row }">
<el-link size="small" type="danger" @click="openDoingLogin(row)"
v-if="row.sldshzt == '01' && getRole() == '02'">审批</el-link>
<el-link size="small" type="danger" @click="openDoingLogin(row)"
v-if="row.xldshzt == '01' && getRole() == '01'">审批</el-link>
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<el-link size="small" type="warning" @click="createProcess(row)"
v-if="row.sldshzt == '02' && getRole() == '02'">送审</el-link>
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -40,9 +43,11 @@
}"></Pages>
</div>
<!-- 新增 -->
<AddForm ref="detailDiloag" @getList="getList" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" />
<AddForm ref="detailDiloag" @getList="getList" :dict="{ D_BZ_LCZT, D_BZ_SSSHZT }" />
</div>
<Doinglogin v-model="doingloginModel" :dataModel="dataModel" :dict="{ D_BZ_SSSHZT }" @getList="getList" />
<Doinglogin v-model="doingloginModel" :dataModel="dataModel" :dict="{ D_BZ_SSSHZT }" @getList="getList" />
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '情报审批', flowType: 'QBSP', modelName: '情报' }"
:path="fixedValue" @getList="getList" />
</template>
<script setup>
@ -51,6 +56,7 @@ import Doinglogin from "./components/doinglogin.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Searchs from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import { xxcjSelectDshPage } from '@/api/xxcj.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { getItem } from "@/utils/storage";
@ -148,13 +154,25 @@ const openDoingLogin = (row) => {
dataModel.value = row
doingloginModel.value = true
}
const detailDiloag=ref()
const detailDiloag = ref()
const addEdit = (type, row) => {
setTimeout(() => {
detailDiloag.value.init(type, row);
}, 500)
};
// 固定值
const fixedValue = {
clueVerification: 'Spdloyment',
byMeansOf: '/qbcj/callback',
nobyMeansOf: '/qbcj/callback',
recycle: '/qbcj/callback',
}
const showSp = ref(false);
const rowData = ref()
const createProcess = (row) => {
showSp.value = true;
rowData.value = row
}
// 表格高度计算
const tabHeightFn = () => {

View File

@ -166,6 +166,7 @@ const searchConfiger = ref([
{ label: "编号", prop: 'xsBh', placeholder: "请输入编号", showType: "input" },
{ label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" },
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
{ label: "标签内容", prop: 'bqdmList', placeholder: "请选择标签内容", showType: "select", options: D_XXCJ_BQLX,multiple:true},
{ label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select", options: D_BZ_BQJB },
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
@ -370,12 +371,14 @@ const butcontroll = (val, zt) => {
// 搜索
const onSearch = (val) => {
console.log(val.bqdmList);
const promes = {
...pageData.pageConfiger,
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.endTime ? val.endTime[1] : '',
bqdmList:val.bqdmList?val.bqdmList.join(','):""
}
queryFrom.value = { ...promes }