This commit is contained in:
lcw
2025-12-10 21:46:34 +08:00
parent ab73675b23
commit a19d69453f
55 changed files with 1124 additions and 225 deletions

View File

@ -10,41 +10,111 @@
<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">
</FormMessage>
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
<!-- </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="dict.D_BZ_QBCZZT" />
</div>
</div>
</el-card>
</el-timeline-item>
</el-timeline>
<MOSTY.Empty :show="lcList.length == 0" :imgSize="100"></MOSTY.Empty>
<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 class="tag-actions">
<el-icon class="action-icon edit-icon" :size="32" @click="openPursue('续保信息', item)">
<EditPen />
</el-icon>
<el-icon class="action-icon delete-icon" :size="32" @click="handleDeleteTag(item)">
<Delete />
</el-icon>
</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 class="tag-actions">
<el-icon class="action-icon edit-icon" :size="32" @click="openPursue('信息追加', item)">
<EditPen />
</el-icon>
<el-icon class="action-icon delete-icon" :size="32" @click="handleDeleteTag(item)">
<Delete />
</el-icon>
</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="dict.D_BZ_QBCZZT" />
</div>
</div>
</el-card>
</el-timeline-item>
</el-timeline>
<MOSTY.Empty :show="lcList.length == 0" :imgSize="100"></MOSTY.Empty>
</div>
</div>
</div>
<pursueContent v-model="pursueShow" :dataList="dataVals" :title="processtitle" :updeteBool="true" />
</template>
<script setup>
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qbcjAdd, qbcjUpdate, qbcjSelectByid } from "@/api/Intelligence.js";
import {xxcjAddEntity,xxcjUpdateEntity,xxcjSelectByid,xxcjSelectCzlcList} from "@/api/xxcj.js"
import { ref, defineExpose, onMounted, defineEmits, watch, getCurrentInstance } from "vue";
import { xxcjAddEntity, xxcjUpdateEntity, xxcjSelectByid, xxcjSelectCzlcList, xxcjSelectListBc, xxcjDeletesBc } from "@/api/xxcj.js"
import { EditPen, Delete } from '@element-plus/icons-vue'
import { ref, defineExpose, onMounted, defineEmits, watch, getCurrentInstance } from "vue"
import { ElMessage } from 'element-plus';
import { useRoute, useRouter } from 'vue-router'
import { qbcjCzztList, qbcjCzztDelete } from '@/api/qbcj'
import pursueContent from "@/views/backOfficeSystem/HumanIntelligence/components/pursueContent.vue";
import * as MOSTY from "@/components/MyComponents/index";
const { proxy } = getCurrentInstance()
const emit = defineEmits(["getList"]);
@ -81,7 +151,6 @@ const listQuery = ref({}); //表单
const elform = ref();
onMounted(() => {
})
const addForm = ref()
const msgeDat = ref()
const title = ref("")
const showPj = ref(false)
@ -96,6 +165,8 @@ const init = (type, row) => {
showPj.value = true
msgeDat.value = row
getqbcjPldb(row.id)
getxxcjSelectListBc(row.id, '01')
getxxcjSelectListBc(row.id, '02')
// 初始化表单数据,并根据详情页设置禁用状态
if (row) getDataById(row.id);
// getqbcjCzztList()
@ -108,8 +179,8 @@ const getDataById = (id) => {
xxcjSelectByid({ id }).then((res) => {
console.log(res);
lcList.value = res.czlcList || []
listQuery.value = res;
listQuery.value.fjdz=res.fjdz?res.fjdz?.split(","):[]
listQuery.value = res;
listQuery.value.fjdz = res.fjdz ? res.fjdz?.split(",") : []
});
};
@ -121,7 +192,9 @@ const submitForm = () => {
if (valid) {
const promes = {
...listQuery.value,
fjdz: listQuery.value.fjdz&&listQuery.value.fjdz.length > 0 ? listQuery.value.fjdz.join(',') : '',
fjdz: listQuery.value.fjdz && listQuery.value.fjdz.length > 0 ? listQuery.value.fjdz.map(item => {
return item.id
}).join(',') : '',
qbly: 0,
}
if (title.value == '新增') {
@ -152,7 +225,7 @@ const close = () => {
router.replace({ query });
}
fjdz.value = []
lcList.value=[]
lcList.value = []
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
@ -166,6 +239,50 @@ const getqbcjPldb = (id) => {
.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 || []
}
})
}
// 处理标签删除
const handleDeleteTag = (tag) => {
proxy.$confirm("确定要删除吗?", "警告", { type: "warning" }).then(() => {
xxcjDeletesBc({ ids: [tag.id] }).then(res => {
ElMessage({
message: '删除成功',
type: 'success',
showClose: true,
})
getxxcjSelectListBc(msgeDat.value.id, '01')
getxxcjSelectListBc(msgeDat.value.id, '02')
})
})
}
//
const pursueShow = ref(false)
const dataVals = ref([])
const processtitle = ref()
const openPursue = (title, data) => {
console.log(title, data);
pursueShow.value = true
processtitle.value = title
dataVals.value = data
}
defineExpose({ init });
</script>
@ -256,7 +373,7 @@ defineExpose({ init });
}
.action-icon {
font-size: 16px;
// font-size: 24px;
cursor: pointer;
transition: all 0.3s ease;
}
@ -362,7 +479,7 @@ defineExpose({ init });
}
.form-content {
display: flex;
// display: flex;
width: 80%;
}
@ -376,4 +493,144 @@ defineExpose({ init });
.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

