Commit 23917f0a authored by 赵啸非's avatar 赵啸非

添加消息发送

parent 048eeb4d
......@@ -60,6 +60,13 @@
<version>${rabbitmq.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
......
package com.mortals.xhx.queue;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.mortals.xhx.common.model.DefaultTbQueueMsgHeaders;
import com.mortals.xhx.common.model.MessageHeader;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 默认消息
*
* @author: zxfei
* @date: 2021/11/22 10:59
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DefaultTbQueueMsg implements TbQueueMsg {
/**
* key 唯一标识
*/
private String key;
/**
* 数据载体
*/
private String data;
/**
* 消息头信息
*/
private TbQueueMsgHeaders headers;
public DefaultTbQueueMsg(TbQueueMsg msg) {
this.key = msg.getKey();
this.data = msg.getData();
TbQueueMsgHeaders headers = new DefaultTbQueueMsgHeaders();
msg.getHeaders().getData().entrySet().stream().forEach(item->
headers.put(item.getKey(),item.getValue()));
this.headers = headers;
}
public static void main(String[] args) {
}
}
package com.mortals.xhx.queue;
import com.mortals.xhx.common.code.MessageProtocolEnum;
import lombok.Setter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 默认消息头
*
* @author: zxfei
* @date: 2021/11/22 11:14
*/
public class DefaultTbQueueMsgHeaders implements TbQueueMsgHeaders {
@Setter
protected Map<String, String> data = new HashMap<>();
public DefaultTbQueueMsgHeaders() {
data.put(MessageHeader.TIMESTAMP, String.valueOf(new Date().getTime()));
// data.put(MessageHeader.MESSAGESIGN, new String(SecureUtil.sign(SignAlgorithm.SHA256withRSA).sign(data.get(MessageHeader.TIMESTAMP).getBytes())));
// TODO: 2022/4/15
data.put(MessageHeader.MESSAGESIGN, "abcd1234");
data.put(MessageHeader.MESSAGEPROTOCOL, MessageProtocolEnum.JSON.getValue());
// data.put(MessageHeader.TOPIC, "");
// data.put(MessageHeader.QOS, "0");
}
@Override
public void put(String key, String value) {
data.put(key, value);
}
@Override
public String get(String key) {
return data.get(key);
}
@Override
public Map<String, String> getData() {
return data;
}
}
package com.mortals.xhx.queue;
/**
* 消息头
*
* @author: zxfei
* @date: 2021/11/22 11:15
*/
public class MessageHeader {
/**
* 客户id
*/
public static final String CLIENTID = "clientId";
/**
* 协议
*/
public static final String MESSAGEPROTOCOL = "protocol";
/**
* 时间戳
*/
public static final String TIMESTAMP = "timestamp";
/**
* 消息签名
*/
public static final String MESSAGESIGN = "sign";
/**
* 消息类型
*/
public static final String MESSAGETYPE = "messageType";
public static final String DEVICECODE = "deviceCode";
/**
* topic
*/
public static final String TOPIC = "topic";
/**
* 消息等级
*/
public static final String QOS = "qos";
public static final String RETAIN = "retain";
public static final String WILL = "will";
public static final String DUP = "dup";
}
package com.mortals.xhx.queue;
/**
* 队列消息体
*
* @author: zxfei
* @date: 2021/11/22 10:56
*/
public interface TbQueueMsg {
String getKey();
TbQueueMsgHeaders getHeaders();
String getData();
}
package com.mortals.xhx.queue;
import java.util.Map;
/**
* 消息头信息
*
* @author: zxfei
* @date: 2021/11/22 10:56
*/
public interface TbQueueMsgHeaders {
void put(String key, String value);
String get(String key);
Map<String, String> getData();
void setData(Map<String, String> data);
}
INSERT INTO `mortals_xhx_param` VALUES (null, '注册人员来源', 'Person', 'source', '3', '海康考勤系统', 1, 4, 0, 'source', NULL, NULL, NULL);
ALTER TABLE mortals_xhx_care_records ADD COLUMN `waitId` bigint(20) COMMENT '等待流水号ID' AFTER personId;
-- ----------------------------
-- 办理时间预警表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_care_dowork_records`;
CREATE TABLE `mortals_xhx_care_dowork_records` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID,主键,自增长',
`siteId` bigint(20) DEFAULT NULL COMMENT '站点Id',
`siteName` varchar(256) DEFAULT NULL COMMENT '站点名称',
`personId` bigint(20) DEFAULT NULL COMMENT '个人信息ID',
`doWorkId` bigint(20) DEFAULT NULL COMMENT '办理号ID与等待号id一致',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`contact` varchar(50) DEFAULT NULL COMMENT '联系方式',
`idCard` varchar(18) DEFAULT NULL COMMENT '身份证号码',
`bussinessId` bigint(20) DEFAULT NULL COMMENT '业务Id',
`bussinessName` varchar(255) DEFAULT NULL COMMENT '预约业务',
`service` varchar(50) DEFAULT NULL COMMENT '办理业务',
`queueNo` varchar(20) DEFAULT NULL COMMENT '排队编号',
`takeTime` datetime DEFAULT NULL COMMENT '排队开始时间',
`callTime` datetime DEFAULT NULL COMMENT '排队结束时间-业务办理开始时间',
`endTime` datetime DEFAULT NULL COMMENT '办理结束时间',
`waitTime` int(4) DEFAULT NULL COMMENT '最终办理时长,秒',
`careCount` int(4) DEFAULT '0' COMMENT '告警次数',
`smsCount` int(4) DEFAULT '0' COMMENT '短信发送次数',
`assessment` varchar(255) DEFAULT NULL COMMENT '评价',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`createUserId` bigint(20) DEFAULT NULL COMMENT '创建人ID',
`updateTime` datetime DEFAULT NULL COMMENT '更新时间',
`updateUserId` bigint(20) DEFAULT NULL COMMENT '更新人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='办理时间表';
ALTER TABLE mortals_xhx_care_records ADD COLUMN `endTime` datetime DEFAULT NULL COMMENT '办理结束时间';
ALTER TABLE mortals_xhx_care_records ADD COLUMN `endDureTime` int(4) DEFAULT NULL COMMENT '最终办理时长,秒';
ALTER TABLE mortals_xhx_care_records ADD COLUMN `waitDureAlarmCount` int(4) DEFAULT '0' COMMENT '等待时间超长告警';
ALTER TABLE mortals_xhx_care_records ADD COLUMN `endDureAlarmCount` int(4) DEFAULT '0' COMMENT '办理时间超长告警';
-- ----------------------------
-- 差评预警表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_care_cp_records`;
CREATE TABLE `mortals_xhx_care_cp_records` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID,主键,自增长',
`siteId` bigint(20) DEFAULT NULL COMMENT '站点Id',
`siteName` varchar(256) DEFAULT NULL COMMENT '站点名称',
`personId` bigint(20) DEFAULT NULL COMMENT '个人信息ID',
`pjId` bigint(20) DEFAULT NULL COMMENT '评价号ID与办理号id一致',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`contact` varchar(50) DEFAULT NULL COMMENT '联系方式',
`idCard` varchar(18) DEFAULT NULL COMMENT '身份证号码',
`window_id` bigint(20) DEFAULT NULL COMMENT '窗口id',
`window_name` varchar(255) DEFAULT NULL COMMENT '窗口名称',
`section` varchar(128) DEFAULT NULL COMMENT '部门',
`flounum` varchar(128) DEFAULT NULL COMMENT '编号',
`assessment` varchar(32) DEFAULT NULL COMMENT '评价选项',
`type` varchar(32) DEFAULT NULL COMMENT '评价类型',
`content` varchar(255) DEFAULT NULL COMMENT '评价内容',
`source` varchar(18) DEFAULT NULL COMMENT '来源',
`pjTime` datetime DEFAULT NULL COMMENT '评价时间',
`careCount` int(4) DEFAULT '0' COMMENT '告警次数',
`smsCount` int(4) DEFAULT '0' COMMENT '消息发送次数',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`createUserId` bigint(20) DEFAULT NULL COMMENT '创建人ID',
`updateTime` datetime DEFAULT NULL COMMENT '更新时间',
`updateUserId` bigint(20) DEFAULT NULL COMMENT '更新人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='差评预警表';
-- ----------------------------
-- 告警消息记录表
-- ----------------------------
DROP TABLE IF EXISTS `mortals_xhx_alarm_records`;
CREATE TABLE `mortals_xhx_alarm_records` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID,主键,自增长',
`siteId` bigint(20) DEFAULT NULL COMMENT '站点Id',
`siteName` varchar(256) DEFAULT NULL COMMENT '站点名称',
`alarmTime` datetime DEFAULT NULL COMMENT '告警时间',
`alarmType` char(32) NOT NULL COMMENT '告警类型',
`alarmLevel` tinyint(2) NOT NULL DEFAULT '0' COMMENT '告警级别(0.一般,1.次要,2.危险)',
`alarmReceivePersonnel` char(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '接收人员',
`receivePersonnelTelephone` char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '接收人员电话',
`alarmContent` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '告警详细内容',
`push` tinyint(2) DEFAULT '0' COMMENT '推送', -- 0未推送,1已推送
`remark` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注信息',
`createTime` datetime NOT NULL COMMENT '创建时间',
`updateUserId` bigint(20) DEFAULT NULL COMMENT '更新用户',
`updateTime` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=178040 DEFAULT CHARSET=utf8 COMMENT='告警消息记录表';
\ No newline at end of file
<template>
<!-- 弹出框表单 -->
<el-drawer
:title="title"
:visible.sync="open"
:direction="direction"
:destroy-on-close="true"
size="60%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field :span="20" label="站点Id" prop="siteId" v-model="form.siteId" placeholder="请输入站点Id"/>
<Field :span="20" label="站点名称" prop="siteName" v-model="form.siteName" type="textarea" placeholder="请输入站点名称"/>
<Field :span="20" label="告警时间" prop="alarmTime" v-model="form.alarmTime" type="date" />
<Field :span="20" label="告警类型" prop="alarmType" v-model="form.alarmType" placeholder="请输入告警类型"/>
<Field :span="20" label="告警级别" prop="alarmLevel" v-model="form.alarmLevel" type="select" :enumData="dict.alarmLevel" placeholder="请选择告警级别"/>
<Field :span="20" label="接收人员" prop="alarmReceivePersonnel" v-model="form.alarmReceivePersonnel" placeholder="请输入接收人员"/>
<Field :span="20" label="接收人员电话" prop="receivePersonnelTelephone" v-model="form.receivePersonnelTelephone" placeholder="请输入接收人员电话"/>
<Field :span="20" label="告警详细内容"><editor v-model="form.alarmContent" :min-height="256"/></Field>
<Field :span="20" label="推送" prop="push" v-model="form.push" type="select" :enumData="dict.push" placeholder="请选择推送"/>
<Field :span="20" label="备注信息" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注信息"/>
</el-row>
<form-buttons @submit='submitForm' v-if="pageInfo.type!='view'" noCancelBtn />
</el-form>
</el-drawer>
</template>
<script>
import form from "@/assets/mixins/formdialog";
export default {
name: "AlarmRecordsDetail",
mixins: [form],
components: {
},
created() {
this.changePath("alarm/records")
},
data() {
return {
// 遮罩层
loading: true,
// 弹出层标题
title: "告警消息记录",
// 是否显示弹出层
open: false,
direction:"rtl",
toString:[
"alarmLevel",
"push",
],
toDate:[
"alarmTime",
],
// 表单校验
rules: {
alarmType: [
{required: true,message: "请输入告警类型", trigger: "blur" },
{max: 32,message: "最多只能录入32个字符",trigger: "blur",},
],
alarmLevel: [
{required: true,message: "请输入告警级别", trigger: "blur" },
],
alarmReceivePersonnel: [
{required: true,message: "请输入接收人员", trigger: "blur" },
{max: 32,message: "最多只能录入32个字符",trigger: "blur",},
],
receivePersonnelTelephone: [
{required: true,message: "请输入接收人员电话", trigger: "blur" },
{max: 11,message: "最多只能录入11个字符",trigger: "blur",},
],
alarmContent: [
{required: true,message: "请输入告警详细内容", trigger: "blur" },
{max: 512,message: "最多只能录入512个字符",trigger: "blur",},
],
remark: [
{required: true,message: "请输入备注信息", trigger: "blur" },
{max: 256,message: "最多只能录入256个字符",trigger: "blur",},
],
createTime: [
{required: true,message: "请选择创建时间" },
],
}
};
},
methods: {
/** 编辑 */
edit(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="alarm/records/edit";
this.getData();
this.pageInfo.type="edit"
this.title = "修改告警消息记录";
},
/** 新增 */
add(row) {
this.reset()
this.urls.currUrl = "alarm/records/add";
this.getData();
this.pageInfo.type="add"
this.title = "新增告警消息记录";
},
/** 查看*/
view(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="alarm/records/view";
this.getData();
this.pageInfo.type="view"
this.title = "告警消息记录详细";
},
/**取消按钮 */
cancel() {
this.open = false;
},
/**获取数据后弹框 */
afterRender(data) {
this.open = true;
},
afterSubmit(data) {
this.open = false;
this.$emit("ok");
},
// 表单重置
reset() {
this.form = {
siteId : null,
siteName : null,
alarmTime : null,
alarmType : null,
alarmLevel : 0,
alarmReceivePersonnel : null,
receivePersonnelTelephone : null,
alarmContent : null,
push : 0,
remark : null,
};
this.resetForm("form");
},
resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
</script>
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig">
</LayoutTable>
<drawer-show ref="drawerform" @ok="getData" />
</div>
</template>
<script>
/** 表单弹出框模式需引入 */
import drawerShow from "./drawershow";
import table from "@/assets/mixins/table";
export default {
name: "AlarmRecordsList",
components: {
drawerShow
},
mixins: [table],
created() {
},
methods: {
/** 重写新增方法 */
toAdd(row) {
this.$refs.drawerform.add(row);
},
/** 重写编辑方法 */
toEdit(row) {
this.$refs.drawerform.edit(row);
},
/** 重写查看方法 */
toView(row) {
this.$refs.drawerform.view(row);
},
},
data() {
return {
config: {
search: [
],
columns: [
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "站点Id", prop: "siteId", formatter: this.formatter},
{label: "站点名称", prop: "siteName"},
{label: "告警时间", prop: "alarmTime", formatter: this.formatterDate},
{label: "告警类型", prop: "alarmType"},
{label: "告警级别", prop: "alarmLevel",formatter: this.formatter},
{label: "接收人员", prop: "alarmReceivePersonnel"},
{label: "接收人员电话", prop: "receivePersonnelTelephone"},
{label: "告警详细内容", prop: "alarmContent"},
{label: "推送", prop: "push",formatter: this.formatter},
{label: "备注信息", prop: "remark"},
{
label: "操作",
width: 240,
formatter: row => {
return (
<table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
);
}
}
]
}
};
}
};
</script>
\ No newline at end of file
<template>
<layout-view>
<el-descriptions :title="title" :column="column" :size="size" :colon="false" border>
<template slot="title">
<i class="el-icon-tickets"></i>
基本详细信息
</template>
<template slot="extra">
<el-button type="primary" @click="$router.go(-1)" size="small">返回</el-button>
</template>
<el-descriptions-item label="站点Id" label-class-name="labelClass" content-class-name="contentClass">
{{form.siteId}}
</el-descriptions-item>
<el-descriptions-item label="站点名称" label-class-name="labelClass" content-class-name="contentClass">
{{form.siteName}}
</el-descriptions-item>
<el-descriptions-item label="告警时间" label-class-name="labelClass" content-class-name="contentClass">
{{ util_formatterDate(form.alarmTime)}}
</el-descriptions-item>
<el-descriptions-item label="告警类型" label-class-name="labelClass" content-class-name="contentClass">
{{form.alarmType}}
</el-descriptions-item>
<el-descriptions-item label="告警级别" label-class-name="labelClass" content-class-name="contentClass">
{{ util_formatters("alarmLevel", form.alarmLevel) }}
</el-descriptions-item>
<el-descriptions-item label="接收人员" label-class-name="labelClass" content-class-name="contentClass">
{{form.alarmReceivePersonnel}}
</el-descriptions-item>
<el-descriptions-item label="接收人员电话" label-class-name="labelClass" content-class-name="contentClass">
{{form.receivePersonnelTelephone}}
</el-descriptions-item>
<el-descriptions-item label="告警详细内容" label-class-name="labelClass" content-class-name="contentClass">
<editor v-model="form.alarmContent" :min-height="256"/>
</el-descriptions-item>
<el-descriptions-item label="推送" label-class-name="labelClass" content-class-name="contentClass">
{{form.push}}
</el-descriptions-item>
<el-descriptions-item label="备注信息" label-class-name="labelClass" content-class-name="contentClass">
{{form.remark}}
</el-descriptions-item>
</el-descriptions>
</layout-view>
</template>
<script>
import view from "@/assets/mixins/view";
import Editor from '@/components/Editor';
export default {
mixins: [view],
components: {
Editor,
},
methods: {
},
data() {
return {
size:"small",
column:2,
toString:[
"alarmLevel",
"push",
],
toArrays: [
],
toDate: [
]
}
}
}
</script>
<style lang="less">
.labelClass{
width: 200px;
}
.el-descriptions__body{
margin-left: 5px;
margin-right: 5px;
color: #606266;
background-color: #FFF;
}
.contentClass{
width: 600px;
}
</style>
\ No newline at end of file
<template>
<!-- 弹出框表单 -->
<el-drawer
:title="title"
:visible.sync="open"
:direction="direction"
:destroy-on-close="true"
size="60%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field :span="20" label="站点Id" prop="siteId" v-model="form.siteId" placeholder="请输入站点Id"/>
<Field :span="20" label="站点名称" prop="siteName" v-model="form.siteName" type="textarea" placeholder="请输入站点名称"/>
<Field :span="20" label="个人信息ID" prop="personId" v-model="form.personId" placeholder="请输入个人信息ID"/>
<Field :span="20" label="评价号ID与办理号id一致" prop="pjId" v-model="form.pjId" placeholder="请输入评价号ID与办理号id一致"/>
<Field :span="20" label="姓名" prop="name" v-model="form.name" placeholder="请输入姓名"/>
<Field :span="20" label="联系方式" prop="contact" v-model="form.contact" placeholder="请输入联系方式"/>
<Field :span="20" label="身份证号码" prop="idCard" v-model="form.idCard" placeholder="请输入身份证号码"/>
<Field :span="20" label="窗口id" prop="windowId" v-model="form.windowId" placeholder="请输入窗口id"/>
<Field :span="20" label="窗口名称" prop="windowName" v-model="form.windowName" type="textarea" placeholder="请输入窗口名称"/>
<Field :span="20" label="部门" prop="section" v-model="form.section" placeholder="请输入部门"/>
<Field :span="20" label="编号" prop="flounum" v-model="form.flounum" placeholder="请输入编号"/>
<Field :span="20" label="评价选项" prop="assessment" v-model="form.assessment" placeholder="请输入评价选项"/>
<Field :span="20" label="评价类型" prop="type" v-model="form.type" placeholder="请输入评价类型"/>
<Field :span="20" label="评价内容"><editor v-model="form.content" :min-height="256"/></Field>
<Field :span="20" label="来源" prop="source" v-model="form.source" placeholder="请输入来源"/>
<Field :span="20" label="评价时间" prop="pjTime" v-model="form.pjTime" type="date" />
<Field :span="20" label="告警次数" prop="careCount" v-model="form.careCount" placeholder="请输入告警次数"/>
<Field :span="20" label="消息发送次数" prop="smsCount" v-model="form.smsCount" placeholder="请输入消息发送次数"/>
</el-row>
<form-buttons @submit='submitForm' v-if="pageInfo.type!='view'" noCancelBtn />
</el-form>
</el-drawer>
</template>
<script>
import form from "@/assets/mixins/formdialog";
export default {
name: "CareCpRecordsDetail",
mixins: [form],
components: {
},
created() {
this.changePath("care/cp/records")
},
data() {
return {
// 遮罩层
loading: true,
// 弹出层标题
title: "差评预警",
// 是否显示弹出层
open: false,
direction:"rtl",
toString:[
],
toDate:[
"pjTime",
],
// 表单校验
rules: {
}
};
},
methods: {
/** 编辑 */
edit(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="care/cp/records/edit";
this.getData();
this.pageInfo.type="edit"
this.title = "修改差评预警";
},
/** 新增 */
add(row) {
this.reset()
this.urls.currUrl = "care/cp/records/add";
this.getData();
this.pageInfo.type="add"
this.title = "新增差评预警";
},
/** 查看*/
view(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="care/cp/records/view";
this.getData();
this.pageInfo.type="view"
this.title = "差评预警详细";
},
/**取消按钮 */
cancel() {
this.open = false;
},
/**获取数据后弹框 */
afterRender(data) {
this.open = true;
},
afterSubmit(data) {
this.open = false;
this.$emit("ok");
},
// 表单重置
reset() {
this.form = {
siteId : null,
siteName : null,
personId : null,
pjId : null,
name : null,
contact : null,
idCard : null,
windowId : null,
windowName : null,
section : null,
flounum : null,
assessment : null,
type : null,
content : null,
source : null,
pjTime : null,
careCount : 0,
smsCount : 0,
};
this.resetForm("form");
},
resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
</script>
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig">
</LayoutTable>
<drawer-show ref="drawerform" @ok="getData" />
</div>
</template>
<script>
/** 表单弹出框模式需引入 */
import drawerShow from "./drawershow";
import table from "@/assets/mixins/table";
export default {
name: "CareCpRecordsList",
components: {
drawerShow
},
mixins: [table],
created() {
},
methods: {
/** 重写新增方法 */
toAdd(row) {
this.$refs.drawerform.add(row);
},
/** 重写编辑方法 */
toEdit(row) {
this.$refs.drawerform.edit(row);
},
/** 重写查看方法 */
toView(row) {
this.$refs.drawerform.view(row);
},
},
data() {
return {
config: {
search: [
],
columns: [
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "站点Id", prop: "siteId", formatter: this.formatter},
{label: "站点名称", prop: "siteName"},
{label: "个人信息ID", prop: "personId", formatter: this.formatter},
{label: "评价号ID与办理号id一致", prop: "pjId", formatter: this.formatter},
{label: "姓名", prop: "name"},
{label: "联系方式", prop: "contact"},
{label: "身份证号码", prop: "idCard"},
{label: "窗口id", prop: "windowId", formatter: this.formatter},
{label: "窗口名称", prop: "windowName"},
{label: "部门", prop: "section"},
{label: "编号", prop: "flounum"},
{label: "评价选项", prop: "assessment"},
{label: "评价类型", prop: "type"},
{label: "评价内容", prop: "content"},
{label: "来源", prop: "source"},
{label: "评价时间", prop: "pjTime", formatter: this.formatterDate},
{label: "告警次数", prop: "careCount",formatter: this.formatter},
{label: "消息发送次数", prop: "smsCount",formatter: this.formatter},
{
label: "操作",
width: 240,
formatter: row => {
return (
<table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
);
}
}
]
}
};
}
};
</script>
\ No newline at end of file
<template>
<layout-view>
<el-descriptions :title="title" :column="column" :size="size" :colon="false" border>
<template slot="title">
<i class="el-icon-tickets"></i>
基本详细信息
</template>
<template slot="extra">
<el-button type="primary" @click="$router.go(-1)" size="small">返回</el-button>
</template>
<el-descriptions-item label="站点Id" label-class-name="labelClass" content-class-name="contentClass">
{{form.siteId}}
</el-descriptions-item>
<el-descriptions-item label="站点名称" label-class-name="labelClass" content-class-name="contentClass">
{{form.siteName}}
</el-descriptions-item>
<el-descriptions-item label="个人信息ID" label-class-name="labelClass" content-class-name="contentClass">
{{form.personId}}
</el-descriptions-item>
<el-descriptions-item label="评价号ID与办理号id一致" label-class-name="labelClass" content-class-name="contentClass">
{{form.pjId}}
</el-descriptions-item>
<el-descriptions-item label="姓名" label-class-name="labelClass" content-class-name="contentClass">
{{form.name}}
</el-descriptions-item>
<el-descriptions-item label="联系方式" label-class-name="labelClass" content-class-name="contentClass">
{{form.contact}}
</el-descriptions-item>
<el-descriptions-item label="身份证号码" label-class-name="labelClass" content-class-name="contentClass">
{{form.idCard}}
</el-descriptions-item>
<el-descriptions-item label="窗口id" label-class-name="labelClass" content-class-name="contentClass">
{{form.windowId}}
</el-descriptions-item>
<el-descriptions-item label="窗口名称" label-class-name="labelClass" content-class-name="contentClass">
{{form.windowName}}
</el-descriptions-item>
<el-descriptions-item label="部门" label-class-name="labelClass" content-class-name="contentClass">
{{form.section}}
</el-descriptions-item>
<el-descriptions-item label="编号" label-class-name="labelClass" content-class-name="contentClass">
{{form.flounum}}
</el-descriptions-item>
<el-descriptions-item label="评价选项" label-class-name="labelClass" content-class-name="contentClass">
{{form.assessment}}
</el-descriptions-item>
<el-descriptions-item label="评价类型" label-class-name="labelClass" content-class-name="contentClass">
{{form.type}}
</el-descriptions-item>
<el-descriptions-item label="评价内容" label-class-name="labelClass" content-class-name="contentClass">
<editor v-model="form.content" :min-height="256"/>
</el-descriptions-item>
<el-descriptions-item label="来源" label-class-name="labelClass" content-class-name="contentClass">
{{form.source}}
</el-descriptions-item>
<el-descriptions-item label="评价时间" label-class-name="labelClass" content-class-name="contentClass">
{{ util_formatterDate(form.pjTime)}}
</el-descriptions-item>
<el-descriptions-item label="告警次数" label-class-name="labelClass" content-class-name="contentClass">
{{form.careCount}}
</el-descriptions-item>
<el-descriptions-item label="消息发送次数" label-class-name="labelClass" content-class-name="contentClass">
{{form.smsCount}}
</el-descriptions-item>
</el-descriptions>
</layout-view>
</template>
<script>
import view from "@/assets/mixins/view";
import Editor from '@/components/Editor';
export default {
mixins: [view],
components: {
Editor,
},
methods: {
},
data() {
return {
size:"small",
column:2,
toString:[
],
toArrays: [
],
toDate: [
]
}
}
}
</script>
<style lang="less">
.labelClass{
width: 200px;
}
.el-descriptions__body{
margin-left: 5px;
margin-right: 5px;
color: #606266;
background-color: #FFF;
}
.contentClass{
width: 600px;
}
</style>
\ No newline at end of file
<template>
<!-- 弹出框表单 -->
<el-drawer
:title="title"
:visible.sync="open"
:direction="direction"
:destroy-on-close="true"
size="60%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field :span="20" label="站点Id" prop="siteId" v-model="form.siteId" placeholder="请输入站点Id"/>
<Field :span="20" label="站点名称" prop="siteName" v-model="form.siteName" type="textarea" placeholder="请输入站点名称"/>
<Field :span="20" label="个人信息ID" prop="personId" v-model="form.personId" placeholder="请输入个人信息ID"/>
<Field :span="20" label="办理号ID与等待号id一致" prop="doWorkId" v-model="form.doWorkId" placeholder="请输入办理号ID与等待号id一致"/>
<Field :span="20" label="姓名" prop="name" v-model="form.name" placeholder="请输入姓名"/>
<Field :span="20" label="联系方式" prop="contact" v-model="form.contact" placeholder="请输入联系方式"/>
<Field :span="20" label="身份证号码" prop="idCard" v-model="form.idCard" placeholder="请输入身份证号码"/>
<Field :span="20" label="业务Id" prop="bussinessId" v-model="form.bussinessId" placeholder="请输入业务Id"/>
<Field :span="20" label="预约业务" prop="bussinessName" v-model="form.bussinessName" type="textarea" placeholder="请输入预约业务"/>
<Field :span="20" label="办理业务" prop="service" v-model="form.service" placeholder="请输入办理业务"/>
<Field :span="20" label="排队编号" prop="queueNo" v-model="form.queueNo" placeholder="请输入排队编号"/>
<Field :span="20" label="排队开始时间" prop="takeTime" v-model="form.takeTime" type="date" />
<Field :span="20" label="排队结束时间-业务办理开始时间" prop="callTime" v-model="form.callTime" type="date" />
<Field :span="20" label="办理结束时间" prop="endTime" v-model="form.endTime" type="date" />
<Field :span="20" label="最终办理时长,秒" prop="waitTime" v-model="form.waitTime" placeholder="请输入最终办理时长,秒"/>
<Field :span="20" label="告警次数" prop="careCount" v-model="form.careCount" placeholder="请输入告警次数"/>
<Field :span="20" label="短信发送次数" prop="smsCount" v-model="form.smsCount" placeholder="请输入短信发送次数"/>
<Field :span="20" label="评价" prop="assessment" v-model="form.assessment" type="textarea" placeholder="请输入评价"/>
</el-row>
<form-buttons @submit='submitForm' v-if="pageInfo.type!='view'" noCancelBtn />
</el-form>
</el-drawer>
</template>
<script>
import form from "@/assets/mixins/formdialog";
export default {
name: "CareDoworkRecordsDetail",
mixins: [form],
components: {
},
created() {
this.changePath("care/dowork/records")
},
data() {
return {
// 遮罩层
loading: true,
// 弹出层标题
title: "办理时间",
// 是否显示弹出层
open: false,
direction:"rtl",
toString:[
],
toDate:[
"takeTime",
"callTime",
"endTime",
],
// 表单校验
rules: {
}
};
},
methods: {
/** 编辑 */
edit(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="care/dowork/records/edit";
this.getData();
this.pageInfo.type="edit"
this.title = "修改办理时间";
},
/** 新增 */
add(row) {
this.reset()
this.urls.currUrl = "care/dowork/records/add";
this.getData();
this.pageInfo.type="add"
this.title = "新增办理时间";
},
/** 查看*/
view(row) {
this.reset()
this.query = { id: row.id };
this.urls.currUrl ="care/dowork/records/view";
this.getData();
this.pageInfo.type="view"
this.title = "办理时间详细";
},
/**取消按钮 */
cancel() {
this.open = false;
},
/**获取数据后弹框 */
afterRender(data) {
this.open = true;
},
afterSubmit(data) {
this.open = false;
this.$emit("ok");
},
// 表单重置
reset() {
this.form = {
siteId : null,
siteName : null,
personId : null,
doWorkId : null,
name : null,
contact : null,
idCard : null,
bussinessId : null,
bussinessName : null,
service : null,
queueNo : null,
takeTime : null,
callTime : null,
endTime : null,
waitTime : null,
careCount : 0,
smsCount : 0,
assessment : null,
};
this.resetForm("form");
},
resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
</script>
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig">
</LayoutTable>
<drawer-show ref="drawerform" @ok="getData" />
</div>
</template>
<script>
/** 表单弹出框模式需引入 */
import drawerShow from "./drawershow";
import table from "@/assets/mixins/table";
export default {
name: "CareDoworkRecordsList",
components: {
drawerShow
},
mixins: [table],
created() {
},
methods: {
/** 重写新增方法 */
toAdd(row) {
this.$refs.drawerform.add(row);
},
/** 重写编辑方法 */
toEdit(row) {
this.$refs.drawerform.edit(row);
},
/** 重写查看方法 */
toView(row) {
this.$refs.drawerform.view(row);
},
},
data() {
return {
config: {
search: [
],
columns: [
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "站点Id", prop: "siteId", formatter: this.formatter},
{label: "站点名称", prop: "siteName"},
{label: "个人信息ID", prop: "personId", formatter: this.formatter},
{label: "办理号ID与等待号id一致", prop: "doWorkId", formatter: this.formatter},
{label: "姓名", prop: "name"},
{label: "联系方式", prop: "contact"},
{label: "身份证号码", prop: "idCard"},
{label: "业务Id", prop: "bussinessId", formatter: this.formatter},
{label: "预约业务", prop: "bussinessName"},
{label: "办理业务", prop: "service"},
{label: "排队编号", prop: "queueNo"},
{label: "排队开始时间", prop: "takeTime", formatter: this.formatterDate},
{label: "排队结束时间-业务办理开始时间", prop: "callTime", formatter: this.formatterDate},
{label: "办理结束时间", prop: "endTime", formatter: this.formatterDate},
{label: "最终办理时长,秒", prop: "waitTime",formatter: this.formatter},
{label: "告警次数", prop: "careCount",formatter: this.formatter},
{label: "短信发送次数", prop: "smsCount",formatter: this.formatter},
{label: "评价", prop: "assessment"},
{
label: "操作",
width: 240,
formatter: row => {
return (
<table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
);
}
}
]
}
};
}
};
</script>
\ No newline at end of file
<template>
<layout-view>
<el-descriptions :title="title" :column="column" :size="size" :colon="false" border>
<template slot="title">
<i class="el-icon-tickets"></i>
基本详细信息
</template>
<template slot="extra">
<el-button type="primary" @click="$router.go(-1)" size="small">返回</el-button>
</template>
<el-descriptions-item label="站点Id" label-class-name="labelClass" content-class-name="contentClass">
{{form.siteId}}
</el-descriptions-item>
<el-descriptions-item label="站点名称" label-class-name="labelClass" content-class-name="contentClass">
{{form.siteName}}
</el-descriptions-item>
<el-descriptions-item label="个人信息ID" label-class-name="labelClass" content-class-name="contentClass">
{{form.personId}}
</el-descriptions-item>
<el-descriptions-item label="办理号ID与等待号id一致" label-class-name="labelClass" content-class-name="contentClass">
{{form.doWorkId}}
</el-descriptions-item>
<el-descriptions-item label="姓名" label-class-name="labelClass" content-class-name="contentClass">
{{form.name}}
</el-descriptions-item>
<el-descriptions-item label="联系方式" label-class-name="labelClass" content-class-name="contentClass">
{{form.contact}}
</el-descriptions-item>
<el-descriptions-item label="身份证号码" label-class-name="labelClass" content-class-name="contentClass">
{{form.idCard}}
</el-descriptions-item>
<el-descriptions-item label="业务Id" label-class-name="labelClass" content-class-name="contentClass">
{{form.bussinessId}}
</el-descriptions-item>
<el-descriptions-item label="预约业务" label-class-name="labelClass" content-class-name="contentClass">
{{form.bussinessName}}
</el-descriptions-item>
<el-descriptions-item label="办理业务" label-class-name="labelClass" content-class-name="contentClass">
{{form.service}}
</el-descriptions-item>
<el-descriptions-item label="排队编号" label-class-name="labelClass" content-class-name="contentClass">
{{form.queueNo}}
</el-descriptions-item>
<el-descriptions-item label="排队开始时间" label-class-name="labelClass" content-class-name="contentClass">
{{ util_formatterDate(form.takeTime)}}
</el-descriptions-item>
<el-descriptions-item label="排队结束时间-业务办理开始时间" label-class-name="labelClass" content-class-name="contentClass">
{{ util_formatterDate(form.callTime)}}
</el-descriptions-item>
<el-descriptions-item label="办理结束时间" label-class-name="labelClass" content-class-name="contentClass">
{{ util_formatterDate(form.endTime)}}
</el-descriptions-item>
<el-descriptions-item label="最终办理时长,秒" label-class-name="labelClass" content-class-name="contentClass">
{{form.waitTime}}
</el-descriptions-item>
<el-descriptions-item label="告警次数" label-class-name="labelClass" content-class-name="contentClass">
{{form.careCount}}
</el-descriptions-item>
<el-descriptions-item label="短信发送次数" label-class-name="labelClass" content-class-name="contentClass">
{{form.smsCount}}
</el-descriptions-item>
<el-descriptions-item label="评价" label-class-name="labelClass" content-class-name="contentClass">
{{form.assessment}}
</el-descriptions-item>
</el-descriptions>
</layout-view>
</template>
<script>
import view from "@/assets/mixins/view";
export default {
mixins: [view],
components: {
},
methods: {
},
data() {
return {
size:"small",
column:2,
toString:[
],
toArrays: [
],
toDate: [
]
}
}
}
</script>
<style lang="less">
.labelClass{
width: 200px;
}
.el-descriptions__body{
margin-left: 5px;
margin-right: 5px;
color: #606266;
background-color: #FFF;
}
.contentClass{
width: 600px;
}
</style>
\ No newline at end of file
......@@ -17,6 +17,9 @@
<properties>
<!-- 默认值 -->
<profiles.server.debug></profiles.server.debug>
<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
<profiles.nacos.group>DEFAULT_GROUP</profiles.nacos.group>
<profiles.nacos.namespace>smart-gov</profiles.nacos.namespace>
<profiles.server.port>21080</profiles.server.port>
<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
<profiles.log.level>info</profiles.log.level>
......@@ -91,7 +94,7 @@
<properties>
<profiles.active>qionglai</profiles.active>
<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
<profiles.php.host>http://127.0.0.1:8090</profiles.php.host>
<profiles.php.host>http://192.168.0.98:8090</profiles.php.host>
<profiles.sms.smsSendUrl>http://172.15.28.113:8901/api/index/index</profiles.sms.smsSendUrl>
<profiles.sms.apiId>ADsUXLrS81vZDU95</profiles.sms.apiId>
</properties>
......
package com.mortals.xhx.base.framework.config;
import com.mortals.xhx.common.key.QueueKey;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitConfig {
public Integer messageTtl = 86400000;
public Map<String, Object> args = new HashMap<>();
// 创建 Queue
@Bean
public Queue alarmMsgQueue() {
args.put("x-message-ttl", messageTtl);
return new Queue(QueueKey.ALARM_MSG_QUEUE, // Queue 名字
true, // durable: 是否持久化
false, // exclusive: 是否排它
false,
args); // autoDelete: 是否自动删除
}
// 创建 Direct Exchange
@Bean
public DirectExchange exchange() {
return new DirectExchange(QueueKey.EXCHANGE,
true, // durable: 是否持久化
false); // exclusive: 是否排它
}
// 创建 Binding
@Bean
public Binding accessBinding() {
return BindingBuilder.bind(alarmMsgQueue()).to(exchange()).with(QueueKey.ALARM_MSG_QUEUE);
}
}
package com.mortals.xhx.busiz.rsp.wait;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Date;
/**
* 差评信息
* @author: zxfei
* @date: 2025/4/3 16:39
*/
@Data
public class CpPersonInfo {
@JSONField(name = "id")
private Long pjId;
@JSONField(name = "siteid")
private Long siteId;
@JSONField(name = "peopleid")
private Long peopleId;
@JSONField(name = "option_id")
private String optionId;
@JSONField(name = "source")
private String source;
@JSONField(name = "queueid")
private String queueid;
@JSONField(name = "type")
private String type;
@JSONField(name = "window_name")
private String windowName;
@JSONField(name = "workman_name")
private String workmanName;
@JSONField(name = "workman_number")
private String workmanNumber;
@JSONField(name = "section")
private String section;
@JSONField(name = "content")
private String content;
@JSONField(name = "flounum")
private String flounum;
@JSONField(name = "idcardData_PhotoFileName")
private String idcardDataPhotoFileName;
@JSONField(name = "create_time",format = "yyyy-MM-dd HH:mm:ss")
private Date cpTime;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp.wait;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Date;
@Data
public class EndPersonInfo {
@JSONField(name = "id")
private Long endId;
@JSONField(name = "endtime", format = "yyyy-MM-dd HH:mm:ss")
private Date endtime;
@JSONField(name = "avg_handle_time")
private Integer avgHandleTime;
}
\ No newline at end of file
......@@ -14,4 +14,11 @@ public class FinPersonInfo {
@JSONField(name = "calltime", format = "yyyy-MM-dd HH:mm:ss")
private Date calltime;
/**
* 平均等待时长
*/
@JSONField(name = "avg_wait_time")
private Integer avgWaitTime;
}
\ No newline at end of file
......@@ -50,4 +50,8 @@ public class WaitPersonInfo {
@JSONField(name = "taketime",format = "yyyy-MM-dd HH:mm:ss")
private Date takeTime;
}
\ No newline at end of file
......@@ -4,14 +4,14 @@ import java.util.LinkedHashMap;
import java.util.Map;
/**
* 告警级别(0.危险,1.次要,2.一般)枚举类
* 告警级别(0.一般,1.次要,2.危险)枚举类
*
* @author zxfei
*/
public enum AlarmLevelEnum {
危险(0, "危险"),
一般(0, "一般"),
次要(1, "次要"),
一般(2, "一般");
危险(2, "危险");
private Integer value;
private String desc;
......
......@@ -11,6 +11,7 @@ import java.util.Map;
public enum ProcessStatusEnum {
排队中("排队中", "排队中"),
办理中("办理中", "办理中"),
办理结束("办理结束", "办理结束"),
接件结束("接件结束", "接件结束");
private String value;
private String desc;
......
package com.mortals.xhx.common.key;
/**
* rabbit 队列key定义
*/
public class QueueKey {
public static final String ALARM_MSG_QUEUE = "ALARM_MSG_QUEUE";
public static final String EXCHANGE = "LOG";
public static final String DEFAULT_EXCHANGE = "amq.direct";
}
......@@ -20,10 +20,20 @@ public class RedisKey {
*/
public static final String KEY_WAITNUM_LIST_CACHE = "takeData";
/**
* 完成业务人群
* 完成排队人群
*/
public static final String KEY_FIN_LIST_CACHE = "callData";
/**
* 完成业务办理人群
*/
public static final String KEY_FIN_DOWORK_LIST_CACHE = "endData";
/**
* 差评人群
*/
public static final String KEY_CP_LIST_CACHE = "cpData";
public static final String KEY_PLATFORM_CACHE = "platformDict";
public static final String KEY_PRODUCT_CACHE = "productDict";
......
......@@ -40,7 +40,7 @@ import static com.mortals.xhx.common.key.ParamKey.PARAM_FACE_GROUP;
*/
@Component
@Slf4j
@ConditionalOnExpression("'${hik.host:}'!=''")
//@ConditionalOnExpression("'${hik.host:}'!=''")
public class SubEventStartedService implements IApplicationStartedService {
@Value("${hik.callback:}")
......@@ -59,7 +59,7 @@ public class SubEventStartedService implements IApplicationStartedService {
public void start() {
ThreadPool.getInstance().init(10);
Constants.DEFAULT_TIMEOUT=12000;
/* Constants.DEFAULT_TIMEOUT=12000;
log.info("开始服务..[事件订阅服务]");
//String eventtypes = GlobalSysInfo.getParamValue(Constant.PARAM_EVENTTYPES, "131614,131659,1644175361,1644171265");
......@@ -102,7 +102,7 @@ public class SubEventStartedService implements IApplicationStartedService {
//创建陌生人计划
facePlanService.createStrangerPlan();
//创建预约人监控计划
facePlanService.createAppointmentPlan();
facePlanService.createAppointmentPlan();*/
}
......
......@@ -55,7 +55,7 @@ public class SyncAppointmentPersonTaskImpl implements ITaskExcuteService {
log.info("同步今天预约用户任务完成");
log.info("创建每日预约人群任务");
facePlanService.createAppointmentPersonByDay();
//facePlanService.createAppointmentPersonByDay();
log.info("创建每日预约人群完成");
}
......
package com.mortals.xhx.module.alarm.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.alarm.model.AlarmRecordsEntity;
import java.util.List;
/**
* 告警消息记录Dao
* 告警消息记录 DAO接口
*
* @author zxfei
* @date 2025-03-28
*/
public interface AlarmRecordsDao extends ICRUDDao<AlarmRecordsEntity,Long>{
}
package com.mortals.xhx.module.alarm.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.alarm.dao.AlarmRecordsDao;
import com.mortals.xhx.module.alarm.model.AlarmRecordsEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 告警消息记录DaoImpl DAO接口
*
* @author zxfei
* @date 2025-03-28
*/
@Repository("alarmRecordsDao")
public class AlarmRecordsDaoImpl extends BaseCRUDDaoMybatis<AlarmRecordsEntity,Long> implements AlarmRecordsDao {
}
package com.mortals.xhx.module.alarm.model;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.alarm.model.vo.AlarmRecordsVo;
import lombok.Data;
/**
* 告警消息记录实体对象
*
* @author zxfei
* @date 2025-03-28
*/
@Data
public class AlarmRecordsEntity extends AlarmRecordsVo {
private static final long serialVersionUID = 1L;
/**
* 站点Id
*/
private Long siteId;
/**
* 站点名称
*/
private String siteName;
/**
* 告警时间
*/
private Date alarmTime;
/**
* 告警类型
*/
private String alarmType;
/**
* 告警级别(0.一般,1.次要,2.危险)
*/
private Integer alarmLevel;
/**
* 接收人员
*/
private String alarmReceivePersonnel;
/**
* 接收人员电话
*/
private String receivePersonnelTelephone;
/**
* 告警详细内容
*/
private String alarmContent;
/**
* 推送
*/
private Integer push;
/**
* 备注信息
*/
private String remark;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof AlarmRecordsEntity) {
AlarmRecordsEntity tmp = (AlarmRecordsEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.siteId = null;
this.siteName = "";
this.alarmTime = null;
this.alarmType = "";
this.alarmLevel = 0;
this.alarmReceivePersonnel = "";
this.receivePersonnelTelephone = "";
this.alarmContent = "";
this.push = 0;
this.remark = "";
}
}
\ No newline at end of file
package com.mortals.xhx.module.alarm.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.alarm.model.AlarmRecordsEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal;
import java.util.Date;
/**
* 告警消息记录视图对象
*
* @author zxfei
* @date 2025-03-28
*/
@Data
public class AlarmRecordsVo extends BaseEntityLong {
/** 主键ID,主键,自增长列表 */
private List <Long> idList;
}
\ No newline at end of file
package com.mortals.xhx.module.alarm.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.alarm.model.AlarmRecordsEntity;
import com.mortals.xhx.module.alarm.dao.AlarmRecordsDao;
/**
* AlarmRecordsService
*
* 告警消息记录 service接口
*
* @author zxfei
* @date 2025-03-28
*/
public interface AlarmRecordsService extends ICRUDService<AlarmRecordsEntity,Long>{
AlarmRecordsDao getDao();
}
\ No newline at end of file
package com.mortals.xhx.module.alarm.service.impl;
import com.mortals.framework.model.PageInfo;
import org.springframework.beans.BeanUtils;
import java.util.function.Function;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.alarm.dao.AlarmRecordsDao;
import com.mortals.xhx.module.alarm.model.AlarmRecordsEntity;
import com.mortals.xhx.module.alarm.service.AlarmRecordsService;
import lombok.extern.slf4j.Slf4j;
/**
* AlarmRecordsService
* 告警消息记录 service实现
*
* @author zxfei
* @date 2025-03-28
*/
@Service("alarmRecordsService")
@Slf4j
public class AlarmRecordsServiceImpl extends AbstractCRUDServiceImpl<AlarmRecordsDao, AlarmRecordsEntity, Long> implements AlarmRecordsService {
}
\ No newline at end of file
package com.mortals.xhx.module.alarm.web;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.mortals.framework.model.Context;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.alarm.model.AlarmRecordsEntity;
import com.mortals.xhx.module.alarm.service.AlarmRecordsService;
import org.apache.commons.lang3.ArrayUtils;
import com.mortals.framework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*;
import com.mortals.xhx.common.code.*;
/**
*
* 告警消息记录
*
* @author zxfei
* @date 2025-03-28
*/
@RestController
@RequestMapping("alarm/records")
public class AlarmRecordsController extends BaseCRUDJsonBodyMappingController<AlarmRecordsService,AlarmRecordsEntity,Long> {
@Autowired
private ParamService paramService;
public AlarmRecordsController(){
super.setModuleDesc( "告警消息记录");
}
@Override
protected void init(Map<String, Object> model, Context context) {
this.addDict(model, "alarmLevel", AlarmLevelEnum.getEnumMap());
this.addDict(model, "push", PushEnum.getEnumMap());
super.init(model, context);
}
}
\ No newline at end of file
package com.mortals.xhx.module.care.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.care.model.CareCpRecordsEntity;
import java.util.List;
/**
* 差评预警Dao
* 差评预警 DAO接口
*
* @author zxfei
* @date 2025-03-28
*/
public interface CareCpRecordsDao extends ICRUDDao<CareCpRecordsEntity,Long>{
}
package com.mortals.xhx.module.care.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.care.model.CareDoworkRecordsEntity;
import java.util.List;
/**
* 办理时间Dao
* 办理时间 DAO接口
*
* @author zxfei
* @date 2025-03-28
*/
public interface CareDoworkRecordsDao extends ICRUDDao<CareDoworkRecordsEntity,Long>{
}
package com.mortals.xhx.module.care.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.care.dao.CareCpRecordsDao;
import com.mortals.xhx.module.care.model.CareCpRecordsEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 差评预警DaoImpl DAO接口
*
* @author zxfei
* @date 2025-03-28
*/
@Repository("careCpRecordsDao")
public class CareCpRecordsDaoImpl extends BaseCRUDDaoMybatis<CareCpRecordsEntity,Long> implements CareCpRecordsDao {
}
package com.mortals.xhx.module.care.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.care.dao.CareDoworkRecordsDao;
import com.mortals.xhx.module.care.model.CareDoworkRecordsEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 办理时间DaoImpl DAO接口
*
* @author zxfei
* @date 2025-03-28
*/
@Repository("careDoworkRecordsDao")
public class CareDoworkRecordsDaoImpl extends BaseCRUDDaoMybatis<CareDoworkRecordsEntity,Long> implements CareDoworkRecordsDao {
}
package com.mortals.xhx.module.care.model;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.care.model.vo.CareCpRecordsVo;
import lombok.Data;
/**
* 差评预警实体对象
*
* @author zxfei
* @date 2025-03-28
*/
@Data
public class CareCpRecordsEntity extends CareCpRecordsVo {
private static final long serialVersionUID = 1L;
/**
* 站点Id
*/
private Long siteId;
/**
* 站点名称
*/
private String siteName;
/**
* 个人信息ID
*/
private Long personId;
/**
* 评价号ID与办理号id一致
*/
private Long pjId;
/**
* 姓名
*/
private String name;
/**
* 联系方式
*/
private String contact;
/**
* 身份证号码
*/
private String idCard;
/**
* 窗口id
*/
private Long windowId;
/**
* 窗口名称
*/
private String windowName;
/**
* 部门
*/
private String section;
/**
* 编号
*/
private String flounum;
/**
* 评价选项
*/
private String assessment;
/**
* 评价类型
*/
private String type;
/**
* 评价内容
*/
private String content;
/**
* 来源
*/
private String source;
/**
* 评价时间
*/
private Date pjTime;
/**
* 告警次数
*/
private Integer careCount;
/**
* 消息发送次数
*/
private Integer smsCount;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof CareCpRecordsEntity) {
CareCpRecordsEntity tmp = (CareCpRecordsEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.siteId = null;
this.siteName = "";
this.personId = null;
this.pjId = null;
this.name = "";
this.contact = "";
this.idCard = "";
this.windowId = null;
this.windowName = "";
this.section = "";
this.flounum = "";
this.assessment = "";
this.type = "";
this.content = "";
this.source = "";
this.pjTime = null;
this.careCount = 0;
this.smsCount = 0;
}
}
\ No newline at end of file
package com.mortals.xhx.module.care.model;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.care.model.vo.CareDoworkRecordsVo;
import lombok.Data;
/**
* 办理时间实体对象
*
* @author zxfei
* @date 2025-03-28
*/
@Data
public class CareDoworkRecordsEntity extends CareDoworkRecordsVo {
private static final long serialVersionUID = 1L;
/**
* 站点Id
*/
private Long siteId;
/**
* 站点名称
*/
private String siteName;
/**
* 个人信息ID
*/
private Long personId;
/**
* 办理号ID与等待号id一致
*/
private Long doWorkId;
/**
* 姓名
*/
private String name;
/**
* 联系方式
*/
private String contact;
/**
* 身份证号码
*/
private String idCard;
/**
* 业务Id
*/
private Long bussinessId;
/**
* 预约业务
*/
private String bussinessName;
/**
* 办理业务
*/
private String service;
/**
* 排队编号
*/
private String queueNo;
/**
* 排队开始时间
*/
private Date takeTime;
/**
* 排队结束时间-业务办理开始时间
*/
private Date callTime;
/**
* 办理结束时间
*/
private Date endTime;
/**
* 最终办理时长,秒
*/
private Integer waitTime;
/**
* 告警次数
*/
private Integer careCount;
/**
* 短信发送次数
*/
private Integer smsCount;
/**
* 评价
*/
private String assessment;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof CareDoworkRecordsEntity) {
CareDoworkRecordsEntity tmp = (CareDoworkRecordsEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.siteId = null;
this.siteName = "";
this.personId = null;
this.doWorkId = null;
this.name = "";
this.contact = "";
this.idCard = "";
this.bussinessId = null;
this.bussinessName = "";
this.service = "";
this.queueNo = "";
this.takeTime = null;
this.callTime = null;
this.endTime = null;
this.waitTime = 0;
this.careCount = 0;
this.smsCount = 0;
this.assessment = "";
}
}
\ No newline at end of file
......@@ -2,6 +2,9 @@ package com.mortals.xhx.module.care.model;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
......@@ -11,7 +14,7 @@ import lombok.Data;
* 预约关怀记录实体对象
*
* @author zxfei
* @date 2023-05-05
* @date 2025-03-31
*/
@Data
public class CareRecordsEntity extends CareRecordsVo {
......@@ -29,6 +32,10 @@ public class CareRecordsEntity extends CareRecordsVo {
* 个人信息ID
*/
private Long personId;
/**
* 等待流水号ID
*/
private Long waitId;
/**
* 姓名
*/
......@@ -78,7 +85,7 @@ public class CareRecordsEntity extends CareRecordsVo {
*/
private String monitorDevice;
/**
* 最终等待时长分钟
* 最终等待时长,秒
*/
private Integer waitTime;
/**
......@@ -98,9 +105,21 @@ public class CareRecordsEntity extends CareRecordsVo {
*/
private Integer smsCount;
/**
* 等待流水号ID
* 办理结束时间
*/
private Long waitId;
private Date endTime;
/**
* 最终办理时长,秒
*/
private Integer endDureTime;
/**
* 等待时间超长告警
*/
private Integer waitDureAlarmCount;
/**
* 办理时间超长告警
*/
private Integer endDureAlarmCount;
@Override
public int hashCode() {
return this.getId().hashCode();
......@@ -118,47 +137,30 @@ public class CareRecordsEntity extends CareRecordsVo {
}
public void initAttrValue(){
this.siteId = null;
this.siteName = "";
this.personId = null;
this.waitId = null;
this.name = "";
this.contact = "";
this.idCard = "";
this.bussinessId = null;
this.bussinessName = "";
this.service = "";
this.queueNo = "";
this.takeTime = null;
this.callTime = null;
this.monitorTime = null;
this.monitorDeviceIds = "";
this.monitorDevice = "";
this.waitTime = null;
this.waitTime = 0;
this.processStatus = "排队中";
this.careCount = 0;
this.assessment = "";
this.smsCount = 0;
this.waitId = null;
this.endTime = null;
this.endDureTime = 0;
this.waitDureAlarmCount = 0;
this.endDureAlarmCount = 0;
}
}
\ No newline at end of file
package com.mortals.xhx.module.care.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.care.model.CareCpRecordsEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal;
import java.util.Date;
/**
* 差评预警视图对象
*
* @author zxfei
* @date 2025-03-28
*/
@Data
public class CareCpRecordsVo extends BaseEntityLong {
/** 主键ID,主键,自增长列表 */
private List <Long> idList;
}
\ No newline at end of file
package com.mortals.xhx.module.care.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.care.model.CareDoworkRecordsEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal;
import java.util.Date;
/**
* 办理时间视图对象
*
* @author zxfei
* @date 2025-03-28
*/
@Data
public class CareDoworkRecordsVo extends BaseEntityLong {
/** 主键ID,主键,自增长列表 */
private List <Long> idList;
}
\ No newline at end of file
package com.mortals.xhx.module.care.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.care.model.CareCpRecordsEntity;
import com.mortals.xhx.module.care.dao.CareCpRecordsDao;
/**
* CareCpRecordsService
*
* 差评预警 service接口
*
* @author zxfei
* @date 2025-03-28
*/
public interface CareCpRecordsService extends ICRUDService<CareCpRecordsEntity,Long>{
CareCpRecordsDao getDao();
}
\ No newline at end of file
package com.mortals.xhx.module.care.service;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.care.model.CareDoworkRecordsEntity;
import com.mortals.xhx.module.care.dao.CareDoworkRecordsDao;
/**
* CareDoworkRecordsService
*
* 办理时间 service接口
*
* @author zxfei
* @date 2025-03-28
*/
public interface CareDoworkRecordsService extends ICRUDService<CareDoworkRecordsEntity,Long>{
CareDoworkRecordsDao getDao();
}
\ No newline at end of file
package com.mortals.xhx.module.care.service.impl;
import com.mortals.framework.model.PageInfo;
import org.springframework.beans.BeanUtils;
import java.util.function.Function;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.care.dao.CareCpRecordsDao;
import com.mortals.xhx.module.care.model.CareCpRecordsEntity;
import com.mortals.xhx.module.care.service.CareCpRecordsService;
import lombok.extern.slf4j.Slf4j;
/**
* CareCpRecordsService
* 差评预警 service实现
*
* @author zxfei
* @date 2025-03-28
*/
@Service("careCpRecordsService")
@Slf4j
public class CareCpRecordsServiceImpl extends AbstractCRUDServiceImpl<CareCpRecordsDao, CareCpRecordsEntity, Long> implements CareCpRecordsService {
}
\ No newline at end of file
package com.mortals.xhx.module.care.service.impl;
import com.mortals.framework.model.PageInfo;
import org.springframework.beans.BeanUtils;
import java.util.function.Function;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.care.dao.CareDoworkRecordsDao;
import com.mortals.xhx.module.care.model.CareDoworkRecordsEntity;
import com.mortals.xhx.module.care.service.CareDoworkRecordsService;
import lombok.extern.slf4j.Slf4j;
/**
* CareDoworkRecordsService
* 办理时间 service实现
*
* @author zxfei
* @date 2025-03-28
*/
@Service("careDoworkRecordsService")
@Slf4j
public class CareDoworkRecordsServiceImpl extends AbstractCRUDServiceImpl<CareDoworkRecordsDao, CareDoworkRecordsEntity, Long> implements CareDoworkRecordsService {
}
\ No newline at end of file
package com.mortals.xhx.module.care.web;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.mortals.framework.model.Context;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.care.model.CareCpRecordsEntity;
import com.mortals.xhx.module.care.service.CareCpRecordsService;
import org.apache.commons.lang3.ArrayUtils;
import com.mortals.framework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*;
import com.mortals.xhx.common.code.*;
/**
*
* 差评预警
*
* @author zxfei
* @date 2025-03-28
*/
@RestController
@RequestMapping("care/cp/records")
public class CareCpRecordsController extends BaseCRUDJsonBodyMappingController<CareCpRecordsService,CareCpRecordsEntity,Long> {
@Autowired
private ParamService paramService;
public CareCpRecordsController(){
super.setModuleDesc( "差评预警");
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
}
\ No newline at end of file
package com.mortals.xhx.module.care.web;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import com.mortals.framework.model.Context;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.care.model.CareDoworkRecordsEntity;
import com.mortals.xhx.module.care.service.CareDoworkRecordsService;
import org.apache.commons.lang3.ArrayUtils;
import com.mortals.framework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*;
import com.mortals.xhx.common.code.*;
/**
*
* 办理时间
*
* @author zxfei
* @date 2025-03-28
*/
@RestController
@RequestMapping("care/dowork/records")
public class CareDoworkRecordsController extends BaseCRUDJsonBodyMappingController<CareDoworkRecordsService,CareDoworkRecordsEntity,Long> {
@Autowired
private ParamService paramService;
public CareDoworkRecordsController(){
super.setModuleDesc( "办理时间");
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment