Compare commits
86 Commits
032b35ec9e
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ea84f248c | |||
| 953cb9943d | |||
| 3fb06e3847 | |||
| 596c9f99e4 | |||
| e59b401828 | |||
| 669c8cb3b5 | |||
| 22c3e0253b | |||
| 6999c36c3a | |||
| 709ce4a1e9 | |||
| 23cc528707 | |||
| bc92cfa735 | |||
| 1a7b27209f | |||
| 5ae5dc7224 | |||
| 039e0ce421 | |||
| 369fb4c00a | |||
| ab9249479c | |||
| c18dde1b43 | |||
| d3110fb7b9 | |||
| a9959ce537 | |||
| d0b7e6c768 | |||
| 56000fdbdf | |||
| 32d5e53b59 | |||
| f6ce1455da | |||
| f9af7e060d | |||
| 198ee8f734 | |||
| 97f7736081 | |||
| f0910016ae | |||
| fb9d399598 | |||
| 7e61b43e5c | |||
| 05524353f4 | |||
| c1fc037cdf | |||
| 9c179c71ca | |||
| 26dfe3d6c0 | |||
| 463051f109 | |||
| cfd6b5b140 | |||
| 901d7bab71 | |||
| 3b8697e744 | |||
| 2ba8ac607e | |||
| 186d1e0d53 | |||
| 571518f1e5 | |||
| cc2bf59a19 | |||
| 6ddecd72af | |||
| 34a1e4aefb | |||
| 244fcc1703 | |||
| bdde65f1c4 | |||
| 693695c178 | |||
| 2241222bb7 | |||
| a21192c47a | |||
| 0c0c35316d | |||
| 504f3a328c | |||
| b18d8e9f25 | |||
| e581d9d5b3 | |||
| 5a42ab322f | |||
| c4f051d82c | |||
| 75c34d983f | |||
| 9319ba65a7 | |||
| 3426b66dd5 | |||
| 1b8655d2ee | |||
| 2bcab2abd6 | |||
| 783b01a514 | |||
| 7307b6c5da | |||
| ca8c391d9f | |||
| c9c1bc1b2e | |||
| 060f2bedaa | |||
| 6ad95dcd36 | |||
| 33a127ec16 | |||
| a83e15ecbd | |||
| 5c4ca373e3 | |||
| 9da3ae7e3c | |||
| 9f6f712e3d | |||
| b754de7135 | |||
| 7917b9cd44 | |||
| dc5e5e5f43 | |||
| 7750f239ec | |||
| 45a1a1ea17 | |||
| 963cf54ec1 | |||
| 791fd08277 | |||
| 6f51e0e0d9 | |||
| 299f6b8f02 | |||
| 561aec8a90 | |||
| acdf6abdea | |||
| 7853672770 | |||
| ff8b4e5cba | |||
| c0237acfff | |||
| 9fc4d227b3 | |||
| 6a80bddff3 |
21380
package-lock.json
generated
21380
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
44
src/App.vue
44
src/App.vue
@ -150,5 +150,47 @@ v-deep .el-loading-mask {
|
||||
left: -10px;
|
||||
transform: translateY(-50%) translateX(-50%);
|
||||
}
|
||||
|
||||
.popupCustomBox{
|
||||
position: relative;
|
||||
background: rgba(2, 55, 114, 0.99);
|
||||
color: #fff;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
||||
.popupCustomTitle_title{
|
||||
padding: 4px;
|
||||
box-sizing: border-box;
|
||||
font-size: 12px;
|
||||
text-transform: none;
|
||||
margin-bottom: 0;
|
||||
border-bottom: 1px dashed #ececec;
|
||||
margin-bottom: 2px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
&::after{
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -10px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 10px solid transparent;
|
||||
border-right: 10px solid transparent;
|
||||
border-top: 10px solid rgba(2, 55, 114, 0.99);
|
||||
}
|
||||
.popupCustomTitle_li{
|
||||
font-size: 12px;
|
||||
line-height: 22px;
|
||||
text-transform: none;
|
||||
margin-bottom: 0;
|
||||
span{
|
||||
display: inline-block;
|
||||
width: 45px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
36
src/api/HumanIntelligence/integralList.js
Normal file
36
src/api/HumanIntelligence/integralList.js
Normal file
@ -0,0 +1,36 @@
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-gsxt";
|
||||
/**
|
||||
* 岗哨系统-信息采集积分(分页)
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} [params.xm] - 姓名
|
||||
* @param {string} [params.sfzh] - 身份证号
|
||||
* @param {string} [params.jflx] - 积分类型:01-优秀信息员、02-优秀研判员
|
||||
* @param {string} [params.jflylx] - 积分来源类型:01-信息采集、02-肯定、03-转会商、04-转合成、05-转线索、06-建模型、07-战术研判、08-战略研判
|
||||
* @param {number} [params.pageCurrent] - 当前页码
|
||||
* @param {number} [params.pageSize] - 每页条数
|
||||
* @returns {Promise<Object>} 返回分页数据对象
|
||||
* @returns {Array} returns.records - 数据记录数组,每个记录包含以下字段:
|
||||
* @returns {string} [returns.records[].bz] - 备注
|
||||
* @returns {string} [returns.records[].hdsj] - 积分获得时间(日期时间格式)
|
||||
* @returns {string} [returns.records[].id] - 主键ID
|
||||
* @returns {number} [returns.records[].jf] - 积分(整数)
|
||||
* @returns {string} [returns.records[].jflx] - 积分类型:01-优秀信息员、02-优秀研判员
|
||||
* @returns {string} [returns.records[].jflylx] - 积分来源类型:04-采纳、05-退回、06-打标签、07-转合成、08-转线索、09-转会商
|
||||
* @returns {string} [returns.records[].sfzh] - 身份证号
|
||||
* @returns {string} [returns.records[].ssbm] - 所属部门
|
||||
* @returns {string} [returns.records[].ssbmdm] - 所属部门代码
|
||||
* @returns {string} [returns.records[].sssgaj] - 所属市公安局
|
||||
* @returns {string} [returns.records[].sssgajdm] - 所属市公安局代码
|
||||
* @returns {string} [returns.records[].ssxgaj] - 所属县公安局
|
||||
* @returns {string} [returns.records[].ssxgajdm] - 所属县公安局代码
|
||||
* @returns {string} [returns.records[].xm] - 姓名
|
||||
* @returns {number} returns.total - 总记录数
|
||||
*/
|
||||
export const mjjfSelectPage = (params) => {
|
||||
return request({
|
||||
url: api + "/xxcj/mjjf/selectPage",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
28
src/api/HumanIntelligence/supplementReportList.js
Normal file
28
src/api/HumanIntelligence/supplementReportList.js
Normal file
@ -0,0 +1,28 @@
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-gsxt";
|
||||
/**
|
||||
* 补充/续报列表查询接口
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} [params.bcrxm] - 补充人姓名(可选)
|
||||
* @param {string} [params.czlx] - 操作类型:01-续报、02-补充(可选)
|
||||
* @param {number} [params.pageCurrent] - 当前页码
|
||||
* @param {number} [params.pageSize] - 每页条数
|
||||
* @returns {Promise<Object>} 返回分页数据对象
|
||||
* @returns {Array} returns.records - 数据记录数组,每个记录包含以下字段:
|
||||
* @returns {string} [returns.records[].bcnr] - 补充内容
|
||||
* @returns {string} [returns.records[].bcrsfzh] - 补充人身份证号
|
||||
* @returns {string} [returns.records[].bcrxm] - 补充人姓名
|
||||
* @returns {string} [returns.records[].bcsj] - 补充时间(日期时间格式)
|
||||
* @returns {string} [returns.records[].czlx] - 操作类型:01-续报、02-补充
|
||||
* @returns {string} [returns.records[].id] - 主键ID
|
||||
* @returns {string} [returns.records[].qbid] - 线索情报ID
|
||||
* @returns {string} [returns.records[].ysnr] - 原始内容
|
||||
* @returns {number} returns.total - 总记录数
|
||||
*/
|
||||
export const zhsSelectPage = (params) => {
|
||||
return request({
|
||||
url: api + "/xxcj/bc/selectPage",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
35
src/api/HumanIntelligence/transferConsultationList.js
Normal file
35
src/api/HumanIntelligence/transferConsultationList.js
Normal file
@ -0,0 +1,35 @@
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-gsxt";
|
||||
/**
|
||||
* 转会商列表查询接口
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} [params.xsBh] - 信息编号
|
||||
* @param {string} [params.qbmc] - 情报名称
|
||||
* @param {string} [params.qbly] - 情报来源,参考字典 D_GS_XS_LY
|
||||
* @param {number} [params.pageCurrent] - 当前页码
|
||||
* @param {number} [params.pageSize] - 每页条数
|
||||
* @returns {Promise<Object>} 返回分页数据对象
|
||||
* @returns {Array} returns.records - 数据记录数组,每个记录包含以下字段:
|
||||
* @returns {string} [returns.records[].bz] - 备注
|
||||
* @returns {string} [returns.records[].hsid] - 会商ID
|
||||
* @returns {string} [returns.records[].id] - 主键ID
|
||||
* @returns {string} [returns.records[].qbid] - 线索情报ID
|
||||
* @returns {string} [returns.records[].qbly] - 情报来源,参考字典 D_GS_XS_LY
|
||||
* @returns {string} [returns.records[].qbmc] - 情报名称
|
||||
* @returns {string} [returns.records[].qbnr] - 情报内容
|
||||
* @returns {string} [returns.records[].ssbm] - 所属部门
|
||||
* @returns {string} [returns.records[].ssbmdm] - 所属部门代码
|
||||
* @returns {string} [returns.records[].sssgaj] - 所属市公安局
|
||||
* @returns {string} [returns.records[].sssgajdm] - 所属市公安局代码
|
||||
* @returns {string} [returns.records[].ssxgaj] - 所属县公安局
|
||||
* @returns {string} [returns.records[].ssxgajdm] - 所属县公安局代码
|
||||
* @returns {string} [returns.records[].xsBh] - 信息编号
|
||||
* @returns {number} returns.total - 总记录数
|
||||
*/
|
||||
export const zhsSelectPage = (params) => {
|
||||
return request({
|
||||
url: api + "/xxcj/zhs/selectPage",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
@ -109,4 +109,13 @@ export function upImageUploadId(data) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 发送指令 (网上会议室)*/
|
||||
export function wshsSendFqzl(data) {
|
||||
return request({
|
||||
url: gsxtApi + '/wshs/sendFqzl',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
53
src/api/dataWatch/onlineUser.js
Normal file
53
src/api/dataWatch/onlineUser.js
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-websocket";
|
||||
/**
|
||||
* 获取在线用户数
|
||||
* @param {Object} params - 查询参数
|
||||
* @returns {Promise<Array<SysUser>>} 返回在线用户数组
|
||||
*
|
||||
* @typedef {Object} SysUser 在线用户对象
|
||||
* @property {string} [avatar] - 头像
|
||||
* @property {string} [beginTime] - 用户有效开始时间,默认为当前日期(用户可改)
|
||||
* @property {string} [birthday] - 出生日期
|
||||
* @property {string} [bz] - 备注
|
||||
* @property {string} [email] - 用户邮箱
|
||||
* @property {string} [endTime] - 用户有效结束时间,默认空
|
||||
* @property {number} [id] - 用户ID
|
||||
* @property {string} [idEntityCard] - 身份证号
|
||||
* @property {string} [inDustRialId] - 行业号码(如:警号)
|
||||
* @property {string} [isVirtualUser] - 是否虚拟用户:1、是 2、不是
|
||||
* @property {string} [loginName] - 登录账号
|
||||
* @property {number} [managerOrgId] - 管理部门ID
|
||||
* @property {string} [managerOrgName] - 管理部门名称
|
||||
* @property {string} [marital] - 婚姻状态
|
||||
* @property {string} [mk] - -
|
||||
* @property {string} [mobile] - 移动电话
|
||||
* @property {string} [nation] - 民族
|
||||
* @property {string} [password] - 密码
|
||||
* @property {string} [politic] - 政治面貌
|
||||
* @property {number} [positionId] - 岗位ID
|
||||
* @property {string} [positionName] - 岗位名称
|
||||
* @property {string} [sex] - 用户性别(0男 1女 2未知)
|
||||
* @property {string} [sfrh] - -
|
||||
* @property {string} [telePhone] - 电话号码
|
||||
* @property {string} [type] - 人员类别
|
||||
* @property {string} [typeName] - 人员类别中文
|
||||
* @property {string} [userId] - -
|
||||
* @property {string} [userName] - 用户昵称
|
||||
* @property {string} [userType] - 用户类型(00系统用户 01注册用户)
|
||||
* @property {string} [whcd] - 文化程度
|
||||
|
||||
* @property {number} [xzcs] - 选择次数
|
||||
*/
|
||||
export const socketCurrentUser = (params) => {
|
||||
return request({
|
||||
url: api + "/socket/currentUser",
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// import {socketCurrentUser} from "@/api/dataWatch/onlineUser.js"
|
||||
62
src/api/huiShangyp/onlineConsultationRoom.js
Normal file
62
src/api/huiShangyp/onlineConsultationRoom.js
Normal file
@ -0,0 +1,62 @@
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-gsxt";
|
||||
|
||||
|
||||
/**
|
||||
* 会商反馈
|
||||
* @param {Object} data - 反馈参数对象
|
||||
* @param {string} data.hsid - 会商ID
|
||||
* @param {string} data.fknr - 反馈内容
|
||||
* @returns {Promise} 返回请求结果
|
||||
*/
|
||||
export const wshsHsfk = (data) => {
|
||||
return request({
|
||||
url: api + `/wshs/hsfk`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送涉嫌种类
|
||||
* @param {Object} data - 发送涉嫌种类参数对象
|
||||
* @param {boolean} data.flag - 标志位
|
||||
* @param {string} data.id - ID
|
||||
* @param {Object} data.instructionsEntity - 指令实体对象
|
||||
* @param {string} [data.instructionsEntity.attachmentPath] - 附件路径
|
||||
* @param {string} [data.instructionsEntity.createdAt] - 创建时间
|
||||
* @param {string} [data.instructionsEntity.instructionContent] - 指令内容
|
||||
* @param {string} [data.instructionsEntity.instructionLevel] - 指令级别
|
||||
* @param {string} [data.instructionsEntity.instructionLevelCode] - 指令级别代码
|
||||
* @param {string} [data.instructionsEntity.instructionNumber] - 指令编号
|
||||
* @param {string} [data.instructionsEntity.instructionTime] - 指令时间
|
||||
* @param {string} [data.instructionsEntity.instructionType] - 指令类型
|
||||
* @param {string} [data.instructionsEntity.instructionTypeCode] - 指令类型代码
|
||||
* @param {string} [data.instructionsEntity.issuer] - 发布者
|
||||
* @param {string} [data.instructionsEntity.issuerCode] - 发布者代码
|
||||
* @param {string} [data.instructionsEntity.receivingUnit] - 接收单位
|
||||
* @param {string} [data.instructionsEntity.receivingUnitCode] - 接收单位代码
|
||||
* @param {string} [data.instructionsEntity.status] - 状态
|
||||
* @param {string} [data.instructionsEntity.title] - 标题
|
||||
* @param {string} [data.instructionsEntity.unitCode] - 单位代码
|
||||
* @param {string} [data.instructionsEntity.unitName] - 单位名称
|
||||
* @param {string} [data.instructionsEntity.updatedAt] - 更新时间
|
||||
* @param {Array<Object>} [data.personnelEntity] - 人员实体数组
|
||||
* @param {string} [data.personnelEntity[].comment] - 备注
|
||||
* @param {string} [data.personnelEntity[].domicilePlace] - 户籍地
|
||||
* @param {string} [data.personnelEntity[].idNumber] - 身份证号
|
||||
* @param {string} [data.personnelEntity[].name] - 姓名
|
||||
* @param {string} [data.personnelEntity[].orderId] - 订单ID
|
||||
* @param {string} [data.personnelEntity[].personTypeId] - 人员类型ID
|
||||
* @param {string} [data.personnelEntity[].personTypeName] - 人员类型名称
|
||||
* @param {string} [data.personnelEntity[].phoneNumber] - 电话号码
|
||||
* @param {string} [data.sfzh] - 身份证号
|
||||
* @returns {Promise} 返回请求结果
|
||||
*/
|
||||
export const sendFqzl = (data) => {
|
||||
return request({
|
||||
url: api + `/send/fqzl`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
@ -60,3 +60,36 @@ export const strategicPut = (data, url) => {
|
||||
data
|
||||
})
|
||||
}
|
||||
//提交研判申请
|
||||
export const ypbgSjzlTjspId = (id) => {
|
||||
return request({
|
||||
url: api + `/ypbg/sjzl/tjsp/${id}`,
|
||||
method: "get"
|
||||
})
|
||||
}
|
||||
//ypbg/sjzl/queryShList 查询研判内部审核人员列表
|
||||
export const ypbgSjzlQueryShList = (params) => {
|
||||
return request({
|
||||
url: api + `/ypbg/sjzl/queryShList`,
|
||||
method: "get",
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export const ypbgSjzlYpsp = (data) => {
|
||||
return request({
|
||||
url: api + `/ypbg/sjzl/ypsp`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
// 提交研判申请
|
||||
// / mosty - api / mosty - gsxt / ypbg / sjzl / tjsp / id
|
||||
// 研判内部审核人员查询列表(市情指领导才有权限)
|
||||
// /mosty-api/mosty - gsxt / ypbg / sjzl / queryShList
|
||||
// 内部研判审批
|
||||
// / mosty - api / mosty - gsxt / ypbg / sjzl / ypsp
|
||||
// 提交上级部门审批
|
||||
// / mosty - api / mosty - gsxt / ypbg / sjzl / sendFqzl
|
||||
// 工作流审批回掉
|
||||
// / mosty - api / mosty - gsxt / ypbg / sjzl / updateBkgzl
|
||||
|
||||
@ -26,41 +26,6 @@ export const tacticalGet = (params) => {
|
||||
})
|
||||
}
|
||||
|
||||
// 战术研判-新增
|
||||
export const tacticalPost = (data, url) => {
|
||||
return request({
|
||||
url: api,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 战术研判-删除
|
||||
export const tacticalDelete = (data, url) => {
|
||||
return request({
|
||||
url: api,
|
||||
method: "delete",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 战术研判-根据ID查询详情
|
||||
export const tacticalGetInfo = (id) => {
|
||||
return request({
|
||||
url: api + `/tactical/${id}`,
|
||||
method: "get"
|
||||
})
|
||||
}
|
||||
|
||||
// 战术研判-编辑
|
||||
export const tacticalPut = (data, url) => {
|
||||
return request({
|
||||
url: api,
|
||||
method: "put",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 开始研判
|
||||
@ -85,10 +50,92 @@ export const endJudgment = (id) => {
|
||||
method: "post"
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 网上会商(新增)
|
||||
* @param {Object} data 会商数据
|
||||
* @param {Array<string>} [data.chryList] 参会人员ID列表
|
||||
* @param {string} [data.czyj] 会商处置意见
|
||||
* @param {string} [data.glxsid] 关联线索ID(采集ID)
|
||||
* @param {string} [data.glxsmc] 关联线索名称
|
||||
* @param {string} [data.hsbt] 会商标题
|
||||
* @param {string} [data.hsjssj] 会商结束时间 (ISO 8601格式)
|
||||
* @param {string} [data.hskssj] 会商开始时间 (ISO 8601格式)
|
||||
* @param {string} [data.hsnr] 会商内容
|
||||
* @param {string} [data.hybh] 会议编号
|
||||
* @param {string} [data.id] ID
|
||||
* @param {string} [data.plnr] 评论内容
|
||||
* @param {string} [data.tsypid] 态势研判ID
|
||||
* @returns {Promise} 请求Promise对象
|
||||
* @returns {Promise} 请求Promise对象
|
||||
*/
|
||||
export const wshsAdd = (data) => {
|
||||
return request({
|
||||
url: api + `/wshs/add`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增研判报告
|
||||
* @param {Object} data 研判报告数据
|
||||
* @param {string} data.bgmc - 报告名称
|
||||
* @param {string} data.bgnr - 报告内容
|
||||
* @param {string} data.bz - 备注
|
||||
* @param {string} data.cjrsfzh - 创建人身份证号
|
||||
* @param {string} data.cjrxm - 创建人姓名
|
||||
* @param {string} data.id - ID
|
||||
* @param {string} data.scsj - 生成时间
|
||||
* @param {string} data.ssbm - 所属部门
|
||||
* @param {string} data.ssbmdm - 所属部门代码
|
||||
* @param {string} data.sssgaj - 所属市公安局
|
||||
* @param {string} data.sssgajdm - 所属市公安局代码
|
||||
* @param {string} data.ssxgaj - 所属县公安局
|
||||
* @param {string} data.ssxgajdm - 所属县公安局代码
|
||||
* @param {string} data.ypid - 研判来源ID(数据整理ID)
|
||||
* @param {string} data.ypmc - 研判名称
|
||||
* @returns {Promise} 请求Promise对象
|
||||
*/
|
||||
export const gsxtYpbgAddEntity = (data) => {
|
||||
return request({
|
||||
url: api + `/gsxtYpbg/addEntity`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑研判报告
|
||||
* @param {Object} data 研判报告数据
|
||||
* @returns {Promise} 请求Promise对象
|
||||
*/
|
||||
export const gsxtYpbgEditEntity = (data) => {
|
||||
return request({
|
||||
url: api + `/gsxtYpbg/editEntity`,
|
||||
method: "put",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 自建研判报告
|
||||
* @param {Object} data 自建研判数据
|
||||
* @param {Array<Object>} data.cyypList 自建研判数据列表
|
||||
* @param {string} data.cyypList[].fj - 附件
|
||||
* @param {string} data.cyypList[].id - ID
|
||||
* @param {string} data.cyypList[].scyq - 素材要求
|
||||
* @param {string} data.cyypList[].sjzlid - 研判数据整理ID
|
||||
* @param {string} data.cyypList[].wcqk - 完成情况(01 准备中、02 已完成)
|
||||
* @param {string} data.cyypList[].wcsj - 完成时间
|
||||
* @param {string} data.cyypList[].ypbmdm - 研判部门代码
|
||||
* @param {string} data.cyypList[].ypbmmc - 研判部门名称
|
||||
* @param {Object} data.ypbgDto 研判报告DTO
|
||||
* @param {string} data.ypbgDto.bgmc 报告名称
|
||||
* @param {string} data.ypbgDto.bgnr 报告内容
|
||||
* @param {string} data.ypbgDto.ypmc 研判名称
|
||||
* @param {string} data.bglx 报告类型(01 战术研判 02 战略研判)
|
||||
* @param {string} data.ypyq 研判要求
|
||||
* @param {string} data.ypyt 研判议题
|
||||
* @returns {Promise} 请求Promise对象
|
||||
*/
|
||||
export const selfBuildJudgment = (data) => {
|
||||
@ -102,11 +149,11 @@ export const selfBuildJudgment = (data) => {
|
||||
/**
|
||||
* 研判指令列表
|
||||
* @param {Object} params 查询参数
|
||||
* @param {number} [params.pageSize] 每页显示数量
|
||||
* @param {number} [params.pageCurrent] 页码
|
||||
* @param {string} [params.zlbt] 指令标题
|
||||
* @param {string} [params.zlnr] 指令内容
|
||||
* @param {string} [params.fqrxm] 发起人姓名
|
||||
* @param {number} params.pageSize 每页显示数量
|
||||
* @param {number} params.pageCurrent 页码
|
||||
* @param {string} params.zlbt 指令标题
|
||||
* @param {string} params.zlnr 指令内容
|
||||
* @param {string} params.fqrxm 发起人姓名
|
||||
* @returns {Promise} 请求Promise对象
|
||||
*/
|
||||
export const getJudgmentCommandList = (params) => {
|
||||
|
||||
43
src/api/sjxsgl.js
Normal file
43
src/api/sjxsgl.js
Normal file
@ -0,0 +1,43 @@
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-gsxt";
|
||||
// 新增系数
|
||||
export const sjxsglAddEntity = (data) => {
|
||||
return request({
|
||||
url: api + "/sjxsgl/addEntity",
|
||||
method: "POST",
|
||||
data
|
||||
});
|
||||
};
|
||||
// 删除系数
|
||||
export const sjxsglDeleteEntity = (data) => {
|
||||
return request({
|
||||
url: api + "/sjxsgl/deleteEntity",
|
||||
method: "DELETE",
|
||||
data
|
||||
});
|
||||
};
|
||||
|
||||
// 修改系数
|
||||
export const sjxsglEditEntity = (data) => {
|
||||
return request({
|
||||
url: api + "/sjxsgl/editEntity",
|
||||
method: "PUT",
|
||||
data
|
||||
});
|
||||
};
|
||||
// 分页查询
|
||||
export const sjxsglGetPageList = (params) => {
|
||||
return request({
|
||||
url: api + "/sjxsgl/getPageList",
|
||||
method: "GET",
|
||||
params
|
||||
});
|
||||
};
|
||||
|
||||
export const sjxsgId = (id) => {
|
||||
return request({
|
||||
url: api + `/sjxsgl/${id}`,
|
||||
method: "GET",
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
import request from "@/utils/request";
|
||||
const api = "/mosty-api/mosty-base";
|
||||
const fzapi = "/mosty-api/mosty-gsxt";
|
||||
/*
|
||||
* 登录
|
||||
* return promise 实例对象
|
||||
@ -154,3 +155,11 @@ export const deleteSysDictItem = (data) => {
|
||||
data
|
||||
});
|
||||
};
|
||||
// 方正字典
|
||||
export const fzdict = (params) => {
|
||||
return request({
|
||||
url: fzapi + "/xsaj/dict/selectList",
|
||||
method: "GET",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
@ -170,3 +170,36 @@ export const xxcjMjjfSelectPage = (params) => {
|
||||
params
|
||||
})
|
||||
}
|
||||
// 情报 续报和补充 参数: czlx 操作类型:01 续报、02 补充 ,id, ysnr
|
||||
export const addEntity = (data) => {
|
||||
return request({
|
||||
url: api + `/xxcj/bc/addEntity`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
// 转会商
|
||||
export const xxcjXxzhs = (data) => {
|
||||
return request({
|
||||
url: api + `/xxcj/xxzhs`,
|
||||
method: "post",
|
||||
data
|
||||
})
|
||||
}
|
||||
// 线索研判盯办统计
|
||||
// 线索总数
|
||||
export const xxcjQbcjSelectPage = (params) => {
|
||||
return request({
|
||||
url: api + `/qbcj/selectPage`,
|
||||
method: "get",
|
||||
params
|
||||
})
|
||||
}
|
||||
// 下发总数列表
|
||||
export const xxcjXfxsSelectPage = (params) => {
|
||||
return request({
|
||||
url: api + `/zlxx/selectPage`,
|
||||
method: "get",
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
@ -78,6 +78,13 @@ export const tbGsxtBqzhSelectList = (params) => {
|
||||
params
|
||||
})
|
||||
}
|
||||
// 组合标签详情
|
||||
export const tbGsxtBqzhId = (id) => {
|
||||
return request({
|
||||
url: api + `/tbGsxtBqzh/${id}`,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
// 身份标签
|
||||
export const yjzxSfyjSelectList = (params) => {
|
||||
return request({
|
||||
@ -210,4 +217,17 @@ export const sjzlQryp = (id) => {
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export const xsajSelectPage = (params) => {
|
||||
return request({
|
||||
url: api + `/asj/xsaj/selectPage`,
|
||||
method: "get",
|
||||
params
|
||||
})
|
||||
}
|
||||
export const xsajDictSelectList = (params) => {
|
||||
return request({
|
||||
url: api + ``,
|
||||
method: "get",
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
241
src/components/ChooseList/ChooseJf/index.vue
Normal file
241
src/components/ChooseList/ChooseJf/index.vue
Normal file
@ -0,0 +1,241 @@
|
||||
<template>
|
||||
<el-dialog :title="titleValue" width="1400px" :model-value="modelValue" append-to-body @close="closed">
|
||||
<div>
|
||||
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
|
||||
|
||||
<el-form-item label="系数名称">
|
||||
<el-input placeholder="请输入系数名称" v-model="listQuery.mc" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="计算规则">
|
||||
<el-input placeholder="请输入计算规则" v-model="listQuery.jsgz" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="success" @click="handleFilter">查询</el-button>
|
||||
<el-button type="info" @click="reset()"> 重置 </el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="tabBox" :class="props.Single ? 'tabBoxRadio' : ''" style="margin-top: 0px">
|
||||
<el-table ref="multipleUserRef" @selection-change="handleSelectionChange" :data="tableData" border
|
||||
:row-key="keyid" style="width: 100%" height="450">
|
||||
<el-table-column type="selection" width="55" :reserve-selection="true" />
|
||||
<el-table-column prop="mc" align="center" label="系数名称" />
|
||||
<el-table-column prop="sjbl" align="center" label="衰减比例" />
|
||||
<el-table-column prop="jsgz" align="center" label="计算规则" />
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="fenye" :style="{ top: tableHeight + 'px' }">
|
||||
<el-pagination class="pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange"
|
||||
:current-page="listQuery.current" :page-sizes="[10, 20, 50, 100]" :page-size="listQuery.size"
|
||||
layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="closed">取消</el-button>
|
||||
<el-button type="primary" @click="onComfirm">确认</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as rule from "@/utils/rules.js";
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { defineProps, watch, ref, onMounted, nextTick } from "vue";
|
||||
import { selectUnAccreditPage, selectUserDeptPage } from "@/api/user-manage";
|
||||
import { sjxsglGetPageList } from "@/api/sjxsgl.js";
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
},
|
||||
titleValue: {
|
||||
type: String,
|
||||
default: "选择配置"
|
||||
},
|
||||
LeaderType: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
//是否单选
|
||||
Single: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
roleIds: {
|
||||
type: Array,
|
||||
default: []
|
||||
}, url: {
|
||||
type: String,
|
||||
default: ""
|
||||
}, bh: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
chooseJfBh: {
|
||||
type: String,
|
||||
default: ""
|
||||
}
|
||||
});
|
||||
const total = ref(0);
|
||||
const listQuery = ref({
|
||||
current: 1,
|
||||
size: 20
|
||||
});
|
||||
const form = ref({});
|
||||
const tableData = ref([]);
|
||||
const emits = defineEmits(["update:modelValue", "choosedUsers"]);
|
||||
onMounted(() => {
|
||||
});
|
||||
|
||||
watch(() => props.modelValue, (val) => {
|
||||
if (val) {
|
||||
nextTick(() => {
|
||||
getListData();
|
||||
});
|
||||
}
|
||||
}, {
|
||||
immediate: true
|
||||
});
|
||||
|
||||
// 监听 roleIds 变化,实时更新选择状态
|
||||
watch(() => props.roleIds, (newVal, oldVal) => {
|
||||
console.log('roleIds变化:', newVal, oldVal);
|
||||
// 只要roleIds有变化,就尝试回显,不需要等待modelValue为true
|
||||
// 因为可能是在对话框打开后roleIds才变化
|
||||
nextTick(() => {
|
||||
multipleUser();
|
||||
});
|
||||
}, { deep: true });
|
||||
const closed = () => {
|
||||
// 清空新选择的内容
|
||||
multipleSelectionUser.value = [];
|
||||
// 取消表格中所有行的选择状态
|
||||
if (multipleUserRef.value && tableData.value && tableData.value.length > 0) {
|
||||
tableData.value.forEach(item => {
|
||||
multipleUserRef.value.toggleRowSelection(item, false);
|
||||
});
|
||||
}
|
||||
emits("update:modelValue", false);
|
||||
};
|
||||
const reset = () => {
|
||||
listQuery.value = {
|
||||
current: 1,
|
||||
size: 20,
|
||||
loginName: "",
|
||||
phone: ""
|
||||
};
|
||||
getListData();
|
||||
};
|
||||
|
||||
const keyid = (row) => {
|
||||
return row.id;
|
||||
};
|
||||
// 为用户分配角色
|
||||
const onComfirm = () => {
|
||||
const userList = multipleSelectionUser.value;
|
||||
console.log(userList);
|
||||
let promes = {
|
||||
list: userList.map(item => {
|
||||
return {
|
||||
xsid: item.id,
|
||||
mc: item.mc,
|
||||
sjbl: item.sjbl,
|
||||
}
|
||||
}),
|
||||
id: props.chooseJfBh
|
||||
}
|
||||
qcckPost(promes, `/mosty-gsxt${props.url}`).then(res => {
|
||||
ElMessage.success('操作成功');
|
||||
})
|
||||
|
||||
closed();
|
||||
};
|
||||
/**
|
||||
* pageSize 改变触发
|
||||
*/
|
||||
const handleSizeChange = (currentSize) => {
|
||||
listQuery.value.size = currentSize;
|
||||
getListData();
|
||||
};
|
||||
|
||||
/**
|
||||
* 页码改变触发
|
||||
*/
|
||||
const handleCurrentChange = (currentPage) => {
|
||||
listQuery.value.current = currentPage;
|
||||
getListData();
|
||||
};
|
||||
const getListData = () => {
|
||||
const params = listQuery.value;
|
||||
sjxsglGetPageList(params).then((res) => {
|
||||
tableData.value = res?.records;
|
||||
total.value = Number(res.total);
|
||||
// 使用 nextTick 确保表格已经渲染完成后再执行回显
|
||||
nextTick(() => {
|
||||
multipleUser();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 列表回显
|
||||
function multipleUser() {
|
||||
// 确保表格引用和数据都存在
|
||||
if (!multipleUserRef.value || !tableData.value || tableData.value.length === 0) {
|
||||
console.log('表格引用或数据不存在,无法回显');
|
||||
return;
|
||||
}
|
||||
|
||||
// 先清空之前的选择,确保选择状态的准确性
|
||||
tableData.value.forEach(item => {
|
||||
multipleUserRef.value.toggleRowSelection(item, false);
|
||||
});
|
||||
|
||||
console.log('开始回显,roleIds:', props.roleIds);
|
||||
console.log('表格数据:', tableData.value);
|
||||
|
||||
// 根据 roleIds 进行回显,确保类型一致
|
||||
tableData.value.forEach((item) => {
|
||||
const itemId = String(item.id);
|
||||
if (props.roleIds.some((id) => String(id) === itemId)) {
|
||||
console.log('回显选择:', item);
|
||||
multipleUserRef.value.toggleRowSelection(item, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const handleFilter = () => {
|
||||
listQuery.value.current = 1;
|
||||
getListData();
|
||||
};
|
||||
|
||||
const multipleUserRef = ref(null);
|
||||
const multipleSelectionUser = ref([]);
|
||||
const handleSelectionChange = (val) => {
|
||||
if (props.Single) {
|
||||
if (val.length > 1) {
|
||||
let del_row = val.shift();
|
||||
multipleUserRef.value.toggleRowSelection(del_row, false);
|
||||
}
|
||||
multipleSelectionUser.value = val;
|
||||
} else {
|
||||
multipleSelectionUser.value = val;
|
||||
}
|
||||
};
|
||||
</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;
|
||||
}
|
||||
</style>
|
||||
@ -7,10 +7,10 @@
|
||||
@close="closed"
|
||||
>
|
||||
<div>
|
||||
<div class="flex" style="margin-bottom: 10px;">
|
||||
<el-button :type="bqLb === '01' ? 'success' : 'info'" @click="qihuan('01')">标签大类</el-button>
|
||||
<el-button :type="bqLb === '02' ? 'success' : 'info'" @click="qihuan('02')"> 标签小类 </el-button>
|
||||
</div>
|
||||
<div class="flex" style="margin-bottom: 10px;">
|
||||
<el-button :type="bqLb === '01' ? 'success' : 'info'" @click="qihuan('01')">标签大类</el-button>
|
||||
<el-button :type="bqLb === '02' ? 'success' : 'info'" @click="qihuan('02')"> 标签小类 </el-button>
|
||||
</div>
|
||||
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
|
||||
<el-form-item label="标签名称">
|
||||
<el-input
|
||||
|
||||
@ -5,164 +5,184 @@
|
||||
v-model:h="element.height"
|
||||
v-model:w="element.width"
|
||||
v-model:active="element.isActive"
|
||||
:draggable="true"
|
||||
:resizable="true"
|
||||
:handles="['tl','tr','bl','br']"
|
||||
handles-type="handles"
|
||||
:active-on-hover="false"
|
||||
:prevent-deactivation="true"
|
||||
class-name-handle="drs-handle"
|
||||
class="container"
|
||||
>
|
||||
<div ref="mainContentRef" class="conference-box">
|
||||
<!-- 会议主题 -->
|
||||
<div v-show="displaySubject" class="subject">
|
||||
<h3 v-if="!editSubject" @click="editSubject = true">
|
||||
{{ displaySubject }} ({{ activeMeetingConfig?.meeting.number }})
|
||||
</h3>
|
||||
<el-input v-else v-model="subject" autofocus allow-clear @blur="updateSubject"/>
|
||||
<!-- Header Area -->
|
||||
<div class="conference-header">
|
||||
<div class="header-top">
|
||||
<div class="title-section" v-show="displaySubject">
|
||||
<h3 v-if="!editSubject" @click="editSubject = true" class="conference-title">
|
||||
{{ displaySubject }}
|
||||
</h3>
|
||||
<el-input v-else v-model="subject" autofocus allow-clear @blur="updateSubject" class="title-input"/>
|
||||
|
||||
<div class="meeting-id-tag" @click="copyMeetingNumber" v-if="activeMeetingConfig?.meeting?.number">
|
||||
<span class="id-label">会议号:</span>
|
||||
<span class="id-value">{{ activeMeetingConfig?.meeting?.number }}</span>
|
||||
<el-icon class="copy-icon"><CopyDocument /></el-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="participants-info">
|
||||
<el-icon><User /></el-icon>
|
||||
<span class="count-text">参会人员 {{ activeMeetingConfig?.members?.length || 0 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="top-box">
|
||||
<!-- 当前正在讲话 -->
|
||||
<el-row justify="space-around">
|
||||
<el-tag v-for="name in speakingMemberNames" :key="name" bordered color="green" >{{ name }}</el-tag>
|
||||
</el-row>
|
||||
<!-- Video Content Area -->
|
||||
<div class="video-content-area">
|
||||
<div class="top-box">
|
||||
<!-- 当前正在讲话 -->
|
||||
<el-row justify="space-around">
|
||||
<el-tag v-for="name in speakingMemberNames" :key="name" bordered color="green" >{{ name }}</el-tag>
|
||||
</el-row>
|
||||
<!-- 共享者 -->
|
||||
<el-tag v-if="activeMeetingConfig?.sharingMember" bordered color="orange">
|
||||
{{ activeMeetingConfig?.sharingMember?.alias}}正在共享屏幕
|
||||
</el-tag>
|
||||
</div>
|
||||
|
||||
<!-- 共享者 -->
|
||||
<el-tag v-if="activeMeetingConfig?.sharingMember" bordered color="orange">
|
||||
{{ activeMeetingConfig?.sharingMember?.alias}}正在共享屏幕
|
||||
</el-tag>
|
||||
<!-- 会议音视频 -->
|
||||
<audio id="conference_audio" ref="audioRef" :volume="80 / 100" :muted="audioOuputStatus !== 0" autoplay controls hidden />
|
||||
<video id="conference_video" ref="videoRef" autoplay playsinline :hidden="!showVideo" class="video"/>
|
||||
|
||||
<!-- 广播相关(此处借用 video 标签获取对应的流) -->
|
||||
<video id="conference_localvideo" ref="localVideoRef" autoplay playsinline :hidden="!showlocalVideo" class="video" />
|
||||
<img v-if="isMicEnable" v-show="activeMeetingConfig?.broadcast" @click="stopBroadcast" src="@/assets/images/webPuc/svgs/img_broadcast.svg" alt="" class="img_broadcast">
|
||||
<el-upload
|
||||
v-show="false"
|
||||
:show-file-list="false"
|
||||
draggable
|
||||
accept=".mp4"
|
||||
:multiple="false"
|
||||
:auto-upload="false"
|
||||
:show-remove-button="false"
|
||||
:show-cancel-button="false"
|
||||
@change="onFileChanged"
|
||||
@before-upload="beforeUpload"
|
||||
/>
|
||||
|
||||
<video id="conference_pushVideo" ref="pushVideoRef" autoplay playsinline :hidden="!showPushlVideo" class="video"/>
|
||||
<audio ref="fileAudioRef" autoplay :hidden="true" />
|
||||
|
||||
<div class="control-bar">
|
||||
<!-- 锁定 -->
|
||||
<el-button circle @click="lockConference" class="control-btn">
|
||||
<el-icon size="20px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
|
||||
<el-icon size="20px" v-else ><Unlock/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 麦克风 -->
|
||||
<el-button circle @click="setMuteMic" class="control-btn">
|
||||
<img v-if="isMicEnable" src="@/assets/images/webPuc/svgs/microphone.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/microphone_mute.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<el-popover title="选择麦克风" trigger="click" position="bottom-end">
|
||||
<template #reference>
|
||||
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
|
||||
</template>
|
||||
<MicPop @changeDevice="changeDevice" />
|
||||
</el-popover>
|
||||
|
||||
<!-- 扬声器 -->
|
||||
<el-button circle @click="setMuteEar" class="control-btn">
|
||||
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt="">
|
||||
</el-button>
|
||||
<el-popover title="选择扬声器" trigger="click" position="bottom-end">
|
||||
<template #reference>
|
||||
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
|
||||
</template>
|
||||
<!-- <AudioPop @changeDevice="changeDevice" /> -->
|
||||
</el-popover>
|
||||
|
||||
<!-- 摄像头 -->
|
||||
<el-button circle @click="setCamera" class="control-btn">
|
||||
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt="">
|
||||
</el-button>
|
||||
<el-popover title="选择摄像头" trigger="click" position="bottom-end">
|
||||
<template #reference>
|
||||
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
|
||||
</template>
|
||||
<!-- <CameraPop @changeDevice="changeDevice" /> -->
|
||||
</el-popover>
|
||||
|
||||
<!-- 屏幕共享 -->
|
||||
<el-button circle @click="setShareScreenStatus(1)" class="control-btn">
|
||||
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<!-- 结束共享 / 结束会议 (Center) -->
|
||||
<el-button v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id"
|
||||
type="danger"
|
||||
shape="round"
|
||||
status="danger"
|
||||
class="hangup-btn"
|
||||
@click="setShareScreenStatus(0)">
|
||||
结束共享
|
||||
</el-button>
|
||||
|
||||
<template v-else>
|
||||
<!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
|
||||
<el-button
|
||||
type="danger"
|
||||
shape="round"
|
||||
class="hangup-btn"
|
||||
@click="endConference">
|
||||
结束会议
|
||||
</el-button>
|
||||
</template>
|
||||
|
||||
<!-- 成员管理 -->
|
||||
<el-button circle @click="showMembers" class="control-btn">
|
||||
<el-icon color="#fff" size="20"><Auatar/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 语音激励 -->
|
||||
<el-button circle @click="setVoiceStimulation()" class="control-btn">
|
||||
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<!-- 布局 -->
|
||||
<!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> -->
|
||||
|
||||
<!-- 画面抓取-截图 -->
|
||||
<el-button circle @click="startScreenshot" class="control-btn">
|
||||
<el-icon color="#fff" size="20"><Scissor/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 视频广播 -->
|
||||
<el-button circle @click="broadcastAction" class="control-btn">
|
||||
<img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<!-- 录屏 -->
|
||||
<el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()" class="control-btn">
|
||||
<el-icon v-if="!isRecording"><Camera/></el-icon>
|
||||
<el-icon v-else style="color: red"><Videopause/></el-icon>
|
||||
</el-button>
|
||||
<el-button circle @click="toggleFullscreen" class="control-btn">
|
||||
<el-icon v-if="!isFullscreen"><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M384 192H192a64 64 0 00-64 64v192a32 32 0 1064 0V288h192a32 32 0 000-64zm384 64H576a32 32 0 100 64h192v160a32 32 0 1064 0V256a64 64 0 00-64-64zM352 768H192V608a32 32 0 10-64 0v192a64 64 0 0064 64h160a32 32 0 100-64zm544-160a32 32 0 00-32 32v128H704a32 32 0 100 64h160a64 64 0 0064-64V640a32 32 0 00-32-32z"/></svg></el-icon>
|
||||
<el-icon v-else><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M352 288a32 32 0 010-64h160a32 32 0 0132 32v160a32 32 0 11-64 0V320H352zm320 448a32 32 0 010 64H512a32 32 0 01-32-32V608a32 32 0 1164 0v128h128zM256 672a32 32 0 00-32-32H96a32 32 0 00-32 32v128a32 32 0 1064 0v-96h64a32 32 0 0032-32zm640-384a32 32 0 00-32 32v96h-64a32 32 0 100 64h128a32 32 0 0032-32V288a32 32 0 00-32-32z"/></svg></el-icon>
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 会议音视频 -->
|
||||
<audio id="conference_audio" ref="audioRef" :volume="80 / 100" :muted="audioOuputStatus !== 0" autoplay controls hidden />
|
||||
<video id="conference_video" ref="videoRef" autoplay playsinline :hidden="!showVideo" class="video"/>
|
||||
|
||||
<!-- 广播相关(此处借用 video 标签获取对应的流) -->
|
||||
<video id="conference_localvideo" ref="localVideoRef" autoplay playsinline :hidden="!showlocalVideo" class="video" />
|
||||
<img v-if="isMicEnable" v-show="activeMeetingConfig?.broadcast" @click="stopBroadcast" src="@/assets/images/webPuc/svgs/img_broadcast.svg" alt="">
|
||||
<el-upload
|
||||
v-show="false"
|
||||
:show-file-list="false"
|
||||
draggable
|
||||
accept=".mp4"
|
||||
:multiple="false"
|
||||
:auto-upload="false"
|
||||
:show-remove-button="false"
|
||||
:show-cancel-button="false"
|
||||
@change="onFileChanged"
|
||||
@before-upload="beforeUpload"
|
||||
/>
|
||||
|
||||
<video id="conference_pushVideo" ref="pushVideoRef" autoplay playsinline :hidden="!showPushlVideo" class="video"/>
|
||||
|
||||
<audio ref="fileAudioRef" autoplay :hidden="true" />
|
||||
|
||||
<el-row class="buttonContainer" justify="space-around">
|
||||
<!-- 锁定 -->
|
||||
|
||||
<el-button circle @click="lockConference">
|
||||
<el-icon size="20px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
|
||||
<el-icon size="20px" v-else ><Unlock/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 麦克风 -->
|
||||
<el-button circle @click="setMuteMic">
|
||||
<img v-if="isMicEnable" src="@/assets/images/webPuc/svgs/microphone.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/microphone_mute.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<el-popover title="选择麦克风" trigger="click" position="bottom-end">
|
||||
<template #reference>
|
||||
<el-icon style="align-self: flex-end" color="#000"><ArrowDown/></el-icon>
|
||||
</template>
|
||||
<MicPop @changeDevice="changeDevice" />
|
||||
</el-popover>
|
||||
|
||||
<!-- 扬声器 -->
|
||||
<el-button circle @click="setMuteEar">
|
||||
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt="">
|
||||
</el-button>
|
||||
<el-popover title="选择扬声器" trigger="click" position="bottom-end">
|
||||
<template #reference>
|
||||
<el-icon style="align-self: flex-end" color="#000"><ArrowDown/></el-icon>
|
||||
</template>
|
||||
<!-- <AudioPop @changeDevice="changeDevice" /> -->
|
||||
</el-popover>
|
||||
|
||||
<!-- 摄像头 -->
|
||||
<el-button circle @click="setCamera">
|
||||
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt="">
|
||||
</el-button>
|
||||
<el-popover title="选择摄像头" trigger="click" position="bottom-end">
|
||||
<template #reference>
|
||||
<el-icon style="align-self: flex-end" color="#000"><ArrowDown/></el-icon>
|
||||
</template>
|
||||
<!-- <CameraPop @changeDevice="changeDevice" /> -->
|
||||
</el-popover>
|
||||
|
||||
<!-- 屏幕共享 -->
|
||||
<el-button circle @click="setShareScreenStatus(1)">
|
||||
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<!-- 成员管理 -->
|
||||
<el-button circle @click="showMembers">
|
||||
<el-icon color="#84888E" size="20"><Auatar/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 语音激励 -->
|
||||
<el-button circle @click="setVoiceStimulation()">
|
||||
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
|
||||
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<!-- 布局 -->
|
||||
<!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> -->
|
||||
|
||||
<!-- 画面抓取-截图 -->
|
||||
<el-button circle @click="startScreenshot">
|
||||
<el-icon color="#84888E" size="20"><Scissor/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 视频广播 -->
|
||||
<el-button circle @click="broadcastAction">
|
||||
<img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt="">
|
||||
</el-button>
|
||||
|
||||
<!-- 录屏 -->
|
||||
<el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()">
|
||||
<el-icon v-if="!isRecording"><Camera/></el-icon>
|
||||
<el-icon v-else style="color: red"><Videopause/></el-icon>
|
||||
</el-button>
|
||||
|
||||
<!-- 结束共享 -->
|
||||
<el-button v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id"
|
||||
type="danger"
|
||||
shape="round"
|
||||
status="danger"
|
||||
@click="setShareScreenStatus(0)">
|
||||
结束共享
|
||||
</el-button>
|
||||
|
||||
<template v-else>
|
||||
<!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
|
||||
<el-button
|
||||
type="danger"
|
||||
shape="round"
|
||||
@click="endConference">
|
||||
结束会议
|
||||
</el-button>
|
||||
|
||||
<!-- 退出会议 -->
|
||||
<!-- <el-button
|
||||
v-else
|
||||
type="danger"
|
||||
shape="round"
|
||||
@click="hangupCall"
|
||||
>退出会议</el-button
|
||||
> -->
|
||||
</template>
|
||||
</el-row>
|
||||
|
||||
<!-- 关闭按钮 -->
|
||||
<el-button class="close" type="primary" icon="Close" circle @click="close"></el-button>
|
||||
<el-button class="close-card-btn" type="text" circle @click="close">
|
||||
<el-icon size="20"><Close /></el-icon>
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 成员管理面板 暂时未改-->
|
||||
@ -189,9 +209,9 @@ const store = useStore();
|
||||
const element = ref({
|
||||
x: 500,
|
||||
y: -600,
|
||||
width: 500,
|
||||
width: 960,
|
||||
height: 500,
|
||||
isActive: false,
|
||||
isActive: true,
|
||||
});
|
||||
const globalStore = store.state.useGlobalStore;
|
||||
// 音视频会议-会控管理模块
|
||||
@ -241,9 +261,10 @@ const speakers = ref([]);
|
||||
const selfGranted = ref(false);
|
||||
|
||||
const displaySubject = computed(() => {
|
||||
const text = globalStore.activeMeetingConfig?.subject || '';
|
||||
subject.value = text;
|
||||
return text;
|
||||
const text = globalStore.activeMeetingConfig?.subject;
|
||||
const defaultText = text && String(text).trim() ? text : '会议的标题';
|
||||
subject.value = defaultText;
|
||||
return defaultText;
|
||||
});
|
||||
|
||||
// 0=关闭,1=打开,2=无扬声器
|
||||
@ -712,6 +733,22 @@ const setAudio = (stream) => {
|
||||
};
|
||||
});
|
||||
};
|
||||
const isFullscreen = ref(false);
|
||||
const onFullscreenChange = () => {
|
||||
isFullscreen.value = !!document.fullscreenElement;
|
||||
};
|
||||
const toggleFullscreen = () => {
|
||||
const el = mainContentRef.value;
|
||||
if (!document.fullscreenElement) {
|
||||
if (el && el.requestFullscreen) {
|
||||
el.requestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 设备列表变化时
|
||||
const onDeviceListChange = (mediaDeviceInfo) => {
|
||||
@ -725,6 +762,17 @@ const setAudio = (stream) => {
|
||||
}
|
||||
};
|
||||
|
||||
const copyMeetingNumber = () => {
|
||||
const number = activeMeetingConfig.value?.meeting?.number;
|
||||
if (number) {
|
||||
navigator.clipboard.writeText(number).then(() => {
|
||||
ElMessage.success('会议号已复制');
|
||||
}).catch(() => {
|
||||
ElMessage.error('复制失败');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
onMounted(()=>{
|
||||
console.log(globalStore,'=====0000000000000');
|
||||
@ -743,6 +791,7 @@ onMounted(()=>{
|
||||
|
||||
// 初始化录屏媒体对象
|
||||
addVideoOnLoadedMetadataEvnt();
|
||||
document.addEventListener('fullscreenchange', onFullscreenChange);
|
||||
});
|
||||
|
||||
|
||||
@ -750,6 +799,7 @@ onUnmounted(() => {
|
||||
emitter.off('onMediaStream');
|
||||
emitter.off('onHangup');
|
||||
removeBroadcastVideoListener();
|
||||
document.removeEventListener('fullscreenchange', onFullscreenChange);
|
||||
});
|
||||
|
||||
</script>
|
||||
@ -759,85 +809,223 @@ onUnmounted(() => {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
margin: 2px;
|
||||
background: rgb(28,32,41);
|
||||
border: 2px dashed #e8e8e8;
|
||||
border-radius: 16px;
|
||||
background: #fff;
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 16px rgba(0,0,0,0.15);
|
||||
cursor: default;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.conference-box {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Header Styles */
|
||||
.conference-header {
|
||||
padding: 16px 20px 10px;
|
||||
background: #fff;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.header-top {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 8px;
|
||||
padding-bottom: 8px;
|
||||
border-bottom: 2px solid #c0c4cc;
|
||||
}
|
||||
|
||||
.title-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.conference-title {
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.title-input {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.meeting-id-tag {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #e6f7ff;
|
||||
color: #1890ff;
|
||||
padding: 2px 8px;
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.meeting-id-tag:hover {
|
||||
background: #bae7ff;
|
||||
}
|
||||
|
||||
.id-label {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.copy-icon {
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.participants-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #666;
|
||||
font-size: 13px;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
/* Video Area Styles */
|
||||
.video-content-area {
|
||||
flex: 1;
|
||||
position: relative;
|
||||
background: #000;
|
||||
margin: 10px;
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.video {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: scale-down;
|
||||
}
|
||||
|
||||
.buttonContainer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 96%;
|
||||
margin: 8px;
|
||||
padding: 5px 3px;
|
||||
background: #fff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.speaks {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.wave {
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.close {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.subject {
|
||||
position: absolute;
|
||||
top: -53px;
|
||||
padding: 0 5px;
|
||||
color: #ffff;
|
||||
background: #1c2029;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.subject .arco-input-wrapper {
|
||||
margin: 8px 0;
|
||||
}
|
||||
|
||||
.icon_broadcast {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.img_broadcast {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 60px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Top Box (Tags) */
|
||||
.top-box {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.top-box .arco-tag {
|
||||
margin: 5px;
|
||||
.top-box .el-tag {
|
||||
margin: 4px;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
::v-deep .el-button.is-circle{
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
/* Control Bar Styles */
|
||||
.control-bar {
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: rgba(0, 0, 0, 0.65);
|
||||
backdrop-filter: blur(10px);
|
||||
border-radius: 40px;
|
||||
padding: 8px 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
z-index: 20;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
color: #fff !important;
|
||||
width: 40px !important;
|
||||
height: 40px !important;
|
||||
padding: 0 !important;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
transition: background 0.3s;
|
||||
}
|
||||
|
||||
.control-btn:hover {
|
||||
background: rgba(255, 255, 255, 0.15) !important;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.control-btn img {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
filter: brightness(0) invert(1); /* Make black icons white */
|
||||
}
|
||||
|
||||
.control-arrow {
|
||||
margin-left: -12px;
|
||||
margin-top: 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.hangup-btn {
|
||||
background-color: #f56c6c !important;
|
||||
border-color: #f56c6c !important;
|
||||
color: #fff !important;
|
||||
height: 36px;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.hangup-btn:hover {
|
||||
background-color: #f78989 !important;
|
||||
border-color: #f78989 !important;
|
||||
}
|
||||
|
||||
/* Close Card Button */
|
||||
.close-card-btn {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
color: #999;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.close-card-btn:hover {
|
||||
color: #666;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Misc */
|
||||
.img_broadcast {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 80px; /* Adjusted to be above control bar */
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
::v-deep .el-button.is-circle {
|
||||
/* Reset element plus styles if needed */
|
||||
}
|
||||
|
||||
::v-deep .drs-handle {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: #1890ff;
|
||||
border: 2px solid #fff;
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 0 0 1px rgba(0,0,0,0.2);
|
||||
z-index: 1000;
|
||||
pointer-events: auto;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -216,7 +216,7 @@ const getLoginAccountInfo =() =>{
|
||||
const openInit = (it,type) =>{
|
||||
modleType.value = type;
|
||||
if(type == '会议'){
|
||||
// 判断是否有会议号
|
||||
//判断是否有会议号
|
||||
let into = it.number ? '确定开始会议?' : '没有找到会议,是否创建会议?'
|
||||
ElMessageBox.confirm(into,'提示',{
|
||||
confirmButtonText:'确定',
|
||||
@ -226,6 +226,7 @@ const openInit = (it,type) =>{
|
||||
// 会议号存在 ? 获取会议列表里面是否包含该条会议 : 创建会议 ;
|
||||
it.number ? fetchConferences(it) : conferenceActionSDK(it);
|
||||
}).catch(()=>{ })
|
||||
|
||||
}
|
||||
|
||||
if(['对讲机','无人机'].includes(type)){
|
||||
|
||||
@ -154,6 +154,10 @@ onMounted(() => {
|
||||
emitter.on("showSquire", (obj) => {
|
||||
mapUtil.value.zdySquire(obj);
|
||||
});
|
||||
// 展示气泡框
|
||||
emitter.on("makerPopup", (obj) => {
|
||||
mapUtil.value.makerPopup(obj);
|
||||
});
|
||||
|
||||
// 绘制图形 - 回显区域
|
||||
emitter.on("drawShape", (res) => {
|
||||
@ -288,6 +292,7 @@ onUnmounted(() => {
|
||||
emitter.off("showPoint");
|
||||
emitter.off("deletePointArea");
|
||||
emitter.off("deletePointAreaOne");
|
||||
emitter.off("makerPopup");
|
||||
emitter.off("drawShape");
|
||||
emitter.off("echoPlane");
|
||||
emitter.off("removeEara");
|
||||
|
||||
@ -167,6 +167,11 @@ onMounted(() => {
|
||||
mapUtil.value.showPoint(obj);
|
||||
});
|
||||
|
||||
// 展示气泡框
|
||||
emitter.on("makerPopup", (obj) => {
|
||||
mapUtil.value.makerPopup(obj);
|
||||
});
|
||||
|
||||
// 清除覆盖物
|
||||
emitter.on("deletePointArea", (res) => {
|
||||
// 只清除与当前地图相关的覆盖物
|
||||
@ -325,6 +330,7 @@ onUnmounted(() => {
|
||||
emitter.off("setMapCenter");
|
||||
emitter.off("addPointArea");
|
||||
emitter.off("showPoint");
|
||||
emitter.off("makerPopup");
|
||||
emitter.off("deletePointArea");
|
||||
emitter.off("deletePointAreaOne");
|
||||
emitter.off("drawShape");
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import { ElContainer } from "element-plus";
|
||||
|
||||
export function MapUtil(map) {
|
||||
let _that = this;
|
||||
@ -84,6 +85,7 @@ export function MapUtil(map) {
|
||||
el.style.width = size ? size : "25px";
|
||||
if (flag.includes('jczMap_')) el.style.width = '45px';
|
||||
if (showTitle) _that.makerShowTitle(item, [item.jd, item.wd], flag, '', offset) //展示标题
|
||||
// if (flag == 'hm') _that.makerPopup({data:item,flag:'hm_pop',type:'Custom'}) //展示气泡框
|
||||
// 确保坐标格式正确,使用对象格式传递坐标
|
||||
const marker = map.Marker(el, { lng: item.jd, lat: item.wd }, { anchor: 'bottom', offset: [0, 0] })
|
||||
el.addEventListener("click", () => {
|
||||
@ -141,24 +143,77 @@ export function MapUtil(map) {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 展示气泡框
|
||||
MapUtil.prototype.makerPopup = (val)=>{
|
||||
|
||||
let { data,flag,type = 'Dark'} = val
|
||||
// Dark Light Custom
|
||||
let marker;
|
||||
if(!_that._self[flag]) _that._self[flag] = [];
|
||||
if(type == 'Dark' || type == 'Light') {
|
||||
let list = zdyContent(flag,data);// 默认的样式
|
||||
marker = map.createPopup([data.jd,data.wd],{
|
||||
style:style, // 气泡框样式:
|
||||
data:list,
|
||||
title:data.ssbm,
|
||||
closeButton:false,
|
||||
anchor:'bottom',
|
||||
pixelOffset:[0,-50]
|
||||
})
|
||||
}else {
|
||||
marker = map.createPopup([data.jd,data.wd],{
|
||||
style:'Custom', // // 自定义样式
|
||||
attrs:{
|
||||
class:'popupCustom'
|
||||
},
|
||||
container: zdyContentHtml(flag,data),
|
||||
closeButton:false,
|
||||
anchor:'bottom',
|
||||
pixelOffset:[0,-30]
|
||||
})
|
||||
}
|
||||
_that._self[flag].push(marker)
|
||||
}
|
||||
// 弹窗自定义默认内容
|
||||
function zdyContent(flag,item){
|
||||
switch (flag) {
|
||||
case 'hm':
|
||||
return [
|
||||
{ label:'林安码线索数量',value:item.lamsx },
|
||||
{ label:'布控预警数量',value:item.bkyj },
|
||||
{ label:'红色预警数量',value:item.hsyj },
|
||||
{ label:'信息采集数量',value:item.xxcjsl },
|
||||
]
|
||||
}
|
||||
}
|
||||
// 弹窗自定义标签内容
|
||||
function zdyContentHtml(flag,item){
|
||||
let html = ''
|
||||
switch (flag) {
|
||||
case 'hm_pop':
|
||||
const list = [
|
||||
{ jb: "一级",sl:'5',ypl:'100%' },
|
||||
{ jb: "二级",sl:'5',ypl:'100%' },
|
||||
{ jb: "三级",sl:'3',ypl:'60%' },
|
||||
{ jb: "四级",sl:'0',ypl:'20%' }
|
||||
];
|
||||
html = `
|
||||
<div class="popupCustomBox">
|
||||
<div class="popupCustomTitle_title">
|
||||
<span>${item.ssbm}</span>
|
||||
<span>今日警情${item.jrzs || 0}</span>
|
||||
</div>
|
||||
<ul>
|
||||
<li class="popupCustomTitle_li"><span>级别</span> <span>数量</span> <span>研判率</span> </li>
|
||||
${item.jqjb.map(it => `<li class="popupCustomTitle_li"><span>${it.jbmc}</span> <span>${it.jrsl}</span> <span>${it.ypbl}</span></li>`).join('')}
|
||||
</ul>
|
||||
</div>
|
||||
`
|
||||
break;
|
||||
}
|
||||
return html;
|
||||
}
|
||||
|
||||
// 信息框展示
|
||||
MapUtil.prototype.makerShowTitle = (item, points, flag, text, offset) => {
|
||||
|
||||
@ -174,6 +229,7 @@ export function MapUtil(map) {
|
||||
// 设置样式
|
||||
const el = document.createElement('div');
|
||||
if (flag == 'hm') {
|
||||
textTitle = item.ssbm;
|
||||
// 直接设置元素样式属性,避免对象赋值的兼容性问题
|
||||
el.style.fontSize = '12px';
|
||||
el.style.color = '#ffffffff';
|
||||
@ -565,10 +621,6 @@ export function MapUtil(map) {
|
||||
_that._self[flag].push(line)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 回显平面- 圆 - 多边形 - 矩形
|
||||
* @param {*} type 回显形状
|
||||
@ -755,7 +807,7 @@ export function MapUtil(map) {
|
||||
// 移除边界
|
||||
|
||||
MapUtil.prototype.createBoundarys = (res) => {
|
||||
let { data, color, fillColor, borderColor, label, text, labelPosition } = res
|
||||
let { data, color, fillColor, borderColor, label, text, labelPosition, outLineWidth } = res
|
||||
if (!data) return false;
|
||||
// 使用传入的颜色参数,如果没有则使用默认值
|
||||
const fillColorValue = fillColor || 'rgba(27, 205, 211, 0.3)';
|
||||
@ -765,7 +817,7 @@ export function MapUtil(map) {
|
||||
const polygon = map.createPolygon(data, {
|
||||
color: fillColorValue,
|
||||
outLineColor: borderColorValue,
|
||||
outLineWidth: 1,
|
||||
outLineWidth: outLineWidth || 1,
|
||||
highlightColor: highlightColorValue,
|
||||
type: 'solid',
|
||||
labelOption: {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="form-item-box" :style="{ width: width }">
|
||||
<el-checkbox-group v-model="modelValue" @change="handleCheckAllChange">
|
||||
<el-checkbox-group :model-value="localValue" @change="handleCheckAllChange">
|
||||
<el-checkbox
|
||||
v-for="item in checkList"
|
||||
:key="item.value"
|
||||
@ -34,15 +34,21 @@ const props = defineProps({
|
||||
type: String
|
||||
}
|
||||
});
|
||||
|
||||
const localValue = ref(props.modelValue);
|
||||
|
||||
watch(
|
||||
() => props.modelValue,
|
||||
(val) => {
|
||||
localValue.value = val;
|
||||
console.log(val, "val");
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
|
||||
const emits = defineEmits(["update:modelValue"]);
|
||||
const handleCheckAllChange = (e) => {
|
||||
localValue.value = e;
|
||||
emits("update:modelValue", e);
|
||||
};
|
||||
</script>
|
||||
|
||||
@ -130,7 +130,7 @@ const props = defineProps({
|
||||
default: 180
|
||||
},
|
||||
tableHeight: {
|
||||
type: Number
|
||||
type: Number || String,
|
||||
},
|
||||
isScroll: {
|
||||
type: Number,
|
||||
@ -287,27 +287,56 @@ const rowcontextmenuHland = (row, column, e) => {
|
||||
};
|
||||
|
||||
const timer = ref(null);
|
||||
const isCloned = ref(false);
|
||||
const originalBodyHeight = ref(0);
|
||||
// 鼠标进入
|
||||
const clearnScroll = () => {
|
||||
clearInterval(timer.value);
|
||||
timer.value = null;
|
||||
};
|
||||
|
||||
watch(() => props.tableData, () => {
|
||||
nextTick(() => {
|
||||
if (props.isScroll) createScroll();
|
||||
})
|
||||
},{deep:true});
|
||||
|
||||
// 鼠标离开
|
||||
const createScroll = () => {
|
||||
clearnScroll();
|
||||
// 拿到table
|
||||
const tabel = multipleTableRef.value.layout.table.refs;
|
||||
// 拿到可以滚动的元素
|
||||
const tableWrapper = tabel.bodyWrapper.firstElementChild.firstElementChild;
|
||||
if (props.isScroll) {
|
||||
timer.value = setInterval(() => {
|
||||
tableWrapper.scrollTop += 1;
|
||||
//判断滚动到底部,设置为0(可视高度+距离顶部 = 整个高度)
|
||||
if ( tableWrapper.clientHeight + tableWrapper.scrollTop == tableWrapper.scrollHeight) {
|
||||
tableWrapper.scrollTop = 0;
|
||||
nextTick(() => {
|
||||
const refsPath = multipleTableRef.value?.$refs || multipleTableRef.value?.layout?.table?.refs;
|
||||
const scrollEl = refsPath?.bodyWrapper || multipleTableRef.value?.$el?.querySelector('.el-table__body-wrapper');
|
||||
const tableEl = scrollEl?.querySelector('table') || multipleTableRef.value?.$el?.querySelector('.el-table__body-wrapper table');
|
||||
const bodyEl = tableEl?.tBodies?.[0];
|
||||
if (!props.isScroll || !scrollEl || !tableEl || !bodyEl) return;
|
||||
if (!props.tableHeight) {
|
||||
const fixedH = scrollEl.clientHeight || multipleTableRef.value?.$el?.clientHeight || 0;
|
||||
if (fixedH > 0) {
|
||||
scrollEl.style.height = fixedH + 'px';
|
||||
scrollEl.style.overflowY = 'auto';
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
originalBodyHeight.value = bodyEl.offsetHeight;
|
||||
const oldClone = tableEl.querySelector('tbody[data-clone="true"]');
|
||||
if (oldClone) {
|
||||
tableEl.removeChild(oldClone);
|
||||
isCloned.value = false;
|
||||
}
|
||||
if (!isCloned.value) {
|
||||
const clone = bodyEl.cloneNode(true);
|
||||
clone.setAttribute('data-clone', 'true');
|
||||
tableEl.appendChild(clone);
|
||||
isCloned.value = true;
|
||||
}
|
||||
const target = scrollEl.firstElementChild?.firstElementChild || scrollEl;
|
||||
timer.value = setInterval(() => {
|
||||
target.scrollTop += 1;
|
||||
if (target.scrollTop >= originalBodyHeight.value) {
|
||||
target.scrollTop -= originalBodyHeight.value;
|
||||
}
|
||||
}, 20);
|
||||
});
|
||||
};
|
||||
|
||||
// 滚动-触底加载
|
||||
@ -370,4 +399,10 @@ onUnmounted(() => {
|
||||
.header-icon {
|
||||
white-space: nowrap;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
watch(() => props.isScroll, (val) => {
|
||||
nextTick(() => {
|
||||
if (val) createScroll();
|
||||
else clearnScroll();
|
||||
});
|
||||
},{immediate:true});
|
||||
|
||||
@ -3,13 +3,13 @@
|
||||
|
||||
<el-form-item v-for="(item, idx) in props.formList" :style="item.width && { width: item.width }" :prop="item.prop" :label="item.label" :label-width="item.labelWidth" :key="idx">
|
||||
<!-- input表单 input-->
|
||||
<MOSTY.Other v-if="item.type == 'input'" width="100%" clearable v-model="listQuery[item.prop]" :placeholder="`请输入${item.label}`" :disabled="item.disabled" :readonly="item.readonly" />
|
||||
<MOSTY.Other v-if="item.type == 'input'" width="100%" clearable v-model="listQuery[item.prop]" :placeholder="`请输入${item.label}`" :disabled="item.disabled" :readonly="item.readonly" @blur="inputBlur($event,item)" />
|
||||
|
||||
<el-input v-model="listQuery[item.prop]" v-else-if="item.type == 'textarea'" type="textarea" :rows="item.rows || 3" :placeholder="`请输入${item.label}`" :disabled="item.disabled" />
|
||||
<el-input v-model="listQuery[item.prop]" v-else-if="item.type == 'textarea'" type="textarea" :rows="item.rows || 3" :placeholder="`请输入${item.label}`" :disabled="item.disabled" @blur="inputBlur($event,item)"/>
|
||||
<!-- 数值 inputNumber-->
|
||||
<el-input type="number" v-model="listQuery[item.prop]" v-else-if="item.type == 'inputNumber'" :placeholder="`请输入${item.label}`" :disabled="item.disabled" />
|
||||
<el-input type="number" v-model="listQuery[item.prop]" v-else-if="item.type == 'inputNumber'" :placeholder="`请输入${item.label}`" :disabled="item.disabled" @blur="inputBlur($event,item)"/>
|
||||
<!-- 数值 number-->
|
||||
<el-input-number v-model="listQuery[item.prop]" v-else-if="item.type == 'number'" style="width: 100%" :min="item.min || 0" :max="item.max || 1000" :disabled="item.disabled" />
|
||||
<el-input-number v-model="listQuery[item.prop]" v-else-if="item.type == 'number'" :step="item.step || 1" style="width: 100%" :min="item.min || 0" :max="item.max || 1000" :disabled="item.disabled" />
|
||||
|
||||
<!--选择 select-->
|
||||
<MOSTY.Select v-else-if="item.type == 'select'" filterable :multiple="item.multiple" v-model="listQuery[item.prop]" :dictEnum="item.options" width="100%" clearable :placeholder="`请选择${item.label}`" :disabled="item.disabled" />
|
||||
@ -77,7 +77,7 @@ const props = defineProps({
|
||||
});
|
||||
const elform = ref();
|
||||
const listQuery = ref({});
|
||||
const emits = defineEmits(["update:modelValue"]);
|
||||
const emits = defineEmits(["update:modelValue", "blur"]);
|
||||
// 提交
|
||||
const submit = (resfun) => {
|
||||
elform.value.validate((valid) => {
|
||||
@ -101,7 +101,12 @@ const reset = () => {
|
||||
|
||||
// 修改这里的watch逻辑,避免无限循环
|
||||
let isUpdatingFromProps = false;
|
||||
|
||||
const inputBlur = (e,item) => {
|
||||
if(typeof item?.blur == 'function') {
|
||||
item.blur();
|
||||
}
|
||||
// emits('blur', e, item);
|
||||
}
|
||||
watch(() => listQuery.value, (newVal) => {
|
||||
if (newVal && !isUpdatingFromProps) {
|
||||
emits("update:modelValue", newVal);
|
||||
|
||||
@ -132,10 +132,13 @@
|
||||
:options="getOptions[item.prop]"
|
||||
:placeholder="item.placeholder"
|
||||
/>
|
||||
<div v-else-if="item.showType === 'defaultSlot'">
|
||||
<div v-if="item.showType === 'Slot'">
|
||||
<slot :name="item.prop"></slot>
|
||||
</div>
|
||||
<div v-if="item.showType === 'defaultSlot'">
|
||||
<slot name="defaultSlot"></slot>
|
||||
</div>
|
||||
<div v-else-if="item.showType === 'nameSlot'">
|
||||
<div v-if="item.showType === 'nameSlot'">
|
||||
<slot name="nameSlot"></slot>
|
||||
</div>
|
||||
</div>
|
||||
@ -472,8 +475,8 @@ const reset = () => {
|
||||
getArr.forEach((item) => {
|
||||
searchObj[item.prop] = item.defaultVal;
|
||||
});
|
||||
emit("reset", true);
|
||||
emit("submit", searchObj);
|
||||
emit("reset", false);
|
||||
};
|
||||
watchEffect(() => {
|
||||
loadingPage.value = true;
|
||||
|
||||
@ -8,22 +8,22 @@
|
||||
:key="index">{{ item.nodeName }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
<div> <el-button type="success" :icon="Plus" @click="newAdditions" v-if="optional"/></div>
|
||||
<div> <el-button type="success" :icon="Plus" @click="newAdditions" v-if="optional" /></div>
|
||||
</div>
|
||||
<div v-if="optional" class="container-box">
|
||||
<div v-if="optional" class="container-box">
|
||||
<!-- <div v-if="flwsNode.flwsUserNode?.role.length == 0"> -->
|
||||
<div class="row" v-for="(item, index) in nodeData" :key="index">
|
||||
<MOSTY.Department filterable v-model="item.deptId" width="100%"
|
||||
@getDepValue="(obj) => changePostList(index, obj)" clearable placeholder="请选择所属部门" />
|
||||
<el-select class="select-user" v-model="item.userId" filterable placeholder="选择审批人"
|
||||
@change="changeUser(index)">
|
||||
<el-option v-for="item in item.listData" :key="item.id" :label="item.userName" :value="item.id" />
|
||||
</el-select>
|
||||
<div>
|
||||
<el-button type="danger" @click="newDelitions(index)">删除</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
<div class="row" v-for="(item, index) in nodeData" :key="index">
|
||||
<MOSTY.Department filterable v-model="item.deptId" width="100%"
|
||||
@getDepValue="(obj) => changePostList(index, obj)" clearable placeholder="请选择所属部门" />
|
||||
<el-select class="select-user" v-model="item.userId" filterable placeholder="选择审批人"
|
||||
@change="changeUser(index)">
|
||||
<el-option v-for="item in item.listData" :key="item.id" :label="item.userName" :value="item.id" />
|
||||
</el-select>
|
||||
<div>
|
||||
<el-button type="danger" @click="newDelitions(index)">删除</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
<div class="container-box" v-else>
|
||||
<div v-for="(item, index) in userList" :key="item.id">
|
||||
@ -59,7 +59,7 @@
|
||||
<div v-if="showNode && showModel">
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="close">取消</el-button>
|
||||
@ -246,7 +246,7 @@ const qcckPostList = async () => {
|
||||
const item = checkListData.value[i].userList[j]
|
||||
if (item.checkList && item.checkList.length > 0) {
|
||||
data[checkListData.value[i].nodeId] = {
|
||||
users: transformData(checkListData.value[i])
|
||||
users: transformData(checkListData.value[i])
|
||||
}
|
||||
} else {
|
||||
listError.push(checkListData.value[i].nodeName)
|
||||
@ -341,7 +341,7 @@ const queryModel = async () => {
|
||||
)
|
||||
const orgId = getItem('deptId')[0].fzOrgId
|
||||
if (!orgId) {
|
||||
proxy.$message({ type: "error", message: "查询模型失败,请重试" })
|
||||
proxy.$message({ type: "error", message: "查询模型失败,请重试" })
|
||||
return
|
||||
}
|
||||
if (eventNode) {
|
||||
@ -358,7 +358,7 @@ const queryModel = async () => {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
const optional=ref(false)
|
||||
const optional = ref(false)
|
||||
// 处理事件节点
|
||||
const handleEventNode = async (eventNode, orgId) => {
|
||||
const nodeExtension = JSON.parse(eventNode.nodeExtension)
|
||||
@ -376,13 +376,13 @@ const handleEventNode = async (eventNode, orgId) => {
|
||||
|
||||
orgData = await queryListByEntity({ id: orgId })
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'parent') {
|
||||
console.log(2);
|
||||
console.log(2);
|
||||
orgData = await querysingleByEntity({ id: orgId })
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'parents') {
|
||||
console.log(3);
|
||||
console.log(3);
|
||||
orgData = await queryUporgsByEntity({ id: orgId })
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'appoint') {
|
||||
console.log(4);
|
||||
console.log(4);
|
||||
// orgData = await queryUporgsByEntity({ orgcode: orgId })
|
||||
console.log(orgData);
|
||||
|
||||
@ -405,7 +405,7 @@ const handleEventNode = async (eventNode, orgId) => {
|
||||
userList: userRes.rows[0]
|
||||
}]
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'optional') {
|
||||
optional.value=true
|
||||
optional.value = true
|
||||
} else {
|
||||
|
||||
const parentids = orgData.rows.map(item => item.parentid)
|
||||
@ -514,37 +514,37 @@ const handleNormalNodes = async (resData, sequenceNode, orgId) => {
|
||||
})
|
||||
}
|
||||
function filterUsersWithOrgInfo(orgsData, checkList) {
|
||||
const result = [];
|
||||
|
||||
// 如果没有数据或检查列表为空,返回空数组
|
||||
if (!orgsData || !Array.isArray(orgsData) || !checkList || checkList.length === 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// 将checkList转换为Set以提高查找效率
|
||||
const checkSet = new Set(checkList);
|
||||
|
||||
// 遍历所有组织
|
||||
for (const org of orgsData) {
|
||||
// 检查组织是否有用户数据
|
||||
if (org.users && Array.isArray(org.users)) {
|
||||
// 筛选匹配的用户
|
||||
for (const user of org.users) {
|
||||
if (checkSet.has(user.userid)) {
|
||||
// 创建带组织信息的用户对象
|
||||
const userWithOrgInfo = {
|
||||
...user, // 保留所有原始用户属性
|
||||
orgCode: org.code, // 添加组织code
|
||||
orgName: org.name, // 添加组织name
|
||||
orgId: org.id // 添加组织id
|
||||
};
|
||||
result.push(userWithOrgInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const result = [];
|
||||
|
||||
// 如果没有数据或检查列表为空,返回空数组
|
||||
if (!orgsData || !Array.isArray(orgsData) || !checkList || checkList.length === 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// 将checkList转换为Set以提高查找效率
|
||||
const checkSet = new Set(checkList);
|
||||
|
||||
// 遍历所有组织
|
||||
for (const org of orgsData) {
|
||||
// 检查组织是否有用户数据
|
||||
if (org.users && Array.isArray(org.users)) {
|
||||
// 筛选匹配的用户
|
||||
for (const user of org.users) {
|
||||
if (checkSet.has(user.userid)) {
|
||||
// 创建带组织信息的用户对象
|
||||
const userWithOrgInfo = {
|
||||
...user, // 保留所有原始用户属性
|
||||
orgCode: org.code, // 添加组织code
|
||||
orgName: org.name, // 添加组织name
|
||||
orgId: org.id // 添加组织id
|
||||
};
|
||||
result.push(userWithOrgInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
//发消息
|
||||
const sendMessage = (gzlid) => {
|
||||
@ -552,11 +552,11 @@ const sendMessage = (gzlid) => {
|
||||
let userList = []
|
||||
for (let i = 0; i < checkListData.value.length; i++) {
|
||||
letDataCheck = [...letDataCheck, ...checkListData.value[i].checkList]
|
||||
userList.push(checkListData.value[i].userList)
|
||||
userList.push(checkListData.value[i].userList)
|
||||
}
|
||||
|
||||
const bkshrSfzh = filterUsersWithOrgInfo(userList, letDataCheck).map(item => {
|
||||
return {
|
||||
return {
|
||||
bkshrXm: item.username,
|
||||
bkshrSfzh: item.userid,
|
||||
bkshrSsbmmc: item.orgName,
|
||||
@ -586,6 +586,11 @@ const sendMessage = (gzlid) => {
|
||||
console.log(res);
|
||||
})
|
||||
break;
|
||||
case 'YPSH':
|
||||
qcckPost(promes, '/mosty-gsxt/ypbg/sjzl/updateBkgzl').then(res => {
|
||||
console.log(res);
|
||||
})
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -603,7 +608,7 @@ const close = () => {
|
||||
orgData: {},
|
||||
}
|
||||
]
|
||||
optional.value=false
|
||||
optional.value = false
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -91,7 +91,6 @@ const qcckGetCount = () => {
|
||||
} else {
|
||||
setCookie('JSRSSIONID', res.substring(10, res.length))
|
||||
}
|
||||
|
||||
qcckGetList()
|
||||
})
|
||||
} else { qcckGetList() }
|
||||
|
||||
147
src/components/inputCom/inputUser.vue
Normal file
147
src/components/inputCom/inputUser.vue
Normal file
@ -0,0 +1,147 @@
|
||||
<template>
|
||||
<el-input :style="{ width: inputWidth }" class="mosty-select" readonly v-model="inputName" :disabled="props.disabled" clearable
|
||||
@click="xgfClick" @clear="clear">
|
||||
<!-- <template #append>
|
||||
<el-button title="" class='cursor' :disabled="props.disabled" @click="xgfClick">选择</el-button>
|
||||
</template> -->
|
||||
</el-input>
|
||||
<!-- 相关方 -->
|
||||
<ChooseUser id="most-user" v-model="isShowDialog" :Single="props.Single" :deptId="props.deptId" :data="userData"
|
||||
@choosedUsers="userChange"></ChooseUser>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
|
||||
import { ref, defineProps, defineEmits, onMounted, watch, defineExpose, computed } from 'vue'
|
||||
const props = defineProps({
|
||||
dataList: {
|
||||
type: Array,
|
||||
default: () => ([])
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// relatedid: {
|
||||
// type: String,
|
||||
// default: ''
|
||||
// },
|
||||
/** 是否单选 默认多选 */
|
||||
Single: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
ids: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
cName: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
stlyrylx: {
|
||||
type: String,
|
||||
default: '01'
|
||||
},
|
||||
/** 父级部门 (即只选该部门下的单位),
|
||||
* 如果没有"deptId"会只能选当前登录人的部门,(但是:登录人是安全科可以选所有部门) */
|
||||
deptId: {
|
||||
type: String,
|
||||
},
|
||||
// xgflx: {
|
||||
// type: String,
|
||||
// default: '09,10,15'
|
||||
// },
|
||||
/** 输入框宽度 */
|
||||
width: [String, Number]
|
||||
})
|
||||
const emit = defineEmits(['change', 'update:ids', 'update:cName', 'clear'])
|
||||
|
||||
const isShowDialog = ref(false)
|
||||
const xgfMan = ref('')
|
||||
const xgfRyId = ref('')
|
||||
const inputName = ref('')
|
||||
const inputWidth = computed(() => {
|
||||
if (props.width) {
|
||||
if (typeof props.width === 'string') {
|
||||
if (props.width.includes('px')) return props.width
|
||||
if (!isNaN(Number(props.width))) return props.width + 'px'
|
||||
return props.width
|
||||
} else if (typeof props.width === 'number') {
|
||||
return `${props.width}px`
|
||||
}
|
||||
}
|
||||
})
|
||||
const userChange = (val) => {
|
||||
val = Array.isArray(val) ? val : []
|
||||
val = val.filter(item => {
|
||||
return !!item
|
||||
})
|
||||
const cName = val.map(item => {
|
||||
// if (item.mobile) {
|
||||
// return item.userName + '(' + item.mobile + ')'
|
||||
// } else {
|
||||
// }
|
||||
return item.userName
|
||||
}).toString();
|
||||
const ids = val.map(item => {
|
||||
return item.id
|
||||
}).toString();
|
||||
emit('update:ids', ids || '')
|
||||
emit('update:cName', cName || '')
|
||||
emit('change', val || {})
|
||||
}
|
||||
|
||||
const xgfClick = () => {
|
||||
if (props.disabled) return
|
||||
isShowDialog.value = true
|
||||
}
|
||||
const clear = () => {
|
||||
// xgfMan.value = ''
|
||||
// xgfRyId.value = ''
|
||||
emit('update:ids', '')
|
||||
emit('update:cName', '')
|
||||
emit('change', {})
|
||||
}
|
||||
const closeDialog = (val) => {
|
||||
isShowDialog.value = val
|
||||
}
|
||||
// 数组回显
|
||||
const userData = computed(() => {
|
||||
if (!props.ids || !props.ids.length) return []
|
||||
if (props.Single) return props.ids
|
||||
if (typeof props.ids === 'string') return props.ids.split(',')
|
||||
return []
|
||||
})
|
||||
// input回显
|
||||
watch(() => props.cName, (val) => {
|
||||
|
||||
inputName.value = val
|
||||
}, { immediate: true })
|
||||
onMounted(() => {
|
||||
// console.log('2332===', props.xgflx);
|
||||
});
|
||||
defineExpose({
|
||||
clear
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.mosty-select {
|
||||
width: 374px;
|
||||
}
|
||||
|
||||
::v-deep .el-form {
|
||||
margin-top: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
// ::v-deep #xgfandzzjgry .el-button + .el-button{
|
||||
// margin-left: 10px;
|
||||
// }</style>
|
||||
::v-depp .treeBox {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
<style></style>
|
||||
@ -14,7 +14,7 @@
|
||||
|
||||
<script setup>
|
||||
import { reactive, ref, onMounted, watch } from "vue";
|
||||
import { sendFqzl, ZdrfjSendFqzl ,qbcjSendFqzl} from '@/api/commit'
|
||||
import { sendFqzl, ZdrfjSendFqzl ,qbcjSendFqzl, wshsSendFqzl} from '@/api/commit'
|
||||
import { getItem } from '@/utils/storage'
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
|
||||
@ -86,6 +86,8 @@ const getsendFqzl = () => {
|
||||
break;
|
||||
case 'qbcj':
|
||||
res = await qbcjSendFqzl(promes)
|
||||
case 'meeting': // 网上会议室
|
||||
res = await wshsSendFqzl(promes)
|
||||
break;
|
||||
}
|
||||
const str = JSON.parse(res)
|
||||
|
||||
@ -52,13 +52,14 @@ import installFilter from "@/filters";
|
||||
import mitt from "mitt";
|
||||
|
||||
import { resetForm } from "@/utils/validate";
|
||||
import { getDict, setCascader } from '@/utils/dict';
|
||||
import { getDict, setCascader, getFzDict } from '@/utils/dict';
|
||||
import axios from "axios";
|
||||
// import fzui from 'fzui-fengqun-vue'
|
||||
|
||||
//挂载全局方法
|
||||
app.config.globalProperties.resetForm = resetForm;
|
||||
app.config.globalProperties.$dict = getDict; //字典公共函数
|
||||
app.config.globalProperties.$fzdict = getFzDict; //字典公共函数
|
||||
app.config.globalProperties.$message = ELMessage; //element提示组件
|
||||
app.config.globalProperties.$set = setCascader; //设置级联选择器回显
|
||||
app.config.globalProperties.mittBus = new mitt(); //配置事件总线
|
||||
|
||||
@ -117,3 +117,4 @@ export function IdCard(IdCard, type) {
|
||||
}
|
||||
return user
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,9 @@
|
||||
const url = "ws://80.155.0.82:8006/mosty-api/mosty-websocket/socket/"; //线上
|
||||
// let url = "ws://80.155.0.82:8006/mosty-api/mosty-websocket/socket/"; //线上
|
||||
let url = "ws://155.240.22.30:2109/mosty-api/mosty-websocket/socket/"; //线上
|
||||
|
||||
if(process.env.NODE_ENV === 'development') {
|
||||
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地
|
||||
}
|
||||
import {
|
||||
getItem
|
||||
} from "@/utils/storage";
|
||||
|
||||
@ -54,6 +54,12 @@ export const publicRoutes = [
|
||||
name: "deploymentApproval",
|
||||
component: () => import("@/views/backOfficeSystem/ApprovalInformation/deploycontrol/deploymentApproval.vue"),
|
||||
},
|
||||
// 布控审核信息
|
||||
{
|
||||
path: "/information",
|
||||
name: "information",
|
||||
component: () => import("@/views/backOfficeSystem/JudgmentHome/internalAuditor/information.vue"),
|
||||
},
|
||||
// 线索
|
||||
{
|
||||
path: "/clueVerification",
|
||||
@ -136,12 +142,18 @@ export const publicRoutes = [
|
||||
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/index"),
|
||||
// meta: { title: "预警中心大屏", icon: "article" },
|
||||
// },
|
||||
// {
|
||||
// path: "/warningBk",
|
||||
// name: "warningBk",
|
||||
// meta: { title: "布控预警", icon: "article" },
|
||||
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"),
|
||||
// },
|
||||
// {
|
||||
// path: "/warningBk",
|
||||
// name: "warningBk",
|
||||
// meta: { title: "布控预警", icon: "article" },
|
||||
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"),
|
||||
// },
|
||||
{
|
||||
path: "/fouColorWarning",
|
||||
name: "fouColorWarning",
|
||||
meta: { title: "预警数据整合", icon: "article" },
|
||||
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
|
||||
},
|
||||
|
||||
{
|
||||
path: "/identityWarning",
|
||||
@ -190,12 +202,18 @@ export const publicRoutes = [
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/fouColorWarning",
|
||||
// name: "fouColorWarning",
|
||||
// meta: { title: "四色预警", icon: "article" },
|
||||
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
|
||||
// },
|
||||
{
|
||||
path: "/controlWarning",
|
||||
name: "controlWarning",
|
||||
meta: { title: "布控预警", icon: "article" },
|
||||
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index"),
|
||||
},
|
||||
// {
|
||||
// path: "/fouColorWarning",
|
||||
// name: "fouColorWarning",
|
||||
// meta: { title: "四色预警", icon: "article" },
|
||||
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
|
||||
// },
|
||||
{
|
||||
path: "/scoreRanking",
|
||||
name: "scoreRanking",
|
||||
@ -212,155 +230,7 @@ export const publicRoutes = [
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
path: "/dataApplication",
|
||||
name: "dataApplication",
|
||||
meta: { title: "数据应用", icon: "article" },
|
||||
children: [
|
||||
{
|
||||
path: "/IdentityManage",
|
||||
name: "IdentityManage",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/IdentityManage/index"
|
||||
),
|
||||
meta: {
|
||||
title: "身份标签管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/BehaviorLabels",
|
||||
name: "BehaviorLabels",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/BehaviorLabels/index"
|
||||
),
|
||||
meta: {
|
||||
title: "行为标签管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/tagManage",
|
||||
name: "tagManage",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/tagManage/index"
|
||||
),
|
||||
meta: {
|
||||
title: "标签组合管理",
|
||||
icon: "article"
|
||||
}
|
||||
}, {
|
||||
path: "/tsypHome",
|
||||
name: "tsypHome",
|
||||
component: () => import("@/views/backOfficeSystem/JudgmentHome/tsypHome/index"),
|
||||
meta: {
|
||||
title: "模型管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/RlStatisticalAnalysis",
|
||||
name: "RlStatisticalAnalysis",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/HumanIntelligence/RlStatisticalAnalysis/index"
|
||||
),
|
||||
meta: {
|
||||
title: "上报统计分析",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: "/TaskScheduling",
|
||||
name: "TaskScheduling",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/HumanIntelligence/TaskScheduling/index"
|
||||
),
|
||||
meta: {
|
||||
title: "上报任务调度",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/ConstructionManagement",
|
||||
name: "ConstructionManagement",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/HumanIntelligence/ConstructionManagement/index"
|
||||
),
|
||||
meta: {
|
||||
title: "力量建设管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/JobAppraisal",
|
||||
name: "JobAppraisal",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
|
||||
meta: {
|
||||
title: "工作考核",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/fileTransfer",
|
||||
name: "fileTransfer",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileTransfer/index"),
|
||||
meta: {
|
||||
title: "文件中转",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/fileOrientation",
|
||||
name: "fileOrientation",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileOrientation/index"),
|
||||
meta: {
|
||||
title: "文件定向传输",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/ssemanticAnalysis",
|
||||
name: "semanticAnalysis",
|
||||
component: () => import("@/views/backOfficeSystem/SemanticAnalysis/index.vue"),
|
||||
meta: {
|
||||
title: "语义分析",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/StatisticalAnalysis",
|
||||
name: "StatisticalAnalysis",
|
||||
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/StatisticalAnalysis/index"),
|
||||
meta: {
|
||||
title: "情报统计分析",
|
||||
icon: "article"
|
||||
}
|
||||
}, {
|
||||
path: "/InstructionInformation",
|
||||
name: "InstructionInformation",
|
||||
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/InstructionInformation/index"),
|
||||
meta: {
|
||||
title: "情报指令",
|
||||
icon: "article"
|
||||
}
|
||||
}, {
|
||||
path: "/RecordsOperations",
|
||||
name: "RecordsOperations",
|
||||
component: () => import("@/views/backOfficeSystem/ResearchJudgment/RecordsOperations/index"),
|
||||
meta: {
|
||||
title: "操作记录",
|
||||
icon: "article"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: "/IntelligentControl",
|
||||
name: "IntelligentControl",
|
||||
@ -448,29 +318,47 @@ export const publicRoutes = [
|
||||
path: "/socialInformationCrculated",
|
||||
name: "changeTheClue",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/FollowLeads/index"),
|
||||
meta: { title: "转线索", icon: "article" },
|
||||
meta: { title: "转线索列表", icon: "article" },
|
||||
},
|
||||
{
|
||||
path: "/socialInformationCrculatec",
|
||||
name: "recombinantSynthesis",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/ConversionSynthesis/index"),
|
||||
meta: { title: "转合成", icon: "article" },
|
||||
meta: { title: "转合成列表", icon: "article" },
|
||||
},
|
||||
// {
|
||||
// path: "/CollectPoints",
|
||||
// name: "CollectPoints",
|
||||
// component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectPoints/index"),
|
||||
// meta: {
|
||||
// title: "采集积分",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
{
|
||||
path: "/CollectPoints",
|
||||
name: "CollectPoints",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectPoints/index"),
|
||||
path: "/transferConsultationList",
|
||||
name: "transferConsultationList",
|
||||
component: () => import("@/views/backOfficeSystem/transferConsultationList/index.vue"),
|
||||
meta: {
|
||||
title: "采集积分",
|
||||
title: "转会商列表",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/policeReport",
|
||||
name: "policeReport",
|
||||
component: () => import("@/views/backOfficeSystem/policeReport/index.vue"),
|
||||
path: "/supplementReportList",
|
||||
name: "supplementReportList",
|
||||
component: () => import("@/views/backOfficeSystem/supplementReportList/index.vue"),
|
||||
meta: {
|
||||
title: "警情管理",
|
||||
title: "补充/续报列表",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/integralList",
|
||||
name: "integralList",
|
||||
component: () => import("@/views/backOfficeSystem/integralList/index.vue"),
|
||||
meta: {
|
||||
title: "积分列表",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
@ -518,6 +406,14 @@ export const publicRoutes = [
|
||||
title: "线索管理",
|
||||
icon: "article"
|
||||
}
|
||||
}, {
|
||||
path: "/InstructionInformation",
|
||||
name: "InstructionInformation",
|
||||
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/InstructionInformation/index"),
|
||||
meta: {
|
||||
title: "线索下发管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/InformationFlows",
|
||||
@ -586,6 +482,15 @@ export const publicRoutes = [
|
||||
icon: "article"
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: "/policeReport",
|
||||
name: "policeReport",
|
||||
component: () => import("@/views/backOfficeSystem/policeReport/index.vue"),
|
||||
meta: {
|
||||
title: "警情管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/ResearchHome",
|
||||
name: "ResearchHome",
|
||||
@ -595,7 +500,7 @@ export const publicRoutes = [
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
{
|
||||
path: "/dataReduction",
|
||||
name: "dataReduction",
|
||||
component: () => import("@/views/backOfficeSystem/JudgmentHome/dataReduction/index"),
|
||||
@ -604,15 +509,15 @@ export const publicRoutes = [
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/situationHome",
|
||||
// name: "situationHome",
|
||||
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
|
||||
// meta: {
|
||||
// title: "战略研判",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// path: "/situationHome",
|
||||
// name: "situationHome",
|
||||
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
|
||||
// meta: {
|
||||
// title: "战略研判",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
// 后面写的研判
|
||||
{
|
||||
path: "/tacticalResearch",
|
||||
@ -641,7 +546,15 @@ export const publicRoutes = [
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: "/internalAuditor",
|
||||
name: "internalAuditor",
|
||||
component: () => import("@/views/backOfficeSystem/JudgmentHome/internalAuditor/index.vue"),
|
||||
meta: {
|
||||
title: "内部审核人员",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/analysisReport",
|
||||
// name: "AnalysisReport",
|
||||
@ -727,6 +640,124 @@ export const publicRoutes = [
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
path: "/dataApplication",
|
||||
name: "dataApplication",
|
||||
meta: { title: "数据应用", icon: "article" },
|
||||
children: [
|
||||
{
|
||||
path: "/IntegralCoefficient",
|
||||
name: "IntegralCoefficient",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/IntegralCoefficient/index"
|
||||
),
|
||||
meta: {
|
||||
title: "积分系数配置",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: "/IdentityManage",
|
||||
name: "IdentityManage",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/IdentityManage/index"
|
||||
),
|
||||
meta: {
|
||||
title: "身份标签管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/BehaviorLabels",
|
||||
name: "BehaviorLabels",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/BehaviorLabels/index"
|
||||
),
|
||||
meta: {
|
||||
title: "行为标签管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/tagManage",
|
||||
name: "tagManage",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/fourColorManage/tagManage/index"
|
||||
),
|
||||
meta: {
|
||||
title: "标签组合管理",
|
||||
icon: "article"
|
||||
}
|
||||
}, {
|
||||
path: "/tsypHome",
|
||||
name: "tsypHome",
|
||||
component: () => import("@/views/backOfficeSystem/JudgmentHome/tsypHome/index"),
|
||||
meta: {
|
||||
title: "模型管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: "/JobAppraisal",
|
||||
name: "JobAppraisal",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
|
||||
meta: {
|
||||
title: "工作考核",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/fileTransfer",
|
||||
name: "fileTransfer",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileTransfer/index"),
|
||||
meta: {
|
||||
title: "文件中转",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/fileOrientation",
|
||||
name: "fileOrientation",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileOrientation/index"),
|
||||
meta: {
|
||||
title: "文件定向传输",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/ssemanticAnalysis",
|
||||
name: "semanticAnalysis",
|
||||
component: () => import("@/views/backOfficeSystem/SemanticAnalysis/index.vue"),
|
||||
meta: {
|
||||
title: "语义分析",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/StatisticalAnalysis",
|
||||
name: "StatisticalAnalysis",
|
||||
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/StatisticalAnalysis/index"),
|
||||
meta: {
|
||||
title: "情报统计分析",
|
||||
icon: "article"
|
||||
}
|
||||
}, {
|
||||
path: "/RecordsOperations",
|
||||
name: "RecordsOperations",
|
||||
component: () => import("@/views/backOfficeSystem/ResearchJudgment/RecordsOperations/index"),
|
||||
meta: {
|
||||
title: "操作记录",
|
||||
icon: "article"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
// {
|
||||
// path: "/BasicManagement",
|
||||
// name: "BasicManagement",
|
||||
@ -759,15 +790,7 @@ export const publicRoutes = [
|
||||
// // }
|
||||
// // },
|
||||
|
||||
// // {
|
||||
// // path: "/policeReport",
|
||||
// // name: "policeReport",
|
||||
// // component: () => import("@/views/backOfficeSystem/policeReport/index.vue"),
|
||||
// // meta: {
|
||||
// // title: "警情管理",
|
||||
// // icon: "article"
|
||||
// // }
|
||||
// // },
|
||||
|
||||
|
||||
// ]
|
||||
// },
|
||||
@ -807,120 +830,120 @@ export const publicRoutes = [
|
||||
},
|
||||
{
|
||||
path: "/systemConfig",
|
||||
component: layout,
|
||||
// component: layout,
|
||||
name: "systemConfigModel",
|
||||
redirect: "/dict/index",
|
||||
// redirect: "/dict/index",
|
||||
meta: {
|
||||
title: "系统管理",
|
||||
icon: "article"
|
||||
title: "系统管理",
|
||||
icon: "article"
|
||||
},
|
||||
children: [
|
||||
{
|
||||
{
|
||||
path: "/user/department-ist",
|
||||
name: "departmentList",
|
||||
component: () => import("@/views/backOfficeSystem/systemConfig/department-list/index"),
|
||||
meta: {
|
||||
title: "部门管理",
|
||||
icon: "article-ranking"
|
||||
title: "部门管理",
|
||||
icon: "article-ranking"
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
path: "/user/userList",
|
||||
name: "userList",
|
||||
component: () =>
|
||||
import("@/views/backOfficeSystem/systemConfig/user-list/index"),
|
||||
import("@/views/backOfficeSystem/systemConfig/user-list/index"),
|
||||
meta: {
|
||||
title: "用户管理",
|
||||
icon: "article-ranking"
|
||||
title: "用户管理",
|
||||
icon: "article-ranking"
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
path: "/user/role",
|
||||
name: "userRoleIndex",
|
||||
component: () =>
|
||||
import("@/views/backOfficeSystem/systemConfig/role-list/index"),
|
||||
import("@/views/backOfficeSystem/systemConfig/role-list/index"),
|
||||
meta: {
|
||||
title: "角色列表",
|
||||
icon: "article-ranking"
|
||||
title: "角色列表",
|
||||
icon: "article-ranking"
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
path: "/user/menuList",
|
||||
name: "menuList",
|
||||
component: () =>
|
||||
import("@/views/backOfficeSystem/systemConfig/menu-list/index"),
|
||||
import("@/views/backOfficeSystem/systemConfig/menu-list/index"),
|
||||
meta: {
|
||||
title: "菜单管理",
|
||||
icon: "article-ranking"
|
||||
title: "菜单管理",
|
||||
icon: "article-ranking"
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
path: "/dict/detail",
|
||||
name: "dictDetail",
|
||||
component: () =>
|
||||
import("@/views/backOfficeSystem/systemConfig/dict/detail"),
|
||||
import("@/views/backOfficeSystem/systemConfig/dict/detail"),
|
||||
meta: {
|
||||
title: "字典数据"
|
||||
title: "字典数据"
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
path: "/dict/index",
|
||||
name: "dictIndex",
|
||||
component: () =>
|
||||
import("@/views/backOfficeSystem/systemConfig/dict/index"),
|
||||
import("@/views/backOfficeSystem/systemConfig/dict/index"),
|
||||
meta: {
|
||||
title: "字典列表",
|
||||
icon: "article-ranking"
|
||||
title: "字典列表",
|
||||
icon: "article-ranking"
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
path: "/user/deptAllocationUser/:id",
|
||||
name: "deptAllocationUser",
|
||||
component: () =>
|
||||
import(
|
||||
import(
|
||||
"@/views/backOfficeSystem/systemConfig/department-list/deptAllocationUser"
|
||||
),
|
||||
),
|
||||
meta: {
|
||||
title: "管理用户"
|
||||
title: "管理用户"
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
path: "/user/allocationUser/:id",
|
||||
name: "allocationUser",
|
||||
component: () =>
|
||||
import(
|
||||
import(
|
||||
"@/views/backOfficeSystem/systemConfig/role-list/allocationUser"
|
||||
),
|
||||
),
|
||||
meta: {
|
||||
title: "分配用户"
|
||||
title: "分配用户"
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
path: "/user/systemConfig",
|
||||
name: "systemConfig",
|
||||
component: () =>
|
||||
import(
|
||||
import(
|
||||
"@/views/backOfficeSystem/systemConfig/system-config-list/index"
|
||||
),
|
||||
),
|
||||
meta: {
|
||||
title: "系统配置",
|
||||
icon: "article-ranking"
|
||||
title: "系统配置",
|
||||
icon: "article-ranking"
|
||||
}
|
||||
}, {
|
||||
}, {
|
||||
path: "/calendar",
|
||||
name: "calendar",
|
||||
component: () => import("@/views/backOfficeSystem/calendar/index.vue"),
|
||||
meta: {
|
||||
title: "敏感节点",
|
||||
icon: "article"
|
||||
title: "敏感节点",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
},
|
||||
]
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "/rests",
|
||||
name: "rests",
|
||||
@ -934,31 +957,62 @@ export const publicRoutes = [
|
||||
name: "CollectCrculate",
|
||||
component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectCrculate/index"),
|
||||
meta: { title: "情报采集", icon: "article" },
|
||||
}, {
|
||||
path: "/RlStatisticalAnalysis",
|
||||
name: "RlStatisticalAnalysis",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/HumanIntelligence/RlStatisticalAnalysis/index"
|
||||
),
|
||||
meta: {
|
||||
title: "上报统计分析",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: "/TaskScheduling",
|
||||
name: "TaskScheduling",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/HumanIntelligence/TaskScheduling/index"
|
||||
),
|
||||
meta: {
|
||||
title: "上报任务调度",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/fouColorWarning",
|
||||
name: "fouColorWarning",
|
||||
meta: { title: "四色预警", icon: "article" },
|
||||
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
|
||||
path: "/ConstructionManagement",
|
||||
name: "ConstructionManagement",
|
||||
component: () =>
|
||||
import(
|
||||
"@/views/backOfficeSystem/HumanIntelligence/ConstructionManagement/index"
|
||||
),
|
||||
meta: {
|
||||
title: "力量建设管理",
|
||||
icon: "article"
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/ResearchHome",
|
||||
// name: "ResearchHome",
|
||||
// component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
|
||||
// meta: {
|
||||
// title: "战术研判",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// path: "/situationHome",
|
||||
// name: "situationHome",
|
||||
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
|
||||
// meta: {
|
||||
// title: "战略研判",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
|
||||
// {
|
||||
// path: "/ResearchHome",
|
||||
// name: "ResearchHome",
|
||||
// component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
|
||||
// meta: {
|
||||
// title: "战术研判",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
// {
|
||||
// path: "/situationHome",
|
||||
// name: "situationHome",
|
||||
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
|
||||
// meta: {
|
||||
// title: "战略研判",
|
||||
// icon: "article"
|
||||
// }
|
||||
// },
|
||||
]
|
||||
},
|
||||
]
|
||||
|
||||
@ -88,7 +88,6 @@ export default {
|
||||
return new Promise((resolve, reject) => {
|
||||
login({ userName, password: Base64.encode(password), kaptcha }).then((data) => {
|
||||
if (data.deptList.length === 1) {
|
||||
|
||||
this.commit("user/setToken", data.jwtToken);
|
||||
this.commit("user/setDeptId", data.deptList);
|
||||
this.commit("user/setUserName", data.userName);
|
||||
|
||||
@ -81,3 +81,26 @@ export function isShiQingZhi() {
|
||||
const Jb = deptLevel?.[0] == '2' ? '01' : deptLevel?.[0] == '3' ? '02' : '03'
|
||||
return deptBizType == '23' && Jb == '01'
|
||||
}
|
||||
|
||||
|
||||
/** 获取当前用户角色信息 */
|
||||
export function getRole() {
|
||||
const roleList = Array.isArray(getItem('roleList')) ? getItem('roleList') : []
|
||||
|
||||
/** 角色配置映射表 */
|
||||
const ROLE_MAP = [
|
||||
{ code: 'JS_666666', label: '市情指领导', value: '01', ename: 'shiQzLeader' },
|
||||
{ code: 'JS_777777', label: '市情指挥人员', value: '02', ename: 'shiQz' },
|
||||
{ code: 'JS_888888', label: '县情指人员', value: '03', ename: 'xianQz' }
|
||||
]
|
||||
|
||||
/** 按优先级匹配角色 */
|
||||
for (const role of ROLE_MAP) {
|
||||
if (roleList.some(item => item.roleCode === role.code)) {
|
||||
return { label: role.label, value: role.value, ename: role.ename }
|
||||
}
|
||||
}
|
||||
|
||||
/** 默认返回普通用户 */
|
||||
return { label: '普通用户', value: '04', ename: 'common' }
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ref, toRefs, isRef } from 'vue';
|
||||
import { getSysDictByCode } from '@/api/sysDict' //引入封装数字字典接口
|
||||
import { getSysDictByCode, fzdict } from '@/api/sysDict' //引入封装数字字典接口
|
||||
|
||||
import { getLocalDic } from "@/utils/localDic/index.js"
|
||||
/**
|
||||
@ -24,11 +24,11 @@ export function getDict(...args) {
|
||||
return (() => {
|
||||
args.forEach((d, index) => {
|
||||
res.value[d] = [];
|
||||
|
||||
// 本地字典拦截,如果本地字典存在,则使用本地字典,否则使用远程字典
|
||||
if (isLocalDict(d) && getLocalDic(d)) {
|
||||
res.value[d] = getLocalDic(d)
|
||||
} else {
|
||||
|
||||
getSysDictByCode({
|
||||
dictCode: d
|
||||
}).then(result => {
|
||||
@ -53,7 +53,42 @@ export function getDict(...args) {
|
||||
return toRefs(res.value);
|
||||
})()
|
||||
}
|
||||
export function getFzDict(...args) {
|
||||
const res = ref({});
|
||||
return (() => {
|
||||
args.forEach((d, index) => {
|
||||
res.value[d] = [];
|
||||
// 本地字典拦截,如果本地字典存在,则使用本地字典,否则使用远程字典
|
||||
if (isLocalDict(d) && getLocalDic(d)) {
|
||||
res.value[d] = getLocalDic(d);
|
||||
} else {
|
||||
fzdict({
|
||||
dictLabel: d
|
||||
}).then(result => {
|
||||
result = result || {};
|
||||
// result.itemList = Array.isArray(result.itemList) ? result.itemList : [];
|
||||
// result.itemList.forEach(p => {
|
||||
// p.label = p.itemName;
|
||||
// p.value = p.itemValue;
|
||||
// p.id = p.itemValue;
|
||||
// p.elTagType = p.dictType;
|
||||
// if (p?.itemList && p.itemList?.length > 0) {
|
||||
// getChildren(p);
|
||||
// }
|
||||
// p.children = p.itemList;
|
||||
// });
|
||||
// console.log(res.value);
|
||||
|
||||
res.value[d] = result
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 使用toRefs确保返回的是响应式对象
|
||||
return toRefs(res.value);
|
||||
})()
|
||||
|
||||
}
|
||||
export function getChildren(item) {
|
||||
item.label = item.zdmc
|
||||
item.value = item.dm
|
||||
@ -177,3 +212,4 @@ export function getMultiDictVal(values, dict) {
|
||||
}).join(',');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -5,19 +5,21 @@ import { getItem } from '@/utils/storage'
|
||||
*/
|
||||
const getChildrenRoutes = (routes) => {
|
||||
const result = [];
|
||||
// const { deptBizType, deptLevel } = getItem('deptId')[0]
|
||||
const { deptBizType, deptLevel } = getItem('deptId')[0]
|
||||
const roleList = getItem('roleList') ? getItem('roleList').filter(item => item.roleCode == 'JS_666666').length > 0 : false
|
||||
routes.forEach((route) => {
|
||||
if (route.children && route.children.length > 0) {
|
||||
// if (deptBizType == '23') {
|
||||
result.push(...route.children);
|
||||
// } else {
|
||||
// if (route.path == '/HumanIntelligence') {
|
||||
// route.children.splice(0, 1);
|
||||
// result.push(...route.children);
|
||||
// } else {
|
||||
// result.push(...route.children);
|
||||
// }
|
||||
// }
|
||||
if (deptBizType == '23' && roleList) {
|
||||
result.push(...route.children);
|
||||
} else {
|
||||
// console.log(route.path);
|
||||
if (route.path == '/JudgmentHome') {
|
||||
route.children.splice(6, 1);
|
||||
result.push(...route.children);
|
||||
} else {
|
||||
result.push(...route.children);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return result;
|
||||
|
||||
@ -93,6 +93,7 @@ export function timeValidate(date, type) {
|
||||
const hh = time.getHours().toString().padStart(2, '0')
|
||||
const mm = time.getMinutes().toString().padStart(2, '0')
|
||||
const ss = time.getSeconds().toString().padStart(2, '0')
|
||||
|
||||
if (type == 'ymd') {
|
||||
return `${yyyy}-${MM}-${dd}`;
|
||||
}
|
||||
@ -381,3 +382,21 @@ export function holographicProfileJump(szhm) {
|
||||
if (!szhm) return
|
||||
window.open(`https://tyyy.lz.dsj.xz/profile/people/person-manage?sfzhm=${szhm}&from=portal`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取表单验证错误信息
|
||||
* @param fields 表单验证错误信息
|
||||
* @param {Object} msgObj 错误信息Ojb,没有就取message
|
||||
*/
|
||||
export function getErrMsg(fields, msgObj) {
|
||||
if (!fields) return;
|
||||
if (Object.keys(fields).length === 0) return;
|
||||
/** 第一个错误字段 */
|
||||
const firstErrorField = Object.keys(fields)[0];
|
||||
if (msgObj && msgObj[firstErrorField]) return msgObj[firstErrorField];
|
||||
if (!firstErrorField) return;
|
||||
/** 第一个错误字段的内容 @type{<Array>Object} - [message, field, fieldValue] */
|
||||
let firstErrorFieldObj = fields?.[firstErrorField];
|
||||
let errMsg = firstErrorFieldObj?.[0]?.message
|
||||
return errMsg
|
||||
}
|
||||
|
||||
@ -1,4 +1,9 @@
|
||||
const url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上
|
||||
// let url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上
|
||||
let url = "ws://155.240.22.30:2109/mosty-api/mosty-websocket/socket/"; //线上
|
||||
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地
|
||||
}
|
||||
import {
|
||||
getItem
|
||||
} from "@/utils/storage";
|
||||
|
||||
@ -57,7 +57,7 @@ const rules = ref({
|
||||
]
|
||||
})
|
||||
const formData = ref([
|
||||
{ label: "关注部门", prop: "ssbmdm", depMc: 'ssbm', type: "department", width: '45%', multiple: true },
|
||||
{ label: "关注部门", prop: "ssbmdm", depMc: 'ssbm', type: "department", width: '45%', multiple: true,isAll: true },
|
||||
])
|
||||
const elform = ref(null)
|
||||
watch(() => props.modelValue, (newVal) => {
|
||||
|
||||
@ -53,7 +53,7 @@ const props = defineProps({
|
||||
},
|
||||
path: {
|
||||
type: String,
|
||||
default: "/qbcjZhc/sendFqzl"
|
||||
default: "/mosty-gsxt/qbcjZhc/sendFqzl"
|
||||
}
|
||||
|
||||
|
||||
@ -101,16 +101,17 @@ const getsendFqzl = () => {
|
||||
}
|
||||
try {
|
||||
const res = await qcckPost(promes,props.path )
|
||||
// qbcjZhcSendFqzl(promes)
|
||||
const str = JSON.parse(res)
|
||||
if (str.code == 200) {
|
||||
// const str = JSON.parse(res)
|
||||
// if (str.code == 200) {
|
||||
ElMessage.success('发送成功')
|
||||
listQuery.value = {}
|
||||
listQuery.value.attachmentPath = ''
|
||||
emit('handleClose')
|
||||
} else {
|
||||
ElMessage.error(str.msg)
|
||||
}
|
||||
// listQuery.value = {}
|
||||
// listQuery.value.attachmentPath = ''
|
||||
emit('handleClose')
|
||||
close()
|
||||
|
||||
// } else {
|
||||
// ElMessage.error(str.msg)
|
||||
// }
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
</FormMessage>
|
||||
<!-- </div> -->
|
||||
<div class="tags-section" v-if="disabled">
|
||||
<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">
|
||||
@ -40,14 +40,14 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="tags-section" v-if="disabled">
|
||||
<h3 class="tags-title">续保信息</h3>
|
||||
<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)">
|
||||
<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)">
|
||||
@ -56,7 +56,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<span v-if="!dataList.xb || dataList.xb.length === 0" class="no-tags">
|
||||
暂无标签
|
||||
暂无续报信息
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -77,7 +77,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<span v-if="!dataList.bc || dataList.bc.length === 0" class="no-tags">
|
||||
暂无标签
|
||||
暂无补充信息
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -104,15 +104,16 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<pursueContent v-model="pursueShow" :dataList="dataVals" :title="processtitle" :updeteBool="true" />
|
||||
<pursueContent v-model="pursueShow" :dataList="dataVals" :title="processtitle" :updeteBool="true" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { xxcjAddEntity, xxcjUpdateEntity, xxcjSelectByid, xxcjSelectCzlcList, xxcjSelectListBc, xxcjDeletesBc } from "@/api/xxcj.js"
|
||||
import { xxcjAddEntity, xxcjUpdateEntity, xxcjSelectByid, xxcjSelectCzlcList, xxcjSelectListBc, xxcjDeletesBc, addEntity, xxcjXxzhs } 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 { getItem } from '@//utils/storage.js'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import pursueContent from "@/views/backOfficeSystem/HumanIntelligence/components/pursueContent.vue";
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
@ -135,15 +136,23 @@ const formData = ref();
|
||||
const rules = ref({
|
||||
qbmc: [{ required: true, message: "请输入情报标题", trigger: "blur" }],
|
||||
qbnr: [{ required: true, message: "请输入情报内容", trigger: "blur" }],
|
||||
bcnr: [{ required: true, message: "请输入续报内容", trigger: "blur" }],
|
||||
})
|
||||
|
||||
watch(() => dialogForm.value, (val) => {
|
||||
if (val) {
|
||||
formData.value = [
|
||||
{ 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 },
|
||||
]
|
||||
if (formType.value === 'followUpReport') {
|
||||
formData.value = [
|
||||
{ label: "情报标题", prop: "qbmc", type: "input", width: '45%', disabled: true },
|
||||
{ label: "续报内容", prop: "bcnr", type: "textarea", width: '100%', rows: 100 },
|
||||
]
|
||||
} else {
|
||||
formData.value = [
|
||||
{ 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 },
|
||||
]
|
||||
}
|
||||
}
|
||||
}, { deep: true })
|
||||
const fjdz = ref()
|
||||
@ -155,13 +164,22 @@ const msgeDat = ref()
|
||||
const title = ref("")
|
||||
const showPj = ref(false)
|
||||
const disabled = ref(false)
|
||||
/** 类型 add 新增 info 详情 edit 编辑 followUpReport 续报*/
|
||||
const formType = ref('add')
|
||||
// 初始化数据
|
||||
const init = (type, row) => {
|
||||
title.value = type == "add" ? "新增" : type == "info" ? "详情" : "编辑"
|
||||
const titleObj = {
|
||||
add: "新增",
|
||||
info: "详情",
|
||||
edit: "编辑",
|
||||
followUpReport: "续报"
|
||||
}
|
||||
title.value = titleObj[type]
|
||||
disabled.value = type == 'info' ? true : false
|
||||
fjdz.value = []
|
||||
dialogForm.value = true;
|
||||
if (type == 'info' || type == 'edit') {
|
||||
formType.value = type
|
||||
if (type == 'info' || type == 'edit' || type == 'followUpReport') {
|
||||
showPj.value = true
|
||||
msgeDat.value = row
|
||||
getqbcjPldb(row.id)
|
||||
@ -177,7 +195,7 @@ const init = (type, row) => {
|
||||
// 根据id查询详情
|
||||
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(",") : []
|
||||
@ -187,9 +205,9 @@ const getDataById = (id) => {
|
||||
|
||||
// 新增
|
||||
const submitForm = () => {
|
||||
loading.value = true
|
||||
elform.value.submit(valid => {
|
||||
if (valid) {
|
||||
loading.value = true
|
||||
const promes = {
|
||||
...listQuery.value,
|
||||
fjdz: listQuery.value.fjdz && listQuery.value.fjdz.length > 0 ? listQuery.value.fjdz.map(item => {
|
||||
@ -211,6 +229,19 @@ const submitForm = () => {
|
||||
}).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
} else if (title.value == '续报') {
|
||||
const params = {
|
||||
qbid: listQuery.value.id,
|
||||
czlx: '01',
|
||||
ysnr: listQuery.value.qbnr,
|
||||
bcnr: promes.bcnr,
|
||||
}
|
||||
addEntity(params).then((res) => {
|
||||
emit("getList")
|
||||
close()
|
||||
}).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -258,18 +289,25 @@ const getxxcjSelectListBc = (id, lx) => {
|
||||
|
||||
// 处理标签删除
|
||||
const handleDeleteTag = (tag) => {
|
||||
|
||||
proxy.$confirm("确定要删除吗?", "警告", { type: "warning" }).then(() => {
|
||||
const userName = getItem('USERNAME')
|
||||
if (userName == tag.bcrxm) {
|
||||
xxcjDeletesBc({ ids: [tag.id] }).then(res => {
|
||||
ElMessage({
|
||||
message: '删除成功',
|
||||
type: 'success',
|
||||
ElMessage({
|
||||
message: '删除成功',
|
||||
type: 'success',
|
||||
showClose: true,
|
||||
})
|
||||
getxxcjSelectListBc(msgeDat.value.id, '01')
|
||||
getxxcjSelectListBc(msgeDat.value.id, '02')
|
||||
})
|
||||
} else {
|
||||
proxy.$message({
|
||||
message: '您不是该数据的创建人,不能删除',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
getxxcjSelectListBc(msgeDat.value.id, '01')
|
||||
getxxcjSelectListBc(msgeDat.value.id, '02')
|
||||
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
@ -278,10 +316,19 @@ 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
|
||||
const userName = getItem('USERNAME')
|
||||
if (userName == data.bcrxm) {
|
||||
pursueShow.value = true
|
||||
processtitle.value = title
|
||||
dataVals.value = data
|
||||
} else {
|
||||
proxy.$message({
|
||||
message: '您不是该数据的创建人,不能进行操作',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
@ -0,0 +1,236 @@
|
||||
<template>
|
||||
<el-dialog v-model="dialogVisible" title="转会商" width="800px" :before-close="handleClose" destroy-on-close>
|
||||
<el-form ref="formRef" :model="formData" :rules="rules" label-width="120px" label-position="right">
|
||||
<!-- 会商标题 -->
|
||||
<el-form-item label="会商标题" prop="hsbt">
|
||||
<el-input v-model="formData.hsbt" placeholder="请输入会商标题" clearable />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<!-- 会商时间 -->
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="会商开始时间" prop="hskssj">
|
||||
<el-date-picker v-model="formData.hskssj" type="datetime" placeholder="选择开始时间" format="YYYY-MM-DD HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="会商结束时间" prop="hsjssj">
|
||||
<el-date-picker v-model="formData.hsjssj" type="datetime" placeholder="选择结束时间" format="YYYY-MM-DD HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 参会人员 -->
|
||||
<el-form-item label="参会人员" prop="chryList">
|
||||
<inputUser v-model:ids="formData.chryList" v-model:cName="formData.chryListCname" :Single="false" width="250"
|
||||
:multiple="true">
|
||||
</inputUser>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 会商内容 -->
|
||||
<el-form-item label="会商内容" prop="hsnr">
|
||||
<el-input v-model="formData.hsnr" type="textarea" :rows="4" placeholder="请输入会商内容" maxlength="1000"
|
||||
show-word-limit />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 会商处置意见 -->
|
||||
<el-form-item label="会商处置意见" prop="czyj">
|
||||
<el-input v-model="formData.czyj" type="textarea" :rows="3" placeholder="请输入会商处置意见" maxlength="500"
|
||||
show-word-limit />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 评论内容 -->
|
||||
<el-form-item label="评论内容" prop="plnr">
|
||||
<el-input v-model="formData.plnr" type="textarea" :rows="3" placeholder="请输入评论内容" maxlength="500"
|
||||
show-word-limit />
|
||||
</el-form-item>
|
||||
|
||||
<!-- ID字段(通常隐藏) -->
|
||||
<el-form-item v-if="formData.id" label="ID" prop="id" style="display: none;">
|
||||
<el-input v-model="formData.id" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">
|
||||
确定
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { xxcjXxzhs } from '@/api/xxcj.js'
|
||||
import inputUser from '@/components/inputCom/inputUser.vue'
|
||||
|
||||
// Props
|
||||
const props = defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: '转会商'
|
||||
},
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits(['close', 'ok'])
|
||||
|
||||
// 响应式数据
|
||||
const formRef = ref()
|
||||
const submitLoading = ref(false)
|
||||
|
||||
/** 保存DTO对象 - 会商信息表单数据 */
|
||||
const formData = ref({
|
||||
/** 主键ID */
|
||||
// id: '',
|
||||
/** 会商标题 */
|
||||
hsbt: '',
|
||||
/** 关联线索ID(采集ID) */
|
||||
glxsid: '',
|
||||
/** 关联线索名称 */
|
||||
glxsmc: '',
|
||||
/** 会商开始时间 */
|
||||
hskssj: '',
|
||||
/** 会商结束时间 */
|
||||
hsjssj: '',
|
||||
/** 参会人员ID数组 */
|
||||
chryList: [],
|
||||
/** 会商内容 */
|
||||
hsnr: '',
|
||||
/** 会商处置意见 */
|
||||
czyj: '',
|
||||
/** 评论内容 */
|
||||
plnr: ''
|
||||
})
|
||||
|
||||
// 表单验证规则
|
||||
const rules = reactive({
|
||||
hsbt: [{ required: true, message: '会商标题不能为空', trigger: 'blur' }],
|
||||
// glxsid: [
|
||||
// { required: true, message: '请选择关联线索', trigger: 'change' }
|
||||
// ],
|
||||
hsnr: [{ required: true, message: '请输入会商内容', trigger: 'blur' },],
|
||||
czyj: [
|
||||
{ required: true, message: '会商处置意见不能为空', trigger: 'blur' }
|
||||
],
|
||||
plnr: [{ required: true, message: '评论内容不能为空', trigger: 'blur' },],
|
||||
hskssj: [
|
||||
{ required: true, message: '请选择会商开始时间', trigger: 'change' }
|
||||
],
|
||||
hsjssj: [
|
||||
{ validator: validateEndTime, trigger: 'change' }
|
||||
]
|
||||
})
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
|
||||
|
||||
// 验证结束时间
|
||||
function validateEndTime(rule, value, callback) {
|
||||
if (value && formData.value.hskssj) {
|
||||
const startTime = new Date(formData.value.hskssj)
|
||||
const endTime = new Date(value)
|
||||
if (endTime <= startTime) {
|
||||
callback(new Error('结束时间必须大于开始时间'))
|
||||
return
|
||||
}
|
||||
}
|
||||
callback()
|
||||
}
|
||||
|
||||
// 初始化表单数据
|
||||
function initFormData() {
|
||||
formData.value = {
|
||||
hsbt: '',
|
||||
glxsid: props.row.id,
|
||||
glxsmc: props.row.qbmc,
|
||||
// tsypid: '',
|
||||
hskssj: '',
|
||||
hsjssj: '',
|
||||
chryList: '',
|
||||
hsnr: '',
|
||||
czyj: '',
|
||||
plnr: ''
|
||||
}
|
||||
}
|
||||
|
||||
// 重置表单
|
||||
function resetForm() {
|
||||
if (formRef.value) {
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
initFormData()
|
||||
}
|
||||
|
||||
function strToArr(str) {
|
||||
if (!str) return []
|
||||
if (typeof str === 'string') {
|
||||
return str.split(',')
|
||||
}
|
||||
if (!Array.isArray(str)) return []
|
||||
return str
|
||||
}
|
||||
// 提交表单
|
||||
function handleSubmit() {
|
||||
formRef.value.validate((valid) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true
|
||||
const chryList = strToArr(formData.value.chryList)
|
||||
const params = { ...formData.value, chryList }
|
||||
xxcjXxzhs(params).then(res => {
|
||||
emit('close')
|
||||
emit('ok')
|
||||
}).finally(() => {
|
||||
submitLoading.value = false
|
||||
})
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 关闭对话框
|
||||
function handleClose() {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
resetForm()
|
||||
dialogVisible.value = true
|
||||
})
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
dialogVisible.value = false
|
||||
})
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.help-text {
|
||||
font-size: 12px;
|
||||
color: #909399;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
:deep(.el-form-item__label) {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
:deep(.el-textarea__inner) {
|
||||
resize: vertical;
|
||||
}
|
||||
</style>
|
||||
@ -72,35 +72,39 @@
|
||||
<DictTag :tag="false" :value="row.czzt" :options="D_BZ_QBCZZT" />
|
||||
</template>
|
||||
<template #lczt="{ row }">
|
||||
|
||||
<DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<!-- (01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 07 转合成 08 转线索 09 转会商)v-if="qxkz.deptLevel == '01'" -->
|
||||
<!-- 在提交和退回得状态才能进行上报 -->
|
||||
<el-link size="small" type="primary" @click="appearNewspapers(row)">上报</el-link>
|
||||
<el-link v-if="isShowBtn('上报')" size="small" type="primary" @click="appearNewspapers(row)">上报</el-link>
|
||||
<!-- 只有上报状态才能进行采纳 -->
|
||||
<el-link size="small" type="primary" @click="cnMsg(row)">采纳</el-link>
|
||||
<el-link v-if="isShowBtn('采纳')" size="small" type="primary" @click="cnMsg(row)">采纳</el-link>
|
||||
<!-- 只有上报状态才能回退 -->
|
||||
<el-link size="small" type="primary" @click="rollbackNewspapers(row)">回退</el-link>
|
||||
<el-link v-if="isShowBtn('回退')" size="small" type="primary" @click="rollbackNewspapers(row)">回退</el-link>
|
||||
<!-- 只有采纳状态才能分组 -->
|
||||
<el-link size="small" type="primary" @click="opneMsg(row)">分组</el-link>
|
||||
<el-link v-if="isShowBtn('分组')" size="small" type="primary" @click="opneMsg(row)">分组</el-link>
|
||||
|
||||
<!-- 所有状态都能进行转线索 -->
|
||||
<el-link size="small" type="primary" @click="FollowUpOnLeads(row)" >转线索</el-link>
|
||||
<el-link v-if="isShowBtn('转线索')" size="small" type="primary" @click="FollowUpOnLeads(row)">转线索</el-link>
|
||||
<!-- 所有状态都能进行转合成 -->
|
||||
<el-link size="small" type="primary" @click="openFkDialogszl(row)">转合成</el-link>
|
||||
<el-link v-if="isShowBtn('转合成')" 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 v-if="isShowBtn('转会商')" size="small" type="primary"
|
||||
@click="handleTransferMerchant(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 v-if="isShowBtn('肯定')" size="small" type="primary" @click="affirm(row)">肯定</el-link>
|
||||
<el-link v-if="isShowBtn('关注部门')" size="small" type="primary" @click="FollowUpOnDept(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>
|
||||
<el-link v-if="isShowBtn('打标签')" size="small" type="primary" @click="openCustomTag(row)">打标签</el-link>
|
||||
|
||||
<el-link v-if="isShowBtn('删除')" size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
|
||||
|
||||
<el-link v-if="isShowBtn('修改', row)" size="small" type="primary" @click="addEdit('edit', row)">修改</el-link>
|
||||
<el-link v-if="isShowBtn('续报', row)" size="small" type="primary"
|
||||
@click="addEdit('followUpReport', row)">续报</el-link>
|
||||
<el-link v-if="isShowBtn('详情')" size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
|
||||
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -131,7 +135,12 @@
|
||||
@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" />
|
||||
<Configuration v-model="configurationShow" :dataList="dataList" @getList="getList" />
|
||||
|
||||
<!-- 转会商 -->
|
||||
<transferMerchant v-if="isShowTransferMerchantTc" :row="currRow" ref="transferMerchantRef" title="转会商"
|
||||
@close="isShowTransferMerchantTc = false" @ok="getList" />
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -151,6 +160,9 @@ 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'
|
||||
import transferMerchant from "./components/transferMerchant.vue";
|
||||
import { isShiQingZhi } from "@/utils/auth.js"
|
||||
|
||||
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,
|
||||
@ -169,14 +181,20 @@ const chooseData = (val) => {
|
||||
})
|
||||
tableList.value = val
|
||||
}
|
||||
|
||||
/** 市情指 */
|
||||
const cityIntelligenceCommand = isShiQingZhi()
|
||||
const currRow = ref({})
|
||||
const transferMerchantRef = ref()
|
||||
const isShowTransferMerchantTc = ref(false)
|
||||
|
||||
const isShow = ref(false)
|
||||
const searchConfiger = ref([
|
||||
{ label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" },
|
||||
{ label: "所属单位", prop: "ssbmdm", placeholder: "请选择所属单位", showType: "department" },
|
||||
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
|
||||
{ label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select",options:D_BZ_BQJB},
|
||||
{ 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: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
|
||||
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
|
||||
]);
|
||||
const pageData = reactive({
|
||||
@ -230,6 +248,16 @@ const cnMsg = (item) => {
|
||||
}
|
||||
// 回退
|
||||
const rollbackNewspapers = (item) => {
|
||||
|
||||
|
||||
if (item.lczt == '04') {
|
||||
proxy.$message({
|
||||
message: '已经采纳的信息无法回退',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
return
|
||||
}
|
||||
if (item.lczt == '03') {
|
||||
proxy.$message({
|
||||
message: '无法回退市局上报信息',
|
||||
@ -264,13 +292,13 @@ const rollbackNewspapers = (item) => {
|
||||
}
|
||||
// 上报
|
||||
const appearNewspapers = (item) => {
|
||||
if ((item.lczt == '01' || item.lczt == '05') && item.qbjb == '00' && qxkz.deptLevel != '01') {
|
||||
if ((item.lczt == '01' || item.lczt == '05' || item.lczt == '02') && item.qbjb == '00' && qxkz.deptLevel != '01') {
|
||||
proxy.$confirm("确定要上报", "警告", { type: "warning" }).then(() => {
|
||||
let promes = {}
|
||||
if (qxkz.deptLevel == '01') {
|
||||
promes = { id: item.id, czzt: '03' }
|
||||
if (qxkz.deptLevel == '02') {
|
||||
promes = { id: item.id, lczt: '03' }
|
||||
} else {
|
||||
promes = { id: item.id, czzt: '02' }
|
||||
promes = { id: item.id, lczt: '02' }
|
||||
}
|
||||
xxcjUpdateCzlc(promes).then(res => {
|
||||
proxy.$message({ type: "success", message: "上报成功" });
|
||||
@ -279,7 +307,7 @@ const appearNewspapers = (item) => {
|
||||
|
||||
}).catch(() => { });
|
||||
} else {
|
||||
proxy.$message({ type: "warning", message: "只能上报提交的情报" });
|
||||
proxy.$message({ type: "warning", message: "市局无法进行上报" });
|
||||
}
|
||||
}
|
||||
// 分组
|
||||
@ -294,8 +322,14 @@ const opneMsg = (item) => {
|
||||
// 打标签
|
||||
const customTagShow = ref(false)
|
||||
const openCustomTag = (item) => {
|
||||
customTagShow.value = true
|
||||
dataList.value = item
|
||||
if (qxkz.depBool) {
|
||||
customTagShow.value = true
|
||||
dataList.value = item
|
||||
} else {
|
||||
proxy.$message.warning('暂无权限')
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// 肯定
|
||||
const affirm = (item) => {
|
||||
@ -310,8 +344,13 @@ const affirm = (item) => {
|
||||
// 配置关注部门
|
||||
const configurationShow = ref(false)
|
||||
const FollowUpOnDept = (item) => {
|
||||
configurationShow.value = true
|
||||
dataList.value = item
|
||||
if (qxkz.depBool) {
|
||||
configurationShow.value = true
|
||||
dataList.value = item
|
||||
} else {
|
||||
proxy.$message.warning('暂无权限')
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -353,14 +392,12 @@ const handleSumbit = () => {
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
const { lrkssj, zxkssj } = val
|
||||
|
||||
const promes = {
|
||||
...pageData.pageConfiger,
|
||||
...val,
|
||||
lrkssj: lrkssj ? lrkssj[0] : '',
|
||||
lrjssj: lrkssj ? lrkssj[1] : '',
|
||||
zxkssj: zxkssj ? zxkssj[0] : '',
|
||||
zxjssj: zxkssj ? zxkssj[1] : '',
|
||||
startTime: val.startTime ? val.startTime[0] : '',
|
||||
endTime: val.endTime ? val.endTime[1] : '',
|
||||
}
|
||||
|
||||
queryFrom.value = { ...promes }
|
||||
@ -473,7 +510,7 @@ const tabHeightFn = () => {
|
||||
} else {
|
||||
pageData.tableHeight = window.innerHeight - 250;
|
||||
}
|
||||
window.onresize = function () {
|
||||
window.onresize = function() {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
@ -487,31 +524,75 @@ const FollowUpOnLeads = (row) => {
|
||||
})
|
||||
return
|
||||
} else {
|
||||
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
|
||||
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
|
||||
proxy.$message({ type: "success", message: "转线索成功" });
|
||||
getList();
|
||||
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) {
|
||||
if (!qxkz.depBool) {
|
||||
proxy.$message({
|
||||
message: '权限不足',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
return
|
||||
} else {
|
||||
fszlShow.value = true
|
||||
dataList.value = row
|
||||
} else {
|
||||
fszlShow.value = true
|
||||
dataList.value = row
|
||||
}
|
||||
|
||||
}
|
||||
/** 获取当前角色 */
|
||||
function getRole() {
|
||||
const { deptBizType, deptLevel } = getItem('deptId')[0]
|
||||
/** 是否是市情指领导 */
|
||||
const isShiQzLeader = getItem('roleList').find(item => item.roleCode == 'JS_666666') != undefined
|
||||
if (isShiQzLeader) return '市情指领导'
|
||||
/** 是否是市情指人员 */
|
||||
const isShiQz = getItem('roleList').find(item => item.roleCode == 'JS_777777') != undefined
|
||||
if (isShiQz) return '市情指挥人员'
|
||||
/** 是否是县情指人员 */
|
||||
const isXianQz = getItem('roleList').find(item => item.roleCode == 'JS_888888') != undefined
|
||||
if (isXianQz) return '县情指人员'
|
||||
return '部门'
|
||||
}
|
||||
/** 是否展示按钮 */
|
||||
const isShowBtn = (btnName, row = {}) => {
|
||||
/** @type {String} 流程状态(01 提交 02 上报县局 03 上班市局 04 采纳 05 退回 06 打标签 08 转线索) */
|
||||
const lczt = row.lczt
|
||||
/** 按钮权限 */
|
||||
const buttonPermissions = {
|
||||
"市情指领导": ["肯定", "采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门"],
|
||||
"市情指挥人员": ["采纳", "回退", "分组", "转线索", "转合成", "转会商", "打标签", "修改", "详情", "关注部门"],
|
||||
"县情指人员": ["上报", "回退", "修改", "详情"],
|
||||
"部门": ["上报", "新增", "修改", "续报", "详情"]
|
||||
};
|
||||
|
||||
const role = getRole(); // 角色
|
||||
const isHadAuth = buttonPermissions[role]?.includes(btnName) // 当前角色所有会显示的按钮
|
||||
if (!isHadAuth) return false
|
||||
// 拦截部分逻辑
|
||||
if (role === '部门') {
|
||||
if (btnName === '续报') return lczt != '01'
|
||||
if (btnName === '修改') return lczt == '01'
|
||||
// if(btnName === '上报') return lczt == '01'
|
||||
}
|
||||
return true
|
||||
}
|
||||
const handleTransferMerchant = (row) => {
|
||||
currRow.value = row
|
||||
isShowTransferMerchantTc.value = true
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@ -40,10 +40,10 @@
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link size="small" type="primary" @click="FollowUpOnLeads(row)">转线索</el-link>
|
||||
<el-link size="small" type="primary" @click="openFszl(row)">转合成</el-link>
|
||||
<!-- <el-link size="small" type="primary" @click="FollowUpOnLeads(row)">转线索</el-link>
|
||||
<el-link size="small" type="primary" @click="openFszl(row)">转合成</el-link> -->
|
||||
<el-link size="small" type="primary" @click="openCheckProcess(row)">补充信息</el-link>
|
||||
<el-link size="small" type="primary" @click="openCheckProcessXb(row)"> 续报</el-link>
|
||||
<!-- <el-link size="small" type="primary" @click="openCheckProcessXb(row)"> 续报</el-link> -->
|
||||
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -72,7 +72,7 @@
|
||||
<MakeTag v-model="chooseRow" :dataList="dataList" :dict="{ D_BZ_CJLX, D_BZ_QBCZZT, D_GS_XS_LX, D_BZ_BQJB }"
|
||||
@getList="getList" />
|
||||
<pursueContent v-model="pursueShow" :dataList="dataList" :title="processtitle" />
|
||||
<Fszl v-model="fszlShow" :itemData="dataList"/>
|
||||
<Fszl v-model="fszlShow" :itemData="dataList" path="/mosty-gsxt/qbcjZhc/sendFqzl" />
|
||||
<!-- <SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj"
|
||||
:tacitly="tacitly" /> -->
|
||||
</template>
|
||||
@ -106,9 +106,16 @@ const ids = ref([])
|
||||
const tableList = ref([]);
|
||||
onMounted(() => {
|
||||
const { deptBizType, deptLevel } = getItem('deptId')[0]
|
||||
qxkz.userName = getItem('USERNAME')
|
||||
const Jb = deptLevel[0] == '2' ? '01' : deptLevel[0] == '3' ? '02' : '03'
|
||||
qxkz.deptBizType = deptBizType
|
||||
qxkz.deptLevel = Jb
|
||||
if (deptBizType == '23' && Jb == '01') {
|
||||
qxkz.depBool = true
|
||||
} else {
|
||||
qxkz.depBool = false
|
||||
}
|
||||
|
||||
getRouter()
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
@ -127,7 +134,8 @@ const chooseData = (val) => {
|
||||
}
|
||||
const qxkz = reactive({
|
||||
deptBizType: "",
|
||||
deptLevel: ""
|
||||
deptLevel: "",
|
||||
userName:''
|
||||
})
|
||||
const list = ref()
|
||||
const searchConfiger = ref();
|
||||
@ -146,7 +154,7 @@ watch(() => D_BZ_BQJB, val => {
|
||||
searchConfiger.value = [
|
||||
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
|
||||
{ label: "情报处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
|
||||
{ label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
|
||||
// { label: "线索编号", prop: 'xsBh', placeholder: "请输入线索编号", showType: "input" },
|
||||
{ label: "关键字", prop: 'keyword', placeholder: "请输入关键字", showType: "input" },
|
||||
]
|
||||
}, { deep: true, immediate: true })
|
||||
@ -179,14 +187,6 @@ const queryFrom = ref({});
|
||||
const chooseRow = ref(false)
|
||||
const dataList = ref()
|
||||
|
||||
// 批量打标
|
||||
const batchMark = () => {
|
||||
chooseRow.value = true
|
||||
dataList.value = tableList.value
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
const { lrkssj, zxkssj } = val
|
||||
@ -218,8 +218,6 @@ const changeSize = (val) => {
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value, qbjb: routerMate.value.qbjbList };
|
||||
|
||||
|
||||
xxcjSelectPage(data).then(res => {
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
@ -273,18 +271,18 @@ const openCheckProcess = (item) => {
|
||||
}
|
||||
// 续报
|
||||
const openCheckProcessXb = (item) => {
|
||||
processtitle.value = '信息续报'
|
||||
if (qxkz.userName == item.xssbr) {
|
||||
processtitle.value = '信息续报'
|
||||
pursueShow.value = true
|
||||
dataList.value = item
|
||||
}
|
||||
// 转线索
|
||||
const instQbcjZxs = (item) => {
|
||||
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
|
||||
qbcjZxs({ qbid: item.id }).then(res => {
|
||||
proxy.$message({ type: "success", message: "转线索成功" });
|
||||
getList();
|
||||
} else {
|
||||
proxy.$message({
|
||||
message: '您不是该情报的上报人,不能续报',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 转线索
|
||||
@ -295,7 +293,6 @@ const FollowUpOnLeads = (row) => {
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
return
|
||||
} else {
|
||||
proxy.$confirm("确定要转线索吗?", "警告", { type: "warning" }).then(() => {
|
||||
xxcjXxzsx({ ids: Array.isArray(row) ? row.join(',') : row.id }).then(res => {
|
||||
@ -309,8 +306,15 @@ const FollowUpOnLeads = (row) => {
|
||||
// 转合成
|
||||
const fszlShow = ref(false)
|
||||
const openFszl = (item) => {
|
||||
fszlShow.value = true
|
||||
dataList.value = item
|
||||
if (!qxkz.depBool) {
|
||||
proxy.$message({
|
||||
message: '权限不足',
|
||||
type: 'warning',
|
||||
showClose: true,
|
||||
})
|
||||
} else { fszlShow.value = true
|
||||
dataList.value = item }
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@ -76655,12 +76655,14 @@ export const bm = {
|
||||
export const centralPoint = [
|
||||
{
|
||||
name: '墨脱县',
|
||||
ssbmdm:'540423000000',
|
||||
point: [
|
||||
95.33050808900407,
|
||||
29.322011545645807
|
||||
]
|
||||
}, {
|
||||
name: '巴宜区',
|
||||
ssbmdm:'540402000000',
|
||||
point: [
|
||||
94.36040092147607,
|
||||
29.637028970765996
|
||||
@ -76668,30 +76670,35 @@ export const centralPoint = [
|
||||
},
|
||||
{
|
||||
name: '波密县',
|
||||
ssbmdm:'540424000000',
|
||||
point: [
|
||||
95.7692249914358,
|
||||
29.85943760031867
|
||||
]
|
||||
}, {
|
||||
name: '察隅县',
|
||||
ssbmdm:'540425000000',
|
||||
point: [
|
||||
97.46698612723947,
|
||||
28.661228694163327
|
||||
]
|
||||
}, {
|
||||
name: '工布江达县',
|
||||
ssbmdm:'540421000000',
|
||||
point: [
|
||||
93.24660931130188,
|
||||
29.88459424127838
|
||||
]
|
||||
}, {
|
||||
name: '朗县',
|
||||
ssbmdm:'540426000000',
|
||||
point: [
|
||||
93.07449497318652,
|
||||
29.045416229209337
|
||||
]
|
||||
}, {
|
||||
name: '米林县',
|
||||
ssbmdm:'540422000000',
|
||||
point: [
|
||||
94.21305189935441,
|
||||
29.21583429482142
|
||||
|
||||
@ -46,17 +46,22 @@ import Footer from './footer.vue'
|
||||
// import useCallModule from '../sdk/call.js'
|
||||
const { proxy } = getCurrentInstance();
|
||||
// const Call = useCallModule()
|
||||
window.lemon.login.login({
|
||||
username: "linzhigongan1",
|
||||
password: "linzhigongan1",
|
||||
realm: "puc.com",
|
||||
webpucUrl: "https://192.168.0.1:16888",
|
||||
}).then(res => {
|
||||
console.log(res,"登录成功");
|
||||
}).catch(err => {
|
||||
console.log(err,"登录失败");
|
||||
try {
|
||||
window.lemon.login.login({
|
||||
username: "linzhigongan1",
|
||||
password: "linzhigongan1",
|
||||
realm: "puc.com",
|
||||
webpucUrl: "https://192.168.0.1:16888",
|
||||
}).then(res => {
|
||||
console.log(res,"登录成功");
|
||||
}).catch(err => {
|
||||
console.log(err,"登录失败");
|
||||
|
||||
})
|
||||
})
|
||||
|
||||
} catch (error) {
|
||||
console.log('error: ', error);
|
||||
}
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
|
||||
@ -0,0 +1,104 @@
|
||||
<template>
|
||||
<el-dialog v-model="dialogVisible" title="会商反馈" width="600px" :before-close="handleClose" destroy-on-close>
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="反馈内容" prop="fknr">
|
||||
<el-input v-model="form.fknr" type="textarea" :rows="6" placeholder="请输入反馈内容" maxlength="500" show-word-limit />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" :loading="loading" @click="handleSave">
|
||||
保存
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { wshsHsfk } from '@/api/huiShangyp/onlineConsultationRoom.js'
|
||||
|
||||
const emit = defineEmits(['success'])
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const loading = ref(false)
|
||||
const formRef = ref()
|
||||
const currentHsid = ref('')
|
||||
|
||||
const form = reactive({
|
||||
fknr: ''
|
||||
})
|
||||
|
||||
const rules = {
|
||||
fknr: [
|
||||
{ required: true, message: '请输入反馈内容', trigger: 'blur' },
|
||||
{ min: 2, message: '反馈内容至少2个字符', trigger: 'blur' }
|
||||
]
|
||||
}
|
||||
|
||||
// 打开弹框
|
||||
const open = (hsid) => {
|
||||
currentHsid.value = hsid
|
||||
form.fknr = ''
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
// 关闭弹框
|
||||
const handleClose = () => {
|
||||
dialogVisible.value = false
|
||||
form.fknr = ''
|
||||
currentHsid.value = ''
|
||||
if (formRef.value) {
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
}
|
||||
|
||||
// 保存反馈
|
||||
const handleSave = async () => {
|
||||
if (!formRef.value) return
|
||||
|
||||
try {
|
||||
const valid = await formRef.value.validate()
|
||||
if (!valid) return
|
||||
|
||||
loading.value = true
|
||||
|
||||
const params = {
|
||||
hsid: currentHsid.value,
|
||||
fknr: form.fknr
|
||||
}
|
||||
|
||||
await wshsHsfk(params)
|
||||
|
||||
ElMessage.success('反馈保存成功')
|
||||
handleClose()
|
||||
emit('success') // 通知父组件刷新列表
|
||||
|
||||
} catch (error) {
|
||||
|
||||
ElMessage.error('保存失败,请重试')
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
:deep(.el-textarea__inner) {
|
||||
resize: vertical;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,197 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
title="查看反馈"
|
||||
width="800px"
|
||||
:before-close="handleClose"
|
||||
>
|
||||
<div class="feedback-container" v-loading="loading">
|
||||
<!-- 反馈列表 -->
|
||||
<div class="feedback-list" v-if="currFkListList.length > 0">
|
||||
<div
|
||||
v-for="(feedback, index) in currFkListList"
|
||||
:key="index"
|
||||
class="feedback-item"
|
||||
>
|
||||
<div class="feedback-header">
|
||||
<div class="user-info">
|
||||
<el-avatar :size="32" :src="feedback.avatar">
|
||||
{{ feedback.fkrxm?.charAt(0) || '用' }}
|
||||
</el-avatar>
|
||||
<span class="username">{{ feedback.fkrxm || '匿名用户' }}</span>
|
||||
</div>
|
||||
<div class="feedback-time" v-if="feedback.fksj">
|
||||
{{ formatTime(feedback.fksj) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="feedback-content">
|
||||
{{ feedback.fknr }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 暂无反馈 -->
|
||||
<el-empty
|
||||
v-else
|
||||
description="暂无反馈信息"
|
||||
:image-size="120"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">关闭</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const loading = ref(false)
|
||||
const currFkListList = ref([])
|
||||
|
||||
// // 计算所有反馈列表
|
||||
// const currFkListList = computed(() => {
|
||||
// let allFeedbacks = []
|
||||
|
||||
// if (currFkListList.value && Array.isArray(currFkListList.value)) {
|
||||
// currFkListList.value.forEach(item => {
|
||||
// if (item.fkList && Array.isArray(item.fkList)) {
|
||||
// item.fkList.forEach(feedback => {
|
||||
// allFeedbacks.push({
|
||||
// ...feedback,
|
||||
// // 如果有评论内容,也一并显示
|
||||
// plnr: item.plnr
|
||||
// })
|
||||
// })
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
|
||||
// // 按时间排序(如果有时间字段)
|
||||
// return allFeedbacks.sort((a, b) => {
|
||||
// if (a.fksj && b.fksj) {
|
||||
// return new Date(b.fksj) - new Date(a.fksj)
|
||||
// }
|
||||
// return 0
|
||||
// })
|
||||
// })
|
||||
|
||||
// 打开弹框
|
||||
const open = (fkList) => {
|
||||
currFkListList.value = fkList || []
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
// 关闭弹框
|
||||
const handleClose = () => {
|
||||
dialogVisible.value = false
|
||||
currFkListList.value = []
|
||||
}
|
||||
|
||||
// 格式化时间
|
||||
const formatTime = (timeStr) => {
|
||||
if (!timeStr) return ''
|
||||
try {
|
||||
const date = new Date(timeStr)
|
||||
return date.toLocaleString('zh-CN', {
|
||||
year: 'numeric',
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit'
|
||||
})
|
||||
} catch (error) {
|
||||
return timeStr
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.feedback-container {
|
||||
max-height: 500px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.feedback-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.feedback-item {
|
||||
border: 1px solid #e4e7ed;
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
background-color: #fafafa;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.feedback-item:hover {
|
||||
border-color: #409eff;
|
||||
box-shadow: 0 2px 8px rgba(64, 158, 255, 0.1);
|
||||
}
|
||||
|
||||
.feedback-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.user-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.username {
|
||||
font-weight: 500;
|
||||
color: #303133;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.feedback-time {
|
||||
font-size: 12px;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
.feedback-content {
|
||||
color: #606266;
|
||||
line-height: 1.6;
|
||||
font-size: 14px;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.dialog-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
/* 滚动条样式 */
|
||||
.feedback-container::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
.feedback-container::-webkit-scrollbar-track {
|
||||
background: #f1f1f1;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.feedback-container::-webkit-scrollbar-thumb {
|
||||
background: #c1c1c1;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.feedback-container::-webkit-scrollbar-thumb:hover {
|
||||
background: #a8a8a8;
|
||||
}
|
||||
</style>
|
||||
@ -2,7 +2,9 @@
|
||||
<div class="titleBox">
|
||||
<PageTitle title="网上会议室">
|
||||
<el-button type="primary" @click="addEdit('add', '')">
|
||||
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">新增</span>
|
||||
</el-button>
|
||||
</PageTitle>
|
||||
@ -29,38 +31,48 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<el-button type="primary" size="small" @click="joinMeeting(item,'会议')">加入会议</el-button>
|
||||
<el-button type="primary" size="small">反馈情况</el-button>
|
||||
<el-button type="primary" size="small">处置下发</el-button>
|
||||
<el-button type="primary" size="small" @click="joinMeeting(item, '会议')">加入会议</el-button>
|
||||
<el-button type="primary" size="small" @click="feedBack(item)">反馈情况</el-button>
|
||||
<el-button v-if="cityIntelligenceCommand" type="primary" size="small"
|
||||
@click="disposeIssue(item)">处置下发</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bottom">
|
||||
<el-popover placement="top" :visible="item.visible" :width="400" trigger="click">
|
||||
<el-link type="primary" @click="viewFeedback(item)">
|
||||
<el-icon>
|
||||
<View />
|
||||
</el-icon>查看反馈
|
||||
</el-link>
|
||||
<el-popover placement="top" :visible="item.visible" :width="400" trigger="click">
|
||||
<template #reference>
|
||||
<el-link type="primary"><el-icon><ChatDotSquare /></el-icon>评论</el-link>
|
||||
<el-link type="primary"><el-icon>
|
||||
<ChatDotSquare />
|
||||
</el-icon>评论</el-link>
|
||||
</template>
|
||||
<MOSTY.Other filterable style="width: 100%;" v-model="comments" type="textarea" rows="3" clearable placeholder="发表评论"/>
|
||||
<MOSTY.Other filterable style="width: 100%;" v-model="comments" type="textarea" rows="3" clearable
|
||||
placeholder="发表评论" />
|
||||
<div class="mt10 flex just-center">
|
||||
<el-button size="small" type="primary" @click.stop="handleSumbit(item)">发送</el-button>
|
||||
</div>
|
||||
</el-popover>
|
||||
<el-link type="primary" ><el-icon><VideoPlay /></el-icon>会议回放</el-link>
|
||||
<el-link type="primary" @click="addEdit('edit', item)"><el-icon><Edit /></el-icon>编辑</el-link>
|
||||
<el-link type="danger" @click="delDictItem(item.id)"><el-icon><Delete /></el-icon>删除</el-link>
|
||||
<el-link type="primary"><el-icon>
|
||||
<VideoPlay />
|
||||
</el-icon>会议回放</el-link>
|
||||
<el-link type="primary" @click="addEdit('edit', item)"><el-icon>
|
||||
<Edit />
|
||||
</el-icon>编辑</el-link>
|
||||
<el-link type="danger" @click="delDictItem(item.id)"><el-icon>
|
||||
<Delete />
|
||||
</el-icon>删除</el-link>
|
||||
</div>
|
||||
</li>
|
||||
<MOSTY.Empty :show="!pageData.loading && pageData.list.length <= 0"></MOSTY.Empty>
|
||||
</ul>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"
|
||||
></Pages>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" @updateDate="getList" />
|
||||
@ -70,253 +82,330 @@
|
||||
<!-- 音视频会议窗口 -->
|
||||
<MeetingView ref="refMeetingView" :update="updateItem"></MeetingView>
|
||||
|
||||
<!-- 反馈弹窗 -->
|
||||
<FeedbackForm ref="feedbackFormRef" @success="getList" />
|
||||
|
||||
<!-- 查看反馈弹窗 -->
|
||||
<ViewFeedback ref="viewFeedbackRef" />
|
||||
|
||||
<Information v-model="showDialog" title="发送指令" @submit="seedFqzl" @close='close'>
|
||||
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="meeting"
|
||||
:tacitly="tacitly" />
|
||||
</Information>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import MeetingView from '@/components/Consultation/demo.vue'
|
||||
import { ElMessageBox } from "element-plus";
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
import RoomDetail from "./components/roomDetail.vue";
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance,nextTick } from "vue";
|
||||
import ConferenceRoom from "./components/Communications/conferenceRoom.vue";
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
const { proxy } = getCurrentInstance();
|
||||
const detailDiloag = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const openMeeting = ref(false); // 打开会议窗口
|
||||
const refMeetingView = ref()
|
||||
const searchConfiger = ref([
|
||||
{
|
||||
label: "会议主题",
|
||||
prop: "hsbt",
|
||||
placeholder: "请输入会议主题",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "会议时间",
|
||||
prop: "daterange",
|
||||
showType: "datetimerange"
|
||||
},
|
||||
]);
|
||||
const comments = ref(''); // 评论内容
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
list: [],
|
||||
loading: false,
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
});
|
||||
const jsonData = ref('')
|
||||
onMounted(() => {
|
||||
jsonData.value = require('@/components/Consultation/components/zh_CN.json');
|
||||
getList();
|
||||
tabHeightFn();
|
||||
});
|
||||
import MeetingView from '@/components/Consultation/demo.vue'
|
||||
import { ElMessageBox } from "element-plus";
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
import RoomDetail from "./components/roomDetail.vue";
|
||||
import FeedbackForm from "./components/FeedbackForm.vue";
|
||||
import ViewFeedback from "./components/ViewFeedback.vue";
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import ConferenceRoom from "./components/Communications/conferenceRoom.vue";
|
||||
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
|
||||
import Information from "@/views/home/model/information.vue";
|
||||
import { isShiQingZhi } from "@/utils/auth.js"
|
||||
|
||||
const updateItem = (item) => {
|
||||
qcckPost(item,'/mosty-gsxt/wshs/update').then(res=>{
|
||||
getList();
|
||||
})
|
||||
}
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
if (val.daterange && val.daterange.length > 0) {
|
||||
queryFrom.value.startTime = val.daterange[0];
|
||||
queryFrom.value.endTime = val.daterange[1];
|
||||
} else {
|
||||
delete queryFrom.value.startTime;
|
||||
delete queryFrom.value.endTime;
|
||||
}
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList();
|
||||
};
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList();
|
||||
};
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.loading = true;
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value };
|
||||
delete data.daterange; // 删除daterange字段
|
||||
if(route.query.tsypid) data.tsypid = route.query.tsypid;
|
||||
qcckGet(data,'/mosty-gsxt/wshs/selectPage').then(res=>{
|
||||
let arr = res.records || [];
|
||||
arr.forEach(item => {
|
||||
item.chry = item.chryList ? item.chryList.map(el => el.chryxm).join('、') : '';
|
||||
item.sjry = item.xsryList ? item.xsryList.map(el => el.xm).join('、') : '';
|
||||
});
|
||||
pageData.list = arr;
|
||||
pageData.total = res.total;
|
||||
pageData.loading = false;
|
||||
}).catch(()=>{ pageData.loading = false; })
|
||||
};
|
||||
|
||||
// 提交评论
|
||||
const handleSumbit = (item) => {
|
||||
if (!comments.value) return proxy.$message({ type: "warning", message: "评论内容不能为空" });
|
||||
proxy.$message({ type: "success", message: "评论已发送" });
|
||||
qcckPost({id:item.id,plnr:comments.value},'/mosty-gsxt/wshs/addWshyPl').then((res)=>{
|
||||
getList();
|
||||
item.visible = false; // 关闭评论弹窗
|
||||
comments.value = ''; // 清空评论内容
|
||||
})
|
||||
};
|
||||
// 加入会议
|
||||
const joinMeeting = (item,type) => {
|
||||
item.number = item.hybh;
|
||||
refMeetingView.value.openInit(item,type)
|
||||
};
|
||||
|
||||
// 删除
|
||||
const delDictItem = (id) =>{
|
||||
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
|
||||
qcckPost({id},'/mosty-gsxt/wshs/delete').then(()=>{
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {});
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
const { proxy } = getCurrentInstance();
|
||||
const detailDiloag = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const openMeeting = ref(false); // 打开会议窗口
|
||||
const refMeetingView = ref()
|
||||
const feedbackFormRef = ref() // 反馈弹窗引用
|
||||
const viewFeedbackRef = ref() // 查看反馈弹窗引用
|
||||
const semdFqzlRef = ref()
|
||||
/** 发送指令Item */
|
||||
const itemData = ref({})
|
||||
/** 市情指 */
|
||||
const cityIntelligenceCommand = ref(isShiQingZhi())
|
||||
/** 下发指令 */
|
||||
const showDialog = ref(false)
|
||||
const tacitly = {
|
||||
// title:'ryXm'
|
||||
}
|
||||
|
||||
// 详情
|
||||
const addEdit = (type, row) => {
|
||||
detailDiloag.value.init(type, row);
|
||||
};
|
||||
const searchConfiger = ref([
|
||||
{
|
||||
label: "会议主题",
|
||||
prop: "hsbt",
|
||||
placeholder: "请输入会议主题",
|
||||
showType: "input"
|
||||
},
|
||||
{
|
||||
label: "会议时间",
|
||||
prop: "daterange",
|
||||
showType: "datetimerange"
|
||||
},
|
||||
]);
|
||||
const comments = ref(''); // 评论内容
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
list: [],
|
||||
loading: false,
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
});
|
||||
const jsonData = ref('')
|
||||
/** 当前行数据 */
|
||||
const currRow = ref({})
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
onMounted(() => {
|
||||
jsonData.value = require('@/components/Consultation/components/zh_CN.json');
|
||||
getList();
|
||||
tabHeightFn();
|
||||
});
|
||||
|
||||
const updateItem = (item) => {
|
||||
qcckPost(item, '/mosty-gsxt/wshs/update').then(res => {
|
||||
getList();
|
||||
})
|
||||
}
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
if (val.daterange && val.daterange.length > 0) {
|
||||
queryFrom.value.startTime = val.daterange[0];
|
||||
queryFrom.value.endTime = val.daterange[1];
|
||||
} else {
|
||||
delete queryFrom.value.startTime;
|
||||
delete queryFrom.value.endTime;
|
||||
}
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList();
|
||||
};
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList();
|
||||
};
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.loading = true;
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value };
|
||||
delete data.daterange; // 删除daterange字段
|
||||
if (route.query.tsypid) data.tsypid = route.query.tsypid;
|
||||
qcckGet(data, '/mosty-gsxt/wshs/selectPage').then(res => {
|
||||
let arr = res.records || [];
|
||||
arr.forEach(item => {
|
||||
item.chry = item.chryList ? item.chryList.map(el => el.chryxm).join('、') : '';
|
||||
item.sjry = item.xsryList ? item.xsryList.map(el => el.xm).join('、') : '';
|
||||
});
|
||||
pageData.list = arr;
|
||||
pageData.total = res.total;
|
||||
pageData.loading = false;
|
||||
}).catch(() => { pageData.loading = false; })
|
||||
};
|
||||
|
||||
// 提交评论
|
||||
const handleSumbit = (item) => {
|
||||
if (!comments.value) return proxy.$message({ type: "warning", message: "评论内容不能为空" });
|
||||
proxy.$message({ type: "success", message: "评论已发送" });
|
||||
qcckPost({ id: item.id, plnr: comments.value }, '/mosty-gsxt/wshs/addWshyPl').then((res) => {
|
||||
getList();
|
||||
item.visible = false; // 关闭评论弹窗
|
||||
comments.value = ''; // 清空评论内容
|
||||
})
|
||||
};
|
||||
// 加入会议
|
||||
const joinMeeting = (item, type) => {
|
||||
item.number = item.hybh;
|
||||
refMeetingView.value.openInit(item, type)
|
||||
};
|
||||
// 反馈情况
|
||||
const feedBack = (item) => {
|
||||
feedbackFormRef.value.open(item.id);
|
||||
};
|
||||
|
||||
|
||||
// 会议详情弹窗
|
||||
// 查看反馈
|
||||
const viewFeedback = (item) => {
|
||||
viewFeedbackRef.value.open(item.fkList || []);
|
||||
};
|
||||
|
||||
// 删除
|
||||
const delDictItem = (id) => {
|
||||
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
|
||||
qcckPost({ id }, '/mosty-gsxt/wshs/delete').then(() => {
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => { });
|
||||
}
|
||||
|
||||
// 详情
|
||||
const addEdit = (type, row) => {
|
||||
detailDiloag.value.init(type, row);
|
||||
};
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function() {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// 会议详情弹窗
|
||||
const conferenceRoomVisible = ref(false);
|
||||
|
||||
|
||||
const seedFqzl = () => {
|
||||
semdFqzlRef.value.getsendFqzl()
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
showDialog.value = false;
|
||||
}
|
||||
|
||||
// 处置下发
|
||||
const disposeIssue = (item) => {
|
||||
showDialog.value = true;
|
||||
itemData.value = item
|
||||
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
.tabBox {
|
||||
.pageSearch {
|
||||
margin-bottom: 0 !important;
|
||||
.box {
|
||||
align-items: center !important;
|
||||
}
|
||||
}
|
||||
:deep(.pageSearch .box .item) {
|
||||
margin-bottom: 0 !important;
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
|
||||
.tabBox {
|
||||
.pageSearch {
|
||||
margin-bottom: 0 !important;
|
||||
|
||||
.box {
|
||||
align-items: center !important;
|
||||
}
|
||||
}
|
||||
.btns {
|
||||
padding: 10px 20px;
|
||||
|
||||
:deep(.pageSearch .box .item) {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
.list {
|
||||
height: calc(100% - 10px);
|
||||
gap: 10px;
|
||||
margin: 0 15px;
|
||||
overflow: auto;
|
||||
.list-item {
|
||||
display: inline-block;
|
||||
border: 1px solid #ccc;
|
||||
height: 296px;
|
||||
width: 380px;
|
||||
box-sizing: border-box;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.btns {
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
.list {
|
||||
height: calc(100% - 10px);
|
||||
gap: 10px;
|
||||
margin: 0 15px;
|
||||
overflow: auto;
|
||||
|
||||
.list-item {
|
||||
display: inline-block;
|
||||
border: 1px solid #ccc;
|
||||
height: 296px;
|
||||
width: 380px;
|
||||
box-sizing: border-box;
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
margin: 10px 5px;
|
||||
|
||||
&:hover {
|
||||
border-color: rgb(124, 195, 253);
|
||||
background-color: rgba(190, 233, 255, 0.582);
|
||||
}
|
||||
|
||||
&:hover .mid {
|
||||
border-color: rgb(124, 195, 253);
|
||||
}
|
||||
|
||||
&:hover .desc {
|
||||
background-color: rgb(190, 233, 255);
|
||||
}
|
||||
|
||||
.title {
|
||||
color: black;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.info {
|
||||
color: #a5a1a1;
|
||||
font-size: 12px;
|
||||
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.desc {
|
||||
margin-top: 5px;
|
||||
background-color: rgb(242, 242, 242);
|
||||
width: 260px;
|
||||
height: 80px;
|
||||
padding: 10px;
|
||||
margin: 10px 5px;
|
||||
&:hover {
|
||||
border-color: rgb(124, 195, 253);
|
||||
background-color: rgba(190, 233, 255, 0.582);
|
||||
}
|
||||
&:hover .mid {
|
||||
border-color: rgb(124, 195, 253);
|
||||
}
|
||||
&:hover .desc {
|
||||
background-color: rgb(190, 233, 255);
|
||||
}
|
||||
.title {
|
||||
color: black;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.info {
|
||||
color: #a5a1a1;
|
||||
font-size: 12px;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
line-height: 1.5;
|
||||
}
|
||||
.desc {
|
||||
margin-top: 5px;
|
||||
background-color: rgb(242, 242, 242);
|
||||
width: 260px;
|
||||
height: 80px;
|
||||
padding: 10px;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.mid {
|
||||
border: 1px dashed rgb(124, 195, 253);
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
padding: 10px 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
.left {
|
||||
width: calc(100% - 80px);
|
||||
.title {
|
||||
font-size: 14px;
|
||||
color: black;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.info {
|
||||
font-size: 12px;
|
||||
color: #a5a1a1;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.mid {
|
||||
border: 1px dashed rgb(124, 195, 253);
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
padding: 10px 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
||||
.left {
|
||||
width: calc(100% - 80px);
|
||||
|
||||
.title {
|
||||
font-size: 14px;
|
||||
color: black;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.right {
|
||||
width: 80px;
|
||||
.el-button + .el-button {
|
||||
margin-left: 0;
|
||||
margin-top: 5px;
|
||||
}
|
||||
.info {
|
||||
font-size: 12px;
|
||||
color: #a5a1a1;
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
.bottom {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
:deep(.el-link--inner) {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
|
||||
.right {
|
||||
width: 80px;
|
||||
|
||||
.el-button+.el-button {
|
||||
margin-left: 0;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bottom {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
|
||||
:deep(.el-link--inner) {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -104,11 +104,12 @@ import LineEcharts from "@/views/home/echarts/moreLineEcharts.vue";
|
||||
import MyTable from "@/components/aboutTable/DarkTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import {tbJqGetPageList } from '@/api/yj.js'
|
||||
import {tbJqGetPageList,xsajSelectPage } from '@/api/yj.js'
|
||||
const router = useRouter();
|
||||
import { nextTick, onMounted, reactive, getCurrentInstance, ref, watch } from 'vue';
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { JQLB } = proxy.$dict("JQLB"); //获取字典数据
|
||||
const {GA_D_XSAJXALBDM} = proxy.$fzdict("GA_D_XSAJXALBDM"); //获取字典数据
|
||||
const readonly_lx = ref(false)
|
||||
const readonly_ry = ref(false)
|
||||
const readonly_dd = ref(false)
|
||||
@ -195,10 +196,11 @@ const list = reactive([
|
||||
pageSize: 6,
|
||||
},
|
||||
tableColumn: [
|
||||
{ label: "案件编号", prop: "ajbh", showOverflowTooltip: true },
|
||||
{ label: "案件内容", prop: "ajnr", showOverflowTooltip: true },
|
||||
{ label: "案件类型", prop: "ajlx", showOverflowTooltip: true },
|
||||
{ label: "案件时间", prop: "ajsj", showOverflowTooltip: true },
|
||||
{ label: "案件编号", prop: "asjbh", showOverflowTooltip: true },
|
||||
{ label: "案件标题", prop: "ajmc", showOverflowTooltip: true },
|
||||
{ label: "简要案情", prop: "jyaq", showOverflowTooltip: true },
|
||||
{ label: "案件类型", prop: "ajxlbDmbcms", showOverflowTooltip: true },
|
||||
{ label: "案件时间", prop: "asjfssjAsjfskssj", showOverflowTooltip: true },
|
||||
],
|
||||
},
|
||||
{
|
||||
@ -243,11 +245,20 @@ watch(() => JQLB.value, (val) => {
|
||||
deep: true, immediate: true
|
||||
})
|
||||
onMounted(() => {
|
||||
|
||||
|
||||
// getCount(); //获取统计数据
|
||||
tabHeightFn()
|
||||
getJqList() //警情列表
|
||||
getAjList()//案件列表
|
||||
});
|
||||
// 获取字典
|
||||
const getxsajDictSelectList = () => {
|
||||
xsajDictSelectList().then(res => {
|
||||
console.log(res);
|
||||
|
||||
})
|
||||
}
|
||||
const getCount = () => {
|
||||
// 获取处置状态统计
|
||||
qcckPost({}, '/mosty-gsxt/qbcj/getXscjTjByXslx').then(res => {
|
||||
@ -275,12 +286,13 @@ const changeNo = (e, type) => {
|
||||
break;
|
||||
case '案件':
|
||||
list[2].pageConfiger.page = e;
|
||||
getAjList()
|
||||
break;
|
||||
case '风险隐患':
|
||||
list[3].pageConfiger.page = e;
|
||||
break;
|
||||
}
|
||||
getJqList()
|
||||
// getJqList()
|
||||
}
|
||||
const changeSize = (e, type) => {
|
||||
switch (type) {
|
||||
@ -293,6 +305,7 @@ const changeSize = (e, type) => {
|
||||
break;
|
||||
case '案件':
|
||||
list[2].pageConfiger.pageSize = e;
|
||||
getAjList()
|
||||
break;
|
||||
case '风险隐患':
|
||||
list[3].pageConfiger.pageSize = e;
|
||||
@ -316,6 +329,26 @@ const getJqList = () => {
|
||||
obj.data_hstj.list = [{ label: '总数', val: [0, res.total, 0, 0] }];
|
||||
})
|
||||
}
|
||||
const getAjList = () => {
|
||||
let params = {
|
||||
pageCurrent: list[2].pageConfiger.page,
|
||||
pageSize: list[2].pageConfiger.pageSize,
|
||||
}
|
||||
console.log("执行");
|
||||
|
||||
xsajSelectPage(params).then(res => {
|
||||
list[2].tableList = res.records || [];
|
||||
list[2].pageConfiger.total = res.total;
|
||||
|
||||
// //模拟的统计警情接口
|
||||
// obj.data_lxtj.list = [{ label: '总数', val: [0, res.total, 0, 0] }];
|
||||
// obj.data_hstj.list = [{ label: '总数', val: [0, res.total, 0, 0] }];
|
||||
})
|
||||
}
|
||||
// xsajSelectPage(promes).then(res => {
|
||||
// list[2].tableList = res.records || [];
|
||||
// list[2].pageConfiger.total = res.total;
|
||||
// })
|
||||
|
||||
|
||||
|
||||
@ -420,7 +453,6 @@ const onSearch = () => {
|
||||
})
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
ElMessage.warning('请选择查询条件')
|
||||
}
|
||||
@ -602,7 +634,7 @@ const tabHeightFn = () => {
|
||||
|
||||
::v-deep .el-table .el-table__cell {
|
||||
padding: 0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-table th.el-table__cell>.cell {
|
||||
|
||||
@ -0,0 +1,206 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="内部审核" />
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
<template #bglx="{ row }">
|
||||
<DictTag :tag="false" :value="row.bglx" :options="D_BZ_YPLX" />
|
||||
</template>
|
||||
<template #ypfs="{ row }">
|
||||
<DictTag :tag="false" :value="row.ypfs" :options="D_BZ_YPFS" />
|
||||
</template>
|
||||
<template #shzt="{ row }">
|
||||
<span v-if="row.shzt == '01'">审批中</span>
|
||||
<span v-if="row.shzt == '02'">已审批</span>
|
||||
<span v-if="row.shzt == '03'">已驳回</span>
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link size="small" type="danger" @click="internalAudit(row.id)">内部审批</el-link>
|
||||
<el-link size="small" type="primary" @click="createProcess(row)">提交上级</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
</div>
|
||||
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '研判审核', flowType: 'YPSH', modelName: '研判' }"
|
||||
:path="fixedValue" @getList="getList" />
|
||||
<Ypdolog v-model="showYpdolog" :dataList="dataList" @getList="getList" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue";
|
||||
import { ypbgSjzlQueryShList } from "@/api/huiShangyp/strategicApi.js";
|
||||
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
|
||||
import Ypdolog from './ypdolog.vue'
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
|
||||
|
||||
const searchBox = ref(); //搜索框
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
|
||||
onMounted(() => {
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
nextTick(() => {
|
||||
addForm.value && addForm.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
|
||||
})
|
||||
}
|
||||
getList()
|
||||
});
|
||||
const searchConfiger = ref([
|
||||
{ label: "研判议题", prop: 'ypyt', placeholder: "请输入研判议题", showType: "input" },
|
||||
]);
|
||||
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
loading: false
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
controlsWidth: 240,
|
||||
tableColumn: [
|
||||
{ label: "研判议题", prop: "ypyt" },
|
||||
{ label: "报告类型", prop: "bglx", showSolt: true },
|
||||
{ label: "审核状态", prop: "shzt", showSolt: true },
|
||||
{ label: "研判时间", prop: "ypsj" },
|
||||
{ label: "研判要求", prop: "ypyq" },
|
||||
{ label: "发起部门", prop: "ssbm" },
|
||||
{ label: "研判方式", prop: "ypfs", showSolt: true },
|
||||
]
|
||||
});
|
||||
|
||||
const queryFrom = ref({});
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
const promes = {
|
||||
...val,
|
||||
...pageData.pageConfiger,
|
||||
}
|
||||
queryFrom.value = { ...promes }
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
}
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList()
|
||||
}
|
||||
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value };
|
||||
ypbgSjzlQueryShList(data).then(res => {
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch(() => { pageData.tableConfiger.loading = false; })
|
||||
}
|
||||
// 工作流
|
||||
const showSp = ref(false);
|
||||
const rowData = ref()
|
||||
// 固定值
|
||||
const fixedValue = {
|
||||
clueVerification: 'information',
|
||||
byMeansOf: 'ypbg/sjzl/sendFqzl',
|
||||
nobyMeansOf: 'ypbg/sjzl/sendFqzl',
|
||||
recycle: 'ypbg/sjzl/sendFqzl',
|
||||
}
|
||||
const createProcess = (row) => {
|
||||
|
||||
if (row.shzt == '02') {
|
||||
showSp.value = true;
|
||||
rowData.value = row
|
||||
} else {
|
||||
proxy.$message({
|
||||
message: '请先内部审批',
|
||||
type: 'warning'
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
// 内部审核
|
||||
const showYpdolog = ref(false)
|
||||
const dataList = ref({})
|
||||
const internalAudit = (row) => {
|
||||
dataList.value = row
|
||||
showYpdolog.value = true
|
||||
};
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.label-pop {
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: '*';
|
||||
top: 0;
|
||||
left: -7px;
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
|
||||
:v-deep .el-dialog {
|
||||
width: 90% !important;
|
||||
}
|
||||
|
||||
.zdy-model-dialogs {
|
||||
/* background-color: rgb(50, 148, 214); */
|
||||
background: url("~@/assets/images/bg46.png") no-repeat center center;
|
||||
background-size: 100% 100%;
|
||||
padding: 8px 10px;
|
||||
box-sizing: border-box;
|
||||
pointer-events: auto !important;
|
||||
height: calc(100% - 50px);
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,186 @@
|
||||
<template>
|
||||
<div class="information-container">
|
||||
<h2 class="page-title">研判详情</h2>
|
||||
<div class="info-section">
|
||||
<div class="info-row">
|
||||
<div class="info-item">
|
||||
<span class="label">研判议题:</span>
|
||||
<span class="value">{{ detail.ypyt || '暂无' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">研判方式:</span>
|
||||
<span class="value">
|
||||
<DictTag v-if="detail.ypfs && D_BZ_YPFS" :tag="false" :value="detail.ypfs" :options="D_BZ_YPFS" />
|
||||
<span v-else>暂无</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<div class="info-item">
|
||||
<span class="label">报告类型:</span>
|
||||
<span class="value">
|
||||
<DictTag v-if="detail.bglx && D_BZ_YPLX" :tag="false" :value="detail.bglx" :options="D_BZ_YPLX" />
|
||||
<span v-else>暂无</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">研判时间:</span>
|
||||
<span class="value">{{ detail.ypsj || '暂无' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<div class="info-item">
|
||||
<span class="label">研判要求:</span>
|
||||
<span class="value">{{ detail.ypyq || '暂无' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="label">发起部门:</span>
|
||||
<span class="value">{{ detail.ssbm || '暂无' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 新增数据展示模块 -->
|
||||
<div class="data-section">
|
||||
<h3 class="section-title">研判部门详情</h3>
|
||||
<el-table :data="detail.cyypList" stripe style="width: 100%" border>
|
||||
<el-table-column prop="ypbmmc" label="研判部门" min-width="150" />
|
||||
<el-table-column prop="scyq" label="上传要求" min-width="200" />
|
||||
<el-table-column prop="fj" label="附件" min-width="150" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.fj">
|
||||
<span v-for="(file, index) in JSON.parse(scope.row.fj)" :key="index">
|
||||
{{ file.name }}<span v-if="index < JSON.parse(scope.row.fj).length - 1">、</span>
|
||||
</span>
|
||||
</span>
|
||||
<span v-else>暂无</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="wcqk" label="完成情况" min-width="120">
|
||||
<template #default="scope">
|
||||
{{ scope.row.wcqk == '01' ? '准备中' : '已完成' }}
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="wcsj" label="完成时间" min-width="180" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import DictTag from '@/components/DictTag/index.vue';
|
||||
import { onMounted ,ref,getCurrentInstance} from 'vue';
|
||||
import { useRoute } from 'vue-router'
|
||||
import {sjzlGetInfo} from '@/api/yj'
|
||||
const props = defineProps({
|
||||
|
||||
/** 字典数据 */
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
});
|
||||
const route = useRoute();
|
||||
const { proxy } = getCurrentInstance();
|
||||
const {D_BZ_YPFS, D_BZ_YPLX}=proxy.$dict("D_BZ_YPFS","D_BZ_YPLX");
|
||||
const detail=ref({});
|
||||
// 新增:存储用户提供的研判部门详情数据
|
||||
const departmentData=ref([
|
||||
{
|
||||
"id": "ae9c8db058fc4bc6b18bc98ab6ef0abd",
|
||||
"sjzlid": "1d538226c8c94577ab3e97f67e7e90bf",
|
||||
"ypbmdm": "540421000000",
|
||||
"ypbmmc": "工布江达县",
|
||||
"scyq": "测试",
|
||||
"fj": "[{\"id\":null,\"name\":\"app登录接口.txt\"}]",
|
||||
"wcqk": "02",
|
||||
"wcsj": "2025-12-26 15:12:29"
|
||||
},
|
||||
{
|
||||
"id": "eef7b85a85784ea4b5211e4330162720",
|
||||
"sjzlid": "1d538226c8c94577ab3e97f67e7e90bf",
|
||||
"ypbmdm": "540402000000",
|
||||
"ypbmmc": "巴宜区",
|
||||
"scyq": "测试",
|
||||
"fj": "[{\"id\":null,\"name\":\"Mosty888.csr\"}]",
|
||||
"wcqk": "02",
|
||||
"wcsj": "2025-12-26 15:12:29"
|
||||
}
|
||||
]);
|
||||
onMounted(() => {
|
||||
console.log(route.query.id);
|
||||
sjzlGetInfo(route.query.id).then(res => {
|
||||
detail.value=res;
|
||||
console.log(res);
|
||||
})
|
||||
});
|
||||
// /ypbg/sjzl/{id}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.information-container {
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
background-color: #fff;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.page-title {
|
||||
color: #303133;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
}
|
||||
|
||||
.info-section {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.info-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 1;
|
||||
min-width: 300px;
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.label {
|
||||
font-weight: bold;
|
||||
color: #606266;
|
||||
margin-right: 12px;
|
||||
width: 100px;
|
||||
text-align: right;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.value {
|
||||
color: #303133;
|
||||
flex: 1;
|
||||
line-height: 32px;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
/* 新增:数据展示模块样式 */
|
||||
.data-section {
|
||||
margin-top: 30px;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid #e8e8e8;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
color: #303133;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,92 @@
|
||||
<template>
|
||||
<el-dialog v-model="modelValue" title="内部审核" width="35%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 15vh; overflow: auto;">
|
||||
<el-form ref="ruleFormRef" :rules="rules" :model="form" label-width="auto" style="max-width: 600px">
|
||||
<el-form-item label="审核状态" prop="shzt">
|
||||
<el-radio-group v-model="form.shzt">
|
||||
<el-radio label="02">通过</el-radio>
|
||||
<el-radio label="03">拒绝</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="审核意见" prop="shyj">
|
||||
<el-input v-model="form.shyj" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="closeDialog(ruleFormRef)">取消</el-button>
|
||||
<el-button type="primary" @click="submitForm(ruleFormRef)">确认 </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
|
||||
import { ref, reactive, getCurrentInstance, watch } from "vue";
|
||||
import { ypbgSjzlYpsp } from '@/api/huiShangyp/strategicApi.js'
|
||||
const { proxy } = getCurrentInstance()
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
dataList: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue','getList'])
|
||||
const closeDialog = (formEl) => {
|
||||
if (!formEl) return
|
||||
formEl.resetFields()
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
const rules = reactive({
|
||||
shzt: [
|
||||
{ required: true, message: '请选择审核状态', trigger: 'blur' }
|
||||
],
|
||||
shyj: [
|
||||
{ required: true, message: '请输入审核意见', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const ruleFormRef = ref(null)
|
||||
const form = reactive({
|
||||
shzt: '',
|
||||
shyj: ''
|
||||
})
|
||||
|
||||
const submitForm = async (formEl) => {
|
||||
if (!formEl) return
|
||||
await formEl.validate((valid, fields) => {
|
||||
if (valid) {
|
||||
const promise = {
|
||||
...form,
|
||||
ypid: props.dataList
|
||||
}
|
||||
|
||||
ypbgSjzlYpsp(promise).then(res => {
|
||||
proxy.$message({
|
||||
message: '操作成功',
|
||||
type: 'success'
|
||||
})
|
||||
emit('getList')
|
||||
formEl.resetFields()
|
||||
emit('update:modelValue', false)
|
||||
})
|
||||
} else {
|
||||
console.log('error submit!', fields)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
@ -8,20 +8,19 @@
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding-bottom: 0px;" class="form_cnt">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title === '详情'">
|
||||
<template #bmList>
|
||||
<div class="table-box">
|
||||
<el-table :data="tableList" border style="width: 100%">
|
||||
<el-table-column prop="ypbmmc" label="部门" width="150" align="center" />
|
||||
<el-table-column label="研判素材" width="280" align="center">
|
||||
<el-table-column label="研判素材" width="380" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.scyq" :disabled="true" placeholder="请输入研判素材" />
|
||||
<el-input v-model="row.scyq" placeholder="请输入研判素材" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="附件" width="200" align="center">
|
||||
<template #default="{ row }">
|
||||
<UploadFile v-model="row.fj" :disabled="true" :limit="1" :isImg="false"
|
||||
:isAll="true" />
|
||||
<UploadFile v-model="row.fj" :limit="1" :isImg="false" :isAll="true" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="wcqk" label="完成状态" width="120" align="center">
|
||||
@ -91,17 +90,29 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
/**
|
||||
* @typedef {Object} JudgmentDept 研判部门对象
|
||||
* @property {string} ypbmdm - 研判部门代码
|
||||
* @property {string} ypbmmc - 研判部门名称
|
||||
* @property {string} scyq - 素材要求
|
||||
* @property {Array} fj - 附件数组
|
||||
* @property {string} wcqk - 完成情况(01 准备中、02 已完成)
|
||||
*/
|
||||
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import UploadFile from "@/components/MyComponents/Upload/index.vue";
|
||||
// import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue";
|
||||
import { sjzlAddEntity, sjzlEditEntity, sjzlGetInfo, sjzlPerfectlnfo, sjzlFstz, sjzlQryp, sjzlPerfectSorce } from '@//api/yj.js'
|
||||
import { sjzlGetInfo, sjzlPerfectlnfo, sjzlFstz, sjzlQryp, sjzlPerfectSorce } from '@//api/yj.js'
|
||||
import { selfBuildJudgment } from "@/api/huiShangyp/tacticalApi.js"
|
||||
// import { tacticalGet, strategicDelete } from "@/api/huiShangyp/strategicApi.js";
|
||||
import { getItem } from '@//utils/storage.js'
|
||||
|
||||
const emit = defineEmits(["updateDate", "getList"]);
|
||||
const props = defineProps({
|
||||
dict: Object
|
||||
dict: Object,
|
||||
/** 报告类型 01 战术研判 02战略研判 */
|
||||
bglx: String,
|
||||
});
|
||||
const imgMsg = ref([])
|
||||
const { proxy } = getCurrentInstance();
|
||||
@ -147,7 +158,7 @@ watch(() => props.dict, (val) => {
|
||||
formData.value = [
|
||||
{ label: "研判议题", prop: "ypyt", type: "input", width: '48%' },
|
||||
{ label: "研判时间", prop: "ypsj", type: "datetime", width: '48%' },
|
||||
{ label: "报告类型", prop: "bglx", type: "radio", options: props.dict.D_BZ_YPLX, width: '48%' },
|
||||
{ label: "报告类型", prop: "bglx", type: "radio", options: props.dict.D_BZ_YPLX, width: '48%', disabled: true },
|
||||
{ label: "研判方式", prop: "ypfs", type: "radio", options: props.dict.D_BZ_YPFS, width: '48%' },
|
||||
{ label: "参与研判部门", prop: "jsdxBmDm", type: "department", multiple: true, depMc: 'jsdxBmMc', width: '48%' },
|
||||
{ label: "研判要求", prop: "ypyq", type: "textarea", width: '100%' },
|
||||
@ -165,6 +176,8 @@ function updateDis(row) {
|
||||
const isFinish = row.wcqk === '02'
|
||||
return isShiQingBaoZhongXin.value || !iscjr || isFinish
|
||||
}
|
||||
|
||||
/** 获取附件数组 */
|
||||
function getFjArr(fj) {
|
||||
if (typeof fj !== 'string' || !fj) return []
|
||||
let fjArr = []
|
||||
@ -176,15 +189,16 @@ function getFjArr(fj) {
|
||||
return fjArr
|
||||
}
|
||||
watch(() => listQuery.value.jsdxBmDm, (val) => {
|
||||
/** @type {Array<{ypbmdm: string, ypbmmc: string, scyq: string, fj: Array, wcqk: string}>} 参与研判部门数据数组 */
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const arr = Array.isArray(val) ? val : []
|
||||
/** @type {Array} 参与研判部门*/
|
||||
const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : []
|
||||
|
||||
tableList.value = arr.map((item, i) => {
|
||||
/** 找原来的对象 */
|
||||
const curr = cyypList.find(item2 => item2.ypbmdm == item) || {}
|
||||
/** 是否是新增 */
|
||||
const isAddForm = !listQuery.value.id
|
||||
const isAddForm = !listQuery.value?.id
|
||||
return {
|
||||
// id: null,
|
||||
// sjzlid: null, // 研判战略研判ID
|
||||
@ -203,13 +217,24 @@ watch(() => listQuery.value.jsdxBmDm, (val) => {
|
||||
const init = (type, row, wjlb) => {
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
|
||||
outRow.value = row || {}
|
||||
if (row) { getDataById(row.id) }
|
||||
outRow.value = row
|
||||
if (row) {
|
||||
getDataById(row.id)
|
||||
} else {
|
||||
listQuery.value = {
|
||||
bglx: props.bglx, // 报告类型 01 战术研判 02战略研判
|
||||
ypfs: undefined, // 研判方式
|
||||
ypsj: undefined, // 研判时间
|
||||
ypyq: undefined, // 研判要求
|
||||
cyypList: [], // 参与研判部门数据数组
|
||||
}
|
||||
}
|
||||
};
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
sjzlGetInfo(id).then((res) => {
|
||||
listQuery.value = res || {};
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []
|
||||
listQuery.value.jsdxBmDm = cyypList.map(item => {
|
||||
return item.ypbmdm
|
||||
@ -219,17 +244,17 @@ const getDataById = (id) => {
|
||||
})
|
||||
});
|
||||
};
|
||||
/** 获取附件json字符串 */
|
||||
function getFjString(arr) {
|
||||
arr = Array.isArray(arr) ? arr : []
|
||||
return JSON.stringify(arr)
|
||||
}
|
||||
/**获取下发部门数据 */
|
||||
const getXfbmList = () => {
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : []
|
||||
|
||||
return tableList.value.map((item, i) => {
|
||||
|
||||
/** 找原来的对象 */
|
||||
/** @type {JudgmentDept} 找原来的对象 */
|
||||
const curr = cyypList.find(item => item.ypbmdm == item.ypbmdm) || {}
|
||||
return {
|
||||
id: curr.id || null,
|
||||
@ -252,21 +277,14 @@ const submit = () => {
|
||||
let params = {
|
||||
...listQuery.value,
|
||||
cyypList: xfbmList,
|
||||
// cyypList: listQuery.value.jsdxBmDm.map((item, index) => {
|
||||
// return {
|
||||
// ypbmdm: item,
|
||||
// ypbmmc: listQuery.value.jsdxBmMc[index],
|
||||
// ypcylx: '01'
|
||||
// }
|
||||
// })
|
||||
};
|
||||
try {
|
||||
loading.value = true;
|
||||
let res
|
||||
if (title.value == "新增") {
|
||||
res = await sjzlAddEntity(params)
|
||||
res = await selfBuildJudgment(params)
|
||||
} else {
|
||||
res = await sjzlEditEntity(params)
|
||||
// res = await sjzlEditEntity(params)// 目前没有修改
|
||||
}
|
||||
if (res && res > 0) {
|
||||
loading.value = false;
|
||||
@ -358,7 +376,7 @@ const submitMaterialAction = async () => {
|
||||
closeMaterialDialog()
|
||||
if (outRow.value.id) { getDataById(outRow.value.id) }
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
|
||||
} finally {
|
||||
materialLoading.value = false
|
||||
}
|
||||
@ -384,7 +402,7 @@ const sendNotice = () => {
|
||||
proxy.$message({ type: "success", message: "下发通知成功" });
|
||||
close();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
} finally {
|
||||
noticeLoading.value = false;
|
||||
}
|
||||
@ -405,7 +423,7 @@ const confirmJudgment = () => {
|
||||
proxy.$message({ type: "success", message: "确认研判成功" });
|
||||
close();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
} finally {
|
||||
confirmLoading.value = false;
|
||||
}
|
||||
|
||||
@ -0,0 +1,137 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span class="title">创建会议{{ title }} </span>
|
||||
<div>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
<!-- <template #glxsmc>
|
||||
<el-input placeholder="请选择关联线索" @click="chooseVisiblexS = true" readonly v-model="listQuery.glxsmc"></el-input>
|
||||
</template> -->
|
||||
<template #chryList>
|
||||
<el-input placeholder="请选择参会人员" @click="openMeetings = true" readonly v-model="listQuery.rymc"></el-input>
|
||||
</template>
|
||||
</FormMessage>
|
||||
</div>
|
||||
</div>
|
||||
<Personnel v-model="openMeetings" />
|
||||
<ChooseUser v-model="chooseVisible" :Single="false" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
|
||||
<Xslist v-model="chooseVisiblexS" @choosed="choosed" :roleIds="roleIdsxs"></Xslist>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
|
||||
// import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import Personnel from '@/views/backOfficeSystem/JudgmentHome/MeetingRoom/components/Communications/personnel.vue'
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, } from "vue";
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
const emit = defineEmits(["updateDate"]);
|
||||
|
||||
const roleIds = ref([]); //角色id
|
||||
const chooseVisible = ref(false);
|
||||
const roleIdsxs = ref([]); //角色id
|
||||
const chooseVisiblexS = ref(false);
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const rules = reactive({
|
||||
hskssj: [{ required: true, message: "请选择会商开始时间", trigger: "change" }],
|
||||
hsjssj: [{ required: true, message: "请选择会商结束时间", trigger: "change" }],
|
||||
hsnr: [{ required: true, message: "请输入会商内容", trigger: "blur" }],
|
||||
hsbt: [{ required: true, message: "请输入会商标题", trigger: "blur" }],
|
||||
// glxsmc: [{ required: true, message: "请选择关联线索", trigger: "change" }],
|
||||
chryList: [{ required: true, message: "请选择参会人员", trigger: "change" }],
|
||||
});
|
||||
const formData = ref([
|
||||
{ label: "会商开始时间", prop: "hskssj", type: "datetime" },
|
||||
{ label: "会商结束时间", prop: "hsjssj", type: "datetime" },
|
||||
{ label: "会商内容", prop: "hsnr", type: "textarea", width: "100%" },
|
||||
// { label: "关联线索", prop: "glxsmc", type: "slot", },
|
||||
{ label: "会商标题", prop: "hsbt", type: "input" },
|
||||
// { label: "参会人员", prop: "chryList", type: "slot" ,width:'100%'},
|
||||
]);
|
||||
const listQuery = ref({}); //表单
|
||||
const loading = ref(false);
|
||||
const elform = ref();
|
||||
const title = ref("");
|
||||
const outRow = ref({})
|
||||
// 初始化数据
|
||||
const init = (type, row, outRowObj = {}) => {
|
||||
outRow.value = outRowObj
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : "编辑";
|
||||
if (row) {
|
||||
getDataById(row.id)
|
||||
} else {
|
||||
listQuery.value = {
|
||||
hskssj: dayjs().format("YYYY-MM-DD HH:mm:ss"),
|
||||
hsjssj: dayjs().add(1, "hour").format("YYYY-MM-DD HH:mm:ss"),
|
||||
}
|
||||
}
|
||||
};
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
qcckGet({ id }, "/mosty-gsxt/wshs/selectByid").then((res) => {
|
||||
res.rymc = res.chryList ? res.chryList.map(v => v.chryxm).join(",") : '';
|
||||
res.chryList = res.chryList ? res.chryList.map(item => item.chryid) : [];
|
||||
roleIds.value = res.chryList;
|
||||
roleIdsxs.value = res.glxsid ? [res.glxsid] : [];
|
||||
listQuery.value = res;
|
||||
});
|
||||
};
|
||||
|
||||
const handleUserSelected = (userData) => {
|
||||
roleIds.value = userData.map(item => item.id);
|
||||
listQuery.value.chryList = userData.map(item => item.id)
|
||||
listQuery.value.rymc = userData.map(item => item.userName).join("、");
|
||||
};
|
||||
|
||||
const choosed = (data) => {
|
||||
listQuery.value.glxsmc = data[0].xsMc;
|
||||
listQuery.value.glxsid = data[0].id;
|
||||
roleIdsxs.value = data.map(item => item.id);
|
||||
};
|
||||
|
||||
// 提交
|
||||
const submit = () => {
|
||||
elform.value.submit((data) => {
|
||||
let url = title.value == "新增" ? "/mosty-gsxt/wshs/add" : "/mosty-gsxt/wshs/update";
|
||||
let params = {
|
||||
...data,
|
||||
glxsid: outRow.value.id,
|
||||
glxsmc: outRow.value.xsMc,
|
||||
};
|
||||
loading.value = true;
|
||||
qcckPost(params, url).then(() => {
|
||||
loading.value = false;
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("updateDate");
|
||||
close();
|
||||
}).catch(() => { loading.value = false; });
|
||||
});
|
||||
};
|
||||
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
roleIds.value = [];
|
||||
roleIdsxs.value = [];
|
||||
dialogForm.value = false;
|
||||
loading.value = false;
|
||||
};
|
||||
// 选择参会人员
|
||||
const openMeetings = ref(false)
|
||||
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
</style>
|
||||
@ -0,0 +1,273 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span class="title">报告{{ title }} </span>
|
||||
<div>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules">
|
||||
<template #bgnr>
|
||||
<el-input v-model="listQuery.bgnr" style="width: 100%" placeholder="请输入关键字" class="input-with-select">
|
||||
<template #append>
|
||||
<el-button :icon="Search" type="primary">搜索</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</template>
|
||||
<template #fj><el-button type="primary" @click="showText = true">附件上传</el-button></template>
|
||||
</FormMessage>
|
||||
<div class="cntBox">
|
||||
<!-- 工具栏 -->
|
||||
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig"
|
||||
:mode="mode" />
|
||||
<!-- 编辑器 -->
|
||||
<Editor :style="`height: 480px; overflow-y: hidden`" v-model="textContent" :defaultConfig="editorConfig"
|
||||
:mode="mode" @onCreated="handleCreated" @onChange="handChange" />
|
||||
|
||||
</div>
|
||||
<div v-if="outRow.id" style="display: flex; justify-content: center;">
|
||||
<!-- <el-button style="display: block;" type="primary" @click="ConsultationShow = true">网上会商</el-button> -->
|
||||
<el-button style="display: block;" type="primary" @click="downloadWithStyles(textContent)">下载</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 文字解析 -->
|
||||
<ExtractionText v-model="showText" @change="getText"></ExtractionText>
|
||||
<!-- 网上会商 -->
|
||||
<!-- <Consultation v-model="ConsultationShow" /> -->
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { timeValidate } from '@/utils/tools.js'
|
||||
import ExtractionText from "@/components/ExtractionText/index.vue";
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
|
||||
import "@wangeditor/editor/dist/css/style.css";
|
||||
// import Consultation from './consultation.vue'
|
||||
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue";
|
||||
import { gsxtYpbgAddEntity, gsxtYpbgEditEntity } from "@/api/huiShangyp/tacticalApi.js"
|
||||
|
||||
const emit = defineEmits(["updateDate", 'ok']);
|
||||
const props = defineProps({
|
||||
dic: Object,
|
||||
});
|
||||
|
||||
|
||||
const ConsultationShow = ref(false)
|
||||
const showText = ref(false);
|
||||
const textContent = ref()
|
||||
const { proxy } = getCurrentInstance();
|
||||
const editorRef = shallowRef();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const mode = "default";
|
||||
const dataBt = ref(`<p class="html_bt">
|
||||
<h4 style=\"text-align: center;\"><span style=\"color: rgb(225, 60, 57); font-size: 32px; font-family: 标楷体;\">林芝市公安局情指中心</span></h4>
|
||||
<h4 style=\"text-align: center;\"><span style=\"color: rgb(225, 60, 57); font-size: 32px; font-family: 标楷体;\">研判专刊(初稿)</span></h4></p>
|
||||
<p style="text-align: center;"><span style="color: rgb(225, 60, 57); font-size: 22px; font-family: 标楷体;">市公安局情指中心编</span></p>
|
||||
<p style="text-align: center;"><span style="color: rgb(225, 60, 57); font-size: 22px; font-family: 标楷体;"> ${timeValidate(new Date(), 'td')}</span></p>
|
||||
<hr/>`)
|
||||
//编辑器配置
|
||||
const editorConfig = {
|
||||
withCredentials: true, //允许跨域
|
||||
placeholder: props.placeholder, //提示语
|
||||
MENU_CONF: {
|
||||
uploadImage: {
|
||||
// 自定义上传图片
|
||||
async customUpload(file, insertFn) {
|
||||
let fileBlob = await compressImage(file);
|
||||
let fileData = new File([fileBlob], fileBlob.name, { type: fileBlob.type });
|
||||
if (fileData.size > 2 * 1024 * 1024) {
|
||||
ElMessage({ message: "图片超过2MB", type: "success" });
|
||||
} else {
|
||||
await uploadFn(fileData, insertFn);
|
||||
}
|
||||
}
|
||||
},
|
||||
uploadVideo: {
|
||||
// 自定义上传视频
|
||||
async customUpload(file, insertFn) {
|
||||
await uploadFn(file, insertFn);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//工具配置
|
||||
const toolbarConfig = {
|
||||
excludeKeys: ["blockquote", "codeBlock"] //清除不必要的工具,引用和代码块
|
||||
};
|
||||
const rules = reactive({
|
||||
jymc: [
|
||||
{ required: true, message: "请输入经验名称", trigger: "blur" }
|
||||
],
|
||||
fbnr: [
|
||||
{ required: true, message: "请输入经验内容", trigger: "blur" }
|
||||
]
|
||||
});
|
||||
const formData = ref([
|
||||
{ label: "报告名称", prop: "bgmc", type: "input", width: "100%", blur: setEditorTextContent },
|
||||
{ label: "报告内容", prop: "bgnr", type: "slot", width: "100%", blur: setEditorTextContent },
|
||||
// { label: "附件内容", prop: "fj", type: "slot", width: "100%" },
|
||||
]);
|
||||
const listQuery = ref({
|
||||
bgmc: "",
|
||||
bgnr: "",
|
||||
fj: ""
|
||||
}); //表单
|
||||
const loading = ref(false);
|
||||
const elform = ref();
|
||||
const title = ref("");
|
||||
/** 外面行数据 */
|
||||
const outRow = ref({})
|
||||
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, reportData, row) => {
|
||||
|
||||
listQuery.value = {
|
||||
bgmc: reportData.bgmc,
|
||||
bgnr: reportData.bgnr,
|
||||
id: reportData.id,
|
||||
// fj: reportData.fj
|
||||
}
|
||||
outRow.value = { ...row }
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : "编辑";
|
||||
setEditorTextContent()
|
||||
};
|
||||
const getText = (val, row = {}) => {
|
||||
listQuery.value.fj = val.text;
|
||||
setEditorTextContent()
|
||||
}
|
||||
|
||||
function setEditorTextContent() {
|
||||
let html = dataBt.value;
|
||||
|
||||
|
||||
html += `<p style="text-align: center;"><span style="font-size: 22px;">${listQuery.value.bgmc || ''}</span></p>`
|
||||
html += `<p>${listQuery.value.fj || ''}</p>`
|
||||
textContent.value = html
|
||||
}
|
||||
|
||||
// watch(() => listQuery.value, (val) => {
|
||||
|
||||
// },
|
||||
// {
|
||||
// deep: true, immediate: true
|
||||
// })
|
||||
// 提交
|
||||
const submit = () => {
|
||||
elform.value.submit((data) => {
|
||||
// let url = title.value == "新增" ? "/mosty-gsxt/gsxt/jyfx/add" : "/mosty-gsxt/gsxt/jyfx/edit";
|
||||
|
||||
let params = {
|
||||
...data,
|
||||
ypid: outRow.value.id,
|
||||
ypmc: outRow.value.ypyt
|
||||
};
|
||||
const apiFun = !listQuery.value.id ? gsxtYpbgAddEntity : gsxtYpbgEditEntity
|
||||
if (!listQuery.value.id) delete params.id
|
||||
apiFun(params).then(() => {
|
||||
loading.value = false;
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("ok");
|
||||
close();
|
||||
}).catch(() => {
|
||||
loading.value = false;
|
||||
})
|
||||
});
|
||||
};
|
||||
//编辑器创建成功
|
||||
const handleCreated = (editor) => {
|
||||
editorRef.value = editor;
|
||||
};
|
||||
//内容发生变化
|
||||
const handChange = (editor) => {
|
||||
// 判断是否是一个空段落,是空就传空文本
|
||||
|
||||
|
||||
};
|
||||
onBeforeUnmount(() => {
|
||||
const editor = editorRef.value;
|
||||
if (editor) editor.destroy();
|
||||
});
|
||||
|
||||
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
loading.value = false;
|
||||
dialogForm.value = false;
|
||||
listQuery.value = {}
|
||||
};
|
||||
|
||||
|
||||
// 带样式的下载方法
|
||||
const downloadWithStyles = (textContent) => {
|
||||
|
||||
const wordDocument = `
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>富文本导出</title>
|
||||
<style>
|
||||
/* 应用两端对齐样式 */
|
||||
body {
|
||||
text-align: justify;
|
||||
text-justify: inter-character; /* 中文文本两端对齐 */
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
}
|
||||
p {
|
||||
text-align: justify;
|
||||
text-justify: inter-character;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
${textContent}
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
const blob = new Blob([wordDocument], {
|
||||
type: 'application/msword'
|
||||
});
|
||||
|
||||
saveAs(blob, '战略研判报告.doc');
|
||||
};
|
||||
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
|
||||
.boxlist {
|
||||
width: 99%;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-textarea__inner {
|
||||
min-height: 550px !important;
|
||||
}
|
||||
|
||||
.html_bt>>>p {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.html_bt {
|
||||
h4 {
|
||||
margin: 10px 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.cntBox {
|
||||
width: 80vw;
|
||||
margin: 0 auto;
|
||||
}
|
||||
</style>
|
||||
@ -2,12 +2,12 @@
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="战略研判">
|
||||
<!-- <el-button type="primary" @click="getDataById('add', '')">
|
||||
<el-button type="primary" @click="selfCreateResearch('add')">
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">新增</span>
|
||||
</el-button> -->
|
||||
<span style="vertical-align: middle">自建研判</span>
|
||||
</el-button>
|
||||
|
||||
</PageTitle>
|
||||
</div>
|
||||
@ -28,7 +28,10 @@
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<!-- <el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link> -->
|
||||
<el-link size="small" type="danger" @click="getypbgSjzlTjspId(row.id)" >提交申请</el-link>
|
||||
<el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link>
|
||||
<el-link size="small" type="primary" @click="createReport(row)">{{ row.ypbg?.id ? '编辑' : '创建' }}报告</el-link>
|
||||
<el-link size="small" type="success" @click="createMeeting(row)">创建会议</el-link>
|
||||
<el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -38,7 +41,12 @@
|
||||
}"></Pages>
|
||||
</div>
|
||||
</div>
|
||||
<AddForm ref="addForm" @getList="getList" :dict="{ D_BZ_YPFS, D_BZ_YPLX }" />
|
||||
<AddForm ref="addForm" :bglx="bglx" @getList="getList" :dict="{ D_BZ_YPFS, D_BZ_YPLX }" />
|
||||
|
||||
<!-- 创建报告 -->
|
||||
<addReport ref="reportTc" :row="currRow" :dic="{ D_GS_BQ_LX }" @ok="getList" />
|
||||
<!-- 创建报告 -->
|
||||
<addMeeting ref="meetingTc" :row="currRow" @updateDate="getList" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -46,21 +54,33 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import { useRoute } from 'vue-router'
|
||||
import { tacticalGet, strategicDelete } from "@/api/huiShangyp/strategicApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch,computed } from "vue";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { tacticalGet, strategicDelete } from "@/api/huiShangyp/tacticalApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue";
|
||||
import {ypbgSjzlTjspId} from "@/api/huiShangyp/strategicApi.js"
|
||||
import addReport from "./addReport.vue";
|
||||
import AddForm from "./addForm.vue";
|
||||
import addMeeting from "./addMeeting.vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_YPFS, D_BZ_YPLX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX")
|
||||
const detailDiloag = ref();
|
||||
const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
|
||||
|
||||
/** 报告弹框 */
|
||||
const reportTc = ref();
|
||||
/** 会议弹框 */
|
||||
const meetingTc = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
|
||||
onMounted(() => {
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
detailDiloag.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
return
|
||||
nextTick(() => {
|
||||
addForm.value && addForm.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
|
||||
})
|
||||
}
|
||||
getList()
|
||||
});
|
||||
@ -98,8 +118,12 @@ const pageData = reactive({
|
||||
{ label: "发起部门", prop: "ssbm" },
|
||||
]
|
||||
});
|
||||
const queryFrom = ref({});
|
||||
|
||||
const isShowReport = ref(false)
|
||||
const currRow = ref({})
|
||||
const queryFrom = ref({});
|
||||
/** 报告类型 01 战术研判 02 战略研判*/
|
||||
const bglx = ref('02')
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
const promes = {
|
||||
@ -136,11 +160,11 @@ const getList = () => {
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () {
|
||||
window.onresize = function() {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
const route = useRoute()
|
||||
// const route = useRoute()
|
||||
|
||||
const addForm = ref(null)
|
||||
const getDataById = (type, row) => {
|
||||
@ -163,6 +187,39 @@ const deleteFile = (row) => {
|
||||
proxy.$message.info('已取消删除');
|
||||
});
|
||||
}
|
||||
|
||||
const selfCreateResearch = (type = 'add') => {
|
||||
addForm.value.init(type, null, '01');
|
||||
}
|
||||
/** 创建报告 */
|
||||
const createReport = (row) => {
|
||||
const type = !row.id ? 'add' : 'edit'
|
||||
reportTc.value.init(type, row?.ypbg || {}, row)
|
||||
// currRow.value = { ...row }
|
||||
// isShowReport.value = true
|
||||
}
|
||||
/** 创建会议 */
|
||||
const createMeeting = (row) => {
|
||||
meetingTc.value.init('add', null, row)
|
||||
// currRow.value = { ...row }
|
||||
// isShowReport.value = true
|
||||
}
|
||||
// 提交研判
|
||||
const getypbgSjzlTjspId = (id) => {
|
||||
proxy.$confirm('确定提交研判申请吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
ypbgSjzlTjspId(id).then((res) => {
|
||||
proxy.$message.success('提交成功');
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {
|
||||
proxy.$message.info('已取消提交');
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@ -8,20 +8,19 @@
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding-bottom: 0px;" class="form_cnt">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title === '详情'">
|
||||
<template #bmList>
|
||||
<div class="table-box">
|
||||
<el-table :data="tableList" border style="width: 100%">
|
||||
<el-table-column prop="ypbmmc" label="部门" width="150" align="center" />
|
||||
<el-table-column label="研判素材" width="380" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.scyq" type="textarea" :rows="3" :disabled="true" placeholder="请输入研判素材" />
|
||||
<el-input v-model="row.scyq" placeholder="请输入研判素材" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="附件" width="200" align="center">
|
||||
<template #default="{ row }">
|
||||
<UploadFile v-model="row.fj" :disabled="true" :limit="1" :isImg="false"
|
||||
:isAll="true" />
|
||||
<UploadFile v-model="row.fj" :limit="1" :isImg="false" :isAll="true" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="wcqk" label="完成状态" width="120" align="center">
|
||||
@ -91,16 +90,29 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
/**
|
||||
* @typedef {Object} JudgmentDept 研判部门对象
|
||||
* @property {string} ypbmdm - 研判部门代码
|
||||
* @property {string} ypbmmc - 研判部门名称
|
||||
* @property {string} scyq - 素材要求
|
||||
* @property {Array} fj - 附件数组
|
||||
* @property {string} wcqk - 完成情况(01 准备中、02 已完成)
|
||||
*/
|
||||
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import UploadFile from "@/components/MyComponents/Upload/index.vue";
|
||||
// import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue";
|
||||
import { sjzlAddEntity, sjzlEditEntity, sjzlGetInfo, sjzlPerfectlnfo, sjzlFstz, sjzlQryp, sjzlPerfectSorce } from '@//api/yj.js'
|
||||
import { sjzlGetInfo, sjzlPerfectlnfo, sjzlFstz, sjzlQryp, sjzlPerfectSorce } from '@//api/yj.js'
|
||||
import { selfBuildJudgment } from "@/api/huiShangyp/tacticalApi.js"
|
||||
// import { tacticalGet, strategicDelete } from "@/api/huiShangyp/strategicApi.js";
|
||||
import { getItem } from '@//utils/storage.js'
|
||||
|
||||
const emit = defineEmits(["updateDate", "getList"]);
|
||||
const props = defineProps({
|
||||
dict: Object
|
||||
dict: Object,
|
||||
/** 报告类型 01 战术研判 02战略研判 */
|
||||
bglx: String,
|
||||
});
|
||||
const imgMsg = ref([])
|
||||
const { proxy } = getCurrentInstance();
|
||||
@ -146,7 +158,7 @@ watch(() => props.dict, (val) => {
|
||||
formData.value = [
|
||||
{ label: "研判议题", prop: "ypyt", type: "input", width: '48%' },
|
||||
{ label: "研判时间", prop: "ypsj", type: "datetime", width: '48%' },
|
||||
{ label: "报告类型", prop: "bglx", type: "radio", options: props.dict.D_BZ_YPLX, width: '48%' },
|
||||
{ label: "报告类型", prop: "bglx", type: "radio", options: props.dict.D_BZ_YPLX, width: '48%', disabled: true },
|
||||
{ label: "研判方式", prop: "ypfs", type: "radio", options: props.dict.D_BZ_YPFS, width: '48%' },
|
||||
{ label: "参与研判部门", prop: "jsdxBmDm", type: "department", multiple: true, depMc: 'jsdxBmMc', width: '48%' },
|
||||
{ label: "研判要求", prop: "ypyq", type: "textarea", width: '100%' },
|
||||
@ -164,6 +176,8 @@ function updateDis(row) {
|
||||
const isFinish = row.wcqk === '02'
|
||||
return isShiQingBaoZhongXin.value || !iscjr || isFinish
|
||||
}
|
||||
|
||||
/** 获取附件数组 */
|
||||
function getFjArr(fj) {
|
||||
if (typeof fj !== 'string' || !fj) return []
|
||||
let fjArr = []
|
||||
@ -175,18 +189,19 @@ function getFjArr(fj) {
|
||||
return fjArr
|
||||
}
|
||||
watch(() => listQuery.value.jsdxBmDm, (val) => {
|
||||
/** @type {Array<{ypbmdm: string, ypbmmc: string, scyq: string, fj: Array, wcqk: string}>} 参与研判部门数据数组 */
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const arr = Array.isArray(val) ? val : []
|
||||
/** @type {Array} 参与研判部门*/
|
||||
const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : []
|
||||
|
||||
tableList.value = arr.map((item, i) => {
|
||||
/** 找原来的对象 */
|
||||
const curr = cyypList.find(item2 => item2.ypbmdm == item) || {}
|
||||
/** 是否是新增 */
|
||||
const isAddForm = !listQuery.value.id
|
||||
const isAddForm = !listQuery.value?.id
|
||||
return {
|
||||
// id: null,
|
||||
// sjzlid: null, // 研判战术研判ID
|
||||
// sjzlid: null, // 研判战略研判ID
|
||||
/** 部门代码 */
|
||||
ypbmdm: item,
|
||||
ypbmmc: listQuery.value.jsdxBmMc[i],
|
||||
@ -202,13 +217,24 @@ watch(() => listQuery.value.jsdxBmDm, (val) => {
|
||||
const init = (type, row, wjlb) => {
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
|
||||
outRow.value = row || {}
|
||||
if (row) { getDataById(row.id) }
|
||||
outRow.value = row
|
||||
if (row) {
|
||||
getDataById(row.id)
|
||||
} else {
|
||||
listQuery.value = {
|
||||
bglx: props.bglx, // 报告类型 01 战术研判 02战略研判
|
||||
ypfs: undefined, // 研判方式
|
||||
ypsj: undefined, // 研判时间
|
||||
ypyq: undefined, // 研判要求
|
||||
cyypList: [], // 参与研判部门数据数组
|
||||
}
|
||||
}
|
||||
};
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
sjzlGetInfo(id).then((res) => {
|
||||
listQuery.value = res || {};
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []
|
||||
listQuery.value.jsdxBmDm = cyypList.map(item => {
|
||||
return item.ypbmdm
|
||||
@ -218,21 +244,21 @@ const getDataById = (id) => {
|
||||
})
|
||||
});
|
||||
};
|
||||
/** 获取附件json字符串 */
|
||||
function getFjString(arr) {
|
||||
arr = Array.isArray(arr) ? arr : []
|
||||
return JSON.stringify(arr)
|
||||
}
|
||||
/**获取下发部门数据 */
|
||||
const getXfbmList = () => {
|
||||
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
|
||||
const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : []
|
||||
|
||||
return tableList.value.map((item, i) => {
|
||||
|
||||
/** 找原来的对象 */
|
||||
/** @type {JudgmentDept} 找原来的对象 */
|
||||
const curr = cyypList.find(item => item.ypbmdm == item.ypbmdm) || {}
|
||||
return {
|
||||
id: curr.id || null,
|
||||
sjzlid: curr.sjzlid || null, // 研判战术研判ID
|
||||
sjzlid: curr.sjzlid || null, // 研判战略研判ID
|
||||
ypbmdm: item.ypbmdm,
|
||||
ypbmmc: listQuery.value.jsdxBmMc[i],
|
||||
/** 素材要求 */
|
||||
@ -251,21 +277,14 @@ const submit = () => {
|
||||
let params = {
|
||||
...listQuery.value,
|
||||
cyypList: xfbmList,
|
||||
// cyypList: listQuery.value.jsdxBmDm.map((item, index) => {
|
||||
// return {
|
||||
// ypbmdm: item,
|
||||
// ypbmmc: listQuery.value.jsdxBmMc[index],
|
||||
// ypcylx: '01'
|
||||
// }
|
||||
// })
|
||||
};
|
||||
try {
|
||||
loading.value = true;
|
||||
let res
|
||||
if (title.value == "新增") {
|
||||
res = await sjzlAddEntity(params)
|
||||
res = await selfBuildJudgment(params)
|
||||
} else {
|
||||
res = await sjzlEditEntity(params)
|
||||
// res = await sjzlEditEntity(params)// 目前没有修改
|
||||
}
|
||||
if (res && res > 0) {
|
||||
loading.value = false;
|
||||
@ -357,7 +376,7 @@ const submitMaterialAction = async () => {
|
||||
closeMaterialDialog()
|
||||
if (outRow.value.id) { getDataById(outRow.value.id) }
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
|
||||
} finally {
|
||||
materialLoading.value = false
|
||||
}
|
||||
@ -383,7 +402,7 @@ const sendNotice = () => {
|
||||
proxy.$message({ type: "success", message: "下发通知成功" });
|
||||
close();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
} finally {
|
||||
noticeLoading.value = false;
|
||||
}
|
||||
@ -404,7 +423,7 @@ const confirmJudgment = () => {
|
||||
proxy.$message({ type: "success", message: "确认研判成功" });
|
||||
close();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
} finally {
|
||||
confirmLoading.value = false;
|
||||
}
|
||||
|
||||
@ -0,0 +1,137 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span class="title">创建会议{{ title }} </span>
|
||||
<div>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
<!-- <template #glxsmc>
|
||||
<el-input placeholder="请选择关联线索" @click="chooseVisiblexS = true" readonly v-model="listQuery.glxsmc"></el-input>
|
||||
</template> -->
|
||||
<template #chryList>
|
||||
<el-input placeholder="请选择参会人员" @click="openMeetings = true" readonly v-model="listQuery.rymc"></el-input>
|
||||
</template>
|
||||
</FormMessage>
|
||||
</div>
|
||||
</div>
|
||||
<Personnel v-model="openMeetings" />
|
||||
<ChooseUser v-model="chooseVisible" :Single="false" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
|
||||
<Xslist v-model="chooseVisiblexS" @choosed="choosed" :roleIds="roleIdsxs"></Xslist>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
|
||||
// import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import Personnel from '@/views/backOfficeSystem/JudgmentHome/MeetingRoom/components/Communications/personnel.vue'
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, } from "vue";
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
const emit = defineEmits(["updateDate"]);
|
||||
|
||||
const roleIds = ref([]); //角色id
|
||||
const chooseVisible = ref(false);
|
||||
const roleIdsxs = ref([]); //角色id
|
||||
const chooseVisiblexS = ref(false);
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const rules = reactive({
|
||||
hskssj: [{ required: true, message: "请选择会商开始时间", trigger: "change" }],
|
||||
hsjssj: [{ required: true, message: "请选择会商结束时间", trigger: "change" }],
|
||||
hsnr: [{ required: true, message: "请输入会商内容", trigger: "blur" }],
|
||||
hsbt: [{ required: true, message: "请输入会商标题", trigger: "blur" }],
|
||||
// glxsmc: [{ required: true, message: "请选择关联线索", trigger: "change" }],
|
||||
chryList: [{ required: true, message: "请选择参会人员", trigger: "change" }],
|
||||
});
|
||||
const formData = ref([
|
||||
{ label: "会商开始时间", prop: "hskssj", type: "datetime" },
|
||||
{ label: "会商结束时间", prop: "hsjssj", type: "datetime" },
|
||||
{ label: "会商内容", prop: "hsnr", type: "textarea", width: "100%" },
|
||||
// { label: "关联线索", prop: "glxsmc", type: "slot", },
|
||||
{ label: "会商标题", prop: "hsbt", type: "input" },
|
||||
// { label: "参会人员", prop: "chryList", type: "slot" ,width:'100%'},
|
||||
]);
|
||||
const listQuery = ref({}); //表单
|
||||
const loading = ref(false);
|
||||
const elform = ref();
|
||||
const title = ref("");
|
||||
const outRow = ref({})
|
||||
// 初始化数据
|
||||
const init = (type, row, outRowObj = {}) => {
|
||||
outRow.value = outRowObj
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : "编辑";
|
||||
if (row) {
|
||||
getDataById(row.id)
|
||||
} else {
|
||||
listQuery.value = {
|
||||
hskssj: dayjs().format("YYYY-MM-DD HH:mm:ss"),
|
||||
hsjssj: dayjs().add(1, "hour").format("YYYY-MM-DD HH:mm:ss"),
|
||||
}
|
||||
}
|
||||
};
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
qcckGet({ id }, "/mosty-gsxt/wshs/selectByid").then((res) => {
|
||||
res.rymc = res.chryList ? res.chryList.map(v => v.chryxm).join(",") : '';
|
||||
res.chryList = res.chryList ? res.chryList.map(item => item.chryid) : [];
|
||||
roleIds.value = res.chryList;
|
||||
roleIdsxs.value = res.glxsid ? [res.glxsid] : [];
|
||||
listQuery.value = res;
|
||||
});
|
||||
};
|
||||
|
||||
const handleUserSelected = (userData) => {
|
||||
roleIds.value = userData.map(item => item.id);
|
||||
listQuery.value.chryList = userData.map(item => item.id)
|
||||
listQuery.value.rymc = userData.map(item => item.userName).join("、");
|
||||
};
|
||||
|
||||
const choosed = (data) => {
|
||||
listQuery.value.glxsmc = data[0].xsMc;
|
||||
listQuery.value.glxsid = data[0].id;
|
||||
roleIdsxs.value = data.map(item => item.id);
|
||||
};
|
||||
|
||||
// 提交
|
||||
const submit = () => {
|
||||
elform.value.submit((data) => {
|
||||
let url = title.value == "新增" ? "/mosty-gsxt/wshs/add" : "/mosty-gsxt/wshs/update";
|
||||
let params = {
|
||||
...data,
|
||||
glxsid: outRow.value.id,
|
||||
glxsmc: outRow.value.xsMc,
|
||||
};
|
||||
loading.value = true;
|
||||
qcckPost(params, url).then(() => {
|
||||
loading.value = false;
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("updateDate");
|
||||
close();
|
||||
}).catch(() => { loading.value = false; });
|
||||
});
|
||||
};
|
||||
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
roleIds.value = [];
|
||||
roleIdsxs.value = [];
|
||||
dialogForm.value = false;
|
||||
loading.value = false;
|
||||
};
|
||||
// 选择参会人员
|
||||
const openMeetings = ref(false)
|
||||
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
</style>
|
||||
@ -0,0 +1,273 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span class="title">报告{{ title }} </span>
|
||||
<div>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules">
|
||||
<template #bgnr>
|
||||
<el-input v-model="listQuery.bgnr" style="width: 100%" placeholder="请输入关键字" class="input-with-select">
|
||||
<template #append>
|
||||
<el-button :icon="Search" type="primary">搜索</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</template>
|
||||
<template #fj><el-button type="primary" @click="showText = true">附件上传</el-button></template>
|
||||
</FormMessage>
|
||||
<div class="cntBox">
|
||||
<!-- 工具栏 -->
|
||||
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig"
|
||||
:mode="mode" />
|
||||
<!-- 编辑器 -->
|
||||
<Editor :style="`height: 480px; overflow-y: hidden`" v-model="textContent" :defaultConfig="editorConfig"
|
||||
:mode="mode" @onCreated="handleCreated" @onChange="handChange" />
|
||||
|
||||
</div>
|
||||
<div v-if="outRow.id" style="display: flex; justify-content: center;">
|
||||
<!-- <el-button style="display: block;" type="primary" @click="ConsultationShow = true">网上会商</el-button> -->
|
||||
<el-button style="display: block;" type="primary" @click="downloadWithStyles(textContent)">下载</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 文字解析 -->
|
||||
<ExtractionText v-model="showText" @change="getText"></ExtractionText>
|
||||
<!-- 网上会商 -->
|
||||
<!-- <Consultation v-model="ConsultationShow" /> -->
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { timeValidate } from '@/utils/tools.js'
|
||||
import ExtractionText from "@/components/ExtractionText/index.vue";
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
|
||||
import "@wangeditor/editor/dist/css/style.css";
|
||||
// import Consultation from './consultation.vue'
|
||||
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue";
|
||||
import { gsxtYpbgAddEntity, gsxtYpbgEditEntity } from "@/api/huiShangyp/tacticalApi.js"
|
||||
|
||||
const emit = defineEmits(["updateDate", 'ok']);
|
||||
const props = defineProps({
|
||||
dic: Object,
|
||||
});
|
||||
|
||||
|
||||
const ConsultationShow = ref(false)
|
||||
const showText = ref(false);
|
||||
const textContent = ref()
|
||||
const { proxy } = getCurrentInstance();
|
||||
const editorRef = shallowRef();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const mode = "default";
|
||||
const dataBt = ref(`<p class="html_bt">
|
||||
<h4 style=\"text-align: center;\"><span style=\"color: rgb(225, 60, 57); font-size: 32px; font-family: 标楷体;\">林芝市公安局情指中心</span></h4>
|
||||
<h4 style=\"text-align: center;\"><span style=\"color: rgb(225, 60, 57); font-size: 32px; font-family: 标楷体;\">研判专刊(初稿)</span></h4></p>
|
||||
<p style="text-align: center;"><span style="color: rgb(225, 60, 57); font-size: 22px; font-family: 标楷体;">市公安局情指中心编</span></p>
|
||||
<p style="text-align: center;"><span style="color: rgb(225, 60, 57); font-size: 22px; font-family: 标楷体;"> ${timeValidate(new Date(), 'td')}</span></p>
|
||||
<hr/>`)
|
||||
//编辑器配置
|
||||
const editorConfig = {
|
||||
withCredentials: true, //允许跨域
|
||||
placeholder: props.placeholder, //提示语
|
||||
MENU_CONF: {
|
||||
uploadImage: {
|
||||
// 自定义上传图片
|
||||
async customUpload(file, insertFn) {
|
||||
let fileBlob = await compressImage(file);
|
||||
let fileData = new File([fileBlob], fileBlob.name, { type: fileBlob.type });
|
||||
if (fileData.size > 2 * 1024 * 1024) {
|
||||
ElMessage({ message: "图片超过2MB", type: "success" });
|
||||
} else {
|
||||
await uploadFn(fileData, insertFn);
|
||||
}
|
||||
}
|
||||
},
|
||||
uploadVideo: {
|
||||
// 自定义上传视频
|
||||
async customUpload(file, insertFn) {
|
||||
await uploadFn(file, insertFn);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//工具配置
|
||||
const toolbarConfig = {
|
||||
excludeKeys: ["blockquote", "codeBlock"] //清除不必要的工具,引用和代码块
|
||||
};
|
||||
const rules = reactive({
|
||||
jymc: [
|
||||
{ required: true, message: "请输入经验名称", trigger: "blur" }
|
||||
],
|
||||
fbnr: [
|
||||
{ required: true, message: "请输入经验内容", trigger: "blur" }
|
||||
]
|
||||
});
|
||||
const formData = ref([
|
||||
{ label: "报告名称", prop: "bgmc", type: "input", width: "100%", blur: setEditorTextContent },
|
||||
{ label: "报告内容", prop: "bgnr", type: "slot", width: "100%", blur: setEditorTextContent },
|
||||
// { label: "附件内容", prop: "fj", type: "slot", width: "100%" },
|
||||
]);
|
||||
const listQuery = ref({
|
||||
bgmc: "",
|
||||
bgnr: "",
|
||||
fj: ""
|
||||
}); //表单
|
||||
const loading = ref(false);
|
||||
const elform = ref();
|
||||
const title = ref("");
|
||||
/** 外面行数据 */
|
||||
const outRow = ref({})
|
||||
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, reportData, row) => {
|
||||
|
||||
listQuery.value = {
|
||||
bgmc: reportData.bgmc,
|
||||
bgnr: reportData.bgnr,
|
||||
id: reportData.id,
|
||||
// fj: reportData.fj
|
||||
}
|
||||
outRow.value = { ...row }
|
||||
dialogForm.value = true;
|
||||
title.value = type == "add" ? "新增" : "编辑";
|
||||
setEditorTextContent()
|
||||
};
|
||||
const getText = (val, row = {}) => {
|
||||
listQuery.value.fj = val.text;
|
||||
setEditorTextContent()
|
||||
}
|
||||
|
||||
function setEditorTextContent() {
|
||||
let html = dataBt.value;
|
||||
|
||||
|
||||
html += `<p style="text-align: center;"><span style="font-size: 22px;">${listQuery.value.bgmc || ''}</span></p>`
|
||||
html += `<p>${listQuery.value.fj || ''}</p>`
|
||||
textContent.value = html
|
||||
}
|
||||
|
||||
// watch(() => listQuery.value, (val) => {
|
||||
|
||||
// },
|
||||
// {
|
||||
// deep: true, immediate: true
|
||||
// })
|
||||
// 提交
|
||||
const submit = () => {
|
||||
elform.value.submit((data) => {
|
||||
// let url = title.value == "新增" ? "/mosty-gsxt/gsxt/jyfx/add" : "/mosty-gsxt/gsxt/jyfx/edit";
|
||||
|
||||
let params = {
|
||||
...data,
|
||||
ypid: outRow.value.id,
|
||||
ypmc: outRow.value.ypyt
|
||||
};
|
||||
const apiFun = !listQuery.value.id ? gsxtYpbgAddEntity : gsxtYpbgEditEntity
|
||||
if (!listQuery.value.id) delete params.id
|
||||
apiFun(params).then(() => {
|
||||
loading.value = false;
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("ok");
|
||||
close();
|
||||
}).catch(() => {
|
||||
loading.value = false;
|
||||
})
|
||||
});
|
||||
};
|
||||
//编辑器创建成功
|
||||
const handleCreated = (editor) => {
|
||||
editorRef.value = editor;
|
||||
};
|
||||
//内容发生变化
|
||||
const handChange = (editor) => {
|
||||
// 判断是否是一个空段落,是空就传空文本
|
||||
|
||||
|
||||
};
|
||||
onBeforeUnmount(() => {
|
||||
const editor = editorRef.value;
|
||||
if (editor) editor.destroy();
|
||||
});
|
||||
|
||||
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
loading.value = false;
|
||||
dialogForm.value = false;
|
||||
listQuery.value = {}
|
||||
};
|
||||
|
||||
|
||||
// 带样式的下载方法
|
||||
const downloadWithStyles = (textContent) => {
|
||||
|
||||
const wordDocument = `
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>富文本导出</title>
|
||||
<style>
|
||||
/* 应用两端对齐样式 */
|
||||
body {
|
||||
text-align: justify;
|
||||
text-justify: inter-character; /* 中文文本两端对齐 */
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
}
|
||||
p {
|
||||
text-align: justify;
|
||||
text-justify: inter-character;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
${textContent}
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
const blob = new Blob([wordDocument], {
|
||||
type: 'application/msword'
|
||||
});
|
||||
|
||||
saveAs(blob, '战略研判报告.doc');
|
||||
};
|
||||
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
|
||||
.boxlist {
|
||||
width: 99%;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-textarea__inner {
|
||||
min-height: 550px !important;
|
||||
}
|
||||
|
||||
.html_bt>>>p {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.html_bt {
|
||||
h4 {
|
||||
margin: 10px 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.cntBox {
|
||||
width: 80vw;
|
||||
margin: 0 auto;
|
||||
}
|
||||
</style>
|
||||
@ -2,12 +2,12 @@
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="战术研判">
|
||||
<!-- <el-button type="primary" @click="getDataById('add', '')">
|
||||
<el-button type="primary" @click="selfCreateResearch('add')">
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">新增</span>
|
||||
</el-button> -->
|
||||
<span style="vertical-align: middle">自建研判</span>
|
||||
</el-button>
|
||||
|
||||
</PageTitle>
|
||||
</div>
|
||||
@ -27,8 +27,11 @@
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link size="small" type="danger" @click="getypbgSjzlTjspId(row.id)" >提交申请</el-link>
|
||||
<!-- <el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link> -->
|
||||
<el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link>
|
||||
<el-link size="small" type="primary" @click="createReport(row)">{{ row.ypbg?.id ? '编辑' : '创建' }}报告</el-link>
|
||||
<el-link size="small" type="success" @click="createMeeting(row)">创建会议</el-link>
|
||||
<el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -38,7 +41,12 @@
|
||||
}"></Pages>
|
||||
</div>
|
||||
</div>
|
||||
<AddForm ref="addForm" @getList="getList" :dict="{ D_BZ_YPFS, D_BZ_YPLX }" />
|
||||
<AddForm ref="addForm" :bglx="bglx" @getList="getList" :dict="{ D_BZ_YPFS, D_BZ_YPLX }" />
|
||||
|
||||
<!-- 创建报告 -->
|
||||
<addReport ref="reportTc" :row="currRow" :dic="{ D_GS_BQ_LX }" @ok="getList" />
|
||||
<!-- 创建报告 -->
|
||||
<addMeeting ref="meetingTc" :row="currRow" @updateDate="getList" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -46,21 +54,33 @@ import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import { useRoute } from 'vue-router'
|
||||
import { tacticalGet, strategicDelete } from "@/api/huiShangyp/tacticalApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch, computed } from "vue";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { tacticalGet, strategicDelete, } from "@/api/huiShangyp/tacticalApi.js";
|
||||
import {ypbgSjzlTjspId} from "@/api/huiShangyp/strategicApi.js"
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue";
|
||||
import addReport from "./addReport.vue";
|
||||
import AddForm from "./addForm.vue";
|
||||
import addMeeting from "./addMeeting.vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_YPFS, D_BZ_YPLX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX")
|
||||
const detailDiloag = ref();
|
||||
const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
|
||||
|
||||
/** 报告弹框 */
|
||||
const reportTc = ref();
|
||||
/** 会议弹框 */
|
||||
const meetingTc = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
|
||||
onMounted(() => {
|
||||
tabHeightFn()
|
||||
if (route.query.id) {
|
||||
detailDiloag.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
return
|
||||
nextTick(() => {
|
||||
addForm.value && addForm.value.init('edit', {
|
||||
id: route.query.id
|
||||
});
|
||||
router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
|
||||
})
|
||||
}
|
||||
getList()
|
||||
});
|
||||
@ -98,8 +118,12 @@ const pageData = reactive({
|
||||
{ label: "发起部门", prop: "ssbm" },
|
||||
]
|
||||
});
|
||||
const queryFrom = ref({});
|
||||
|
||||
const isShowReport = ref(false)
|
||||
const currRow = ref({})
|
||||
const queryFrom = ref({});
|
||||
/** 报告类型 01 战术研判 02 战略研判*/
|
||||
const bglx = ref('01')
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
const promes = {
|
||||
@ -123,7 +147,7 @@ const changeSize = (val) => {
|
||||
// 获取列表
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
// bglx 报告类型(01 战术研判 02 战略研判)
|
||||
// bglx 报告类型(01 战术研判 02 战略研判)
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value, bglx: '01' };
|
||||
tacticalGet(data).then(res => {
|
||||
pageData.tableData = res.records || [];
|
||||
@ -140,7 +164,7 @@ const tabHeightFn = () => {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
const route = useRoute()
|
||||
// const route = useRoute()
|
||||
|
||||
const addForm = ref(null)
|
||||
const getDataById = (type, row) => {
|
||||
@ -163,6 +187,39 @@ const deleteFile = (row) => {
|
||||
proxy.$message.info('已取消删除');
|
||||
});
|
||||
}
|
||||
|
||||
const selfCreateResearch = (type = 'add') => {
|
||||
addForm.value.init(type, null, '01');
|
||||
}
|
||||
/** 创建报告 */
|
||||
const createReport = (row) => {
|
||||
const type = !row.id ? 'add' : 'edit'
|
||||
reportTc.value.init(type, row?.ypbg || {}, row)
|
||||
// currRow.value = { ...row }
|
||||
// isShowReport.value = true
|
||||
}
|
||||
/** 创建会议 */
|
||||
const createMeeting = (row) => {
|
||||
meetingTc.value.init('add', null, row)
|
||||
// currRow.value = { ...row }
|
||||
// isShowReport.value = true
|
||||
}
|
||||
// 提交研判
|
||||
const getypbgSjzlTjspId = (id) => {
|
||||
proxy.$confirm('确定提交研判申请吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
ypbgSjzlTjspId(id).then((res) => {
|
||||
proxy.$message.success('提交成功');
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {
|
||||
proxy.$message.info('已取消提交');
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@ -76,22 +76,21 @@ const props = defineProps({
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const rules = reactive({
|
||||
xsMc: [{ required: true, message: "请输入线索名称", trigger: "blur" }],
|
||||
xlLx: [{ required: true, message: "请选择线索类型", trigger: "change" }],
|
||||
qbLy: [{ required: true, message: "请选择情报来源", trigger: "change" }],
|
||||
qbmc: [{ required: true, message: "请输入线索名称", trigger: "blur" }],
|
||||
qblx: [{ required: true, message: "请选择线索类型", trigger: "change" }],
|
||||
});
|
||||
const formData = ref([
|
||||
{ prop: "gapdive", type: "slot", width: '100%' },
|
||||
{ label: "线索名称", prop: "xsMc", type: "input" },
|
||||
{ label: "线索类型", prop: "xlLx", type: "select", options: props.dic.D_GS_XS_LX },
|
||||
{ label: "情报来源", prop: "qbLy", type: "select", options: props.dic.D_GS_XS_LY },
|
||||
{ label: "指向开始时间", prop: "zxkssj", type: "datetime" },
|
||||
{ label: "指向结束时间", prop: "zxjssj", type: "datetime" },
|
||||
{ label: "指向地点", prop: "zxdz", type: "input" },
|
||||
{ label: "线索名称", prop: "qbmc", type: "input" },
|
||||
{ label: "线索类型", prop: "qblx", type: "select", options: props.dic.D_GS_XS_LX },
|
||||
// { label: "情报来源", prop: "qbly", type: "select", options: props.dic.D_GS_XS_LY },
|
||||
// { label: "指向开始时间", prop: "zxkssj", type: "datetime" },
|
||||
// { label: "指向结束时间", prop: "zxjssj", type: "datetime" },
|
||||
{ label: "线索地点", prop: "zxdz", type: "input" },
|
||||
{ label: "所属专题", prop: "sszt", type: "select", options: props.dic.D_BZ_SSZT },
|
||||
{ prop: "gapline", type: "slot", width: '100%' },
|
||||
{ prop: "scfj", type: "slot", width: '100%' },
|
||||
{ label: "线索内容", prop: "xsNr", type: "textarea", width: '100%' },
|
||||
{ label: "线索内容", prop: "qbnr", type: "textarea", width: '100%' },
|
||||
]);
|
||||
const fjdz = ref()
|
||||
const listQuery = ref({}); //表单
|
||||
|
||||
@ -0,0 +1,112 @@
|
||||
<template>
|
||||
<el-dialog v-model="modelValue" title="线索下发" width="50%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 50vh; overflow: auto;">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" />
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="closeDialog">取消</el-button>
|
||||
<el-button type="primary" @click="submitForm">确认 </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
|
||||
import { ref, reactive, getCurrentInstance, watch } from "vue";
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ')
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
dataList: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue', 'getList'])
|
||||
const elform = ref(null)
|
||||
const closeDialog = (formEl) => {
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
|
||||
const rules = reactive({
|
||||
glxs: [{ required: true, message: '请输入线索名称', trigger: 'blur' }],
|
||||
zlbt: [{ required: true, message: '请输入指令标题', trigger: 'blur' }],
|
||||
zllx: [{ required: true, message: '请选择指令类型', trigger: 'change' }],
|
||||
zldj: [{ required: true, message: '请选择指令等级', trigger: 'change' }],
|
||||
xfbmList: [{ required: true, message: '请选择下发部门集合', trigger: 'change' }],
|
||||
zsdw: [{ required: true, message: '请选择主送单位', trigger: 'change' }],
|
||||
csdw: [{ required: true, message: '请选择抄送单位', trigger: 'change' }],
|
||||
zlnr: [{ required: true, message: '请输入指令内容', trigger: 'blur' }],
|
||||
})
|
||||
const listQuery = ref({})
|
||||
const formData = ref(
|
||||
[
|
||||
{ label: "线索名称", prop: "glxs", type: "input" },
|
||||
{ label: "指令标题", prop: "zlbt", type: "input" },
|
||||
{ label: "指令类型", prop: "zllx", type: "select", options: D_GS_XS_ZLLX },
|
||||
{ label: "指令等级", prop: "zldj", type: "select", options: D_GS_ZDQT_FXDJ },
|
||||
{ label: "指令联系人", prop: "zllxr", type: "input" },
|
||||
{ label: "指令联系电话", prop: "zllxdh", type: "input" },
|
||||
{ label: "指令结束时间", prop: "jssj", type: "datetime" },
|
||||
{ label: "下发部门集合", depMc: 'xfbmListMc', prop: "xfbmList", type: "department", width: "90%", multiple: true },
|
||||
{ label: "主送单位", prop: "zsdw", type: "department" },
|
||||
{ label: "抄送单位", prop: "csdw", type: "department" },
|
||||
{ label: "指令内容", prop: "zlnr", type: "textarea", width: "90%" },
|
||||
{ label: "附件地址", prop: "fjzd", type: "upload", width: "90%" },
|
||||
]
|
||||
)
|
||||
watch(() => props.modelValue, (newVal, oldVal) => {
|
||||
if (newVal) {
|
||||
listQuery.value.xsid = props.dataList.id
|
||||
listQuery.value.glxsid = props.dataList.id
|
||||
listQuery.value.glxs = props.dataList.qbmc
|
||||
}
|
||||
}, { deep: true })
|
||||
|
||||
|
||||
const submitForm = (formEl) => {
|
||||
console.log(listQuery.value);
|
||||
elform.value.submit((valid) => {
|
||||
if (valid) {
|
||||
const params = {
|
||||
...listQuery.value,
|
||||
fjzd:listQuery.value.fjzd? listQuery.value.fjzd.join(',') : '',
|
||||
xfbmList: listQuery.value.xfbmList.map((item, index) => {
|
||||
return {
|
||||
ssbm: listQuery.value.xfbmListMc[index],
|
||||
ssbmdm: item,
|
||||
}
|
||||
}),
|
||||
}
|
||||
qcckPost(params, '/mosty-gsxt/qbcj/xfxs').then((res) => {
|
||||
proxy.$message({ type: "success", message: "下发成功" });
|
||||
emit('update:modelValue', false)
|
||||
// closeDialog(formEl);
|
||||
}).catch(() => {
|
||||
proxy.$message({ type: "error", message: "新增失败" });
|
||||
});
|
||||
console.log(params);
|
||||
// emit('getList', listQuery)
|
||||
// closeDialog(formEl)
|
||||
} else {
|
||||
console.log('校验失败');
|
||||
}
|
||||
})
|
||||
// formEl.validate((valid) => {
|
||||
// if (valid) {
|
||||
// emit('getList', listQuery)
|
||||
// closeDialog(formEl)
|
||||
// } else {
|
||||
// console.log('校验失败');
|
||||
// }
|
||||
// })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
@ -3,105 +3,68 @@
|
||||
<div class="titleBox">
|
||||
<PageTitle title="线索数据采集">
|
||||
<el-button type="primary" @click="addEdit('add', null)">
|
||||
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">新增</span>
|
||||
</el-button>
|
||||
<el-button type="danger">
|
||||
<el-icon style="vertical-align: middle"><Dete /></el-icon>
|
||||
<el-button type="danger" @click="plDelDictItem">
|
||||
<el-icon style="vertical-align: middle">
|
||||
<Dete />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">批量删除</span>
|
||||
</el-button>
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"/>
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth">
|
||||
<template #xlLx="{row}">
|
||||
<DictTag :tag="false" :value="row.xlLx" :options="D_GS_XS_LX" />
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
|
||||
@chooseData="chooseData">
|
||||
<template #qblx="{ row }">
|
||||
<DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
|
||||
</template>
|
||||
<template #qbLy="{row}">
|
||||
<DictTag :tag="false" :value="row.qbLy" :options="D_GS_XS_LY" />
|
||||
<template #cjLx="{ row }">
|
||||
<DictTag :tag="false" :value="row.cjLx" :options="D_GS_XS_LY" />
|
||||
</template>
|
||||
<template #czzt="{row}">
|
||||
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
|
||||
<template #czzt="{ row }">
|
||||
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_XSCZZT" />
|
||||
</template>
|
||||
<template #zxkssj="{row}">
|
||||
<span>{{ row.zxkssj }}</span> 至
|
||||
<span>{{ row.zxjssj }}</span>
|
||||
</template>
|
||||
<template #shzt="{row}">
|
||||
|
||||
<template #shzt="{ row }">
|
||||
<!-- 采纳(将这条信息推送到情报管理),退回! -->
|
||||
<DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<template v-if="row.shzt === '0'">
|
||||
<el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
|
||||
<template v-if="!row.gzlid">
|
||||
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
|
||||
<el-link size="small" type="primary" @click.stop="createProcess(row)">审核</el-link>
|
||||
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
|
||||
</template>
|
||||
|
||||
<!-- <el-popover placement="left" :visible="row.visible" :width="400" trigger="click">
|
||||
<template #reference>
|
||||
<el-link size="small" type="primary" @click.stop="handleSh(row)">审核</el-link>
|
||||
</template>
|
||||
|
||||
<div class="flex mb10 align-center">
|
||||
<div class="w70 label-pop">审核状态 :</div>
|
||||
<div style="flex:1">
|
||||
<el-radio-group v-model="chooseRow.shzt" @change="rules.bhyy = false">
|
||||
<el-radio v-for="obj in D_BZ_XSSHZT" :key="obj.value" :label="obj.value" >{{ obj.zdmc }}</el-radio>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex" v-if=" chooseRow.shzt == '01'">
|
||||
<div class="w70 label-pop">驳回原因 :</div>
|
||||
<div style="flex:1">
|
||||
<MOSTY.Other filterable style="width: 100%;" v-model="chooseRow.bhyy" type="textarea" rows="3" clearable placeholder="请输入审核原因"/>
|
||||
<div class="f12" style="color: red;" v-if="rules.bhyy">请输入驳回原因</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt10 flex just-center">
|
||||
<el-button size="small" @click.stop="cancel(row)">取消</el-button>
|
||||
<el-button size="small" type="primary" @click.stop="handleSumbit(row)">确定</el-button>
|
||||
</div>
|
||||
</el-popover> -->
|
||||
<template v-if="!row.gzlid">
|
||||
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
|
||||
<el-link size="small" type="primary" @click.stop="createProcess(row)">审核</el-link>
|
||||
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
|
||||
</template>
|
||||
<el-link size="small" type="danger" @click="addEdit('info', row)">详情</el-link>
|
||||
<!-- 续报 == 编辑 -->
|
||||
<el-link size="small" type="warning" @click="addEdit('edit', row)">续报</el-link>
|
||||
<el-link size="small" type="warning" @click="openXsxf( row)">线索下发</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"
|
||||
></Pages>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 新增 -->
|
||||
<AddForm ref="detailDiloag" @change="getList" v-if="isShow" :dic="{D_BZ_SF,D_BZ_XB,D_GS_XS_LY,D_BZ_SSZT,D_GS_XS_LX ,D_GS_XS_QTLX}" />
|
||||
<AddForm ref="detailDiloag" @change="getList" v-if="isShow"
|
||||
:dic="{ D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX }" />
|
||||
</div>
|
||||
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '线索数据采集审批', flowType: 'XSSJCJSP',modelName:'线索' }"
|
||||
:path="fixedValue" @getList="getList" />
|
||||
<SubmissionProcess v-model="showSp" :data="rowData"
|
||||
:userData="{ ajmc: '线索数据采集审批', flowType: 'XSSJCJSP', modelName: '线索' }" :path="fixedValue" @getList="getList" />
|
||||
<Xsxf v-model="xsxfShow" :dataList="rowData"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -111,27 +74,20 @@ import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
import Xsxf from "./components/xsxf.vue";
|
||||
const router = useRouter();
|
||||
const { proxy } = getCurrentInstance();
|
||||
const {D_GS_XS_CZZT,D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_XS_CZZT","D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
|
||||
const { D_GS_XS_XSCZZT, D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_GS_XS_QTLX, D_BZ_XB, D_BZ_XSSHZT } = proxy.$dict("D_GS_XS_XSCZZT", "D_GS_XS_LY", "D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX", "D_BZ_XB", "D_BZ_XSSHZT"); //获取字典数据
|
||||
const detailDiloag = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const isShow = ref(false)
|
||||
const searchConfiger = ref([
|
||||
{ label: "线索名称", prop: 'xsMc', placeholder: "请输入线索名称", showType: "input" },
|
||||
{ label: "内容关键字", prop: 'xsNr', placeholder: "请输入语义关键字", showType: "input" },
|
||||
{ label: "线索类型", prop: 'xlLx', placeholder: "请选择线索类型", showType: "select",options:D_GS_XS_LX },
|
||||
{ label: "线索来源", prop: 'qbLy', placeholder: "请选择线索来源", showType: "select",options:D_GS_XS_LY },
|
||||
{ label: "开始时间", prop: 'kssj', placeholder: "请选择开始时间", showType: "datetime" },
|
||||
{ label: "结束时间", prop: 'jssj', placeholder: "请选择结束时间", showType: "datetime" },
|
||||
{ label: "指向地点", prop: 'zxdz', placeholder: "请输入指向地点", showType: "input" },
|
||||
{ label: "线索名称", prop: 'qbmc', placeholder: "请输入线索名称", showType: "input" },
|
||||
{ label: "内容关键字", prop: 'qbnr', placeholder: "请输入语义关键字", showType: "input" },
|
||||
{ label: "线索类型", prop: 'qblx', placeholder: "请选择线索类型", showType: "select", options: D_GS_XS_LX },
|
||||
{ label: "线索来源", prop: 'cjLx', placeholder: "请选择线索来源", showType: "select", options: D_GS_XS_LY },
|
||||
]);
|
||||
const chooseRow = ref({})
|
||||
const rules = reactive({
|
||||
bhyy:false,
|
||||
shzt: false,
|
||||
})
|
||||
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
@ -145,18 +101,16 @@ const pageData = reactive({
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
controlsWidth: 220,
|
||||
controlsWidth: 250,
|
||||
tableColumn: [
|
||||
{ label: "线索编号", prop: "xsBh" },
|
||||
{ label: "线索名称", prop: "xsMc" },
|
||||
{ label: "线索类型", prop: "xlLx",showSolt:true },
|
||||
{ label: "线索来源", prop: "qbLy",showSolt:true },
|
||||
{ label: "指向时间", prop: "zxkssj",showSolt:true,showOverflowTooltip:true },
|
||||
{ label: "上报时间", prop: "sxsbsj",showOverflowTooltip:true },
|
||||
{ label: "指向地点", prop: "zxdz" },
|
||||
{ label: "线索内容", prop: "xsNr"},
|
||||
{ label: "处置状态", prop: "czzt",showSolt: true},
|
||||
{ label: "附件", prop: "fjdz", showSolt: true },
|
||||
{ label: "线索名称", prop: "qbmc" },
|
||||
{ label: "线索类型", prop: "qblx", showSolt: true },
|
||||
{ label: "线索来源", prop: "cjLx", showSolt: true },
|
||||
{ label: "上报时间", prop: "sxsbsj", showOverflowTooltip: true },
|
||||
{ label: "线索地点", prop: "zxdz" },
|
||||
{ label: "线索内容", prop: "qbnr" },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "审核状态", prop: "shzt", showSolt: true },
|
||||
]
|
||||
});
|
||||
@ -168,74 +122,67 @@ onMounted(() => {
|
||||
tabHeightFn();
|
||||
});
|
||||
|
||||
const handleSh = (val) =>{
|
||||
chooseRow.value = {id:val.id,shzt:'01'}
|
||||
val.visible = !val.visible;
|
||||
}
|
||||
const cancel = (row) =>{
|
||||
row.visible = false;
|
||||
rules.bhyy = false;
|
||||
chooseRow.value = {}
|
||||
}
|
||||
const handleSumbit = (row) =>{
|
||||
rules.bhyy = !chooseRow.value.bhyy ? true :false;
|
||||
if(chooseRow.value.shzt == '01' && rules.bhyy) return false;
|
||||
let data = { ...chooseRow.value }
|
||||
qcckPost(data,'/mosty-gsxt/qbcj/updateByXssh').then(res=>{
|
||||
row.visible = false;
|
||||
proxy.$message({ type: "success", message: "审核成功" });
|
||||
getList();
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) =>{
|
||||
queryFrom.value = {...val}
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val }
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) =>{
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
}
|
||||
const changeSize = (val) =>{
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList()
|
||||
}
|
||||
|
||||
// 获取列表
|
||||
const getList = () =>{
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value,cjLx:'0' };
|
||||
qcckGet(data,'/mosty-gsxt/qbcj/selectPage').then(res=>{
|
||||
let data = { ...pageData.pageConfiger, ...queryFrom.value, cjLx: '0' };
|
||||
qcckGet(data, '/mosty-gsxt/qbcj/selectPage').then(res => {
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch(()=>{ pageData.tableConfiger.loading = false; })
|
||||
}).catch(() => { pageData.tableConfiger.loading = false; })
|
||||
}
|
||||
|
||||
// 删除
|
||||
const delDictItem = (id) =>{
|
||||
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
|
||||
qcckPost({id},'/mosty-gsxt/qbcj/delete').then(()=>{
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
const delDictItem = (id) => {
|
||||
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
|
||||
qcckPost({ id }, '/mosty-gsxt/qbcj/delete').then(() => {
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {});
|
||||
}).catch(() => { });
|
||||
}
|
||||
const ids = ref()
|
||||
const chooseData = (val) => {
|
||||
ids.value = val.map(item => item.id)
|
||||
}
|
||||
const plDelDictItem = () => {
|
||||
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
|
||||
qcckPost({ ids: ids.value }, '/mosty-gsxt/qbcj/deletes').then(() => {
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => { });
|
||||
}
|
||||
|
||||
// 详情
|
||||
const addEdit = (type, row) => {
|
||||
isShow.value = true;
|
||||
setTimeout(()=>{
|
||||
setTimeout(() => {
|
||||
detailDiloag.value.init(type, row);
|
||||
},500)
|
||||
}, 500)
|
||||
};
|
||||
|
||||
const clickTag = (val) =>{
|
||||
if(val == '02') router.push('/IntelligenceManagement');
|
||||
const clickTag = (val) => {
|
||||
if (val == '02') router.push('/IntelligenceManagement');
|
||||
}
|
||||
|
||||
// 表格高度计算
|
||||
@ -251,21 +198,32 @@ const showSp = ref(false);
|
||||
const rowData = ref()
|
||||
// 固定值
|
||||
const fixedValue = {
|
||||
clueVerification:'clueVerification',
|
||||
clueVerification: 'clueVerification',
|
||||
byMeansOf: 'qbcj/callback',
|
||||
nobyMeansOf: 'qbcj/callback',
|
||||
recycle:'qbcj/callback',
|
||||
recycle: 'qbcj/callback',
|
||||
}
|
||||
const createProcess = (row) => {
|
||||
showSp.value = true;
|
||||
rowData.value = row
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 线索下发
|
||||
const xsxfShow = ref(false)
|
||||
const openXsxf = (row) => {
|
||||
xsxfShow.value = true
|
||||
rowData.value = {...row}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.label-pop{
|
||||
.label-pop {
|
||||
position: relative;
|
||||
&::before{
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
content: '*';
|
||||
top: 0;
|
||||
@ -279,4 +237,3 @@ const createProcess = (row) => {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@ -3,19 +3,43 @@
|
||||
<div class="head_box">
|
||||
<span class="title">指令{{ title }} </span>
|
||||
<div>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit" >保存</el-button>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit" v-if="title != '详情'">保存</el-button>
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
<template #glxsid>
|
||||
<div class="box pointer ellipsis" @click="chooseVisible = true">
|
||||
<span v-if="listQuery.glxs">{{ listQuery.glxs }}</span>
|
||||
<span v-else style="color: #b8b8b8;">请选择关联线索</span>
|
||||
</div>
|
||||
</template>
|
||||
</FormMessage>
|
||||
<div class="form_cnt flex-between">
|
||||
<div class="main-content" :class="{ 'content-with-timeline': title == '详情' }">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title == '详情'">
|
||||
<template #glxsid>
|
||||
<div class="box pointer ellipsis" @click="chooseVisible = true">
|
||||
<span v-if="listQuery.glxs">{{ listQuery.glxs }}</span>
|
||||
<span v-else class="placeholder-text">请选择关联线索</span>
|
||||
</div>
|
||||
</template>
|
||||
</FormMessage>
|
||||
</div>
|
||||
<div v-if="title == '详情'" class="timeline-container">
|
||||
<el-timeline class="timeline-wrapper" v-if="listQuery.czlcList.length > 0">
|
||||
<el-timeline-item placement="top" v-for="(activity, index) in listQuery.czlcList" :key="index"
|
||||
:timestamp="activity.czsj" :color="activity.czlx == '01' ? '#409eff' : '#67c23a'" size="large">
|
||||
<div class="timeline-content" :class="activity.czlx == '01' ? 'sign-type' : 'feedback-type'">
|
||||
<div class="content-item">
|
||||
<span class="label">处置部门:</span>
|
||||
<span class="value">{{ activity.ssbm }}</span>
|
||||
</div>
|
||||
<div class="content-item">
|
||||
<span class="label">处置状态:</span>
|
||||
<span class="value status">{{ activity.czlx == '01' ? '签收' : '反馈' }}</span>
|
||||
</div>
|
||||
<div class="content-item">
|
||||
<span class="label">处置内容:</span>
|
||||
<span class="value content">{{ activity.fknr }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-timeline-item>
|
||||
</el-timeline>
|
||||
<el-empty description="暂无处置记录" v-else />
|
||||
</div>
|
||||
</div>
|
||||
<!-- 选择线索 -->
|
||||
<Xslist v-model="chooseVisible" @choosed="choosed" :roleIds="roleIds"></Xslist>
|
||||
@ -26,7 +50,6 @@
|
||||
import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
|
||||
import FormMessage from '@/components/aboutTable/FormMessage.vue'
|
||||
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
|
||||
import * as rule from "@/utils/rules.js";
|
||||
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick } from "vue";
|
||||
const emit = defineEmits(["updateDate"]);
|
||||
const props = defineProps({
|
||||
@ -38,16 +61,16 @@ const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const formData = ref([
|
||||
{ label: "指令标题", prop: "zlbt", type: "input", },
|
||||
{ label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
|
||||
{ label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ },
|
||||
{ label: "反馈结束时间", prop: "jssj", type: "datetime" },
|
||||
{ label: "联系人", prop: "zllxr", type: "input" },
|
||||
{ label: "联系电话", prop: "zllxdh", type: "input" },
|
||||
{ label: "关联线索", prop: "glxsid", type: "slot" },
|
||||
{ label: "主送单位", prop: "zsdw", type: "department" },
|
||||
{ label: "抄送单位", prop: "csdw", type: "department" },
|
||||
{ label: "指令内容", prop: "zlnr", type: "textarea",width: '100%' },
|
||||
{ label: "附件", prop: "fjzd", type: "upload",width: '100%' },
|
||||
{ label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
|
||||
{ label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ },
|
||||
{ label: "反馈结束时间", prop: "jssj", type: "datetime" },
|
||||
{ label: "联系人", prop: "zllxr", type: "input" },
|
||||
{ label: "联系电话", prop: "zllxdh", type: "input" },
|
||||
{ label: "关联线索", prop: "glxsid", type: "slot" },
|
||||
{ label: "主送单位", prop: "zsdw", type: "department" },
|
||||
{ label: "抄送单位", prop: "csdw", type: "department" },
|
||||
{ label: "指令内容", prop: "zlnr", type: "textarea", width: '100%' },
|
||||
{ label: "附件", prop: "fjzd", type: "upload", width: '100%' },
|
||||
]);
|
||||
const listQuery = ref({}); //表单
|
||||
const loading = ref(false);
|
||||
@ -69,14 +92,18 @@ const rules = reactive({
|
||||
const init = (type, row,) => {
|
||||
listQuery.value.fjzd = null
|
||||
dialogForm.value = true;
|
||||
title.value = type == 'add' ? "新增" : "编辑";
|
||||
title.value = type == 'add' ? '新增' : type == 'info' ? '详情' : '编辑';
|
||||
|
||||
if (row) getDataById(row.id);
|
||||
};
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
qcckGet({id}, '/mosty-gsxt/zlxx/selectByid').then((res) => {
|
||||
res.fjzd = res.fjzd ? res.fjzd.split(','):[];
|
||||
listQuery.value = res;
|
||||
qcckGet({ id }, '/mosty-gsxt/zlxx/selectByid').then((res) => {
|
||||
res.fjzd = res.fjzd ? res.fjzd.split(',') : [];
|
||||
listQuery.value = {
|
||||
...res,
|
||||
czlcList: res.czlcList ? res.czlcList.reverse() : []
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
@ -84,22 +111,22 @@ const getDataById = (id) => {
|
||||
const choosed = (val) => {
|
||||
listQuery.value.glxs = val[0].xsMc;
|
||||
listQuery.value.glxsid = val[0].id;
|
||||
roleIds.value = val.map(v=>v.id)
|
||||
roleIds.value = val.map(v => v.id)
|
||||
}
|
||||
|
||||
// 提交
|
||||
const submit = () => {
|
||||
elform.value.submit((data)=>{
|
||||
let url = title.value == "新增" ? '/mosty-gsxt/zlxx/add':'/mosty-gsxt/zlxx/update';
|
||||
elform.value.submit((data) => {
|
||||
let url = title.value == "新增" ? '/mosty-gsxt/zlxx/add' : '/mosty-gsxt/zlxx/update';
|
||||
let params = { ...data }
|
||||
loading.value = true;
|
||||
params.fjzd = params.fjzd ? params.fjzd.join(','):''
|
||||
params.fjzd = params.fjzd ? params.fjzd.join(',') : ''
|
||||
qcckPost(params, url).then((res) => {
|
||||
loading.value = false;
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("updateDate");
|
||||
close();
|
||||
}).catch(() => {loading.value = false;});
|
||||
}).catch(() => { loading.value = false; });
|
||||
});
|
||||
};
|
||||
|
||||
@ -115,11 +142,115 @@ defineExpose({ init });
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
.box{
|
||||
|
||||
.box {
|
||||
width: 100%;
|
||||
height: 32px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #e9e9e9;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
// 新增类样式
|
||||
.flex-between {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
margin-right: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.content-with-timeline {
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.placeholder-text {
|
||||
color: #b8b8b8;
|
||||
}
|
||||
|
||||
.timeline-container {
|
||||
width: 18%;
|
||||
}
|
||||
|
||||
.timeline-wrapper {
|
||||
max-width: 100%;
|
||||
padding: 10px;
|
||||
background-color: #f5f7fa;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
// 时间线样式优化
|
||||
.el-timeline {
|
||||
.el-timeline-item {
|
||||
&::before {
|
||||
height: calc(100% - 20px); // 调整时间线高度
|
||||
}
|
||||
|
||||
.el-timeline-item__content {
|
||||
min-height: 80px; // 确保内容区域有足够空间
|
||||
}
|
||||
|
||||
.el-timeline-item__timestamp {
|
||||
font-size: 12px;
|
||||
color: #909399;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.timeline-content {
|
||||
padding: 12px;
|
||||
background-color: white;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
|
||||
border-left: 3px solid transparent;
|
||||
|
||||
&.sign-type {
|
||||
border-left-color: #409eff;
|
||||
|
||||
.status {
|
||||
color: #409eff;
|
||||
}
|
||||
}
|
||||
|
||||
&.feedback-type {
|
||||
border-left-color: #67c23a;
|
||||
|
||||
.status {
|
||||
color: #67c23a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.content-item {
|
||||
margin-bottom: 6px;
|
||||
line-height: 1.5;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.label {
|
||||
font-weight: 500;
|
||||
color: #303133;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.value {
|
||||
color: #606266;
|
||||
|
||||
&.status {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&.content {
|
||||
// display: block;
|
||||
// margin-top: 5px;
|
||||
// word-break: break-all;
|
||||
// white-space: pre-wrap;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -0,0 +1,78 @@
|
||||
<template>
|
||||
<el-dialog v-model="modelValue" title="线索反馈" width="50%" @close="closeDialog" destroy-on-close append-to-body>
|
||||
<div style="height: 15vh; overflow: auto;">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" />
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="closeDialog">取消</el-button>
|
||||
<el-button type="primary" @click="submitForm">确认 </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
|
||||
import { ref, reactive, getCurrentInstance, watch } from "vue";
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ')
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
dataList: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue', 'getList'])
|
||||
const elform = ref(null)
|
||||
const closeDialog = (formEl) => {
|
||||
elform.value.reset()
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
|
||||
const rules = reactive({
|
||||
fknr: [{ required: true, message: '请输入反馈内容', trigger: 'blur' }],
|
||||
})
|
||||
const listQuery = ref({})
|
||||
const formData = ref(
|
||||
[
|
||||
{ label: "反馈内容", prop: "fknr", type: "textarea" ,width:'90%'},
|
||||
]
|
||||
)
|
||||
watch(() => props.modelValue, (newVal, oldVal) => {
|
||||
if (newVal) {
|
||||
listQuery.value.zlxxid = props.dataList.id
|
||||
}
|
||||
}, { deep: true })
|
||||
|
||||
|
||||
const submitForm = (formEl) => {
|
||||
console.log(listQuery.value);
|
||||
elform.value.submit((valid) => {
|
||||
if (valid) {
|
||||
const params = {
|
||||
...listQuery.value,
|
||||
}
|
||||
qcckPost(params, '/mosty-gsxt/zlxx/fk').then((res) => {
|
||||
proxy.$message({ type: "success", message: "反馈成功" });
|
||||
emit('getList')
|
||||
closeDialog()
|
||||
}).catch(() => {
|
||||
proxy.$message({ type: "error", message: "反馈失败" });
|
||||
});
|
||||
console.log(params);
|
||||
|
||||
} else {
|
||||
console.log('校验失败');
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
@ -31,9 +31,18 @@
|
||||
</template>
|
||||
<template #czzt="{row}">
|
||||
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
|
||||
</template>
|
||||
<template #sffk="{row}">
|
||||
{{ row.sffk == '1' ? '已反馈' : '未反馈' }}
|
||||
</template>
|
||||
<template #sfqs="{row}">
|
||||
{{ row.sfqs == '0' ? '未签收' : '已签收' }}
|
||||
</template>
|
||||
<template #controls="{ row }">
|
||||
<el-link size="small" type="primary" v-if="row.sfqs == '0'" @click="signRow(row)">签收</el-link>
|
||||
<el-link size="small" type="warning" @click="fkRow(row)">反馈</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>
|
||||
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -50,6 +59,7 @@
|
||||
<!-- 详情 -->
|
||||
<DetailForm ref="detailDiloag" v-if="isShow" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
|
||||
</div>
|
||||
<Fk v-model="isShowFk" :dataList="dataList" @getList="getList"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -58,6 +68,7 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import DetailForm from "./components/detailForm.vue";
|
||||
import Fk from "./components/fk.vue";
|
||||
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
@ -87,13 +98,15 @@ const pageData = reactive({
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
controlsWidth: 120,
|
||||
controlsWidth: 240,
|
||||
tableColumn: [
|
||||
{ label: '指令标题', prop: 'zlbt' },
|
||||
{ label: '指令类型', prop: 'zllx',showSolt:true },
|
||||
{ label: '指令等级', prop: 'zldj',showSolt:true },
|
||||
{ label: '反馈截止时间', prop: 'jssj' },
|
||||
{ label: '处置状态', prop: 'czzt',showSolt:true },
|
||||
{ label: '处置状态', prop: 'czzt', showSolt: true },
|
||||
{ label: '是否反馈', prop: 'sffk', showSolt: true },
|
||||
{ label: '是否签收', prop: 'sfqs', showSolt: true },
|
||||
]
|
||||
});
|
||||
|
||||
@ -150,7 +163,27 @@ const addEdit = (type, row) => {
|
||||
detailDiloag.value.init(type, row);
|
||||
})
|
||||
};
|
||||
// 签收
|
||||
const signRow = (row) =>{
|
||||
proxy.$confirm("确定要签收", "警告", {type: "warning"}).then(() => {
|
||||
qcckGet({id:row.id},'/mosty-gsxt/zlxx/qs').then(()=>{
|
||||
proxy.$message({ type: "success", message: "签收成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {});
|
||||
}
|
||||
// 反馈
|
||||
const isShowFk = ref(false)
|
||||
const dataList = ref()
|
||||
const fkRow = (row) => {
|
||||
if (row.sfqs=='0') {
|
||||
proxy.$message({ type: "error", message: "请先签收" });
|
||||
return;
|
||||
}
|
||||
isShowFk.value = true;
|
||||
dataList.value = {...row};
|
||||
|
||||
}
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
<template #default="{ row }">
|
||||
<div class="status-badge" :class="{ online: row.online }">
|
||||
<div class="status-dot"></div>
|
||||
<span>{{ row.online ? '在线' : '离线' }}</span>
|
||||
<span>{{ row.sfzx == '1' ? '在线' : '离线' }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -113,14 +113,14 @@ const fetchData = async () => {
|
||||
}
|
||||
const res = await getMonitorList(params) || {}
|
||||
// 通道是否在线:0 不在线 、1 在线
|
||||
const onlineStatus = {
|
||||
0: '不在线',
|
||||
1: '在线'
|
||||
}
|
||||
// const onlineStatus = {
|
||||
// '0': '离线',
|
||||
// '1': '在线'
|
||||
// }
|
||||
// 处理数据,添加在线状态
|
||||
data.value = (res || []).map(item => ({
|
||||
...item,
|
||||
online: onlineStatus[item.sfzx]
|
||||
online: item.sfzx == '1' ? 1 : 0
|
||||
}))
|
||||
} catch (error) {
|
||||
ElMessage.error(`获取${props.title}数据失败`)
|
||||
@ -137,7 +137,7 @@ const total = ref(0)
|
||||
|
||||
// 获取表格行类名
|
||||
const getRowClassName = ({ row }) => {
|
||||
return row.online == 1 ? 'online-row' : 'offline-row'
|
||||
return row.online == '1' ? 'online-row' : 'offline-row'
|
||||
}
|
||||
|
||||
// 刷新处理
|
||||
|
||||
@ -1,5 +1,170 @@
|
||||
<template>
|
||||
<div>
|
||||
开发中。。
|
||||
<div class="titleBox">
|
||||
<PageTitle title="在线用户监控">
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<!-- <div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
</div> -->
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
<template #sex="{ row }">
|
||||
<dict-tag :options="D_BZ_XB" :value="row.sex" :tag="false" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="primary" @click="addEdit('edit', row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<!-- <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages> -->
|
||||
</div>
|
||||
<!-- 编辑详情 -->
|
||||
<!-- <EditAddForm v-if="show" ref="detailDiloag" :dic="{ JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ }"
|
||||
@updateDate="getList" /> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
// import EditAddForm from "./components/editAddForm.vue";
|
||||
// import { socketCurrentUser } from '@/api/HumanIntelligence/integralList.js'
|
||||
import { socketCurrentUser } from "@/api/dataWatch/onlineUser.js"
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
// import { jflylxTypes } from "./dict.js"
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_BZ_XB, } = proxy.$dict("D_BZ_XB",); //获取字典数据
|
||||
|
||||
const detailDiloag = ref();
|
||||
const show = ref(false)
|
||||
const userTypeArr = [
|
||||
{ label: '系统用户', value: '00' },
|
||||
{ label: '注册用户', value: '01' }
|
||||
]
|
||||
const searchConfiger = ref([
|
||||
{
|
||||
label: "用户昵称",
|
||||
prop: "userName",
|
||||
placeholder: "请输入用户昵称",
|
||||
showType: "input"
|
||||
},
|
||||
|
||||
{
|
||||
label: "用户类型",
|
||||
prop: "userType",
|
||||
placeholder: "请选择用户类型",
|
||||
showType: "select",
|
||||
options: userTypeArr
|
||||
},
|
||||
|
||||
]);
|
||||
const searchBox = ref(); //搜索框
|
||||
const pageData = reactive({
|
||||
tableData: [], //表格数据
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
haveControls: false, //不显示【操作列】
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
loading: false,
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
}, //分页
|
||||
controlsWidth: 160, //操作栏宽度
|
||||
tableColumn: [
|
||||
{ label: "用户昵称", prop: "userName" },
|
||||
{ label: "登录账号", prop: "loginName" },
|
||||
{ label: "用户类型", prop: "userType_cname" },
|
||||
{ label: "性别", prop: "sex", showSolt: true },
|
||||
{ label: "移动电话", prop: "mobile" },
|
||||
{ label: "邮箱", prop: "email" },
|
||||
{ label: "管理部门", prop: "managerOrgName" },
|
||||
{ label: "岗位名称", prop: "positionName" },
|
||||
{ label: "行业号码", prop: "inDustRialId" },
|
||||
{ label: "备注", prop: "bz", showOverflowTooltip: true },
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
tabHeightFn();
|
||||
getList()
|
||||
});
|
||||
const listQuery = ref({})
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
listQuery.value = { ...val };
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
}
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList()
|
||||
}
|
||||
|
||||
const getUserTypeName = (val) => {
|
||||
const userTypeObj = userTypeArr.find(item => item.value === val)
|
||||
return userTypeObj ? userTypeObj.label : ''
|
||||
}
|
||||
|
||||
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
const params = {
|
||||
...listQuery.value
|
||||
}
|
||||
|
||||
socketCurrentUser(params).then(res => {
|
||||
// socketCurrentUser 返回的是数组格式,不是分页对象
|
||||
pageData.tableData = Array.isArray(res) ? res : [];
|
||||
pageData.tableData = pageData.tableData.map(item => {
|
||||
item.userType_cname = getUserTypeName(item.userType);
|
||||
return item;
|
||||
})
|
||||
pageData.total = Array.isArray(res) ? res.length : 0;
|
||||
|
||||
}).finally(() => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 新增
|
||||
const addEdit = (type, row) => {
|
||||
show.value = true;
|
||||
nextTick(() => {
|
||||
detailDiloag.value.init(type, row,);
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - (searchBox.value?.offsetHeight || 0) - 250;
|
||||
window.onresize = function() {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -0,0 +1,118 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span class="title">积分系数规则{{ title }} </span>
|
||||
<div>
|
||||
<el-button type="primary" size="small" :loading="loading" @click="submit" >保存</el-button>
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
|
||||
</FormMessage>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import DialogList from '@/views/backOfficeSystem/fourColorManage/components/dialogList.vue'
|
||||
import FormMessage from '@/components/aboutTable/FormMessage.vue'
|
||||
import {sjxsglAddEntity ,sjxsglEditEntity,sjxsgId} from '@/api/sjxsgl.js'
|
||||
import { ref,defineProps, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance } from "vue";
|
||||
const emit = defineEmits(["updateDate"]);
|
||||
const props = defineProps({
|
||||
type:String,
|
||||
dic:Object,
|
||||
});
|
||||
const showDialog = ref(false); //弹窗
|
||||
const listQuery = ref({}); //表单
|
||||
const loading = ref(false);
|
||||
const elform = ref();
|
||||
const title = ref("");
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const formData = reactive([
|
||||
{ label: "系数名称", prop: "mc", type: "input" },
|
||||
{ label: "衰减比列", prop: "sjbl", type: "number", max: 100,step:0.1 },
|
||||
{ label: "计算规则", prop: "jsgz", type: "textarea" ,width:'100%'},
|
||||
]);
|
||||
|
||||
const rules = reactive({
|
||||
mc: [{ required: true, message: "请输入系数名称", trigger: "blur" }],
|
||||
sjbl: [{ required: true, message: "请输入衰减比列", trigger: "blur" }],
|
||||
jsgz: [{ required: true, message: "请输入计算规则", trigger: ['blur','change'] }],
|
||||
});
|
||||
|
||||
// 初始化数据
|
||||
const init = (type, row,) => {
|
||||
title.value = type == 'add' ? "新增" : "编辑";
|
||||
dialogForm.value = true;
|
||||
if (row) getDataById(row.id);
|
||||
};
|
||||
|
||||
// 根据id查询详情
|
||||
const getDataById = (id) => {
|
||||
sjxsgId(id).then((res) => {
|
||||
listQuery.value = res;
|
||||
});
|
||||
};
|
||||
|
||||
// 提交
|
||||
const submit = () => {
|
||||
console.log("xxxxxxxx");
|
||||
|
||||
elform.value.submit((data) => {
|
||||
const promes = {
|
||||
...data
|
||||
}
|
||||
console.log(promes);
|
||||
|
||||
if ( title.value == "新增" ) {
|
||||
sjxsglAddEntity(promes).then((res) => {
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("updateDate");
|
||||
loading.value = false;
|
||||
close();
|
||||
}).catch(() => {loading.value = false;});
|
||||
} else {
|
||||
sjxsglEditEntity(promes).then((res) => {
|
||||
proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
emit("updateDate");
|
||||
loading.value = false;
|
||||
close();
|
||||
}).catch(() => {loading.value = false;});
|
||||
}
|
||||
// let url = title.value == "新增" ? '/mosty-gsxt/tbGsxtBqgl/save':'/mosty-gsxt/tbGsxtBqgl/update';
|
||||
// let params = { ...data, bqLb:props.dic.D_GS_BQ_LB.find((it)=>it.zdmc == props.type).dm }
|
||||
// params.bqLx = '01';
|
||||
// loading.value = true;
|
||||
// qcckPost(params, url).then((res) => {
|
||||
// proxy.$message({ type: "success", message: title.value + "成功" });
|
||||
// emit("updateDate");
|
||||
// loading.value = false;
|
||||
// close();
|
||||
// }).catch(() => {loading.value = false;});
|
||||
});
|
||||
};
|
||||
|
||||
// 选择的数据
|
||||
const chooseDate = (val) => {
|
||||
listQuery.value.bqDlId = val[0].id;
|
||||
listQuery.value.bqDlMc = val[0].bqMc;
|
||||
}
|
||||
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
dialogForm.value = false;
|
||||
loading.value = false;
|
||||
if(props.type == '标签细类') formData.pop()
|
||||
|
||||
};
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
</style>
|
||||
@ -0,0 +1,149 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="积分系数配置">
|
||||
<el-button type="primary" @click="addEdit('add', '')">
|
||||
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
|
||||
<span style="vertical-align: middle">新增</span>
|
||||
</el-button>
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox">
|
||||
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox" :style="{height:pageData.tableHeight+20+'px'}">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link size="small" @click="addEdit('edit', row)">编辑</el-link>
|
||||
<el-link size="small" @click="delDictItem(row.id)" type="danger">删除</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"
|
||||
></Pages>
|
||||
</div>
|
||||
<!-- 编辑详情 -->
|
||||
<EditAddForm v-if="show" ref="detailDiloag" :type="type" :dic="{D_GS_BQ_LX,D_GS_BQ_DJ,D_GS_SSYJ,D_GS_BQ_LB}" @updateDate="getList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import EditAddForm from "./components/editAddForm.vue";
|
||||
import {sjxsglDeleteEntity ,sjxsglGetPageList} from '@/api/sjxsgl.js'
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_GS_BQ_DJ,D_GS_SSYJ,D_GS_BQ_LB,D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ","D_GS_SSYJ","D_GS_BQ_LB","D_GS_BQ_LX"); //获取字典数据
|
||||
const detailDiloag = ref();
|
||||
const searchBox = ref(); //搜索框
|
||||
const type = ref('标签大类')
|
||||
const show = ref(false)
|
||||
const searchConfiger = ref([
|
||||
{ label: "计算规则",prop:'jsgz',placeholder: "请输入计算规则", showType: "input"},
|
||||
{ label: "系数名称",prop:'mc' ,placeholder: "请输入系数名称", showType: "input"},
|
||||
]);
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
tableData: [], //表格数据
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "null",
|
||||
loading: false
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
}, //分页
|
||||
controlsWidth: 150, //操作栏宽度
|
||||
tableColumn: [
|
||||
{ label: "系数名称", prop: "mc" },
|
||||
{ label: "衰减比列", prop: "sjbl" },
|
||||
{ label: "计算规则", prop: "jsgz"},
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
getList()
|
||||
tabHeightFn();
|
||||
});
|
||||
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) =>{
|
||||
queryFrom.value = {...val}
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
|
||||
// 分页
|
||||
const changeNo = (val) =>{
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
}
|
||||
// 页数
|
||||
const changeSize = (val) =>{
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList()
|
||||
}
|
||||
|
||||
// 获取列表
|
||||
const getList = () =>{
|
||||
pageData.tableConfiger.loading = true;
|
||||
let data = { ...pageData.pageConfiger,...queryFrom.value };
|
||||
data.bqLb = type.value == '标签大类'? '01':'02'
|
||||
sjxsglGetPageList(data).then(res=>{
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch(()=>{ pageData.tableConfiger.loading = false; })
|
||||
}
|
||||
// 删除
|
||||
const delDictItem = (id) =>{
|
||||
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
|
||||
sjxsglDeleteEntity({ids:[id]}).then(()=>{
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {});
|
||||
}
|
||||
|
||||
// 新增
|
||||
const addEdit = (type, row) => {
|
||||
show.value = true;
|
||||
nextTick(()=>{
|
||||
detailDiloag.value.init(type, row);
|
||||
})
|
||||
};
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
window.onresize = function () { tabHeightFn(); };
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
@ -12,7 +12,9 @@
|
||||
<span style="vertical-align: middle">导入</span>
|
||||
</el-button> -->
|
||||
<el-button type="primary" @click="addEdit('add', '')">
|
||||
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
|
||||
<el-icon style="vertical-align: middle">
|
||||
<CirclePlus />
|
||||
</el-icon>
|
||||
<span style="vertical-align: middle">新增</span>
|
||||
</el-button>
|
||||
</PageTitle>
|
||||
@ -23,38 +25,31 @@
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox">
|
||||
<MyTable
|
||||
:tableData="pageData.tableData"
|
||||
:tableColumn="pageData.tableColumn"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount"
|
||||
:tableConfiger="pageData.tableConfiger"
|
||||
:controlsWidth="pageData.controlsWidth"
|
||||
>
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
|
||||
<template #bqYs="{ row }">
|
||||
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" />
|
||||
</template>
|
||||
<template #bqDj="{ row }">
|
||||
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
|
||||
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
|
||||
</template>
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
|
||||
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
|
||||
<el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
|
||||
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
|
||||
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages
|
||||
@changeNo="changeNo"
|
||||
@changeSize="changeSize"
|
||||
:tableHeight="pageData.tableHeight"
|
||||
:pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"
|
||||
></Pages>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
<!-- 编辑详情 -->
|
||||
<EditAddForm v-if="show" ref="detailDiloag" :dic="{D_GS_BQ_LX,D_GS_BQ_DJ,D_GS_SSYJ,D_GS_BQ_LB}" @updateDate="getList" />
|
||||
<EditAddForm v-if="show" ref="detailDiloag" :dic="{ D_GS_BQ_LX, D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB }"
|
||||
@updateDate="getList" />
|
||||
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
|
||||
:chooseJfBh="chooseJfBh" url="/tbGsxtBqzh/sjxspz" :roleIds="roleIds"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -64,19 +59,21 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Search from "@/components/aboutTable/Search.vue";
|
||||
import EditAddForm from "./components/editAddForm.vue";
|
||||
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
|
||||
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
|
||||
import { tbGsxtBqzhId } from "@/api/yj.js";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_GS_BQ_DJ,D_GS_SSYJ,D_GS_BQ_LB,D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ","D_GS_SSYJ","D_GS_BQ_LB","D_GS_BQ_LX"); //获取字典数据
|
||||
const { D_GS_BQ_DJ, D_GS_SSYJ, D_GS_BQ_LB, D_GS_BQ_LX } = proxy.$dict("D_GS_BQ_DJ", "D_GS_SSYJ", "D_GS_BQ_LB", "D_GS_BQ_LX"); //获取字典数据
|
||||
const detailDiloag = ref();
|
||||
const show = ref(false)
|
||||
const searchBox = ref(); //搜索框
|
||||
const searchConfiger = ref(
|
||||
[
|
||||
{ label: "组合标签名称", prop: 'bqMc', placeholder: "请输入组合标签名称", showType: "input"},
|
||||
// { label: "组合标签标签等级", prop: 'bqDj', placeholder: "请选择组合标签标签等级", showType: "select",options: D_GS_BQ_DJ },
|
||||
{ label: "组合标签颜色", prop: 'bqYs', placeholder: "请选择组合标签标签颜色", showType: "select",options: D_GS_SSYJ },
|
||||
]);
|
||||
{ label: "组合标签名称", prop: 'bqMc', placeholder: "请输入组合标签名称", showType: "input" },
|
||||
// { label: "组合标签标签等级", prop: 'bqDj', placeholder: "请选择组合标签标签等级", showType: "select",options: D_GS_BQ_DJ },
|
||||
{ label: "组合标签颜色", prop: 'bqYs', placeholder: "请选择组合标签标签颜色", showType: "select", options: D_GS_SSYJ },
|
||||
]);
|
||||
const queryFrom = ref({});
|
||||
const pageData = reactive({
|
||||
tableData: [], //表格数据
|
||||
@ -96,9 +93,9 @@ const pageData = reactive({
|
||||
{ label: "组合标签名称", prop: "bqMc" },
|
||||
{ label: "标签代码", prop: "bqDm" },
|
||||
// { label: "组合标签等级", prop: "bqDj",showSolt:true },
|
||||
{ label: "组合标签颜色", prop: "bqYs",showSolt:true },
|
||||
{ label: "组合标签分值", prop: "bqFz"},
|
||||
{ label: "组合标签说明", prop: "bqSm",showOverflowTooltip:true },
|
||||
{ label: "组合标签颜色", prop: "bqYs", showSolt: true },
|
||||
{ label: "组合标签分值", prop: "bqFz" },
|
||||
{ label: "组合标签说明", prop: "bqSm", showOverflowTooltip: true },
|
||||
]
|
||||
});
|
||||
onMounted(() => {
|
||||
@ -108,51 +105,61 @@ onMounted(() => {
|
||||
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) =>{
|
||||
queryFrom.value = {...val}
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val }
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
|
||||
const changeNo = (val) =>{
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
}
|
||||
const changeSize = (val) =>{
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList()
|
||||
}
|
||||
|
||||
const getList = () =>{
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
qcckGet(queryFrom.value,'/mosty-gsxt/tbGsxtBqzh/selectPage').then((res)=>{
|
||||
qcckGet(queryFrom.value, '/mosty-gsxt/tbGsxtBqzh/selectPage').then((res) => {
|
||||
pageData.tableData = res.records;
|
||||
pageData.total = res.total;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch(()=>{
|
||||
}).catch(() => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// 删除
|
||||
const delDictItem = (id) =>{
|
||||
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
|
||||
qcckDelete({},'/mosty-gsxt/tbGsxtBqzh/'+id).then(()=>{
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
const delDictItem = (id) => {
|
||||
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
|
||||
qcckDelete({}, '/mosty-gsxt/tbGsxtBqzh/' + id).then(() => {
|
||||
proxy.$message({ type: "success", message: "删除成功" });
|
||||
getList();
|
||||
})
|
||||
}).catch(() => {});
|
||||
}).catch(() => { });
|
||||
}
|
||||
|
||||
// 新增
|
||||
const addEdit = (type, row) => {
|
||||
show.value = true;
|
||||
nextTick(()=>{
|
||||
nextTick(() => {
|
||||
detailDiloag.value.init(type, row,);
|
||||
})
|
||||
};
|
||||
|
||||
// 选择系数
|
||||
const chooseJfShow = ref(false)
|
||||
const chooseJfBh = ref()
|
||||
const roleIds=ref()
|
||||
const chooseJfFun = (val) => {
|
||||
chooseJfBh.value=val.id
|
||||
tbGsxtBqzhId(val.id).then(res => {
|
||||
roleIds.value=res.sjxspzList.map(item => item.xsid)
|
||||
chooseJfShow.value = true
|
||||
})
|
||||
}
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
<template>
|
||||
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
|
||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
|
||||
<el-form-item label="处置建议" prop="jynr">
|
||||
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button type="primary" @click="okSubmit">确定</el-button>
|
||||
<el-button @click="closeHndle">返回</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref , defineExpose} from 'vue'
|
||||
const emit = defineEmits(['okSubmit'])
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const form = ref({})
|
||||
|
||||
const rules = ref({
|
||||
jynr: [
|
||||
{ required: true, message: '请输入处置建议', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const init = (row) => {
|
||||
visible.value = true;
|
||||
form.value.yjid = row.id;
|
||||
}
|
||||
const closeHndle = () => {
|
||||
visible.value = false;
|
||||
form.value = {};
|
||||
}
|
||||
const okSubmit = async () => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
let params = {...form.value , lylx:'03'}
|
||||
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
|
||||
emit('okSubmit', {...form.value})
|
||||
closeHndle()
|
||||
})
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
@ -15,7 +15,15 @@
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" v-if="search">
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Searchs>
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
|
||||
<template #jfd>
|
||||
<div>
|
||||
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
|
||||
<span style="color: #333;margin: 0 4px;">至</span>
|
||||
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
|
||||
</div>
|
||||
</template>
|
||||
</Searchs>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
|
||||
@ -38,11 +46,13 @@
|
||||
</template>
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
|
||||
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs ">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
|
||||
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
|
||||
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -62,9 +72,16 @@
|
||||
</Information>
|
||||
<!-- 详情 -->
|
||||
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }"></AddFrom>
|
||||
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
|
||||
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Czjy from './components/czjy.vue'
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import * as XLSX from "xlsx";
|
||||
import Detail from './components/detail.vue'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
@ -72,6 +89,8 @@ import Searchs from "@/components/aboutTable/Search.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Items from "./item/items.vue";
|
||||
import {yjzxXwyjSelectList } from "@/api/yj.js";
|
||||
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
|
||||
import { tbGsxtBqglSelectList } from '@/api/zdr'
|
||||
@ -84,10 +103,11 @@ import AddFrom from './components/addFrom.vue'
|
||||
import { holographicProfileJump } from "@/utils/tools.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
|
||||
|
||||
const czjyRef = ref()
|
||||
const permission_sfqs = ref(false)
|
||||
const roleCode = ref(false)
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict("D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
|
||||
const { D_BZ_YJJB,D_GS_SSYJ, D_GSXT_YJXX_CZZT } = proxy.$dict('D_BZ_YJJB',"D_GS_SSYJ", "D_GSXT_YJXX_CZZT"); //获取字典数据
|
||||
|
||||
// 字典数据集合
|
||||
const dict = ref({
|
||||
@ -106,10 +126,10 @@ const searchConfiger = ref(
|
||||
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
|
||||
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
|
||||
{ label: "电话号码", prop: 'dh', placeholder: "请输入电话号码", showType: "input" },
|
||||
{
|
||||
label: "标签小类", prop: 'bqxl', placeholder: "请选择标签小类",
|
||||
showType: "select", options: []
|
||||
},
|
||||
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
|
||||
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
|
||||
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
|
||||
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
|
||||
]);
|
||||
|
||||
const detailRef = ref()
|
||||
@ -132,7 +152,7 @@ const pageData = reactive({
|
||||
tableColumn: [
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号", prop: "sfzh", width: 200 },
|
||||
{ label: "电话", prop: "dh", width: 150 },
|
||||
// { label: "电话", prop: "dh", width: 150 },
|
||||
{ label: "行为大类", prop: "xldlmc" },
|
||||
{ label: "行为子类", prop: "xwzlmc", showOverflowTooltip: true },
|
||||
{ label: "行为描述", prop: "xwms", showOverflowTooltip: true },
|
||||
@ -140,7 +160,8 @@ const pageData = reactive({
|
||||
{ label: "行为颜色", prop: "bqys", showSolt: true },
|
||||
{ label: "行为分值", prop: "xwfz", },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "所属县局", prop: "ssbm" },
|
||||
{ label: "所属县局", prop: "ssxgaj" },
|
||||
{ label: "处置单位", prop: "ssbm" },
|
||||
]
|
||||
});
|
||||
|
||||
@ -155,25 +176,37 @@ const gettbGsxtBqglSelectList = (val) => {
|
||||
}) || []
|
||||
})
|
||||
}
|
||||
watch(() => bqLbData.value.bqXl, (res) => {
|
||||
searchConfiger.value.push({
|
||||
label: "标签小类", prop: 'bqxl', placeholder: "请选择标签小类",
|
||||
showType: "select", options: res
|
||||
},)
|
||||
}, { deep: true })
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
|
||||
|
||||
let rols = getItem('roleList') ? getItem('roleList'):[]
|
||||
let obj = rols.find(item => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
|
||||
tabHeightFn();
|
||||
getList()
|
||||
gettbGsxtBqglSelectList('02')
|
||||
|
||||
});
|
||||
|
||||
const handleCzjy = (row) => {
|
||||
czjyRef.value.init( row)
|
||||
}
|
||||
|
||||
// 搜索
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val }
|
||||
queryFrom.value = { ...queryFrom.value,...val };
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList()
|
||||
}
|
||||
const reset = () => {
|
||||
delete queryFrom.value.ksfz
|
||||
delete queryFrom.value.jsfz
|
||||
}
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList()
|
||||
@ -294,6 +327,19 @@ const openSearch = () => {
|
||||
tabHeightFn()
|
||||
})
|
||||
}
|
||||
|
||||
// 选择系数
|
||||
const chooseJfShow = ref(false)
|
||||
const chooseJfBh = ref()
|
||||
const roleIds=ref()
|
||||
const chooseJfFun = (val) => {
|
||||
chooseJfBh.value=val.id
|
||||
yjzxXwyjSelectList(val.id).then(res => {
|
||||
roleIds.value=res.sjxspzList.map(item => item.xsid)
|
||||
chooseJfShow.value = true
|
||||
})
|
||||
}
|
||||
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
if (search.value) {
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<div class="second-row">
|
||||
<div class="info-item">预警人姓名:<span>{{ row.xm }}</span></div>
|
||||
<div class="info-item">身份证号:<span>{{ row.sfzh }}</span></div>
|
||||
<div class="info-item">电话:<span>{{ row.dh }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">行为大类:<span>{{ row.xldlmc }}</span></div>
|
||||
<div class="info-item">行为子类:<span>{{ row.xwzlmc }}</span></div>
|
||||
<div class="info-item">行为次数:<span>{{ row.xwcs }}次</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
标签颜色:
|
||||
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)"
|
||||
:options="Array.isArray(props.dict.D_GS_SSYJ) ? props.dict.D_GS_SSYJ : []" />
|
||||
</div>
|
||||
<div class=" info-item">预警时间:<span>{{ row.yjsj }}</span>
|
||||
</div>
|
||||
<div class="info-item">行为分值:<span>{{ row.xwfz }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
处置状态:
|
||||
|
||||
<DictTag v-model:value="row.czzt"
|
||||
:options="Array.isArray(props.dict.D_GSXT_YJXX_CZZT) ? props.dict.D_GSXT_YJXX_CZZT : []" />
|
||||
</div>
|
||||
<div class="info-item">所属部门:<span>{{ row.ssbm }}</span></div>
|
||||
<div class="info-item">所属县局:<span>{{ row.ssxgaj }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">所属市局:<span>{{ row.sssgaj }}</span></div>
|
||||
<div class="info-item">接警员姓名:<span>{{ row.jjyxm }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item full-width">行为描述:<span>{{ row.xwms }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
const bqYs = (val) => {
|
||||
if (val == '01') { // 红
|
||||
return '#ff0202'
|
||||
} else if (val == '02') { // 橙
|
||||
return '#ff8c00'
|
||||
} else if (val == '03') { // 黄
|
||||
return '#c2c203' // 原亮黄色:ffff00
|
||||
} else if (val == '04') { // 蓝
|
||||
return '#0000ff'
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
}
|
||||
}
|
||||
|
||||
// 全宽字段
|
||||
.full-width {
|
||||
flex: 0 0 100% !important;
|
||||
}
|
||||
</style>
|
||||
@ -1,46 +1,42 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<div class="second-row">
|
||||
<div class="info-item">预警人姓名:<span>{{ row.xm }}</span></div>
|
||||
<div class="info-item">身份证号:<span>{{ row.sfzh }}</span></div>
|
||||
<div class="info-item">电话:<span>{{ row.dh }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">行为大类:<span>{{ row.xldlmc }}</span></div>
|
||||
<div class="info-item">行为子类:<span>{{ row.xwzlmc }}</span></div>
|
||||
<div class="info-item">行为次数:<span>{{ row.xwcs }}次</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
标签颜色:
|
||||
<DictTag :value="row.bqys" :tag="false" :color="bqYs(row.bqys)"
|
||||
:options="Array.isArray(props.dict.D_GS_SSYJ) ? props.dict.D_GS_SSYJ : []" />
|
||||
</div>
|
||||
<div class=" info-item">预警时间:<span>{{ row.yjsj }}</span>
|
||||
</div>
|
||||
<div class="info-item">行为分值:<span>{{ row.xwfz }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
处置状态:
|
||||
<div class="warning-item" >
|
||||
|
||||
<DictTag v-model:value="row.czzt"
|
||||
:options="Array.isArray(props.dict.D_GSXT_YJXX_CZZT) ? props.dict.D_GSXT_YJXX_CZZT : []" />
|
||||
<el-divider content-position="left">处置建议</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in list" :key="idx">
|
||||
<div class="info-item">
|
||||
<span class="text">预警人姓名:{{ it.jryXm }}</span>
|
||||
<span class="text">建议时间:{{ it.jysj }}</span>
|
||||
<span class="text">所属部门:{{ it.ssbm }}</span>
|
||||
</div>
|
||||
<div class="info-item">所属部门:<span>{{ row.ssbm }}</span></div>
|
||||
<div class="info-item">所属县局:<span>{{ row.ssxgaj }}</span></div>
|
||||
<div class="info-item">建议内容:<span>{{ it.jynr || '暂无' }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">所属市局:<span>{{ row.sssgaj }}</span></div>
|
||||
<div class="info-item">接警员姓名:<span>{{ row.jjyxm }}</span></div>
|
||||
<div>
|
||||
<el-empty v-if="list.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item full-width">行为描述:<span>{{ row.xwms }}</span></div>
|
||||
|
||||
<el-divider content-position="left">反馈内容</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in Fklist" :key="idx">
|
||||
<div class="info-item">
|
||||
<span class="text">处置地址:{{ it.czdz }}</span>
|
||||
<span class="text">处置时间:{{ it.czsj }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="text">常控不尿检理由:<span>{{ it.ckbnjly || '暂无' }}</span></span>
|
||||
<span class="text">常控处置反馈补充信息:<span>{{ it.ckczbcxx || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估:<span>{{ it.cklxzcpg || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估依据:<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<el-empty v-if="Fklist.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
|
||||
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
@ -55,52 +51,39 @@ const props = defineProps({
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
const bqYs = (val) => {
|
||||
if (val == '01') { // 红
|
||||
return '#ff0202'
|
||||
} else if (val == '02') { // 橙
|
||||
return '#ff8c00'
|
||||
} else if (val == '03') { // 黄
|
||||
return '#c2c203' // 原亮黄色:ffff00
|
||||
} else if (val == '04') { // 蓝
|
||||
return '#0000ff'
|
||||
}
|
||||
}
|
||||
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
onMounted(() => {
|
||||
qcckPost({yjid: props.row.id},'/mosty-gsxt/yjxx/czjy/getPageList').then((res) => {
|
||||
list.value = res.records || []
|
||||
})
|
||||
qcckGet({},'/mosty-gsxt/yjzxXwyj/'+ props.row.id).then((res) => {
|
||||
Fklist.value = res.fkList || []
|
||||
})
|
||||
})
|
||||
// console.log('row😃: ', props.row);
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
.text{
|
||||
display: inline-block;
|
||||
width: 25%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
// 全宽字段
|
||||
.full-width {
|
||||
flex: 0 0 100% !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -92,7 +92,6 @@ onMounted(() => {
|
||||
showDialog.value = true;
|
||||
listQuery.value = { yjid: val.id }
|
||||
let url = ''
|
||||
console.log(url);
|
||||
switch (props.lx) {
|
||||
case '01':
|
||||
url = '/mosty-gsxt/tbYjxx/getInfo/'
|
||||
@ -158,6 +157,9 @@ const submitForm = () => {
|
||||
case '04':
|
||||
url = '/mosty-gsxt/yjzxZhyj/yjfk'
|
||||
break;
|
||||
case '05':
|
||||
url = '/mosty-gsxt/tbYjxx/yjfk'
|
||||
break;
|
||||
}
|
||||
qcckPost(prome, url).then(() => {
|
||||
loading.value = false;
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
|
||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
|
||||
<el-form-item label="处置建议" prop="jynr">
|
||||
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button type="primary" @click="okSubmit">确定</el-button>
|
||||
<el-button @click="closeHndle">返回</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref , defineExpose} from 'vue'
|
||||
const emit = defineEmits(['okSubmit'])
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const form = ref({})
|
||||
const rules = ref({
|
||||
jynr: [
|
||||
{ required: true, message: '请输入处置建议', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const init = (row) => {
|
||||
visible.value = true;
|
||||
form.value.yjid = row.id;
|
||||
}
|
||||
|
||||
const closeHndle = () => {
|
||||
visible.value = false;
|
||||
form.value = {};
|
||||
}
|
||||
|
||||
const okSubmit = async () => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
let params = {...form.value , lylx:'04'}
|
||||
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
|
||||
emit('okSubmit', {...form.value})
|
||||
closeHndle()
|
||||
})
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
@ -15,7 +15,15 @@
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" v-if="search">
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Searchs>
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
|
||||
<template #jfd>
|
||||
<div>
|
||||
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
|
||||
<span style="color: #333;margin: 0 4px;">至</span>
|
||||
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
|
||||
</div>
|
||||
</template>
|
||||
</Searchs>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
|
||||
@ -32,17 +40,19 @@
|
||||
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #expand="{ props }">
|
||||
<div class="expand-content" style="max-width: 100%">
|
||||
<div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
|
||||
<Items :row="props || {}" :dict="dict" />
|
||||
</div>
|
||||
</template>
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
|
||||
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'&& permission_sfqs">反馈</el-link>
|
||||
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
|
||||
<el-link type="primary" @click="openAddModel(row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -60,28 +70,38 @@
|
||||
:tacitly="tacitly" />
|
||||
</Information>
|
||||
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
|
||||
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
|
||||
:chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz" :roleIds="roleIds"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Czjy from './components/czjy.vue'
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Searchs from "@/components/aboutTable/Search.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import Items from "./item/items.vue";
|
||||
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList } from '@/api/yj.js'
|
||||
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
|
||||
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList,yjzxZhyjSelectList } from '@/api/yj.js'
|
||||
import HolographicArchive from '@/views/home/components/holographicArchive.vue'
|
||||
import Information from "@/views/home/model/information.vue";
|
||||
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
|
||||
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
|
||||
import AddFrom from "./components/addFrom.vue";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, watch, nextTick } from "vue";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import Detail from './components/detail.vue'
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
|
||||
const permission_sfqs = ref(false)
|
||||
const roleCode = ref(false)
|
||||
const searchBox = ref();
|
||||
const czjyRef = ref()
|
||||
const { proxy } = getCurrentInstance();
|
||||
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ, D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ", "D_BZ_YJJB");
|
||||
|
||||
@ -96,6 +116,10 @@ import { holographicProfileJump } from "@/utils/tools.js"
|
||||
const searchConfiger = ref([
|
||||
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
|
||||
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
|
||||
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
|
||||
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
|
||||
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
|
||||
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
|
||||
]);
|
||||
|
||||
const queryFrom = ref({});
|
||||
@ -119,30 +143,51 @@ const pageData = reactive({
|
||||
tableColumn: [
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号", prop: "sfzh" },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "组合大类", prop: "sfdlmc" },
|
||||
{ label: "组合小类", prop: "sfzlmc" },
|
||||
// { label: "电话", prop: "dh" },
|
||||
{ label: "预警标签", prop: "yjbqmc" },
|
||||
// { label: "组合大类", prop: "sfdlmc" },
|
||||
// { label: "组合小类", prop: "sfzlmc" },
|
||||
{ label: "组合次数", prop: "sfcs", showSolt: true },
|
||||
{ label: "标签颜色", prop: "bqys", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjsj" },
|
||||
{ label: "预警分值", prop: "sffz" },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "所属县局", prop: "ssbm" },
|
||||
{ label: "所属县局", prop: "ssxgaj" },
|
||||
{ label: "处置单位", prop: "ssbm" },
|
||||
]
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
|
||||
|
||||
let rols = getItem('roleList') ? getItem('roleList'):[]
|
||||
let obj = rols.find(item => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
|
||||
tabHeightFn();
|
||||
getList();
|
||||
gettbGsxtBqglSelectList()
|
||||
});
|
||||
|
||||
|
||||
const handleCzjy = (row) => {
|
||||
czjyRef.value.init( row)
|
||||
}
|
||||
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val };
|
||||
queryFrom.value = { ...queryFrom.value,...val };
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList();
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
delete queryFrom.value.ksfz
|
||||
delete queryFrom.value.jsfz
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList();
|
||||
@ -156,7 +201,13 @@ const changeSize = (val) => {
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
// TODO: 替换为实际的组合预警API接口
|
||||
tbYjxxGetZbtj(queryFrom.value).then((res) => {
|
||||
const promes = {
|
||||
...queryFrom.value,
|
||||
pageCurrent: pageData.pageConfiger.pageCurrent,
|
||||
pageSize: pageData.pageConfiger.pageSize
|
||||
}
|
||||
|
||||
tbYjxxGetZbtj(promes).then((res) => {
|
||||
pageData.tableData = res.records || [];
|
||||
pageData.total = res.total || 0;
|
||||
pageData.tableConfiger.loading = false;
|
||||
@ -188,12 +239,7 @@ const gettbGsxtBqglSelectList = (val) => {
|
||||
}) || []
|
||||
})
|
||||
}
|
||||
watch(() => bqLbData.value.bqXl, (res) => {
|
||||
searchConfiger.value.push({
|
||||
label: "组合标签", prop: 'bqmc', placeholder: "请选择组合标签",
|
||||
showType: "select", options: res
|
||||
},)
|
||||
}, { deep: true, immediate: true })
|
||||
|
||||
|
||||
// 查看详情
|
||||
const detailRef = ref()
|
||||
@ -259,6 +305,20 @@ const openAddModel = (row) => {
|
||||
|
||||
addModelRef.value.init(row)
|
||||
}
|
||||
|
||||
|
||||
// 选择系数
|
||||
const chooseJfShow = ref(false)
|
||||
const chooseJfBh = ref()
|
||||
const roleIds=ref()
|
||||
const chooseJfFun = (val) => {
|
||||
chooseJfBh.value=val.id
|
||||
yjzxZhyjSelectList(val.id).then(res => {
|
||||
roleIds.value=res.sjxspzList.map(item => item.xsid)
|
||||
chooseJfShow.value = true
|
||||
})
|
||||
}
|
||||
|
||||
// 搜索栏
|
||||
const search = ref(false)
|
||||
const openSearch = () => {
|
||||
@ -318,3 +378,4 @@ const exportExl = () => {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<div class="second-row">
|
||||
<div class="info-item">姓名:<span>{{ row.xm }}</span></div>
|
||||
<div class="info-item">身份证号:<span>{{ row.sfzh }}</span></div>
|
||||
<div class="info-item">电话:<span>{{ row.dh }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">组合大类:<span>{{ row.sfdlmc }}</span></div>
|
||||
<div class="info-item">组合小类:<span>{{ row.sfzlmc }}</span></div>
|
||||
<div class="info-item">组合次数:<span>{{ row.sfcs }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
标签颜色:<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
|
||||
</div>
|
||||
<div class="info-item">预警时间:<span>{{ row.yjsj }}</span></div>
|
||||
<div class="info-item">预警分值:<span>{{ row.sffz }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
处置状态:<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
</div>
|
||||
<div class="info-item">所属县局:<span>{{ row.ssbm }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,32 +1,42 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<div class="second-row">
|
||||
<div class="info-item">姓名:<span>{{ row.xm }}</span></div>
|
||||
<div class="info-item">身份证号:<span>{{ row.sfzh }}</span></div>
|
||||
<div class="info-item">电话:<span>{{ row.dh }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">组合大类:<span>{{ row.sfdlmc }}</span></div>
|
||||
<div class="info-item">组合小类:<span>{{ row.sfzlmc }}</span></div>
|
||||
<div class="info-item">组合次数:<span>{{ row.sfcs }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="warning-item" >
|
||||
|
||||
<el-divider content-position="left">处置建议</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in list" :key="idx">
|
||||
<div class="info-item">
|
||||
标签颜色:<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
|
||||
<span class="text">预警人姓名:{{ it.jryXm }}</span>
|
||||
<span class="text">建议时间:{{ it.jysj }}</span>
|
||||
<span class="text">所属部门:{{ it.ssbm }}</span>
|
||||
</div>
|
||||
<div class="info-item">预警时间:<span>{{ row.yjsj }}</span></div>
|
||||
<div class="info-item">预警分值:<span>{{ row.sffz }}</span></div>
|
||||
<div class="info-item">建议内容:<span>{{ it.jynr || '暂无' }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div>
|
||||
<el-empty v-if="list.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
<el-divider content-position="left">反馈内容</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in Fklist" :key="idx">
|
||||
<div class="info-item">
|
||||
处置状态:<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
<span class="text">处置地址:{{ it.czdz }}</span>
|
||||
<span class="text">处置时间:{{ it.czsj }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="text">常控不尿检理由:<span>{{ it.ckbnjly || '暂无' }}</span></span>
|
||||
<span class="text">常控处置反馈补充信息:<span>{{ it.ckczbcxx || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估:<span>{{ it.cklxzcpg || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估依据:<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
|
||||
</div>
|
||||
<div class="info-item">所属县局:<span>{{ row.ssbm }}</span></div>
|
||||
</div>
|
||||
<div>
|
||||
<el-empty v-if="Fklist.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
|
||||
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
@ -41,34 +51,39 @@ const props = defineProps({
|
||||
})
|
||||
},
|
||||
})
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
onMounted(() => {
|
||||
qcckPost({yjid: props.row.id},'/mosty-gsxt/yjxx/czjy/getPageList').then((res) => {
|
||||
list.value = res.records || []
|
||||
})
|
||||
qcckGet({},'/mosty-gsxt/yjzxZhyj/'+ props.row.id).then((res) => {
|
||||
Fklist.value = res.fkList || []
|
||||
})
|
||||
})
|
||||
// console.log('row😃: ', props.row);
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
.text{
|
||||
display: inline-block;
|
||||
width: 25%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@ -0,0 +1,79 @@
|
||||
<template>
|
||||
<div class="dialog" v-if="dialogForm">
|
||||
<div class="head_box">
|
||||
<span class="title">身份预警{{ title }} </span>
|
||||
<div>
|
||||
<!-- <el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button> -->
|
||||
<el-button size="small" @click="close">关闭</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form_cnt">
|
||||
<FormMessage :formList="formData" disabled v-model="listQuery" ref="elform">
|
||||
</FormMessage>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch } from "vue";
|
||||
const emit = defineEmits(["updateDate"]);
|
||||
const props = defineProps({
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => { }
|
||||
}
|
||||
});
|
||||
const { proxy } = getCurrentInstance();
|
||||
const dialogForm = ref(false); //弹窗
|
||||
const formData = ref([])
|
||||
watch(() => props.dict, (res) => {
|
||||
if (res) {
|
||||
formData.value = [
|
||||
{ label: "预警人员姓名", prop: "yjRyxm", type: "input" },
|
||||
{ label: "预警人员身份证号码", prop: "yjRysfzh", type: "input" },
|
||||
{ label: "电话", prop: "dh", type: "input" },
|
||||
{ label: "预警标签", prop: "yjbqmc", type: "input" },
|
||||
{ label: "今日预警次数", prop: "yjJrcs", type: "input",lx:"number" },
|
||||
{ label: "标签颜色", prop: "yjJb", type: "select", options: props.dict.D_GS_SSYJ },
|
||||
{ label: "预警标题", prop: "yjBt", type: "input" },
|
||||
{ label: "预警内容", prop: "yjNr", type: "input" },
|
||||
{ label: "预警时间", prop: "yjFssj", type: "input" },
|
||||
{ label: "处置状态", prop: "czzt", type: "select", options: props.dict.D_GSXT_YJXX_CZZT },
|
||||
{ label: "所属部门", prop: "ssbm", type: "input" },
|
||||
{ label: "所属县局", prop: "ssxgaj", type: "input" },
|
||||
{ label: "所属市局", prop: "sssgaj", type: "input" },
|
||||
]
|
||||
}
|
||||
}, { deep: true, immediate: true })
|
||||
const listQuery = ref({}); //表单
|
||||
const loading = ref(false);
|
||||
const title = ref("详情");
|
||||
const init = (type, row) => {
|
||||
dialogForm.value = true;
|
||||
qcckGet({},'/mosty-gsxt/tbYjxx/getInfo/'+ row.id).then((res) => {
|
||||
listQuery.value = res || {}
|
||||
})
|
||||
|
||||
};
|
||||
// 关闭
|
||||
const close = () => {
|
||||
listQuery.value = {};
|
||||
loading.value = false;
|
||||
dialogForm.value = false;
|
||||
listQuery.value = {}
|
||||
};
|
||||
|
||||
defineExpose({ init });
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "~@/assets/css/layout.scss";
|
||||
@import "~@/assets/css/element-plus.scss";
|
||||
::v-deep {
|
||||
.el-form-item__content {
|
||||
align-items: normal;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
|
||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
|
||||
<el-form-item label="处置建议" prop="jynr">
|
||||
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button type="primary" @click="okSubmit">确定</el-button>
|
||||
<el-button @click="closeHndle">返回</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref , defineExpose} from 'vue'
|
||||
const emit = defineEmits(['okSubmit'])
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const form = ref({})
|
||||
const rules = ref({
|
||||
jynr: [
|
||||
{ required: true, message: '请输入处置建议', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const init = (row) => {
|
||||
visible.value = true;
|
||||
form.value.yjid = row.id;
|
||||
}
|
||||
|
||||
const closeHndle = () => {
|
||||
visible.value = false;
|
||||
form.value = {};
|
||||
}
|
||||
|
||||
const okSubmit = async () => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
let params = {...form.value , lylx:'01'}
|
||||
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
|
||||
emit('okSubmit', {...form.value})
|
||||
closeHndle()
|
||||
})
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
@ -0,0 +1,280 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="预警布控">
|
||||
<el-button type="success" @click="openSearch">
|
||||
<Search style="width: 1em; height: 1em; margin-right: 8px" />
|
||||
<span style="vertical-align: middle" v-if="!search">搜索</span>
|
||||
<span style="vertical-align: middle" v-else>关闭搜索</span>
|
||||
</el-button>
|
||||
<el-button type="primary" @click="exportExl">导出</el-button>
|
||||
</PageTitle>
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" v-if="search">
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
|
||||
<template #jfd>
|
||||
<div>
|
||||
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
|
||||
<span style="color: #333;margin: 0 4px;">至</span>
|
||||
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
|
||||
</div>
|
||||
</template>
|
||||
</Searchs>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="tabBox" :style="{ height: (pageData.tableHeight + 40) + 'px' }">
|
||||
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
|
||||
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth" expand
|
||||
@chooseData="handleChooseData">
|
||||
<template #expand="{ props }">
|
||||
<div class="expand-content" style="max-width: 100%">
|
||||
<Items :row="props || {}" :dict="dict" />
|
||||
</div>
|
||||
</template>
|
||||
<template #yjJb="{ row }">
|
||||
<DictTag :value="row.yjJb" :tag="false" :color="bqYs(row.yjJb)" :options="D_GS_SSYJ" />
|
||||
</template>
|
||||
<template #czzt="{ row }">
|
||||
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
|
||||
</template>
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-if="row.czzt == '02' && permission_sfqs" >反馈</el-link>
|
||||
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
|
||||
...pageData.pageConfiger,
|
||||
total: pageData.total
|
||||
}"></Pages>
|
||||
</div>
|
||||
</div>
|
||||
<FkDialog @change="getList" lx="05" />
|
||||
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Czjy from './components/czjy.vue'
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Searchs from "@/components/aboutTable/Search.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
import AddFrom from "./components/addFrom.vue";
|
||||
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import emitter from "@/utils/eventBus.js";
|
||||
import { holographicProfileJump } from "@/utils/tools.js"
|
||||
import Items from "./item/items.vue"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
const czjyRef = ref()
|
||||
const { proxy } = getCurrentInstance();
|
||||
const searchBox = ref();
|
||||
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ,D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ",'D_BZ_YJJB')
|
||||
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
|
||||
// 搜索配置
|
||||
const searchConfiger = ref([
|
||||
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
|
||||
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
|
||||
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
|
||||
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
|
||||
{ label: "级别", prop: 'yjJb', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
|
||||
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
|
||||
]);
|
||||
|
||||
const permission_sfqs = ref(false)
|
||||
const roleCode = ref(false)
|
||||
|
||||
const queryFrom = ref({});
|
||||
|
||||
// 页面数据
|
||||
const pageData = reactive({
|
||||
tableData: [],
|
||||
keyCount: 0,
|
||||
tableConfiger: {
|
||||
rowHieght: 61,
|
||||
showSelectType: "checkBox",
|
||||
loading: false,
|
||||
haveControls: true,
|
||||
},
|
||||
total: 0,
|
||||
pageConfiger: {
|
||||
pageSize: 20,
|
||||
pageCurrent: 1
|
||||
},
|
||||
controlsWidth: 300, //操作栏宽度
|
||||
tableColumn: [
|
||||
{ label: "预警人员姓名", prop: "yjRyxm" },
|
||||
{ label: "预警人员身份证号码", prop: "yjRysfzh" },
|
||||
{ label: "预警标签", prop: "yjbqmc" },
|
||||
{ label: "今日预警次数", prop: "yjJrcs" },
|
||||
{ label: "标签颜色", prop: "yjJb", showSolt: true },
|
||||
{ label: "预警内容", prop: "yjNr" },
|
||||
{ label: "预警时间", prop: "yjFssj" },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "所属县局", prop: "ssxgaj" },
|
||||
{ label: "处置单位", prop: "ssbm" },
|
||||
]
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
|
||||
let rols = getItem('roleList') ? getItem('roleList'):[]
|
||||
let obj = rols.find(item => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
|
||||
tabHeightFn();
|
||||
getList();
|
||||
});
|
||||
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...queryFrom.value,...val };
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList();
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
delete queryFrom.value.ksfz
|
||||
delete queryFrom.value.jsfz
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList();
|
||||
};
|
||||
|
||||
const changeSize = (val) => {
|
||||
pageData.pageConfiger.pageSize = val;
|
||||
getList();
|
||||
};
|
||||
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
let params = {
|
||||
...queryFrom.value,
|
||||
pageCurrent: pageData.pageConfiger.pageCurrent,
|
||||
pageSize: pageData.pageConfiger.pageSize,
|
||||
}
|
||||
qcckPost(params,'/mosty-gsxt/tbYjxx/getBdbkPageList').then((res) => {
|
||||
pageData.tableData = res?.records || []
|
||||
pageData.total = res?.total || 0;
|
||||
pageData.tableConfiger.loading = false;
|
||||
}).catch(() => {
|
||||
pageData.tableConfiger.loading = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 处理签收
|
||||
const handleQsFk = (val, type) => {
|
||||
switch (type) {
|
||||
case '签收':
|
||||
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
|
||||
qcckPost({ id: val.id }, "/mosty-gsxt/mosty-gsxt/tbYjxx/yjqs").then(() => {
|
||||
val.czzt = '02'
|
||||
getList()
|
||||
proxy.$message({ type: "success", message: "签收成功" });
|
||||
});
|
||||
})
|
||||
break;
|
||||
case '反馈':
|
||||
case '查看反馈':
|
||||
emitter.emit("openFkDialog", { id: val.id, type });
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const pushAssess = (val) => {
|
||||
return holographicProfileJump(val?.sfzh) // 全息档案跳转
|
||||
}
|
||||
|
||||
|
||||
const bqYs = (val) => {
|
||||
switch (val) {
|
||||
case '01':
|
||||
return '#ff0202'
|
||||
case '02':
|
||||
return '#ff8c00'
|
||||
case '03':
|
||||
return '#ffff00'
|
||||
case '04':
|
||||
return '#0000ff'
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
// 新增
|
||||
const addModelRef = ref(null)
|
||||
const openAddFrom = (row) => {
|
||||
addModelRef.value.init('add', row)
|
||||
}
|
||||
// 搜索栏
|
||||
const search = ref(false)
|
||||
const openSearch = () => {
|
||||
search.value = !search.value
|
||||
nextTick(() => {
|
||||
tabHeightFn()
|
||||
})
|
||||
}
|
||||
|
||||
const handleCzjy = (row) => {
|
||||
czjyRef.value.init( row)
|
||||
}
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
if (search.value) {
|
||||
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
|
||||
} else {
|
||||
pageData.tableHeight = window.innerHeight - 250;
|
||||
}
|
||||
window.onresize = function() {
|
||||
tabHeightFn();
|
||||
};
|
||||
};
|
||||
/** 选中项 */
|
||||
const selectRows = ref([])
|
||||
const handleChooseData = (val) => {
|
||||
selectRows.value = val
|
||||
}
|
||||
const exportExl = () => {
|
||||
const titleObj = {
|
||||
yjRyxm: "预警人员姓名",
|
||||
yjRysfzh: "预警人员身份证号码",
|
||||
yjbqmc: "预警标签",
|
||||
yjJrcs: "今日预警次数",
|
||||
yjJb_name: "标签颜色",
|
||||
yjNr: "预警内容",
|
||||
yjFssj: "预警时间",
|
||||
czzt_name: "处置状态",
|
||||
ssxgaj: "所属县局",
|
||||
ssbm: "处置单位",
|
||||
}
|
||||
/** 导出【选中】的数据 (没有就全部)*/
|
||||
const needArr = selectRows.value?.length > 0 ? selectRows.value : pageData.tableData
|
||||
const data = needArr.map(item => {
|
||||
return {
|
||||
...item,
|
||||
yjJb_name: getMultiDictVal(item.yjJb, D_GS_SSYJ),
|
||||
czzt_name: getMultiDictVal(item.czzt, D_GSXT_YJXX_CZZT),
|
||||
}
|
||||
})
|
||||
exportExlByObj(titleObj, data, '预警布控')
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.el-loading-mask {
|
||||
background: rgba(0, 0, 0, 0.5) !important;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,89 @@
|
||||
<template>
|
||||
<div class="warning-item" >
|
||||
|
||||
<el-divider content-position="left">处置建议</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in list" :key="idx">
|
||||
<div class="info-item">
|
||||
<span class="text">预警人姓名:{{ it.jryXm }}</span>
|
||||
<span class="text">建议时间:{{ it.jysj }}</span>
|
||||
<span class="text">所属部门:{{ it.ssbm }}</span>
|
||||
</div>
|
||||
<div class="info-item">建议内容:<span>{{ it.jynr || '暂无' }}</span></div>
|
||||
</div>
|
||||
<div>
|
||||
<el-empty v-if="list.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
<el-divider content-position="left">反馈内容</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in Fklist" :key="idx">
|
||||
<div class="info-item">
|
||||
<span class="text">处置地址:{{ it.czdz }}</span>
|
||||
<span class="text">处置时间:{{ it.czsj }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="text">常控不尿检理由:<span>{{ it.ckbnjly || '暂无' }}</span></span>
|
||||
<span class="text">常控处置反馈补充信息:<span>{{ it.ckczbcxx || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估:<span>{{ it.cklxzcpg || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估依据:<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<el-empty v-if="Fklist.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
|
||||
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
onMounted(() => {
|
||||
if(!props.row.id) return;
|
||||
qcckPost({yjid: props.row.id},'/mosty-gsxt/yjxx/czjy/getPageList').then((res) => {
|
||||
list.value = res.records || []
|
||||
})
|
||||
qcckGet({},'/mosty-gsxt/tbYjxx/getInfo/'+ props.row.id).then((res) => {
|
||||
Fklist.value = res.fkList || []
|
||||
})
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
.text{
|
||||
display: inline-block;
|
||||
width: 25%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="titleBox">
|
||||
<PageTitle title="四色预警" />
|
||||
<PageTitle title="预警数据整合" />
|
||||
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
@ -75,7 +75,6 @@ const searchConfiger = ref(
|
||||
[
|
||||
{ label: "预警级别", prop: 'yjjbList', placeholder: "请输入姓名", showType: "select", options: D_BZ_YJJB },
|
||||
{ label: "预警类型", prop: 'yjlxList', placeholder: "请输入身份证号码", showType: "select", options: D_GS_ZDQT_YJLB },
|
||||
|
||||
]);
|
||||
|
||||
const queryFrom = ref({});
|
||||
|
||||
@ -47,7 +47,6 @@ watch(() => props.dict, (res) => {
|
||||
{ label: "所属县局", prop: "ssxgaj", type: "input" },
|
||||
{ label: "所属市局", prop: "sssgaj", type: "input" },
|
||||
{ label: "接警员姓名", prop: "jjyxm", type: "input" },
|
||||
// { label: "预警内容", prop: "yjNr", type: "textarea", width: "100%" },
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
|
||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
|
||||
<el-form-item label="处置建议" prop="jynr">
|
||||
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button type="primary" @click="okSubmit">确定</el-button>
|
||||
<el-button @click="closeHndle">返回</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref , defineExpose} from 'vue'
|
||||
const emit = defineEmits(['okSubmit'])
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const form = ref({})
|
||||
const rules = ref({
|
||||
jynr: [
|
||||
{ required: true, message: '请输入处置建议', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const init = (row) => {
|
||||
visible.value = true;
|
||||
form.value.yjid = row.id;
|
||||
}
|
||||
|
||||
const closeHndle = () => {
|
||||
visible.value = false;
|
||||
form.value = {};
|
||||
}
|
||||
|
||||
const okSubmit = async () => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
let params = {...form.value , lylx:'02'}
|
||||
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
|
||||
emit('okSubmit', {...form.value})
|
||||
closeHndle()
|
||||
})
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
@ -15,17 +15,13 @@
|
||||
</div>
|
||||
<!-- 搜索 -->
|
||||
<div ref="searchBox" v-if="search">
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
|
||||
<template #defaultSlot>
|
||||
<el-select @change="gettbGsxtBqglSelectList" v-model="queryFrom.sfdl" placeholder="请选择身份类型"
|
||||
style="width: 100%">
|
||||
<el-option :label="item.label" :value="item.value" v-for="(item, index) in bqLbData.bqDl" :key="index" />
|
||||
</el-select>
|
||||
</template>
|
||||
<template #nameSlot>
|
||||
<el-select v-model="queryFrom.sfxl" placeholder="请选择身份类型" style="width: 100%">
|
||||
<el-option :label="item.label" :value="item.value" v-for="(item, index) in bqLbData.bqXl" :key="index" />
|
||||
</el-select>
|
||||
<Searchs :searchArr="searchConfiger" @submit="onSearch" @reset="reset" :key="pageData.keyCount">
|
||||
<template #jfd>
|
||||
<div>
|
||||
<el-input v-model="queryFrom.ksfz" type="number" placeholder="开始身份分值" style="width: 130px"></el-input>
|
||||
<span style="color: #333;margin: 0 4px;">至</span>
|
||||
<el-input v-model="queryFrom.jsfz" type="number" placeholder="结束身份分值" style="width: 130px"></el-input>
|
||||
</div>
|
||||
</template>
|
||||
</Searchs>
|
||||
</div>
|
||||
@ -50,11 +46,13 @@
|
||||
</template>
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
|
||||
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="danger" @click="handleQsFk(row)">转会商</el-link> -->
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
|
||||
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
|
||||
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
|
||||
</template>
|
||||
</MyTable>
|
||||
@ -72,9 +70,17 @@
|
||||
:tacitly="tacitly" />
|
||||
</Information>
|
||||
<AddFrom ref="addModelRef" :dict="{ D_GSXT_YJXX_CZZT, D_BZ_YJJB, D_GS_SSYJ }" />
|
||||
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
|
||||
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
|
||||
:chooseJfBh="chooseJfBh" url="/yjzxSfyj/sjxspz" :roleIds="roleIds"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Czjy from './components/czjy.vue'
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
import Searchs from "@/components/aboutTable/Search.vue";
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
@ -83,10 +89,11 @@ import HolographicArchive from '@/views/home/components/holographicArchive.vue'
|
||||
import Information from "@/views/home/model/information.vue";
|
||||
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
|
||||
import AddFrom from "./components/addFrom.vue";
|
||||
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
|
||||
import FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
|
||||
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
||||
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
|
||||
import { yjzxSfyjSelectList } from "@/api/yj.js";
|
||||
import { yjzxSfyjSelectList,yjzxyjzxSfyjSelectList } from "@/api/yj.js";
|
||||
import { tbGsxtBqglSelectList } from '@/api/zdr'
|
||||
import Detail from './components/detail.vue'
|
||||
import { watch } from "vue";
|
||||
@ -95,19 +102,24 @@ import { holographicProfileJump } from "@/utils/tools.js"
|
||||
import Items from "./item/items.vue"
|
||||
import { exportExlByObj } from "@/utils/exportExcel.js"
|
||||
import { getMultiDictVal } from "@/utils/dict.js"
|
||||
|
||||
const czjyRef = ref()
|
||||
const { proxy } = getCurrentInstance();
|
||||
const searchBox = ref();
|
||||
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ")
|
||||
const { D_GSXT_YJXX_CZZT, D_GS_SSYJ,D_BZ_YJJB } = proxy.$dict("D_GSXT_YJXX_CZZT", "D_GS_SSYJ",'D_BZ_YJJB')
|
||||
const dict = reactive({ D_GSXT_YJXX_CZZT, D_GS_SSYJ })
|
||||
// 搜索配置
|
||||
const searchConfiger = ref([
|
||||
{ label: "姓名", prop: 'xm', placeholder: "请输入姓名", showType: "input" },
|
||||
{ label: "身份证号码", prop: 'sfzh', placeholder: "请输入身份证号码", showType: "input" },
|
||||
{ label: "标签大类", prop: 'sflx', placeholder: "请选择标签大类", showType: "defaultSlot" },
|
||||
{ label: "标签小类", prop: 'bqxl', placeholder: "请选择标签小类", showType: "nameSlot" },
|
||||
{ label: "预警标签", prop: 'yjbqmc', placeholder: "请输入预警标签", showType: "input" },
|
||||
{ label: "部门", prop: 'ssbmdm', placeholder: "请选择部门", showType: "department" },
|
||||
{ label: "级别", prop: 'bqys', placeholder: "请选择级别", showType: "select" ,options: D_BZ_YJJB},
|
||||
{ label: "积分段", prop: 'jfd', placeholder: "请选择积分段", showType: "Slot" },
|
||||
]);
|
||||
|
||||
const permission_sfqs = ref(false)
|
||||
const roleCode = ref(false)
|
||||
|
||||
const queryFrom = ref({});
|
||||
|
||||
// 页面数据
|
||||
@ -129,30 +141,47 @@ const pageData = reactive({
|
||||
tableColumn: [
|
||||
{ label: "姓名", prop: "xm" },
|
||||
{ label: "身份证号", prop: "sfzh" },
|
||||
{ label: "电话", prop: "dh" },
|
||||
{ label: "组合大类", prop: "sfdlmc" },
|
||||
{ label: "组合小类", prop: "sfzlmc" },
|
||||
// { label: "电话", prop: "dh" },
|
||||
{ label: "预警标签", prop: "yjbqmc" },
|
||||
// { label: "组合大类", prop: "sfdlmc" },
|
||||
// { label: "组合小类", prop: "sfzlmc" },
|
||||
{ label: "组合次数", prop: "sfcs", showSolt: true },
|
||||
{ label: "标签颜色", prop: "bqys", showSolt: true },
|
||||
{ label: "预警时间", prop: "yjsj" },
|
||||
{ label: "预警分值", prop: "sffz" },
|
||||
{ label: "处置状态", prop: "czzt", showSolt: true },
|
||||
{ label: "所属县局", prop: "ssbm" },
|
||||
{ label: "所属县局", prop: "ssxgaj" },
|
||||
{ label: "处置单位", prop: "ssbm" },
|
||||
]
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
|
||||
|
||||
let rols = getItem('roleList') ? getItem('roleList'):[]
|
||||
let obj = rols.find(item => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
|
||||
gettbGsxtBqglSelectList()
|
||||
tabHeightFn();
|
||||
getList();
|
||||
});
|
||||
|
||||
|
||||
const onSearch = (val) => {
|
||||
queryFrom.value = { ...val, ...queryFrom.value };
|
||||
queryFrom.value = { ...queryFrom.value,...val };
|
||||
pageData.pageConfiger.pageCurrent = 1;
|
||||
getList();
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
delete queryFrom.value.ksfz
|
||||
delete queryFrom.value.jsfz
|
||||
}
|
||||
|
||||
const changeNo = (val) => {
|
||||
pageData.pageConfiger.pageCurrent = val;
|
||||
getList();
|
||||
@ -166,7 +195,12 @@ const changeSize = (val) => {
|
||||
const getList = () => {
|
||||
pageData.tableConfiger.loading = true;
|
||||
// TODO: 替换为实际的身份预警API接口
|
||||
yjzxSfyjSelectList(queryFrom.value).then((res) => {
|
||||
let params = {
|
||||
...queryFrom.value,
|
||||
pageCurrent: pageData.pageConfiger.pageCurrent,
|
||||
pageSize: pageData.pageConfiger.pageSize,
|
||||
}
|
||||
yjzxSfyjSelectList(params).then((res) => {
|
||||
pageData.tableData = Array.isArray(res?.records) ? res.records : [];
|
||||
pageData.tableData = pageData.tableData.map(item => {
|
||||
return {
|
||||
@ -291,6 +325,18 @@ const addModelRef = ref(null)
|
||||
const openAddFrom = (row) => {
|
||||
addModelRef.value.init('add', row)
|
||||
}
|
||||
// 选择系数
|
||||
const chooseJfShow = ref(false)
|
||||
const chooseJfBh = ref()
|
||||
const roleIds=ref()
|
||||
const chooseJfFun = (val) => {
|
||||
chooseJfBh.value=val.id
|
||||
yjzxyjzxSfyjSelectList(val.id).then(res => {
|
||||
roleIds.value=res.sjxspzList.map(item => item.xsid)
|
||||
chooseJfShow.value = true
|
||||
})
|
||||
}
|
||||
|
||||
// 搜索栏
|
||||
const search = ref(false)
|
||||
const openSearch = () => {
|
||||
@ -299,6 +345,10 @@ const openSearch = () => {
|
||||
tabHeightFn()
|
||||
})
|
||||
}
|
||||
|
||||
const handleCzjy = (row) => {
|
||||
czjyRef.value.init( row)
|
||||
}
|
||||
// 表格高度计算
|
||||
const tabHeightFn = () => {
|
||||
if (search.value) {
|
||||
|
||||
@ -0,0 +1,83 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<div class="second-row">
|
||||
<div class="info-item">预警人姓名:<span>{{ row.xm }}</span></div>
|
||||
<div class="info-item">身份证号:<span>{{ row.sfzh }}</span></div>
|
||||
<div class="info-item">电话:<span>{{ row.dh }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">组合大类:<span>{{ row.sfdlmc }}</span></div>
|
||||
<div class="info-item">组合小类:<span>{{ row.sfzlmc }}</span></div>
|
||||
<div class="info-item">组合预警次数:<span>{{ row.sfcs }}次</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
标签颜色:
|
||||
<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
|
||||
</div>
|
||||
<div class="info-item">预警时间:<span>{{ row.yjsj }}</span></div>
|
||||
<div class="info-item">预警分值:<span>{{ row.sffz }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">
|
||||
处置状态:
|
||||
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
</div>
|
||||
<div class="info-item">所属部门:<span>{{ row.ssbm }}</span></div>
|
||||
<div class="info-item">所属县局:<span>{{ row.ssxgaj }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">所属市局:<span>{{ row.sssgaj }}</span></div>
|
||||
<div class="info-item">接警员姓名:<span>{{ row.jjyxm }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
// import DictTag from '@/components/dictTag.vue'
|
||||
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
// console.log('row😃: ', props.row);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,40 +1,41 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<div class="second-row">
|
||||
<div class="info-item">预警人姓名:<span>{{ row.xm }}</span></div>
|
||||
<div class="info-item">身份证号:<span>{{ row.sfzh }}</span></div>
|
||||
<div class="info-item">电话:<span>{{ row.dh }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">组合大类:<span>{{ row.sfdlmc }}</span></div>
|
||||
<div class="info-item">组合小类:<span>{{ row.sfzlmc }}</span></div>
|
||||
<div class="info-item">组合预警次数:<span>{{ row.sfcs }}次</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="warning-item" >
|
||||
|
||||
<el-divider content-position="left">处置建议</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in list" :key="idx">
|
||||
<div class="info-item">
|
||||
标签颜色:
|
||||
<DictTag v-model:value="row.bqys" :options="props.dict.D_GS_SSYJ" />
|
||||
<span class="text">预警人姓名:{{ it.jryXm }}</span>
|
||||
<span class="text">建议时间:{{ it.jysj }}</span>
|
||||
<span class="text">所属部门:{{ it.ssbm }}</span>
|
||||
</div>
|
||||
<div class="info-item">预警时间:<span>{{ row.yjsj }}</span></div>
|
||||
<div class="info-item">预警分值:<span>{{ row.sffz }}</span></div>
|
||||
<div class="info-item">建议内容:<span>{{ it.jynr || '暂无' }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div>
|
||||
<el-empty v-if="list.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
<el-divider content-position="left">反馈内容</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in Fklist" :key="idx">
|
||||
<div class="info-item">
|
||||
处置状态:
|
||||
<DictTag v-model:value="row.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
<span class="text">处置地址:{{ it.czdz }}</span>
|
||||
<span class="text">处置时间:{{ it.czsj }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="text">常控不尿检理由:<span>{{ it.ckbnjly || '暂无' }}</span></span>
|
||||
<span class="text">常控处置反馈补充信息:<span>{{ it.ckczbcxx || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估:<span>{{ it.cklxzcpg || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估依据:<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
|
||||
</div>
|
||||
<div class="info-item">所属部门:<span>{{ row.ssbm }}</span></div>
|
||||
<div class="info-item">所属县局:<span>{{ row.ssxgaj }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item">所属市局:<span>{{ row.sssgaj }}</span></div>
|
||||
<div class="info-item">接警员姓名:<span>{{ row.jjyxm }}</span></div>
|
||||
<div>
|
||||
<el-empty v-if="Fklist.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
// import DictTag from '@/components/dictTag.vue'
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
|
||||
|
||||
const props = defineProps({
|
||||
/** 表格行数据 */
|
||||
@ -50,34 +51,39 @@ const props = defineProps({
|
||||
})
|
||||
},
|
||||
})
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
onMounted(() => {
|
||||
qcckPost({yjid: props.row.id},'/mosty-gsxt/yjxx/czjy/getPageList').then((res) => {
|
||||
list.value = res.records || []
|
||||
})
|
||||
qcckGet({},'/mosty-gsxt/yjzxSfyj/'+ props.row.id).then((res) => {
|
||||
Fklist.value = res.fkList || []
|
||||
})
|
||||
})
|
||||
// console.log('row😃: ', props.row);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
.text{
|
||||
display: inline-block;
|
||||
width: 25%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@ -124,7 +124,7 @@ const pageData = reactive({
|
||||
// { label: "预警图片", prop: "yjtp", showSlot: true, width: 100 },
|
||||
// { label: "预警时间", prop: "yjsj", showOverflowTooltip: true, width: 150 },
|
||||
{ label: "姓名", prop: "ryxm", showOverflowTooltip: true },
|
||||
{ label: "车牌号", prop: "cph", showOverflowTooltip: true },
|
||||
// { label: "车牌号", prop: "cph", showOverflowTooltip: true },
|
||||
// { label: "号牌类型", prop: "hplx", showOverflowTooltip: true },
|
||||
// { label: "身份证号", prop: "rysfzh", showOverflowTooltip: true },
|
||||
// { label: "部门名称", prop: "ssbm", showOverflowTooltip: true },
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
|
||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
|
||||
<el-form-item label="处置建议" prop="jynr">
|
||||
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button type="primary" @click="okSubmit">确定</el-button>
|
||||
<el-button @click="closeHndle">返回</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref , defineExpose} from 'vue'
|
||||
const emit = defineEmits(['okSubmit'])
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const form = ref({})
|
||||
const rules = ref({
|
||||
jynr: [
|
||||
{ required: true, message: '请输入处置建议', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const init = (row) => {
|
||||
visible.value = true;
|
||||
form.value.yjid = row.id;
|
||||
}
|
||||
|
||||
const closeHndle = () => {
|
||||
visible.value = false;
|
||||
form.value = {};
|
||||
}
|
||||
|
||||
const okSubmit = async () => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
let params = {...form.value , lylx:'01'}
|
||||
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
|
||||
emit('okSubmit', {...form.value})
|
||||
closeHndle()
|
||||
})
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
@ -7,7 +7,7 @@
|
||||
:expand="true" @chooseData="handleChooseData">
|
||||
<template #expand="{ props }">
|
||||
<div class="expand-content" style="max-width: 100%">
|
||||
<Items :data="props" :dict="dict" />
|
||||
<Items :row="props" :dict="dict" />
|
||||
</div>
|
||||
</template>
|
||||
<template #yjTp="{ row }">
|
||||
@ -43,11 +43,12 @@
|
||||
<!-- 操作 -->
|
||||
<template #controls="{ row }">
|
||||
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link>
|
||||
<el-link type="primary" @click="showDetail(row)">转合成</el-link>
|
||||
<el-link type="primary" @click="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
|
||||
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> -->
|
||||
<!-- <el-link type="danger" @click="delDictItem(row.id)">转会商</el-link> -->
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01'">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
|
||||
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02' && permission_sfqs">反馈</el-link>
|
||||
<!-- <el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
|
||||
<el-link type="primary" @click="openAddFrom(row)">详情</el-link>
|
||||
</template>
|
||||
<!-- <el-button type="success" @click="showFeedback(item, '签收')" v-if="item.czzt == '01'">签收</el-button>
|
||||
@ -68,9 +69,13 @@
|
||||
:tacitly="tacitly" />
|
||||
</Information>
|
||||
<!-- <AddFrom ref="addFrom" /> -->
|
||||
<!-- 处置建议 -->
|
||||
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Czjy from './czjy.vue'
|
||||
import { getItem, setItem } from '@/utils/storage'
|
||||
import Items from '../item/items.vue'
|
||||
import MyTable from "@/components/aboutTable/MyTable.vue";
|
||||
import Pages from "@/components/aboutTable/Pages.vue";
|
||||
@ -107,6 +112,11 @@ const props = defineProps({
|
||||
default: '预警信息'
|
||||
}
|
||||
});
|
||||
|
||||
const permission_sfqs = ref(false)
|
||||
const roleCode = ref(false)
|
||||
const czjyRef = ref()
|
||||
|
||||
const pageData = reactive({
|
||||
tableData: [], //表格数据
|
||||
keyCount: 0,
|
||||
@ -146,6 +156,15 @@ const selectRows = ref([])
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
let str = getItem('deptId') ? getItem('deptId')[0].deptLevel : ''
|
||||
permission_sfqs.value = str.startsWith('2'||'3') ? false : true;
|
||||
|
||||
let rols = getItem('roleList') ? getItem('roleList'):[]
|
||||
let obj = rols.find(item => {
|
||||
return ['JS_666666','JS_777777','JS_888888'].includes(item.roleCode)
|
||||
})
|
||||
roleCode.value = obj ? true : false;
|
||||
|
||||
// tabHeightFn();
|
||||
getList()
|
||||
});
|
||||
@ -208,6 +227,11 @@ const handleQsFk = (val, type) => {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const handleCzjy = (row) => {
|
||||
czjyRef.value.init(row)
|
||||
}
|
||||
|
||||
// 发送指令
|
||||
const showDialog = ref(false)
|
||||
const itemData = ref()
|
||||
|
||||
@ -25,6 +25,17 @@
|
||||
start-placeholder="开始时间" end-placeholder="结束时间" value-format="YYYY-MM-DD HH:mm:ss"
|
||||
format="YYYY-MM-DD HH:mm:ss" />
|
||||
</el-form-item>
|
||||
<el-form-item label="预警级别">
|
||||
<el-select clearable v-model="listQuery.yjJb" filterable placeholder="请选择预警级别" style="width: 240px">
|
||||
<el-option v-for="item in D_BZ_YJJB" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="身份证查询">
|
||||
<el-input v-model="listQuery.yjRysfzh" placeholder="请输入身份证号" style="width: 240px" />
|
||||
</el-form-item>
|
||||
<el-form-item label="所属部门">
|
||||
<MOSTY.Department clearable v-model="listQuery.ssbmdm" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="onSearch">查询</el-button>
|
||||
<el-button @click="resetForm(searchArr)">重置</el-button>
|
||||
@ -88,6 +99,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import PageTitle from "@/components/aboutTable/PageTitle.vue";
|
||||
// import Search from "@/components/aboutTable/Search.vue";
|
||||
import { IdCard } from '@/utils/validate.js'
|
||||
@ -193,11 +205,11 @@ const localWarningRef = ref(null);
|
||||
|
||||
const onSearch = () => {
|
||||
const promes = {
|
||||
yjRyxm: listQuery.value.yjRyxm,
|
||||
// yjLx: listQuery.value.yjlx,
|
||||
...listQuery.value,
|
||||
startTime: listQuery.value.time ? listQuery.value.time[0] : '',
|
||||
endTime: listQuery.value.time ? listQuery.value.time[1] : '',
|
||||
}
|
||||
delete promes.time;
|
||||
localWarningRef.value.getList(promes)
|
||||
}
|
||||
const loading = ref(false)
|
||||
|
||||
@ -0,0 +1,197 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<!-- 第一行:图片、姓名、年龄、性别 -->
|
||||
<div class="first-row">
|
||||
<div class="avatar-container">
|
||||
<template v-if="!data.yjTp || data.yjTp.includes('baidu')">
|
||||
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
|
||||
</template>
|
||||
<el-image v-else style="width: 60px; height:70px" :src="data.yjTp" :preview-src-list="[data.yjTp]"
|
||||
show-progress>
|
||||
<template #error>
|
||||
<div class="image-slot error">
|
||||
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
|
||||
</div>
|
||||
</template>
|
||||
</el-image>
|
||||
</div>
|
||||
<div class="basic-info">
|
||||
<div class="info-items name">姓名:<span>{{ data.yjRyxm }}</span></div>
|
||||
<div class="info-items gender">性别:<span> {{ IdCard(data.yjRysfzh, 3) }}</span></div>
|
||||
<div class="info-items age">年龄:<span> {{ IdCard(data.yjRysfzh, 2) }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 第二行:其他所有字段 -->
|
||||
<div class="second-row">
|
||||
<div class="info-item title">预警标题:<span>{{ data.yjBt }}</span></div>
|
||||
<div class="info-item level">
|
||||
预警级别:
|
||||
<DictTag :color="bqYs(data.yjJb)" :tag="false" v-model:value="data.yjJb" :options="props.dict.D_BZ_YJJB" />
|
||||
<!-- <span :class="getLevelClass(data.yjJb)">{{ data.yjJb || data.yjLx }}</span> -->
|
||||
</div>
|
||||
<div class="info-item similarity">相似度:<span>{{ data.xsd }}%</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item time">预警时间:<span>{{ data.yjSj }}</span></div>
|
||||
<div class="info-item location">预警地点:<span>{{ data.yjDz }}</span></div>
|
||||
<div class="info-item count">预警次数:<span>{{ data.yjCs }}次</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item status">
|
||||
处置状态: <DictTag v-model:value="data.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
|
||||
</div>
|
||||
<div class="info-item phone">布控手机:<span>{{ data.yjRysjh }}</span></div>
|
||||
<div class="info-item car">布控车牌号:<span>{{ data.yjClcph }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item idcard">布控身份证:<span>{{ data.yjRysfzh }}</span></div>
|
||||
<div class="info-item tag">预警标签:<span>{{ data.yjbqmc }}</span></div>
|
||||
<div class="info-item department">管辖部门:<span>{{ data.ssbm }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item county">管辖县局:<span>{{ data.ssxgaj }}</span></div>
|
||||
<div class="info-item city">管辖市局:<span>{{ data.sssgaj }}</span></div>
|
||||
<div class="info-item officer">接警员:<span>{{ data.jjyxm }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item content full-width">预警内容:<span>{{ data.yjNr }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
import { bqYs } from '@/utils/tools'
|
||||
import { IdCard } from '@/utils/validate.js'
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => { }
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => { }
|
||||
},
|
||||
})
|
||||
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.first-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.avatar-container {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
gap: 30px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.info-items {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
// justify-content: space-between;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
}
|
||||
}
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
// justify-content: space-between;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
}
|
||||
}
|
||||
|
||||
// 特殊字段样式
|
||||
.name span {
|
||||
color: #1890ff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// 预警级别颜色
|
||||
.level-high span {
|
||||
color: #f56c6c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.level-medium span {
|
||||
color: #e6a23c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.level-low span {
|
||||
color: #67c23a;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// 处置状态颜色
|
||||
.status-completed span {
|
||||
color: #67c23a;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.status-processing span {
|
||||
color: #409eff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.status-pending span {
|
||||
color: #e6a23c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// 全宽字段
|
||||
.full-width {
|
||||
flex: 0 0 100% !important;
|
||||
}
|
||||
|
||||
// 内容字段特殊样式
|
||||
.content {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
|
||||
span {
|
||||
margin-top: 5px;
|
||||
padding: 8px 12px;
|
||||
background-color: #f0f9eb;
|
||||
border-radius: 4px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,197 +1,88 @@
|
||||
<template>
|
||||
<div class="warning-item">
|
||||
<!-- 第一行:图片、姓名、年龄、性别 -->
|
||||
<div class="first-row">
|
||||
<div class="avatar-container">
|
||||
<template v-if="!data.yjTp || data.yjTp.includes('baidu')">
|
||||
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
|
||||
</template>
|
||||
<el-image v-else style="width: 60px; height:70px" :src="data.yjTp" :preview-src-list="[data.yjTp]"
|
||||
show-progress>
|
||||
<template #error>
|
||||
<div class="image-slot error">
|
||||
<img src="@/assets/images/car.png" width="60" height="70" v-if="data.yjLx == 2" />
|
||||
<img src="@/assets/images/default_male.png" width="60" height="70" v-else />
|
||||
</div>
|
||||
</template>
|
||||
</el-image>
|
||||
</div>
|
||||
<div class="basic-info">
|
||||
<div class="info-items name">姓名:<span>{{ data.yjRyxm }}</span></div>
|
||||
<div class="info-items gender">性别:<span> {{ IdCard(data.yjRysfzh, 3) }}</span></div>
|
||||
<div class="info-items age">年龄:<span> {{ IdCard(data.yjRysfzh, 2) }}</span></div>
|
||||
<div class="warning-item" >
|
||||
|
||||
<el-divider content-position="left">处置建议</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in list" :key="idx">
|
||||
<div class="info-item">
|
||||
<span class="text">预警人姓名:{{ it.jryXm }}</span>
|
||||
<span class="text">建议时间:{{ it.jysj }}</span>
|
||||
<span class="text">所属部门:{{ it.ssbm }}</span>
|
||||
</div>
|
||||
<div class="info-item">建议内容:<span>{{ it.jynr || '暂无' }}</span></div>
|
||||
</div>
|
||||
<div>
|
||||
<el-empty v-if="list.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
<!-- 第二行:其他所有字段 -->
|
||||
<div class="second-row">
|
||||
<div class="info-item title">预警标题:<span>{{ data.yjBt }}</span></div>
|
||||
<div class="info-item level">
|
||||
预警级别:
|
||||
<DictTag :color="bqYs(data.yjJb)" :tag="false" v-model:value="data.yjJb" :options="props.dict.D_BZ_YJJB" />
|
||||
<!-- <span :class="getLevelClass(data.yjJb)">{{ data.yjJb || data.yjLx }}</span> -->
|
||||
<el-divider content-position="left">反馈内容</el-divider>
|
||||
<div class="item-row" v-for="(it,idx) in Fklist" :key="idx">
|
||||
<div class="info-item">
|
||||
<span class="text">处置地址:{{ it.czdz }}</span>
|
||||
<span class="text">处置时间:{{ it.czsj }}</span>
|
||||
</div>
|
||||
<div class="info-item similarity">相似度:<span>{{ data.xsd }}%</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item time">预警时间:<span>{{ data.yjSj }}</span></div>
|
||||
<div class="info-item location">预警地点:<span>{{ data.yjDz }}</span></div>
|
||||
<div class="info-item count">预警次数:<span>{{ data.yjCs }}次</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item status">
|
||||
处置状态: <DictTag v-model:value="data.czzt" :options="props.dict.D_GSXT_YJXX_CZZT" />
|
||||
|
||||
<div class="info-item">
|
||||
<span class="text">常控不尿检理由:<span>{{ it.ckbnjly || '暂无' }}</span></span>
|
||||
<span class="text">常控处置反馈补充信息:<span>{{ it.ckczbcxx || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估:<span>{{ it.cklxzcpg || '暂无' }}</span></span>
|
||||
<span class="text">常控立线侦察评估依据:<span>{{ it.cklxzcpgyj || '暂无' }}</span></span>
|
||||
</div>
|
||||
<div class="info-item phone">布控手机:<span>{{ data.yjRysjh }}</span></div>
|
||||
<div class="info-item car">布控车牌号:<span>{{ data.yjClcph }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item idcard">布控身份证:<span>{{ data.yjRysfzh }}</span></div>
|
||||
<div class="info-item tag">预警标签:<span>{{ data.yjbqmc }}</span></div>
|
||||
<div class="info-item department">管辖部门:<span>{{ data.ssbm }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item county">管辖县局:<span>{{ data.ssxgaj }}</span></div>
|
||||
<div class="info-item city">管辖市局:<span>{{ data.sssgaj }}</span></div>
|
||||
<div class="info-item officer">接警员:<span>{{ data.jjyxm }}</span></div>
|
||||
</div>
|
||||
<div class="second-row">
|
||||
<div class="info-item content full-width">预警内容:<span>{{ data.yjNr }}</span></div>
|
||||
<div>
|
||||
<el-empty v-if="Fklist.length === 0" description="暂无数据" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, computed } from 'vue'
|
||||
import { bqYs } from '@/utils/tools'
|
||||
import { IdCard } from '@/utils/validate.js'
|
||||
import { ref, onMounted,defineProps } from 'vue'
|
||||
import { qcckPost,qcckGet } from "@/api/qcckApi.js";
|
||||
const props = defineProps({
|
||||
data: {
|
||||
/** 表格行数据 */
|
||||
row: {
|
||||
type: Object,
|
||||
default: () => { }
|
||||
default: () => ({})
|
||||
},
|
||||
dict: {
|
||||
type: Object,
|
||||
default: () => { }
|
||||
default: () => ({
|
||||
D_GS_SSYJ: [],
|
||||
D_GSXT_YJXX_CZZT: []
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
const list = ref([])
|
||||
const Fklist = ref([])
|
||||
onMounted(() => {
|
||||
if(!props.row.id) return;
|
||||
qcckPost({yjid: props.row.id},'/mosty-gsxt/yjxx/czjy/getPageList').then((res) => {
|
||||
list.value = res.records || []
|
||||
})
|
||||
qcckGet({},'/mosty-gsxt/tbYjxx/getInfo/'+ props.row.id).then((res) => {
|
||||
Fklist.value = res.fkList || []
|
||||
})
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.warning-item {
|
||||
width: 100%;
|
||||
padding: 15px;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
.first-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.avatar-container {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.basic-info {
|
||||
display: flex;
|
||||
gap: 30px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.second-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
.item-row{
|
||||
border-bottom: 1px dashed #e8e8e8;
|
||||
line-height: 36px;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.info-items {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
// justify-content: space-between;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
}
|
||||
}
|
||||
.info-item {
|
||||
flex: 0 0 calc(33.33% - 20px);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
// justify-content: space-between;
|
||||
padding: 5px 0;
|
||||
color: #333;
|
||||
|
||||
span {
|
||||
font-weight: 500;
|
||||
color: #606266;
|
||||
.info-item{
|
||||
line-height: 36px;
|
||||
width: 100%;
|
||||
.text{
|
||||
display: inline-block;
|
||||
width: 25%;
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
// 特殊字段样式
|
||||
.name span {
|
||||
color: #1890ff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// 预警级别颜色
|
||||
.level-high span {
|
||||
color: #f56c6c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.level-medium span {
|
||||
color: #e6a23c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.level-low span {
|
||||
color: #67c23a;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// 处置状态颜色
|
||||
.status-completed span {
|
||||
color: #67c23a;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.status-processing span {
|
||||
color: #409eff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.status-pending span {
|
||||
color: #e6a23c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// 全宽字段
|
||||
.full-width {
|
||||
flex: 0 0 100% !important;
|
||||
}
|
||||
|
||||
// 内容字段特殊样式
|
||||
.content {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
|
||||
span {
|
||||
margin-top: 5px;
|
||||
padding: 8px 12px;
|
||||
background-color: #f0f9eb;
|
||||
border-radius: 4px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<el-dialog title="处置建议" v-model="visible" width="50%" v-if="visible" @close="closeHndle">
|
||||
<el-form :model="form" ref="formRef" :rules="rules" label-width="120px" >
|
||||
<el-form-item label="处置建议" prop="jynr">
|
||||
<el-input v-model="form.jynr" placeholder="请输入处置建议" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<div class="flex just-center">
|
||||
<el-button type="primary" @click="okSubmit">确定</el-button>
|
||||
<el-button @click="closeHndle">返回</el-button>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { qcckPost } from "@/api/qcckApi.js";
|
||||
import { ref , defineExpose} from 'vue'
|
||||
const emit = defineEmits(['okSubmit'])
|
||||
const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const form = ref({})
|
||||
const rules = ref({
|
||||
jynr: [
|
||||
{ required: true, message: '请输入处置建议', trigger: 'blur' }
|
||||
]
|
||||
})
|
||||
const init = (row) => {
|
||||
visible.value = true;
|
||||
form.value.yjid = row.id;
|
||||
}
|
||||
|
||||
const closeHndle = () => {
|
||||
visible.value = false;
|
||||
form.value = {};
|
||||
}
|
||||
|
||||
const okSubmit = async () => {
|
||||
await formRef.value.validate((valid) => {
|
||||
if (!valid) return;
|
||||
let params = {...form.value , lylx:'01'}
|
||||
qcckPost(params,'/mosty-gsxt/yjxx/czjy/insert').then((res) => {
|
||||
emit('okSubmit', {...form.value})
|
||||
closeHndle()
|
||||
})
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
</script>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user