@ -21,12 +21,12 @@
</el-icon>
<span style="vertical-align: middle">转线索</span>
</el-button>
<el-button type="primary" :disabled="ids.length === 0" @click="batchMark(ids)" v-if="qxkz.deptLevel == '01'">
<!-- <el-button type="primary" :disabled="ids.length === 0" @click="batchMark(ids)" v-if="qxkz.deptLevel == '01'">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">转合成</span>
</el-button>
</el-button> -->
<!-- <el-button type="primary" :disabled="ids.length === 0" @click="batchMark(ids)" v-if="qxkz.deptLevel == '01'">
<el-icon style="vertical-align: middle">
<CirclePlus />
@ -85,18 +85,19 @@
<!-- 只有上报状态才能回退 -->
<el-link size="small" type="primary" @click="rollbackNewspapers(row)">回退</el-link>
<!-- 只有采纳状态才能分组 -->
<el-link size="small" type="primary" @click="opneMsg(row)">分组</el-link>
<el-link size="small" type="primary" @click="opneMsg(row)">分组</el-link>
<!-- 所有状态都能进行转线索 -->
<el-link size="small" type="primary" @click="FollowUpOnLeads(row)" v-if="qxkz.depBool">转线索</el-link>
<el-link size="small" type="primary" @click="FollowUpOnLeads(row)" >转线索</el-link>
<!-- 所有状态都能进行转合成 -->
<el-link size="small" type="primary" @click="openFkDialogszl(row)" v-if="qxkz.depBool">转合成</el-link>
<el-link size="small" type="primary" @click="openFkDialogszl(row)">转合成</el-link>
<!-- 所有状态都能进行转会商 -->
<el-link size="small" type="primary" @click="addEdit('info', row)" v-if="qxkz.depBool">转会商</el-link>
<!-- 只有领导有肯定 -->
<el-link size="small" type="primary" @click="addEdit('info', row)">肯定</el-link>
<el-link size="small" type="primary" @click="affirm(row)" v-if="qxkz.roleCode">肯定</el-link>
<el-link size="small" type="primary" @click="FollowUpOnDept(row)">关注部门</el-link>
<!-- 市局能给所有数据创建标签 -->
<el-link size="small" type="primary" @click="addEdit('info', row)">创建</el-link>
<el-link size="small" type="primary" @click="openCustomTag(row)">创建</el-link>
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)">修改</el-link>
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
@ -129,6 +130,8 @@
<MakeTag v-model="chooseRow" :dataList="dataList" :dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }"
@getList="getList" />
<Fszl v-model="fszlShow" path="/xxcj/sendFqzl" :itemData="dataList" />
<CustomTag v-model="customTagShow" :dataList="dataList" @getList="getList" :dict="{ D_XXCJ_BQLX }" />
<Configuration v-model="configurationShow" :dataList="dataList" @getList="getList" />
</template>
<script setup>
@ -139,20 +142,23 @@ import Searchs from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import { useRouter, useRoute } from 'vue-router'
import { qbcjSelectQbsbPage, qbcjDeletes, qbcjCzzt, qbcjPlsb } from "@/api/Intelligence.js";
import { xxcjSelectXxsbPage, xxcjDeletes, xxcjXxzsx, xxcjUpdateCzlc } from '@/api/xxcj.js'
import { xxcjSelectXxsbPage, xxcjDeletes, xxcjXxzsx, xxcjUpdateCzlc, xxcjXxqd } from '@/api/xxcj.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import MakeTag from '../components/maketag.vue'
import ExportFile from './components/exportFile.vue'
import { ElMessageBox } from 'element-plus'
import { getItem } from '@//utils/storage.js'
import Fszl from '@/views/backOfficeSystem/HumanIntelligence/components/fszl.vue'
import CustomTag from '../components/customTag.vue'
import Configuration from '../components/configuration.vue'
const { proxy } = getCurrentInstance();
const { D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_BZ_BQJB,
D_GS_XS_QTLX, D_GS_ZDQT_LB,
D_BZ_BMJB, D_BZ_CLPP, D_BZ_CLYS, D_BZ_CLLX, D_BZ_XZQHDM, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT } =
D_BZ_BMJB, D_BZ_CLPP, D_BZ_CLYS, D_BZ_CLLX, D_BZ_XZQHDM, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT,
D_XXCJ_BQLX } =
proxy.$dict("D_BZ_BMJB", "D_GS_XS_LY",
"D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX",
"D_GS_ZDQT_LB", "D_BZ_CLPP", "D_BZ_CLYS", "D_BZ_CLLX", "D_BZ_XZQHDM", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT"); //获取字典数据
"D_GS_ZDQT_LB", "D_BZ_CLPP", "D_BZ_CLYS", "D_BZ_CLLX", "D_BZ_XZQHDM", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_BQJB", "D_BZ_LCZT", "D_XXCJ_BQLX"); //获取字典数据
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const ids = ref([])
@ -168,11 +174,9 @@ const chooseData = (val) => {
const isShow = ref(false)
const searchConfiger = ref([
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
{ label: "姓名", prop: 'xssbr', placeholder: "请输入姓名", showType: "input" },
{ label: "录入时间", prop: 'lrkssj', placeholder: "请选择开始时间", showType: "datetimerange" },
{ label: "情报来源", prop: 'qbly', placeholder: "请选择情报来源", showType: "select", options: D_BZ_CJLX },
{ label: "情报处置状态", prop: 'czzt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_QBCZZT },
{ label: "来源单位", prop: 'ssbmdm', placeholder: "请选择来源单位", showType: "department" },
{ label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select",options:D_BZ_BQJB},
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
{ label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
]);
const pageData = reactive({
@ -195,14 +199,11 @@ const pageData = reactive({
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true },
{ label: "流程状态", prop: "lczt", showSolt: true },
{ label: "消息状态", prop: "czzt", showSolt: true },
// { label: "消息状态", prop: "czzt", showSolt: true },
]
});
const queryFrom = ref({});
const chooseRow = ref(false)
const dataList = ref()
@ -283,13 +284,38 @@ const appearNewspapers = (item) => {
}
// 分组
const opneMsg = (item) => {
if (item.lczt=='04'&& qxkz.depBool) {
chooseRow.value = true
dataList.value = [item]
if (item.lczt == '04' && qxkz.depBool) {
chooseRow.value = true
dataList.value = [item]
} else {
proxy.$message.warning('请选择已采纳的消息!')
proxy.$message.warning('请选择已采纳的消息!')
}
}
// 打标签
const customTagShow = ref(false)
const openCustomTag = (item) => {
customTagShow.value = true
dataList.value = item
}
// 肯定
const affirm = (item) => {
proxy.$confirm("确定要肯定吗?", "警告", { type: "warning" }).then(() => {
xxcjXxqd({ ids: item.id }).then(res => {
proxy.$message({ type: "success", message: "肯定成功" });
getList();
})
})
}
// 配置关注部门
const configurationShow = ref(false)
const FollowUpOnDept = (item) => {
configurationShow.value = true
dataList.value = item
}
// 批量分组
// const batchMark = () => {
@ -397,11 +423,13 @@ const titleData = ref()
const qxkz = reactive({
deptBizType: '',
deptLevel: '',
roleCode: false,
depBool: false
});
onMounted(() => {
const { deptBizType, deptLevel } = getItem('deptId')[0]
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
qxkz.roleCode = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
qxkz.deptBizType = deptBizType
qxkz.deptLevel = Jb
if (deptBizType == '23' && Jb == '01') {
@ -451,18 +479,38 @@ const tabHeightFn = () => {
};
// 转线索
const FollowUpOnLeads = (row) => {
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
if (!qxkz.depBool) {
proxy.$message({
message: '权限不足',
type: 'warning',
showClose: true,
})
return
} else {
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
proxy.$message({ type: "success", message: "转线索成功" });
getList();
})
})
}
}
// 发送指令
const fszlShow = ref(false)
const openFkDialogszl = (row) => {
if (!qxkz.depBool) {
proxy.$message({
message: '权限不足',
type: 'warning',
showClose: true,
})
return
} else {
fszlShow.value = true
dataList.value = row
}
}
</script>