From 55d5be8b794ae8c32d488795b67dbf249759a19f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?yinjinlu-pc=5C=E5=B0=B9=E9=87=91=E8=B7=AF?= <411641505@qq.com> Date: Wed, 8 Mar 2023 11:12:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/设计文档/数据库设计/mes-wm.sql | 1 + doc/设计文档/数据库设计/mes_sys.sql | 31 ++ .../system/SysMessageController.java | 121 ++++++++ .../system/SysMessageMobController.java | 38 +++ .../ktg/common/constant/UserConstants.java | 11 + ktg-framework/pom.xml | 6 + .../ktg/framework/config/SecurityConfig.java | 1 + .../framework/message/MessageProvider.java | 41 +++ .../framework/web/service/TokenService.java | 24 ++ .../framework/websocket/SemaphoreUtils.java | 58 ++++ .../framework/websocket/WebSocketConfig.java | 20 ++ .../framework/websocket/WebSocketServer.java | 138 +++++++++ .../framework/websocket/WebSocketUsers.java | 156 ++++++++++ .../ktg/mes/wm/domain/WmBarcodeConfig.java | 44 +-- .../mapper/wm/WmBarcodeConfigMapper.xml | 6 +- .../com/ktg/system/domain/SysMessage.java | 293 ++++++++++++++++++ .../ktg/system/mapper/SysMessageMapper.java | 61 ++++ .../system/service/ISysMessageService.java | 61 ++++ .../service/impl/SysMessageServiceImpl.java | 96 ++++++ .../mapper/system/SysMessageMapper.xml | 158 ++++++++++ 20 files changed, 1345 insertions(+), 20 deletions(-) create mode 100644 ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageController.java create mode 100644 ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageMobController.java create mode 100644 ktg-framework/src/main/java/com/ktg/framework/message/MessageProvider.java create mode 100644 ktg-framework/src/main/java/com/ktg/framework/websocket/SemaphoreUtils.java create mode 100644 ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketConfig.java create mode 100644 ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketServer.java create mode 100644 ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketUsers.java create mode 100644 ktg-system/src/main/java/com/ktg/system/domain/SysMessage.java create mode 100644 ktg-system/src/main/java/com/ktg/system/mapper/SysMessageMapper.java create mode 100644 ktg-system/src/main/java/com/ktg/system/service/ISysMessageService.java create mode 100644 ktg-system/src/main/java/com/ktg/system/service/impl/SysMessageServiceImpl.java create mode 100644 ktg-system/src/main/resources/mapper/system/SysMessageMapper.xml diff --git a/doc/设计文档/数据库设计/mes-wm.sql b/doc/设计文档/数据库设计/mes-wm.sql index 893a2e6..c6c5d8e 100644 --- a/doc/设计文档/数据库设计/mes-wm.sql +++ b/doc/设计文档/数据库设计/mes-wm.sql @@ -899,6 +899,7 @@ create table wm_barcode_config ( content_formart varchar(255) not null comment '内容格式', content_example varchar(255) comment '内容样例', auto_gen_flag char(1) default 'Y' comment '是否自动生成', + default_template varchar(255) comment '默认的打印模板', enable_flag char(1) default 'Y' comment '是否生效', remark varchar(500) default '' comment '备注', attr1 varchar(64) default null comment '预留字段1', diff --git a/doc/设计文档/数据库设计/mes_sys.sql b/doc/设计文档/数据库设计/mes_sys.sql index 477df4b..da8429b 100644 --- a/doc/设计文档/数据库设计/mes_sys.sql +++ b/doc/设计文档/数据库设计/mes_sys.sql @@ -110,3 +110,34 @@ create table sys_attachment ( ) engine=innodb auto_increment=200 comment = '附件表'; +-- ---------------------------- +-- 5、消息表 +-- ---------------------------- +drop table if exists sys_messsage; +create table sys_message ( + message_id bigint(20) not null auto_increment comment '附件ID', + message_type varchar(64) not null comment '消息类型', + message_level varchar(64) not null comment '消息级别', + message_title varchar(64) comment '标题', + message_content longblob comment '内容', + sender_id bigint(20) comment '发送人ID', + sender_name varchar(64) comment '发送人名称', + sender_nick varchar(64) comment '发送人昵称', + recipient_id bigint(20) not null comment '接收人ID', + recipient_name varchar(64) comment '接收人名称', + recipient_nick varchar(64) comment '接收人昵称', + process_time datetime comment '处理时间', + call_back varchar(255) comment '回调地址', + status varchar(64) not null default 'UNREAD' comment '状态', + deleted_flag char(1) not null default 'N' comment '是否删除', + remark varchar(500) default '' comment '备注', + attr1 varchar(64) default null comment '预留字段1', + attr2 varchar(255) default null comment '预留字段2', + attr3 int(11) default 0 comment '预留字段3', + attr4 int(11) default 0 comment '预留字段4', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (message_id) +) engine=innodb auto_increment=200 comment = '消息表'; diff --git a/ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageController.java b/ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageController.java new file mode 100644 index 0000000..71219f9 --- /dev/null +++ b/ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageController.java @@ -0,0 +1,121 @@ +package com.ktg.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ktg.common.constant.UserConstants; +import com.ktg.common.core.domain.entity.SysUser; +import com.ktg.common.utils.StringUtils; +import com.ktg.framework.message.MessageProvider; +import com.ktg.system.service.ISysUserService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ktg.common.annotation.Log; +import com.ktg.common.core.controller.BaseController; +import com.ktg.common.core.domain.AjaxResult; +import com.ktg.common.enums.BusinessType; +import com.ktg.system.domain.SysMessage; +import com.ktg.system.service.ISysMessageService; +import com.ktg.common.utils.poi.ExcelUtil; +import com.ktg.common.core.page.TableDataInfo; + +/** + * 消息Controller + * + * @author yinjinlu + * @date 2023-03-06 + */ +@RestController +@RequestMapping("/system/message") +public class SysMessageController extends BaseController +{ + @Autowired + private ISysMessageService sysMessageService; + @Autowired + private ISysUserService sysUserService; + @Autowired + private MessageProvider messageProvider; + + /** + * 查询消息列表 + */ + @PreAuthorize("@ss.hasPermi('system:message:list')") + @GetMapping("/list") + public TableDataInfo list(SysMessage sysMessage) + { + startPage(); + List list = sysMessageService.selectSysMessageList(sysMessage); + return getDataTable(list); + } + + /** + * 导出消息列表 + */ + @PreAuthorize("@ss.hasPermi('system:message:export')") + @Log(title = "消息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysMessage sysMessage) + { + List list = sysMessageService.selectSysMessageList(sysMessage); + ExcelUtil util = new ExcelUtil(SysMessage.class); + util.exportExcel(response, list, "消息数据"); + } + + /** + * 获取消息详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:message:query')") + @GetMapping(value = "/{messageId}") + public AjaxResult getInfo(@PathVariable("messageId") Long messageId) + { + return AjaxResult.success(sysMessageService.selectSysMessageByMessageId(messageId)); + } + + /** + * 新增消息 + */ + @PreAuthorize("@ss.hasPermi('system:message:add')") + @Log(title = "消息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysMessage sysMessage) + { + messageProvider.sendMessage(sysMessage); + return AjaxResult.success(); + } + + /** + * 修改消息 + */ + @PreAuthorize("@ss.hasPermi('system:message:edit')") + @Log(title = "消息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysMessage sysMessage) + { + return toAjax(sysMessageService.updateSysMessage(sysMessage)); + } + + /** + * 删除消息 + */ + @PreAuthorize("@ss.hasPermi('system:message:remove')") + @Log(title = "消息", businessType = BusinessType.DELETE) + @DeleteMapping("/{messageIds}") + public AjaxResult remove(@PathVariable Long[] messageIds) + { + for (Long messageId: messageIds + ) { + SysMessage sysMessage = sysMessageService.selectSysMessageByMessageId(messageId); + sysMessage.setDeletedFlag(UserConstants.YES); + sysMessageService.updateSysMessage(sysMessage); + } + return AjaxResult.success(); + } +} diff --git a/ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageMobController.java b/ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageMobController.java new file mode 100644 index 0000000..134dd8b --- /dev/null +++ b/ktg-admin/src/main/java/com/ktg/web/controller/system/SysMessageMobController.java @@ -0,0 +1,38 @@ +package com.ktg.web.controller.system; + +import com.ktg.common.core.controller.BaseController; +import com.ktg.common.core.domain.entity.SysUser; +import com.ktg.common.core.page.TableDataInfo; +import com.ktg.common.utils.SecurityUtils; +import com.ktg.system.domain.SysMessage; +import com.ktg.system.service.ISysMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/mobile/system/message") +public class SysMessageMobController extends BaseController { + + @Autowired + private ISysMessageService sysMessageService; + + /** + * 查询当前人的消息 + */ + @PreAuthorize("@ss.hasPermi('system:message:list')") + @GetMapping("/getMyMessage") + public TableDataInfo list(SysMessage sysMessage) + { + SysUser user = SecurityUtils.getLoginUser().getUser(); + startPage(); + sysMessage.setRecipientId(user.getUserId()); + List list = sysMessageService.selectSysMessageList(sysMessage); + return getDataTable(list); + } + +} diff --git a/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java b/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java index 8a6eab4..b5c9f0a 100644 --- a/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java +++ b/ktg-common/src/main/java/com/ktg/common/constant/UserConstants.java @@ -1,5 +1,7 @@ package com.ktg.common.constant; +import org.omg.CORBA.PUBLIC_MEMBER; + /** * 用户常量信息 * @@ -36,6 +38,8 @@ public class UserConstants /** 是否为系统默认(是) */ public static final String YES = "Y"; + public static final String NO = "N"; + /** 是否菜单外链(是) */ public static final String YES_FRAME = "0"; @@ -210,4 +214,11 @@ public class UserConstants public static final String BARCODE_TYPE_VENDOR = "VENDOR"; //供应商 public static final String BARCODE_TYPE_SN = "SN"; + /** + * 消息状态 + */ + public static final String MESSAGE_STATUS_UNREAD = "UNREAD"; //未读 + public static final String MESSAGE_STATUS_READ = "READ";//已读 + public static final String MESSAGE_STATUS_PROCEED = "PROCEED";//已处理 + } diff --git a/ktg-framework/pom.xml b/ktg-framework/pom.xml index f225a6a..fa9090e 100644 --- a/ktg-framework/pom.xml +++ b/ktg-framework/pom.xml @@ -47,6 +47,12 @@ + + + org.springframework.boot + spring-boot-starter-websocket + + com.github.oshi diff --git a/ktg-framework/src/main/java/com/ktg/framework/config/SecurityConfig.java b/ktg-framework/src/main/java/com/ktg/framework/config/SecurityConfig.java index ed13104..8c01fbc 100644 --- a/ktg-framework/src/main/java/com/ktg/framework/config/SecurityConfig.java +++ b/ktg-framework/src/main/java/com/ktg/framework/config/SecurityConfig.java @@ -114,6 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/webjars/**").anonymous() .antMatchers("/*/api-docs").anonymous() .antMatchers("/druid/**").anonymous() + .antMatchers("/websocket/**").anonymous() .antMatchers("/system/autocode/get/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() diff --git a/ktg-framework/src/main/java/com/ktg/framework/message/MessageProvider.java b/ktg-framework/src/main/java/com/ktg/framework/message/MessageProvider.java new file mode 100644 index 0000000..dec25a2 --- /dev/null +++ b/ktg-framework/src/main/java/com/ktg/framework/message/MessageProvider.java @@ -0,0 +1,41 @@ +package com.ktg.framework.message; + +import com.alibaba.fastjson.JSON; +import com.ktg.common.constant.UserConstants; +import com.ktg.common.core.domain.entity.SysUser; +import com.ktg.common.utils.StringUtils; +import com.ktg.framework.websocket.WebSocketUsers; +import com.ktg.system.domain.SysMessage; +import com.ktg.system.service.ISysMessageService; +import com.ktg.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class MessageProvider { + + @Autowired + private ISysMessageService sysMessageService; + @Autowired + private ISysUserService sysUserService; + + @Transactional + public void sendMessage(SysMessage message){ + message.setStatus(UserConstants.MESSAGE_STATUS_UNREAD); + if(StringUtils.isNotNull(message.getRecipientId())){ + SysUser recipient = sysUserService.selectUserById(message.getRecipientId()); + message.setRecipientName(recipient.getUserName()); + message.setRecipientNick(recipient.getNickName()); + } + if(StringUtils.isNotNull(message.getSenderId())){ + SysUser sender = sysUserService.selectUserById(message.getSenderId()); + message.setRecipientName(sender.getUserName()); + message.setRecipientNick(sender.getNickName()); + } + message.setDeletedFlag(UserConstants.NO); + WebSocketUsers.sendMesssageToUserByName(message.getRecipientName(), JSON.toJSONString(message)); + sysMessageService.insertSysMessage(message); + } + +} diff --git a/ktg-framework/src/main/java/com/ktg/framework/web/service/TokenService.java b/ktg-framework/src/main/java/com/ktg/framework/web/service/TokenService.java index 4a48c39..2f408d9 100644 --- a/ktg-framework/src/main/java/com/ktg/framework/web/service/TokenService.java +++ b/ktg-framework/src/main/java/com/ktg/framework/web/service/TokenService.java @@ -222,4 +222,28 @@ public class TokenService { return Constants.LOGIN_TOKEN_KEY + uuid; } + + /** + * 根据Token获取对应的用户 + * @param token + * @return + */ + public LoginUser getUserByToken(String token){ + if (StringUtils.isNotEmpty(token)) + { + try + { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + } + } + return null; + } } diff --git a/ktg-framework/src/main/java/com/ktg/framework/websocket/SemaphoreUtils.java b/ktg-framework/src/main/java/com/ktg/framework/websocket/SemaphoreUtils.java new file mode 100644 index 0000000..ca51ee5 --- /dev/null +++ b/ktg-framework/src/main/java/com/ktg/framework/websocket/SemaphoreUtils.java @@ -0,0 +1,58 @@ +package com.ktg.framework.websocket; + +import java.util.concurrent.Semaphore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 信号量相关处理 + * + * @author ruoyi + */ +public class SemaphoreUtils +{ + /** + * SemaphoreUtils 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(SemaphoreUtils.class); + + /** + * 获取信号量 + * + * @param semaphore + * @return + */ + public static boolean tryAcquire(Semaphore semaphore) + { + boolean flag = false; + + try + { + flag = semaphore.tryAcquire(); + } + catch (Exception e) + { + LOGGER.error("获取信号量异常", e); + } + + return flag; + } + + /** + * 释放信号量 + * + * @param semaphore + */ + public static void release(Semaphore semaphore) + { + + try + { + semaphore.release(); + } + catch (Exception e) + { + LOGGER.error("释放信号量异常", e); + } + } +} diff --git a/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketConfig.java b/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketConfig.java new file mode 100644 index 0000000..e23bfba --- /dev/null +++ b/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketConfig.java @@ -0,0 +1,20 @@ +package com.ktg.framework.websocket; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * websocket 配置 + * + * @author ruoyi + */ +@Configuration +public class WebSocketConfig +{ + @Bean + public ServerEndpointExporter serverEndpointExporter() + { + return new ServerEndpointExporter(); + } +} diff --git a/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketServer.java b/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketServer.java new file mode 100644 index 0000000..342c970 --- /dev/null +++ b/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketServer.java @@ -0,0 +1,138 @@ +package com.ktg.framework.websocket; + +import java.util.concurrent.Semaphore; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.ktg.common.core.domain.entity.SysUser; +import com.ktg.common.core.domain.model.LoginUser; +import com.ktg.common.utils.StringUtils; +import com.ktg.common.utils.spring.SpringUtils; +import com.ktg.framework.web.service.TokenService; +import com.ktg.system.domain.SysMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * websocket 消息处理 + * + * @author ruoyi + */ +@Component +@ServerEndpoint("/websocket/message/{token}") +public class WebSocketServer +{ + /** + * WebSocketServer 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class); + + + /** + * 默认最多允许同时在线人数100 + */ + public static int socketMaxOnlineCount = 100; + + private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount); + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session,@PathParam("token") String token) throws Exception + { + boolean semaphoreFlag = false; + //身份验证 + if(!StringUtils.isNotNull(token)){ + session.close(); + return; + } + + TokenService tokenService = SpringUtils.getBean(TokenService.class); + + LoginUser user = tokenService.getUserByToken(token); + if(!StringUtils.isNotNull(user)){ + session.close(); + return; + } + + // 尝试获取信号量 + semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore); + if (!semaphoreFlag) + { + // 未获取到信号量 + LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount); + WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount); + session.close(); + } + else + { + // 添加用户 + WebSocketUsers.put(user.getUsername(), session); + LOGGER.info("\n 建立连接 - {}", session); + LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size()); + WebSocketUsers.sendMessageToUserByText(session, "连接成功"); + } + } + + /** + * 连接关闭时处理 + */ + @OnClose + public void onClose(Session session) + { + LOGGER.info("\n 关闭连接 - {}", session); + // 移除用户 + WebSocketUsers.remove(session); + // 获取到信号量则需释放 + SemaphoreUtils.release(socketSemaphore); + } + + /** + * 抛出异常时处理 + */ + @OnError + public void onError(Session session, Throwable exception) throws Exception + { + if (session.isOpen()) + { + // 关闭连接 + session.close(); + } + String sessionId = session.getId(); + LOGGER.info("\n 连接异常 - {}", sessionId); + LOGGER.info("\n 异常信息 - {}", exception); + // 移出用户 + WebSocketUsers.remove(session); + // 获取到信号量则需释放 + SemaphoreUtils.release(socketSemaphore); + } + + /** + * 服务器接收到客户端消息时调用的方法 + */ + @OnMessage + public void onMessage(String message, Session session) + { + try{ + SysMessage msg = JSON.parseObject(message, new TypeReference(){}); + if(StringUtils.isNotNull(msg.getRecipientName())){ + //这里必须传递username + WebSocketUsers.sendMesssageToUserByName(msg.getRecipientName(),message); + } + }catch (Exception e){ + LOGGER.error("\n 错误的websocket信息格式 - {}", message); + } + } + +} diff --git a/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketUsers.java b/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketUsers.java new file mode 100644 index 0000000..ba1be28 --- /dev/null +++ b/ktg-framework/src/main/java/com/ktg/framework/websocket/WebSocketUsers.java @@ -0,0 +1,156 @@ +package com.ktg.framework.websocket; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import javax.websocket.Session; + +import com.ktg.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * websocket 客户端用户集 + * + * @author ruoyi + */ +public class WebSocketUsers +{ + /** + * WebSocketUsers 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers.class); + + /** + * 用户集 + */ + private static Map USERS = new ConcurrentHashMap(); + + /** + * 存储用户 + * + * @param key 唯一键 + * @param session 用户信息 + */ + public static void put(String key, Session session) + { + USERS.put(key, session); + } + + /** + * 移除用户 + * + * @param session 用户信息 + * + * @return 移除结果 + */ + public static boolean remove(Session session) + { + String key = null; + boolean flag = USERS.containsValue(session); + if (flag) + { + Set> entries = USERS.entrySet(); + for (Map.Entry entry : entries) + { + Session value = entry.getValue(); + if (value.equals(session)) + { + key = entry.getKey(); + break; + } + } + } + else + { + return true; + } + return remove(key); + } + + /** + * 移出用户 + * + * @param key 键 + */ + public static boolean remove(String key) + { + LOGGER.info("\n 正在移出用户 - {}", key); + Session remove = USERS.remove(key); + if (remove != null) + { + boolean containsValue = USERS.containsValue(remove); + LOGGER.info("\n 移出结果 - {}", containsValue ? "失败" : "成功"); + return containsValue; + } + else + { + return true; + } + } + + /** + * 获取在线用户列表 + * + * @return 返回用户集合 + */ + public static Map getUsers() + { + return USERS; + } + + /** + * 群发消息文本消息 + * + * @param message 消息内容 + */ + public static void sendMessageToUsersByText(String message) + { + Collection values = USERS.values(); + for (Session value : values) + { + sendMessageToUserByText(value, message); + } + } + + /** + * 发送文本消息 + * + * @param session 自己的用户名 + * @param message 消息内容 + */ + public static void sendMessageToUserByText(Session session, String message) + { + if (session != null) + { + try + { + session.getBasicRemote().sendText(message); + } + catch (IOException e) + { + LOGGER.error("\n[发送消息异常]", e); + } + } + else + { + LOGGER.info("\n[你已离线]"); + } + } + + public static void sendMesssageToUserByName(String username,String message){ + Session session = USERS.get(username); + if(StringUtils.isNotNull(session)){ + try + { + session.getBasicRemote().sendText(message); + } + catch (IOException e) + { + LOGGER.error("\n[发送消息异常]", e); + } + } + } +} diff --git a/ktg-mes/src/main/java/com/ktg/mes/wm/domain/WmBarcodeConfig.java b/ktg-mes/src/main/java/com/ktg/mes/wm/domain/WmBarcodeConfig.java index 1b19549..b1abfd6 100644 --- a/ktg-mes/src/main/java/com/ktg/mes/wm/domain/WmBarcodeConfig.java +++ b/ktg-mes/src/main/java/com/ktg/mes/wm/domain/WmBarcodeConfig.java @@ -38,6 +38,9 @@ public class WmBarcodeConfig extends BaseEntity @Excel(name = "是否自动生成") private String autoGenFlag; + /** 默认的打印模板 **/ + private String defaultTemplate; + /** 是否生效 */ @Excel(name = "是否生效") private String enableFlag; @@ -112,7 +115,14 @@ public class WmBarcodeConfig extends BaseEntity { return autoGenFlag; } - public void setEnableFlag(String enableFlag) + public String getDefaultTemplate() { + return defaultTemplate; + } + + public void setDefaultTemplate(String defaultTemplate) { + this.defaultTemplate = defaultTemplate; + } + public void setEnableFlag(String enableFlag) { this.enableFlag = enableFlag; } @@ -160,23 +170,19 @@ public class WmBarcodeConfig extends BaseEntity @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("configId", getConfigId()) - .append("barcodeFormart", getBarcodeFormart()) - .append("barcodeType", getBarcodeType()) - .append("contentFormart", getContentFormart()) - .append("contentExample", getContentExample()) - .append("autoGenFlag", getAutoGenFlag()) - .append("enableFlag", getEnableFlag()) - .append("remark", getRemark()) - .append("attr1", getAttr1()) - .append("attr2", getAttr2()) - .append("attr3", getAttr3()) - .append("attr4", getAttr4()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .toString(); + return "WmBarcodeConfig{" + + "configId=" + configId + + ", barcodeFormart='" + barcodeFormart + '\'' + + ", barcodeType='" + barcodeType + '\'' + + ", contentFormart='" + contentFormart + '\'' + + ", contentExample='" + contentExample + '\'' + + ", autoGenFlag='" + autoGenFlag + '\'' + + ", defaultTemplate='" + defaultTemplate + '\'' + + ", enableFlag='" + enableFlag + '\'' + + ", attr1='" + attr1 + '\'' + + ", attr2='" + attr2 + '\'' + + ", attr3=" + attr3 + + ", attr4=" + attr4 + + '}'; } } diff --git a/ktg-mes/src/main/resources/mapper/wm/WmBarcodeConfigMapper.xml b/ktg-mes/src/main/resources/mapper/wm/WmBarcodeConfigMapper.xml index ca4cbf9..a12ec09 100644 --- a/ktg-mes/src/main/resources/mapper/wm/WmBarcodeConfigMapper.xml +++ b/ktg-mes/src/main/resources/mapper/wm/WmBarcodeConfigMapper.xml @@ -11,6 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -24,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select config_id, barcode_formart, barcode_type, content_formart, content_example, auto_gen_flag, enable_flag, remark, attr1, attr2, attr3, attr4, create_by, create_time, update_by, update_time from wm_barcode_config + select config_id, barcode_formart, barcode_type, content_formart, content_example, auto_gen_flag,default_template, enable_flag, remark, attr1, attr2, attr3, attr4, create_by, create_time, update_by, update_time from wm_barcode_config + + + and message_type = #{messageType} + and message_level = #{messageLevel} + and message_title = #{messageTitle} + and message_content = #{messageContent} + and sender_id = #{senderId} + and sender_name like concat('%', #{senderName}, '%') + and sender_nick = #{senderNick} + and recipient_id = #{recipientId} + and recipient_name like concat('%', #{recipientName}, '%') + and recipient_nick = #{recipientNick} + and process_time = #{processTime} + and call_back = #{callBack} + and status = #{status} + and deleted_flag = 'N' + + order by create_time desc + + + + + + insert into sys_message + + message_type, + message_level, + message_title, + message_content, + sender_id, + sender_name, + sender_nick, + recipient_id, + recipient_name, + recipient_nick, + process_time, + call_back, + status, + deleted_flag, + remark, + attr1, + attr2, + attr3, + attr4, + create_by, + create_time, + update_by, + update_time, + + + #{messageType}, + #{messageLevel}, + #{messageTitle}, + #{messageContent}, + #{senderId}, + #{senderName}, + #{senderNick}, + #{recipientId}, + #{recipientName}, + #{recipientNick}, + #{processTime}, + #{callBack}, + #{status}, + #{deletedFlag}, + #{remark}, + #{attr1}, + #{attr2}, + #{attr3}, + #{attr4}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update sys_message + + message_type = #{messageType}, + message_level = #{messageLevel}, + message_title = #{messageTitle}, + message_content = #{messageContent}, + sender_id = #{senderId}, + sender_name = #{senderName}, + sender_nick = #{senderNick}, + recipient_id = #{recipientId}, + recipient_name = #{recipientName}, + recipient_nick = #{recipientNick}, + process_time = #{processTime}, + call_back = #{callBack}, + status = #{status}, + deleted_flag = #{deletedFlag}, + remark = #{remark}, + attr1 = #{attr1}, + attr2 = #{attr2}, + attr3 = #{attr3}, + attr4 = #{attr4}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where message_id = #{messageId} + + + + delete from sys_message where message_id = #{messageId} + + + + delete from sys_message where message_id in + + #{messageId} + + + \ No newline at end of file