From 53b0b8613081cfe0ba339fc45d1b0650910c1b58 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Fri, 23 Nov 2018 14:27:17 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/busi/ISysUserService.java | 38 +++++++- .../controller/busi/SysUserController.java | 12 +-- .../serviceimpl/busi/SysUserService.java | 105 ++++++++++++++++++++- .../src/main/resources/init/permission.xlsx | Bin 40838 -> 40942 bytes 4 files changed, 143 insertions(+), 12 deletions(-) diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java index 581380e..a1e5cb9 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java @@ -126,6 +126,20 @@ public interface ISysUserService { SysUser getSysUserByLoginName(String loginName); /** + * 根据手机号查询账号 + * @param email + * @return + */ + SysUser getSysUserByEmail(String email); + + /** + * 根据手机号查询账号 + * @param phone + * @return + */ + SysUser getSysUserByPhone(String phone); + + /** * 查出用户角色关系 * @param userId * @return @@ -138,5 +152,27 @@ public interface ISysUserService { * @param id * @return */ - boolean checkLoginName(String userLoginName,long id); + boolean checkSysUserLoginName(String userLoginName, long id); + + /** + * 判断邮箱是否存在 + * @param email + * @param id + * @return + */ + boolean checkSysUserEmail(String email,long id); + + /** + * 判断手机是否存在 + * @param phone + * @param id + * @return + */ + boolean checkSysUserPhone(String phone,long id); + + /** + * 用户唯一教研 + * @param user + */ + void checkSysUserOnly(SysUser user); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index fbfd4ca..eb6915d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -72,6 +72,9 @@ public class SysUserController extends CoreBaseController{ .build(); } + // 用户唯一校验 + sysUserService.checkSysUserOnly(sysUser); + SysUserInfo userInfo = sysUserInfoService.getSysUserInfoById(sysUser.getUserInfoId()); if(userInfo == null){ throw ImppExceptionBuilder.newInstance() @@ -126,13 +129,8 @@ public class SysUserController extends CoreBaseController{ .build(); } - if (sysUserService.checkLoginName(sysUser.getUserLoginName(), sysUser.getId())) { - throw ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) - .setErrorDetail("用户名已存在") - .build(); - } + // 用户唯一校验 + sysUserService.checkSysUserOnly(sysUser); // 用户信息封装 SysUserInfo userInfo = sysUserService.getSysUserInfoById(sysUser.getUserInfoId()); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java index a6dafe0..7fb2785 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java @@ -17,6 +17,7 @@ import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; +import io.swagger.annotations.ApiOperation; import org.apache.shiro.authc.AuthenticationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,7 +25,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; /** @@ -73,6 +73,7 @@ public class SysUserService implements ISysUserService { private SysPositionRepository sysPositionRDao; @Override + @ApiOperation(value = "用户登录", notes = "用户登录功能实现") public SessionUser queryUserLogin(String loginName, String password, String languageCode) throws AuthenticationException { LOGGER.debug("平台用户 SYS_USER loginName:{} \t password:{} \t languageCode:{}", loginName, password, languageCode); @@ -96,6 +97,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "修改账号", notes = "修改账号状态") public void updateSysUserStatus(Long id, int status, SessionUser user) { LOGGER.debug("平台用户 SYS_USER id:{} status:{} modifyUser:{}", id, status, user.getUserName()); SysUser sysUser = sysUserRDao.getById(id); @@ -105,6 +107,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "修改账号", notes = "批量修改账号状态") public void updateBatchSysUserStatus(Long[] ids, int status, SessionUser user) { LOGGER.debug("平台用户 SYS_USER DELETE By ids :{} status:{}, SessionUser :{}", ids,status,user); @@ -121,12 +124,14 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "修改账号", notes = "修改账号信息") public void updateSysUser(SysUser sysUser) throws Exception{ LOGGER.debug("平台用户 SYS_USER SysUser :{}", sysUser); sysUserRDao.save(sysUser); } @Override + @ApiOperation(value = "修改账号", notes = "修改账号登录密码") public void updateSysUserPassword(Long userId, String password, String newPwd) throws Exception { LOGGER.debug("平台用户 SYS_USER Override:{} password:{} newPwd:{}", userId,password,newPwd); SysUser user = sysUserRDao.getById(userId); @@ -154,6 +159,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "刷新账号", notes = "刷新账号登录信息") public void refreshUserLoginInformation(Long userId) { SysUser user = sysUserRDao.getById(userId); SysUserInfo userInfo = sysUserInfoRDao.getById(user.getUserInfoId()); @@ -168,6 +174,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "新增账号", notes = "新增账号信息") public SysUser insertSysUser(SysUser sysUser)throws Exception { LOGGER.debug("平台用户 SYS_USER SysUser:{}", sysUser); @@ -188,6 +195,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "新增账号", notes = "新增账号信息") public void refreshSysRefUserRole(SysUser sysUser, Long[] roleIds, String userName) { LOGGER.debug("平台用户 SYS_USER SysUser:{}", sysUser); LOGGER.debug("平台用户 SYS_USER String[] :{}", roleIds); @@ -230,6 +238,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "删除账号", notes = "删除账号信息,逻辑删除,账号关系业务物理删除") public void deleteSysUserById(Long id) { LOGGER.debug("平台用户 SYS_USER DELETE By id :{}", id); sysUserRDao.updateByProperties("id", id, "isValid", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); @@ -241,6 +250,7 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "删除账号", notes = "批量删除账号信息,逻辑删除,账号关系业务物理删除") public void deleteBatchSysUserById(Long[] ids,SessionUser user) { LOGGER.debug("平台用户 SYS_USER DELETE By ids :{}", ids); @@ -258,12 +268,14 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "账号查询", notes = "查询所有账号信息") public List list() { LOGGER.debug("平台用户 SYS_USER find All"); return sysUserRDao.findByProperty("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); } @Override + @ApiOperation(value = "账号分页查询", notes = "组合查询") public ListPager querySysUserByPager(SysUser user, Pager pager) { LOGGER.debug("系统用户 SysUser find user :{} page :{}", user, pager); @@ -274,17 +286,20 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "账号查询", notes = "根据ID 查询账号信息") public SysUser getSysUserById(Long id) { LOGGER.debug("平台用户 SYS_USER get By id :{}", id); return sysUserRDao.getById(id); } @Override + @ApiOperation(value = "用户查询", notes = "根据ID 查询用户信息") public SysUserInfo getSysUserInfoById(Long id) { return sysUserInfoRDao.getByProperty("id",id); } @Override + @ApiOperation(value = "账号查询", notes = "根据登录名查询用户信息") public SysUser getSysUserByLoginName(String loginName) { LOGGER.debug("平台用户 SYS_USER find By Login Name :{}", loginName); return sysUserRDao.getByProperty(new String[]{"userLoginName", "isValid"}, @@ -292,12 +307,28 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "账号查询", notes = "根据邮箱查询用户信息") + public SysUser getSysUserByEmail(String email) { + return sysUserRDao.getByProperty(new String[]{"userEmail", "isValid"}, + new Object[]{email, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}); + } + + @Override + @ApiOperation(value = "账号查询", notes = "根据手机号查询用户信息") + public SysUser getSysUserByPhone(String phone) { + return sysUserRDao.getByProperty(new String[]{"userPhone", "isValid"}, + new Object[]{phone, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}); + } + + @Override + @ApiOperation(value = "账号角色", notes = "根据账号ID查询账号角色关系") public List findSysRefUserRoleByUserId(Long userId) { return refUserRoleRDao.findByProperty("userId",userId); } @Override - public boolean checkLoginName(String userLoginName, long id) { + @ApiOperation(value = "检查-账号登录名", notes = "判断账号是否存在") + public boolean checkSysUserLoginName(String userLoginName, long id) { int count; if(id > 0){ StringBuffer sw = new StringBuffer(); @@ -311,6 +342,74 @@ public class SysUserService implements ISysUserService { return count <= 0 ; } + @Override + @ApiOperation(value = "检查-账号邮箱", notes = "判断邮箱是否存在") + public boolean checkSysUserEmail(String email, long id) { + int count; + if(id > 0){ + StringBuffer sw = new StringBuffer(); + HqlPack.getStringEqualPackOr(email,"userEmail",sw); + HqlPack.getNumNOEqualPack(id,"id",sw); + count = sysUserRDao.findByHqlWhereCount(sw.toString()); + + }else{ + count = sysUserRDao.findByPropertyCount("userEmail",email); + } + return count <= 0 ; + } + + @Override + @ApiOperation(value = "检查-账号手机", notes = "判断手机是否存在") + public boolean checkSysUserPhone(String phone, long id) { + int count; + if(id > 0){ + StringBuffer sw = new StringBuffer(); + HqlPack.getStringEqualPackOr(phone,"userPhone",sw); + HqlPack.getNumNOEqualPack(id,"id",sw); + count = sysUserRDao.findByHqlWhereCount(sw.toString()); + + }else{ + count = sysUserRDao.findByPropertyCount("userPhone",phone); + } + return count <= 0 ; + } + + @Override + @ApiOperation(value = "检查-账号唯一", notes = "账号唯一性校验") + public void checkSysUserOnly(SysUser user) { + if(user != null){ + // 登录名唯一教研 + if(checkSysUserLoginName(user.getUserLoginName(),user.getId())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode()) + .setErrorDetail("用户名已存在") + .setErrorSolution("请重新输入用户名") + .build(); + } + + // 登录名唯一教研 + if(checkSysUserEmail(user.getUserEmail(),user.getId())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode()) + .setErrorDetail("邮箱已存在") + .setErrorSolution("请重新输入邮箱") + .build(); + } + + // 登录名唯一教研 + if(checkSysUserPhone(user.getUserPhone(),user.getId())){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode()) + .setErrorDetail("手机号已存在") + .setErrorSolution("请重新输入手机号") + .build(); + } + } + } + /** * 封装用户登陆信息 * @@ -456,6 +555,4 @@ public class SysUserService implements ISysUserService { } } - - } diff --git a/modules/i3plus-core-apiservice/src/main/resources/init/permission.xlsx b/modules/i3plus-core-apiservice/src/main/resources/init/permission.xlsx index de22f2584ed6bb8e1d1f93fde164e7fc984128c1..19fd927027c639c3ac8091acd336c6513890dd32 100644 GIT binary patch delta 22518 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 e?pS`wRR<6VK%xPAK9i!~X@vR2Ccn delta 22422 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 From c9ef53ef80af722a1bf1589764633abf03bd383c Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Fri, 23 Nov 2018 14:28:50 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=E7=94=9F=E6=88=90=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/busi/ISysMessageService.java | 30 ++++++++- .../api/iservice/busi/ISysOrderNoRuleService.java | 3 + .../controller/busi/SysConfigController.java | 41 ++++++++++-- .../controller/busi/SysMessageController.java | 72 +++++++++++++--------- .../controller/busi/SysOrderNoRuleController.java | 41 +++++++++--- .../core/apiservice/mq/LetterQueueReceiver.java | 3 + .../core/apiservice/mq/MailQueueReceiver.java | 5 +- .../core/apiservice/schedulejob/DemoJob.java | 13 ---- .../serviceimpl/busi/SysConfigService.java | 3 +- .../serviceimpl/busi/SysMessageService.java | 30 +++++++++ .../serviceimpl/busi/SysOrderNoRuleService.java | 30 ++++++++- .../core/apiservice/util/OrderNoMakeUtil.java | 14 ++--- .../core/apiservice/util/TestOrderNoMakeUtil.java | 10 +-- 13 files changed, 221 insertions(+), 74 deletions(-) diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java index cb27dd6..e54355c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; +import io.swagger.annotations.ApiOperation; import java.util.List; @@ -20,31 +21,36 @@ public interface ISysMessageService { * 添加消息 * @param sysMessage */ + @ApiOperation(value = "添加消息") SysMessage insertSysMessage(SysMessage sysMessage); /** * 删除消息 * @param id */ + @ApiOperation(value = "删除消息") void deleteSysMessageById(Long id); /** * 修改消息 * @param sysMessage */ + @ApiOperation(value = "修改消息") void updateSysMessage(SysMessage sysMessage); /** * 查询全部信息 * @return */ + @ApiOperation(value = "查询全部信息") List listSysMessage(); /** - * 根据id查询消息*标记已读 + * 根据id查询消息 * @param id * @return */ + @ApiOperation(value = "根据id查询消息") SysMessage getSysMessageById(Long id); /** @@ -53,6 +59,7 @@ public interface ISysMessageService { * @param pager * @return */ + @ApiOperation(value = "系统消息复杂查询,分页,排序") ListPager querySysMessageByPager(SysMessage sysMessage, Pager pager); // /** @@ -66,6 +73,7 @@ public interface ISysMessageService { * 批量删除系统消息 * @param ids */ + @ApiOperation(value = "批量删除消息") void deleteSysMessageByIds(Long[] ids); // /** @@ -76,9 +84,10 @@ public interface ISysMessageService { // void updateSysMessageStatusByIds(String[] ids,Integer status); /** - * 添加用户消息关系表 + * 添加用户消息关系 * @param refUserMessage */ + @ApiOperation(value = "添加用户消息关系") SysRefUserMessage insertSysRefUserMessage(SysRefUserMessage refUserMessage); /** @@ -86,5 +95,22 @@ public interface ISysMessageService { * @param sysMessage * @return */ + @ApiOperation(value = "添加消息并发送") void sendSysMessage(SysMessage sysMessage); + + /** + * 分页查询用户消息表 + * @return + */ + @ApiOperation(value = "分页查询用户消息表") + ListPager querySysRefUserMessageByPager(SysRefUserMessage sysRefUserMessage, Pager pager); + + /** + * 根据用户id和消息状态和查询用户消息表 + * @param userId + * @param status + * @return + */ + @ApiOperation(value = "根据用户id和消息状态和查询用户消息表") + List findSysRefUserMessageByUserIdAndStatus(Long userId,Integer status); } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java index 8bc6802..4666a1f 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java @@ -31,4 +31,7 @@ public interface ISysOrderNoRuleService { @ApiOperation(value = "根据code查询单号规则") SysOrderNoRule getSysOrderNoRuleCode(String code); + + @ApiOperation(value = "根据id修改用户状态") + void updateSysOrderNoRuleCodeStatusById(Long id,Integer status); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java index d93d1bf..9eaa97a 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java @@ -1,9 +1,11 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysConfigService; +import cn.estsh.i3plus.core.apiservice.util.MailUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SessionUser; import cn.estsh.i3plus.pojo.platform.bean.SysConfig; @@ -36,7 +38,9 @@ public class SysConfigController extends CoreBaseController { public static final Logger LOGGER = LoggerFactory.getLogger(SysConfigController.class); @Autowired - public ISysConfigService sysConfigService; + private ISysConfigService sysConfigService; + @Autowired + private MailUtil mailUtil; @PostMapping("/insert") @ApiOperation(value = "添加系统参数",notes = "添加系统参数") @@ -122,6 +126,8 @@ public class SysConfigController extends CoreBaseController { @ApiOperation(value = "根据id查询系统参数",notes = "根据id查询系统参数") public ResultBean getSysConfigById(@PathVariable("id") String id){ try { + ValidatorBean.checkNotNull(id,"id不能为空"); + SysConfig sysConfig = sysConfigService.getSysConfigById(Long.parseLong(id)); if (sysConfig != null) { return ResultBean.success("查询成功") @@ -141,9 +147,7 @@ public class SysConfigController extends CoreBaseController { public ResultBean querySysConfigByPager(SysConfig sysConfig,Pager pager) { try { ListPager sysConfigListPager = sysConfigService.querySysConfigByPager(sysConfig,pager); - return ResultBean.success("查询成功") - .setListPager(sysConfigListPager) - .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + return ResultBean.success("查询成功").setListPager(sysConfigListPager).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ @@ -155,6 +159,8 @@ public class SysConfigController extends CoreBaseController { @ApiOperation(value = "根据代码获取系统配置") public ResultBean getSysConfigByCode(@PathVariable("code") String code){ try { + ValidatorBean.checkNotNull(code,"配置项代码不能为空"); + SysConfig sysConfig = sysConfigService.getSysConfigByCode(code); if(sysConfig == null){ return ResultBean.fail("数据不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); @@ -186,10 +192,14 @@ public class SysConfigController extends CoreBaseController { } @PostMapping("/update-code/{code}/{value}") + @ApiOperation(value = "根据code修改系统配置") public ResultBean updateSysConfigByCode(@PathVariable("code") String code,@PathVariable("value") String value){ try{ -// sysConfigService.update - return null; + ValidatorBean.checkNotNull(code,"配置项代码不能为空"); + ValidatorBean.checkNotNull(value,"值不能为空"); + + sysConfigService.updateSysConfigByCode(code,value); + return ResultBean.success("查询成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ @@ -197,4 +207,23 @@ public class SysConfigController extends CoreBaseController { } } + @GetMapping("/send-test-mail/{to}") + @ApiOperation(value = "邮件测试") + public ResultBean sendTestMail(@PathVariable("to") String to){ + try { + ValidatorBean.checkNotNull(to,"收件人不能为空"); + + mailUtil.init(); + mailUtil.setSubject("测试邮件"); + mailUtil.setContentType(ImppEnumUtil.MESSAGE_CONTENT_TYPE.HTML.getDescription()); + mailUtil.setBody("测试邮件"); + mailUtil.setTo(to); + mailUtil.send(); + return ResultBean.success("测试邮件已发送").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java index e9d1bda..f241513 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java @@ -10,6 +10,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SessionUser; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; +import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; @@ -36,7 +37,7 @@ import java.util.List; * @Modify : **/ @RestController -@RequestMapping(CoreBaseController.BASE_URL + "/sys-message") +@RequestMapping(CoreBaseController.BASE_URL) @Api(description = "消息管理服务") public class SysMessageController extends CoreBaseController { public static final Logger LOGGER = LoggerFactory.getLogger(SysMessageController.class); @@ -44,7 +45,7 @@ public class SysMessageController extends CoreBaseController { @Autowired private ISysMessageService sysMessageService; - @PostMapping(value = "/insert") + @PostMapping(value = "/sys-message/insert") @ApiOperation(value = "新增消息",notes = "新增消息") public ResultBean insertSysMessage(SysMessage sysMessage){ try { @@ -67,15 +68,13 @@ public class SysMessageController extends CoreBaseController { sysMessageService.sendSysMessage(sysMessage); return ResultBean.success("添加成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } - @DeleteMapping("/delete/{id}") + @DeleteMapping("/sys-message/delete/{id}") @ApiOperation(value = "根据id删除消息",notes = "根据id删除消息") public ResultBean deleteSysMessageById(@PathVariable("id") String id){ try { @@ -85,15 +84,13 @@ public class SysMessageController extends CoreBaseController { sysMessageService.deleteSysMessageById(Long.parseLong(id)); return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } - @PutMapping("/update") + @PutMapping("/sys-message/update") @ApiOperation(value = "修改信息",notes = "修改信息") public ResultBean updateSysMessage(SysMessage sysMessage){ try { @@ -109,30 +106,26 @@ public class SysMessageController extends CoreBaseController { sysMessageService.updateSysMessage(sysMessage); return ResultBean.success("修改成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } - @GetMapping(value = "/list") + @GetMapping(value = "/sys-message/list") @ApiOperation(value = "查询全部消息",notes = "查询全部消息") public ResultBean findSysConfigAll(){ try { List sysMessageList = sysMessageService.listSysMessage(); return ResultBean.success("查询成功").setResultList(sysMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } - @GetMapping(value = "/get/{id}") + @GetMapping(value = "/sys-message/get/{id}") @ApiOperation(value = "根据id查询消息",notes = "根据id查询消息") public ResultBean getSysConfigById(String id){ try { @@ -143,26 +136,22 @@ public class SysMessageController extends CoreBaseController { return ResultBean.fail("数据不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); } }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } - @GetMapping(value = "/query") + @GetMapping(value = "/sys-message/query") @ApiOperation(value = "消息复杂查询,分页,排序",notes = "消息复杂查询,分页,排序") public ResultBean querySysMessageByPager(SysMessage sysMessage, Pager pager){ try { ListPager sysMessageListPager = sysMessageService.querySysMessageByPager(sysMessage,pager); return ResultBean.success("查询成功").setListPager(sysMessageListPager).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } @@ -184,7 +173,7 @@ public class SysMessageController extends CoreBaseController { // } // } - @DeleteMapping("/batch-delete") + @DeleteMapping("/sys-message/batch-delete") @ApiOperation(value = "批量删除消息",notes = "批量删除消息") public ResultBean deleteSysMessageByIds(String[] ids){ try{ @@ -200,11 +189,9 @@ public class SysMessageController extends CoreBaseController { sysMessageService.deleteSysMessageByIds(StringTool.getArrayLong(ids)); return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); return ResultBean.fail(busExcep.getErrorShow()); }catch(Exception e){ - LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); - return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } @@ -232,4 +219,31 @@ public class SysMessageController extends CoreBaseController { // return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); // } // } + + @GetMapping(value = "/user-message/query") + @ApiOperation(value = "用户消息复杂查询,分页,排序") + public ResultBean querySysRefUserMessageByPager(SysRefUserMessage sysRefUserMessage,Pager pager){ + try { + ListPager userMessageList = sysMessageService.querySysRefUserMessageByPager(sysRefUserMessage,pager); + return ResultBean.success("查询成功").setListPager(userMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @GetMapping(value = "/user-message/find-unread") + @ApiOperation(value = "查看用户未读站内信") + public ResultBean findUnreadUserMessage(){ + try { + List userMessageList = sysMessageService.findSysRefUserMessageByUserIdAndStatus(getSessionUser().getUser().getId(), + ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); + return ResultBean.success("查询成功").setResultList(userMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java index 31764fb..f8c8784 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrderNoRuleController.java @@ -1,7 +1,9 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService; -import cn.estsh.i3plus.core.apiservice.util.OrderNoMakeUtil; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule; import cn.estsh.impp.framework.base.controller.CoreBaseController; @@ -42,6 +44,9 @@ public class SysOrderNoRuleController { .checkNotZero("serialNoLength",sysOrderNoRule.getSerialNoLength()) .checkNotZero("isCycle",sysOrderNoRule.getIsCycle()); + sysOrderNoRule.setOrderNoRuleStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + sysOrderNoRule.setSerialNo(CommonEnumUtil.PARENT.DEFAULT.getValue()); + sysOrderNoRuleService.insertSysOrderNoRule(sysOrderNoRule); return ResultBean.success("操作成功").setResultObject(sysOrderNoRule).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ @@ -115,12 +120,6 @@ public class SysOrderNoRuleController { ValidatorBean.checkNotNull(code,"code不能为空"); SysOrderNoRule sysOrderNoRule = sysOrderNoRuleService.getSysOrderNoRuleCode(code); - if (sysOrderNoRule == null) { - return ResultBean.fail("单号规则不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); - }else { - sysOrderNoRule = OrderNoMakeUtil.next(sysOrderNoRule); - sysOrderNoRuleService.updateSysOrderNoRule(sysOrderNoRule); - } return ResultBean.success("查询成功").setResultObject(sysOrderNoRule).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep.getErrorShow()); @@ -129,4 +128,32 @@ public class SysOrderNoRuleController { } } + @GetMapping(value = "/query") + @ApiOperation(value = "单号规则复杂查询,分页,排序") + public ResultBean querySysOrderNoRuleByPager(SysOrderNoRule sysOrderNoRule, Pager pager){ + try { + ListPager sysOrderNoRuleList = sysOrderNoRuleService.querySysOrderNoRuleByPager(sysOrderNoRule, pager); + return ResultBean.success("查询成功").setListPager(sysOrderNoRuleList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @PutMapping(value = "/update-status/{id}/{status}") + @ApiOperation(value = "单号规则复杂查询,分页,排序") + public ResultBean updateSysOrderNoRuleStatusById(@PathVariable("id") String id,@PathVariable("status") Integer status){ + try { + ValidatorBean.checkNotNull(id,"code不能为空"); + ValidatorBean.checkNotZero(status,"code不能为空"); + + sysOrderNoRuleService.updateSysOrderNoRuleCodeStatusById(Long.parseLong(id),status); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java index d29d207..cc3f458 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.core.apiservice.mq; import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; import cn.estsh.i3plus.pojo.platform.bean.SysUser; @@ -61,8 +62,10 @@ public class LetterQueueReceiver { refUserMessage.setMessageId(msg.getId()); refUserMessage.setMessageTitleRdd(msg.getMessageTitle()); refUserMessage.setMessageTypeRdd(msg.getMessageType()); + refUserMessage.setMessageSenderNameRdd(msg.getMessageSenderNameRdd()); refUserMessage.setReceiverId(sysUser.getId()); refUserMessage.setReceiverNameRdd(sysUser.getUserName()); + refUserMessage.setMessageStatus(ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); refUserMessage.setReceiverTime(TimeTool.getNowTime(true)); sysMessageService.insertSysRefUserMessage(refUserMessage); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java index b99b384..2ffdd49 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java @@ -44,8 +44,7 @@ public class MailQueueReceiver { //@RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_MAIL_QUEUE) public void processImppMail(SysMessage msg, Channel channel, Message message) { try { - LOGGER.info("【MQ-IMPP_MESSAGE_MAIL_QUEUE】数据接收成功:{}",msg); - msg = sysMessageService.insertSysMessage(msg); + LOGGER.info("【MQ-IMPP_MESSAGE_MAIL_QUEUE】数据接收成功:{}",msg);msg = sysMessageService.insertSysMessage(msg); mailUtil.init(); // 收件人信息 @@ -63,8 +62,10 @@ public class MailQueueReceiver { refUserMessage.setMessageId(msg.getId()); refUserMessage.setMessageTitleRdd(msg.getMessageTitle()); refUserMessage.setMessageTypeRdd(msg.getMessageType()); + refUserMessage.setMessageSenderNameRdd(msg.getMessageSenderNameRdd()); refUserMessage.setReceiverId(sysUser.getId()); refUserMessage.setReceiverNameRdd(sysUser.getUserName()); + refUserMessage.setMessageStatus(ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); refUserMessage.setReceiverTime(TimeTool.getNowTime(true)); sysMessageService.insertSysRefUserMessage(refUserMessage); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java index 08fd19a..18f3bf9 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java @@ -1,16 +1,11 @@ package cn.estsh.i3plus.core.apiservice.schedulejob; -import cn.estsh.i3plus.core.api.iservice.busi.ISysTaskTimeService; import cn.estsh.impp.framework.base.schedule.BaseImppScheduleJob; import cn.estsh.impp.framework.boot.init.ApplicationProperties; import io.swagger.annotations.ApiOperation; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.text.SimpleDateFormat; -import java.util.Date; /** * @Description : 定时任务 @@ -23,20 +18,12 @@ import java.util.Date; public class DemoJob extends BaseImppScheduleJob { public static final Logger LOGGER = LoggerFactory.getLogger(DemoJob.class); - @Autowired - private ISysTaskTimeService taskTimeService; - public DemoJob() { super(DemoJob.class,"定时任务demo"); } @Override public void executeImppJob(JobExecutionContext context, ApplicationProperties applicationProperties) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd"); - - taskTimeService.doSysTaskTimeLastDateByNameAndGroupName(sdf.format(new Date()), - context.getJobDetail().getKey().getName(), - context.getJobDetail().getKey().getGroup()); System.out.println("定时任务被执行"); LOGGER.info("projectName:{},port:{}",applicationProperties.getApplicationName(),applicationProperties.getServerPort()); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java index 7819c50..745b9cf 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysConfigService.java @@ -100,8 +100,9 @@ public class SysConfigService implements ISysConfigService { } @Override + @ApiOperation(value = "根据code修改系统配置") public void updateSysConfigByCode(String code, String value) { - SysConfigRDao.updateByProperties("configCode",value,"",value); + SysConfigRDao.updateByProperties("configCode",value,"configValue",value); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java index 112b199..7a8ed6e 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java @@ -12,6 +12,7 @@ import cn.estsh.i3plus.pojo.platform.repository.SysMessageRepository; import cn.estsh.i3plus.pojo.platform.repository.SysRefUserMessageRepository; import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; +import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -48,11 +49,13 @@ public class SysMessageService implements ISysMessageService { private RabbitTemplate rabbitTemplate; @Override + @ApiOperation(value = "添加消息") public SysMessage insertSysMessage(SysMessage sysMessage) { return sysMessageRDao.insert(sysMessage); } @Override + @ApiOperation(value = "删除消息") public void deleteSysMessageById(Long id) { LOGGER.info("消息 SYS_MESSAGE id:{}",id); refUserMessageRDao.deleteByProperty("messageId",id); @@ -60,24 +63,28 @@ public class SysMessageService implements ISysMessageService { } @Override + @ApiOperation(value = "修改消息") public void updateSysMessage(SysMessage sysMessage){ LOGGER.info("消息 SYS_MESSAGE :{}",sysMessage); sysMessageRDao.update(sysMessage); } @Override + @ApiOperation(value = "查询全部信息") public List listSysMessage(){ LOGGER.info("消息 SYS_MESSAGE list"); return sysMessageRDao.list(); } @Override + @ApiOperation(value = "根据id查询消息") public SysMessage getSysMessageById(Long id) { LOGGER.info("消息 SYS_MESSAGE id:{}",id); return sysMessageRDao.getById(id); } @Override + @ApiOperation(value = "系统消息复杂查询,分页,排序") public ListPager querySysMessageByPager(SysMessage sysMessage, Pager pager) { LOGGER.info("消息 SYS_MESSAGE SysMessage:{},Pager:{}",sysMessage,pager); if(sysMessage == null) { @@ -97,6 +104,7 @@ public class SysMessageService implements ISysMessageService { // } @Override + @ApiOperation(value = "批量删除消息") public void deleteSysMessageByIds(Long[] ids) { LOGGER.info("消息 SYS_MESSAGE ids:{}", ids.toString()); sysMessageRDao.deleteByIds(ids); @@ -112,11 +120,13 @@ public class SysMessageService implements ISysMessageService { // } @Override + @ApiOperation(value = "添加用户消息关系") public SysRefUserMessage insertSysRefUserMessage(SysRefUserMessage refUserMessage) { return refUserMessageRDao.insert(refUserMessage); } @Override + @ApiOperation(value = "添加消息并发送") public void sendSysMessage(SysMessage sysMessage) { // 判断消息类型推送到对应的队列 if(ImppEnumUtil.MESSAGE_TYPE.MAIL.getValue() == sysMessage.getMessageType().intValue()){ @@ -125,4 +135,24 @@ public class SysMessageService implements ISysMessageService { rabbitTemplate.convertAndSend(I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE,sysMessage); } } + + @Override + @ApiOperation(value = "分页查询用户消息表") + public ListPager querySysRefUserMessageByPager(SysRefUserMessage sysRefUserMessage, Pager pager) { + if(sysRefUserMessage == null) { + pager = PagerHelper.getPager(pager, sysMessageRDao.listCount()); + return new ListPager(refUserMessageRDao.listPager(pager),pager); + }else { + String hqlPack = CoreHqlPack.packHqlSysRefUserMessage(sysRefUserMessage); + pager = PagerHelper.getPager(pager, sysMessageRDao.findByHqlWhereCount(hqlPack)); + return new ListPager(sysMessageRDao.findByHqlWherePage(hqlPack + sysRefUserMessage.orderBy(),pager),pager); + } + } + + @Override + @ApiOperation(value = "根据用户id和消息状态和查询用户消息表") + public List findSysRefUserMessageByUserIdAndStatus(Long userId, Integer status) { + return refUserMessageRDao.findByProperty(new String[]{"receiverId","messageStatus","messageTypeRdd"}, + new Object[]{userId,status,ImppEnumUtil.MESSAGE_TYPE.LETTER.getValue()}); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java index 1d7c5ec..a5eed4d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService; +import cn.estsh.i3plus.core.apiservice.util.OrderNoMakeUtil; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; @@ -82,8 +83,33 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { } @Override - public SysOrderNoRule getSysOrderNoRuleCode(String code) { - return sysOrderNoRuleRDao.getByProperty("code",code); + public synchronized SysOrderNoRule getSysOrderNoRuleCode(String code) { + SysOrderNoRule sysOrderNoRule = sysOrderNoRuleRDao.getByProperty("orderNoRuleCode",code); + + if (sysOrderNoRule == null) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail("规则代码不存在存在") + .setErrorSolution("请重新输入规则代码") + .build(); + }else if(sysOrderNoRule.getOrderNoRuleStatus() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("单号规则已禁用") + .setErrorSolution("请重新输入规则代码") + .build(); + }else { + sysOrderNoRule = OrderNoMakeUtil.next(sysOrderNoRule); + sysOrderNoRuleRDao.update(sysOrderNoRule); + return sysOrderNoRule; + } + } + + @Override + public void updateSysOrderNoRuleCodeStatusById(Long id, Integer status) { + sysOrderNoRuleRDao.updateByProperties("id",id,"orderNoRuleStatus",status); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java index ebda193..ba90f91 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java @@ -30,21 +30,21 @@ public class OrderNoMakeUtil { // 流水号长度补全 String serialNumberFormatStr = MessageFormat.format(PlatformConstWords.SERIAL_NO_FORMAT, orderNoRule.getSerialNoLength()); - if (orderNoRule.getLastMakeSerialNo() > 0) { - int serialNo = orderNoRule.getLastMakeSerialNo() + orderNoRule.getSerialNoIncrement(); + if (orderNoRule.getSerialNo() > 0) { + Long serialNo = orderNoRule.getSerialNo() + orderNoRule.getSerialNoIncrement(); // 达到最大值后循环或继续 if(orderNoRule.getSerialNoLength().intValue() < String.valueOf(serialNo).length() && orderNoRule.getIsCycle() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()){ - orderNoRule.setLastMakeSerialNo(orderNoRule.getSerialNoSeed()); + orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed()); } else { - orderNoRule.setLastMakeSerialNo(orderNoRule.getLastMakeSerialNo() + orderNoRule.getSerialNoIncrement()); + orderNoRule.setSerialNo(orderNoRule.getSerialNo() + orderNoRule.getSerialNoIncrement()); } } else { - orderNoRule.setLastMakeSerialNo(orderNoRule.getSerialNoSeed()); + orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed()); } - replace(orderNo, PlatformConstWords.SERIAL_NO, String.format(serialNumberFormatStr, orderNoRule.getLastMakeSerialNo())); + replace(orderNo, PlatformConstWords.SERIAL_NO, String.format(serialNumberFormatStr, orderNoRule.getSerialNo())); - orderNoRule.setLastMakeOrderNo(orderNo.toString()); + orderNoRule.setOrderNo(orderNo.toString()); return orderNoRule; } diff --git a/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java b/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java index 2195fc7..e592865 100644 --- a/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java +++ b/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java @@ -14,14 +14,14 @@ import org.junit.Test; public class TestOrderNoMakeUtil extends TestBase { @Test - public void TestMakeOrderNO() { + public void TestMakeOrderNo() { SysOrderNoRule sysOrderNoRule = new SysOrderNoRule(); sysOrderNoRule.setName("一号单据"); sysOrderNoRule.setOrderNoRule("GG-{yyyy}{MM}{dd}{serialNo}"); - sysOrderNoRule.setSerialNoSeed(1); - sysOrderNoRule.setSerialNoIncrement(1); - sysOrderNoRule.setSerialNoLength(4); - sysOrderNoRule.setLastMakeSerialNo(9999); + sysOrderNoRule.setSerialNoSeed(1L); + sysOrderNoRule.setSerialNoIncrement(1L); + sysOrderNoRule.setSerialNoLength(4L); + sysOrderNoRule.setSerialNo(9999L); sysOrderNoRule.setIsCycle(1); System.out.println(OrderNoMakeUtil.next(sysOrderNoRule)); From da1c50f9a07bea5112db52069fbb81380818bf5e Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Sat, 24 Nov 2018 17:42:42 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=B6=88=E6=81=AF=20we?= =?UTF-8?q?bsocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/busi/ISysMessageService.java | 39 +++--- .../controller/busi/SysMessageController.java | 143 ++++++++++++++------- .../core/apiservice/mq/LetterQueueReceiver.java | 7 +- .../core/apiservice/mq/MailQueueReceiver.java | 3 +- .../serviceimpl/busi/SysMessageService.java | 67 ++++++---- .../core/apiservice/websocket/DemoWebSocket.java | 6 +- .../apiservice/websocket/MessageWebSocket.java | 107 +++++++++++++++ 7 files changed, 278 insertions(+), 94 deletions(-) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java index e54355c..e9d7384 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysMessageService.java @@ -62,13 +62,6 @@ public interface ISysMessageService { @ApiOperation(value = "系统消息复杂查询,分页,排序") ListPager querySysMessageByPager(SysMessage sysMessage, Pager pager); -// /** -// * 根据id修改消息状态 -// * @param id -// * @param status -// */ -// void updateSysMessageStatusById(String id,Integer status); - /** * 批量删除系统消息 * @param ids @@ -76,13 +69,6 @@ public interface ISysMessageService { @ApiOperation(value = "批量删除消息") void deleteSysMessageByIds(Long[] ids); -// /** -// * 批量修改消息状态 -// * @param ids -// * @param status -// */ -// void updateSysMessageStatusByIds(String[] ids,Integer status); - /** * 添加用户消息关系 * @param refUserMessage @@ -111,6 +97,29 @@ public interface ISysMessageService { * @param status * @return */ - @ApiOperation(value = "根据用户id和消息状态和查询用户消息表") + @ApiOperation(value = "根据用户id和消息状态和查询用户消息") List findSysRefUserMessageByUserIdAndStatus(Long userId,Integer status); + + /** + * 根据id查询用户消息 + * @param id + * @return + */ + @ApiOperation(value = "根据id查询用户消息") + SysMessage getSysMessageByRefUserMessageId(Long id); + + /** + * 批量修改用户消息状态 + * @param ids + * @param status + */ + @ApiOperation(value = "根据id查询用户消息") + void updateSysRefUserMessageStatusByIds(Long[] ids,Integer status); + + /** + * 批量删除用户消息 + * @param ids + */ + @ApiOperation(value = "批量删除用户消息") + void deleteSysRefUserMessageStatusByIds(Long[] ids); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java index f241513..5cb9c11 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java @@ -114,7 +114,7 @@ public class SysMessageController extends CoreBaseController { @GetMapping(value = "/sys-message/list") @ApiOperation(value = "查询全部消息",notes = "查询全部消息") - public ResultBean findSysConfigAll(){ + public ResultBean findSysMessageAll(){ try { List sysMessageList = sysMessageService.listSysMessage(); return ResultBean.success("查询成功").setResultList(sysMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); @@ -127,9 +127,9 @@ public class SysMessageController extends CoreBaseController { @GetMapping(value = "/sys-message/get/{id}") @ApiOperation(value = "根据id查询消息",notes = "根据id查询消息") - public ResultBean getSysConfigById(String id){ + public ResultBean getSysMessageById(@PathVariable("id") String idStr){ try { - SysMessage sysMessageList = sysMessageService.getSysMessageById(Long.parseLong(id)); + SysMessage sysMessageList = sysMessageService.getSysMessageById(Long.parseLong(idStr)); if (sysMessageList != null) { return ResultBean.success("查询成功").setResultObject(sysMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }else { @@ -155,24 +155,6 @@ public class SysMessageController extends CoreBaseController { } } -// @PutMapping("/status") -// public ResultBean updateSysMessageStatusById(String id,Integer status){ -// try { -// // 条件校验 -// ValidatorBean.checkNotNull(id,"id不能为空"); -// ValidatorBean.checkNotZero(status,"修改状态值不能为空"); -// -// sysMessageService.updateSysMessageStatusById(id,status); -// return ResultBean.success("修改成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); -// }catch(ImppBusiException busExcep){ -// LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); -// return ResultBean.fail(busExcep.getErrorShow()); -// }catch(Exception e){ -// LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); -// return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); -// } -// } - @DeleteMapping("/sys-message/batch-delete") @ApiOperation(value = "批量删除消息",notes = "批量删除消息") public ResultBean deleteSysMessageByIds(String[] ids){ @@ -195,35 +177,14 @@ public class SysMessageController extends CoreBaseController { } } -// @PutMapping("/batch-status") -// @ApiOperation(value = "批量切换消息状态",notes = "批量切换消息状态") -// public ResultBean updateSysMessageStatusByIds(String[] ids,Integer status){ -// try{ -// // 条件判断 -// ValidatorBean.checkNotZero(status,"状态不能为空"); -// ids = ConvertBean.modelSafeArrayNumber(ids,true); -// if(ids.length == 0){ -// throw ImppExceptionBuilder.newInstance() -// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) -// .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) -// .setErrorDetail("请选择需要操作的资源。") -// .build(); -// } -// sysMessageService.updateSysMessageStatusByIds(ids,status); -// return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); -// }catch(ImppBusiException busExcep){ -// LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); -// return ResultBean.fail(busExcep.getErrorShow()); -// }catch(Exception e){ -// LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); -// return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); -// } -// } - - @GetMapping(value = "/user-message/query") - @ApiOperation(value = "用户消息复杂查询,分页,排序") - public ResultBean querySysRefUserMessageByPager(SysRefUserMessage sysRefUserMessage,Pager pager){ + @GetMapping(value = "/user-message/query-inbox") + @ApiOperation(value = "查询用户收件箱,分页,排序") + public ResultBean queryInboxByPager(SysRefUserMessage sysRefUserMessage,Pager pager){ try { + // 设置消息类型为站内信 + sysRefUserMessage.setMessageTypeRdd(ImppEnumUtil.MESSAGE_TYPE.LETTER.getValue()); + sysRefUserMessage.setReceiverId(getSessionUser().getUser().getId()); + ListPager userMessageList = sysMessageService.querySysRefUserMessageByPager(sysRefUserMessage,pager); return ResultBean.success("查询成功").setListPager(userMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ @@ -233,6 +194,22 @@ public class SysMessageController extends CoreBaseController { } } + @GetMapping(value = "/user-message/query-outbox") + @ApiOperation(value = "查询用户发件箱,分页,排序") + public ResultBean querySysRefUserMessageByPager(SysMessage sysMessage,Pager pager){ + try { + // 发件人为当前用户 + sysMessage.setMessageSenderId(getSessionUser().getUser().getId()); + + ListPager sysMessageListPager = sysMessageService.querySysMessageByPager(sysMessage,pager); + return ResultBean.success("查询成功").setListPager(sysMessageListPager).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + @GetMapping(value = "/user-message/find-unread") @ApiOperation(value = "查看用户未读站内信") public ResultBean findUnreadUserMessage(){ @@ -246,4 +223,72 @@ public class SysMessageController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @GetMapping(value = "/user-message/get/{id}") + @ApiOperation(value = "根据id查询消息",notes = "根据id查询消息") + public ResultBean getUserMessageById(@PathVariable("id") String idStr){ + try { + ValidatorBean.checkNotNull(idStr,"id"); + + SysMessage userMessage =sysMessageService.getSysMessageByRefUserMessageId(Long.parseLong(idStr)); + if (userMessage != null) { + return ResultBean.success("查询成功").setResultObject(userMessage).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }else { + return ResultBean.fail("数据不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); + } + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @PutMapping("/user-message/batch-status") + @ApiOperation(value = "批量切换消息状态",notes = "批量切换消息状态") + public ResultBean updateSysMessageStatusByIds(String[] ids,Integer status){ + try{ + // 条件判断 + ValidatorBean.checkNotZero(status,"状态不能为空"); + ids = ConvertBean.modelSafeArrayNumber(ids,true); + if(ids.length == 0){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) + .setErrorDetail("请选择需要操作的资源。") + .build(); + } + sysMessageService.updateSysRefUserMessageStatusByIds(StringTool.getArrayLong(ids),status); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @DeleteMapping(value = "/user-message/delete-inbox/{id}") + @ApiOperation(value = "根据id删除用户消息") + public ResultBean deleteUserMessageById(@PathVariable("id") String idStr){ + try { + sysMessageService.deleteSysRefUserMessageStatusByIds(new Long[]{Long.parseLong(idStr)}); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + @DeleteMapping(value = "/user-message/batch-delete-inbox") + @ApiOperation(value = "根据id批量删除用户消息") + public ResultBean deleteUserMessageByIds(String[] idsStr){ + try { + sysMessageService.deleteSysRefUserMessageStatusByIds(StringTool.getArrayLong(idsStr)); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep.getErrorShow()); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java index cc3f458..9a26a90 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java @@ -2,6 +2,7 @@ package cn.estsh.i3plus.core.apiservice.mq; import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; +import cn.estsh.i3plus.core.apiservice.websocket.MessageWebSocket; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; @@ -12,6 +13,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -40,7 +42,7 @@ public class LetterQueueReceiver { * @param message * 发送:rabbitTemplate.convertAndSend(I3CoreQueueConfig.IMPP_MESSAGE_QUEUE, new SysMessage(....)); */ - //@RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE) + @RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE) public void processImppMessage(SysMessage msg, Channel channel, Message message) { try { LOGGER.info("【MQ-IMPP_MESSAGE_LETTER_QUEUE】数据接收成功:{}",msg); @@ -69,11 +71,14 @@ public class LetterQueueReceiver { refUserMessage.setReceiverTime(TimeTool.getNowTime(true)); sysMessageService.insertSysRefUserMessage(refUserMessage); + + MessageWebSocket.getWebSocketSet().get(sysUser.getId()).sendMessage(); } msg.setMessageSenderNameRdd(StringUtils.join(receiverName, ",")); sysMessageService.updateSysMessage(msg); + //信息已处理 channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); } catch (IOException e) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java index 2ffdd49..8a868b4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MailQueueReceiver.java @@ -13,6 +13,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -41,7 +42,7 @@ public class MailQueueReceiver { * @param channel * @param message */ - //@RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_MAIL_QUEUE) + @RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_MAIL_QUEUE) public void processImppMail(SysMessage msg, Channel channel, Message message) { try { LOGGER.info("【MQ-IMPP_MESSAGE_MAIL_QUEUE】数据接收成功:{}",msg);msg = sysMessageService.insertSysMessage(msg); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java index 7a8ed6e..3646dea 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysMessageService.java @@ -2,16 +2,21 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; import cn.estsh.i3plus.core.apiservice.mq.I3CoreQueueConfig; +import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.HqlPack; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; import cn.estsh.i3plus.pojo.platform.repository.SysMessageRepository; import cn.estsh.i3plus.pojo.platform.repository.SysRefUserMessageRepository; import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; +import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; +import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +42,7 @@ public class SysMessageService implements ISysMessageService { private SysMessageRepository sysMessageRDao; @Autowired - private SysRefUserMessageRepository refUserMessageRDao; + private SysRefUserMessageRepository sysRefUserMessageRDao; @Autowired private SysUserRepository sysUserRDao; @@ -58,7 +63,7 @@ public class SysMessageService implements ISysMessageService { @ApiOperation(value = "删除消息") public void deleteSysMessageById(Long id) { LOGGER.info("消息 SYS_MESSAGE id:{}",id); - refUserMessageRDao.deleteByProperty("messageId",id); + sysRefUserMessageRDao.deleteByProperty("messageId",id); sysMessageRDao.deleteById(id); } @@ -97,12 +102,6 @@ public class SysMessageService implements ISysMessageService { } } -// @Override -// public void updateSysMessageStatusById(String id, Integer status) { -// LOGGER.info("消息 SYS_MESSAGE id:{},status:{}",id,status); -// sysMessageRDao.updateByProperties("id",Long.parseLong(id),"messageStatusId", status); -// } - @Override @ApiOperation(value = "批量删除消息") public void deleteSysMessageByIds(Long[] ids) { @@ -110,19 +109,10 @@ public class SysMessageService implements ISysMessageService { sysMessageRDao.deleteByIds(ids); } -// @Override -// public void updateSysMessageStatusByIds(String[] ids,Integer status) { -// LOGGER.info("消息 SYS_MESSAGE ids:{},status:{}",ids,status); -// StringBuffer where = new StringBuffer(); -// HqlPack.getInPack(String.join(",", ids), "id", where); -// -// sysMessageRDao.updateByHqlWhere(where.toString(), "messageStatusId", status); -// } - @Override @ApiOperation(value = "添加用户消息关系") public SysRefUserMessage insertSysRefUserMessage(SysRefUserMessage refUserMessage) { - return refUserMessageRDao.insert(refUserMessage); + return sysRefUserMessageRDao.insert(refUserMessage); } @Override @@ -140,19 +130,48 @@ public class SysMessageService implements ISysMessageService { @ApiOperation(value = "分页查询用户消息表") public ListPager querySysRefUserMessageByPager(SysRefUserMessage sysRefUserMessage, Pager pager) { if(sysRefUserMessage == null) { - pager = PagerHelper.getPager(pager, sysMessageRDao.listCount()); - return new ListPager(refUserMessageRDao.listPager(pager),pager); + pager = PagerHelper.getPager(pager, sysRefUserMessageRDao.listCount()); + return new ListPager(sysRefUserMessageRDao.listPager(pager),pager); }else { String hqlPack = CoreHqlPack.packHqlSysRefUserMessage(sysRefUserMessage); - pager = PagerHelper.getPager(pager, sysMessageRDao.findByHqlWhereCount(hqlPack)); - return new ListPager(sysMessageRDao.findByHqlWherePage(hqlPack + sysRefUserMessage.orderBy(),pager),pager); + pager = PagerHelper.getPager(pager, sysRefUserMessageRDao.findByHqlWhereCount(hqlPack)); + return new ListPager(sysRefUserMessageRDao.findByHqlWherePage(hqlPack + sysRefUserMessage.orderBy(),pager),pager); } } @Override @ApiOperation(value = "根据用户id和消息状态和查询用户消息表") public List findSysRefUserMessageByUserIdAndStatus(Long userId, Integer status) { - return refUserMessageRDao.findByProperty(new String[]{"receiverId","messageStatus","messageTypeRdd"}, - new Object[]{userId,status,ImppEnumUtil.MESSAGE_TYPE.LETTER.getValue()}); + return sysRefUserMessageRDao.findByProperty(new String[]{"receiverId","messageStatus","messageTypeRdd"}, + new Object[]{userId,status,ImppEnumUtil.MESSAGE_TYPE.LETTER.getValue()}); + } + + @Override + @ApiOperation(value = "根据id查询用户消息") + public SysMessage getSysMessageByRefUserMessageId(Long id) { + SysRefUserMessage sysRefUserMessage = sysRefUserMessageRDao.getById(id); + if (sysRefUserMessage == null){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail("数据不存在") + .build(); + } + sysRefUserMessage.setMessageStatus(ImppEnumUtil.MESSAGE_STATUS.READ.getValue()); + sysRefUserMessageRDao.update(sysRefUserMessage); + + return sysMessageRDao.getById(sysRefUserMessage.getMessageId()); + } + + @Override + public void updateSysRefUserMessageStatusByIds(Long[] ids, Integer status) { + StringBuffer where = new StringBuffer(); + HqlPack.getInPack(String.join(",", StringTool.getArrayString(ids)), "id", where); + sysRefUserMessageRDao.updateByHqlWhere(where.toString(), "messageStatus", status); + } + + @Override + public void deleteSysRefUserMessageStatusByIds(Long[] ids) { + sysRefUserMessageRDao.deleteByIds(ids); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java index a342b37..786bd9d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java @@ -4,10 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import javax.websocket.OnClose; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; +import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; @@ -79,6 +76,7 @@ public class DemoWebSocket { * 发生错误时调用 * @OnError */ + @OnError public void onError(Session session, Throwable error) { LOGGER.info("发生错误"); error.printStackTrace(); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java new file mode 100644 index 0000000..a438074 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java @@ -0,0 +1,107 @@ +package cn.estsh.i3plus.core.apiservice.websocket; + +import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; +import com.alibaba.fastjson.JSON; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @Description : 消息 + * @Reference : + * @Author : yunhao + * @CreateDate : 2018-11-24 16:57 + * @Modify: + **/ +@ServerEndpoint(value="/message-websocket/{userId}") +@Component +public class MessageWebSocket { + + private static final Logger LOGGER = LoggerFactory.getLogger(MessageWebSocket.class); + + private Long userId = 1L; + + //在线连接数 + private static int onlineCount = 0; + + //concurrent线程安全集合,存放客户端websocket对象 + private static ConcurrentMap webSocketSet = new ConcurrentHashMap(); + + //websocket会话 + private Session session; + + public static ConcurrentMap getWebSocketSet() { + return webSocketSet; + } + + @Autowired + private ISysMessageService sysMessageService; + + + @OnOpen + public void onOpen(@PathParam("userId")Long userId, Session session){ + this.session = session; + this.userId = userId; + + webSocketSet.put(userId,this); //加入set中 + addOnlineCount(); //在线数加1 + LOGGER.info("{}加入!当前在线人数为{}",userId,getOnlineCount()); + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose() { + webSocketSet.remove(this.userId); //从set中删除 + subOnlineCount(); //在线数减1 + LOGGER.info("有一连接关闭!当前在线人数为" + getOnlineCount()); + } + + /** + * 收到客户端消息后调用的方法 + * + * @param message 客户端发送过来的消息*/ + @OnMessage + public void onMessage(String message, Session session) { + LOGGER.info("来自客户端的消息:" + message); + } + + /** + * 发生错误时调用 + * @OnError + */ + @OnError + public void onError(Session session, Throwable error) { + LOGGER.info("发生错误"); + error.printStackTrace(); + } + + public void sendMessage() throws IOException { + List userMessageList = sysMessageService.findSysRefUserMessageByUserIdAndStatus(this.userId, + ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); + this.session.getBasicRemote().sendText(JSON.toJSONString(userMessageList)); + } + + public static synchronized int getOnlineCount() { + return onlineCount; + } + + public static synchronized void addOnlineCount() { + MessageWebSocket.onlineCount++; + } + + public static synchronized void subOnlineCount() { + MessageWebSocket.onlineCount--; + } +} From 17569779582c3185a4472a51163578051726d1f9 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Sat, 24 Nov 2018 17:50:42 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=B6=88=E6=81=AF=20we?= =?UTF-8?q?bsocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i3plus/core/apiservice/controller/busi/SysConfigController.java | 2 +- .../java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java index 403ed0a..c06b38d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java @@ -215,7 +215,7 @@ public class SysConfigController extends CoreBaseController { mailUtil.init(); mailUtil.setSubject("测试邮件"); - mailUtil.setContentType(ImppEnumUtil.MESSAGE_CONTENT_TYPE.HTML.getDescription()); + mailUtil.setContentType(ImppEnumUtil.MESSAGE_TYPE_CONTENT.HTML.getDescription()); mailUtil.setBody("测试邮件"); mailUtil.setTo(to); mailUtil.send(); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java index 9a26a90..adbd949 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java @@ -42,7 +42,7 @@ public class LetterQueueReceiver { * @param message * 发送:rabbitTemplate.convertAndSend(I3CoreQueueConfig.IMPP_MESSAGE_QUEUE, new SysMessage(....)); */ - @RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE) +// @RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE) public void processImppMessage(SysMessage msg, Channel channel, Message message) { try { LOGGER.info("【MQ-IMPP_MESSAGE_LETTER_QUEUE】数据接收成功:{}",msg); From dbcaf5221eaca93eab44a7817601dbff72b7c737 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Mon, 26 Nov 2018 09:59:59 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=AF=86=E7=A0=81=E6=89=BE=E5=9B=9E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/controller/base/AuthController.java | 4 +- .../controller/busi/SysLogExceptionController.java | 22 ++--- .../controller/busi/SysUserController.java | 95 +++++++++++++++++++++- 3 files changed, 107 insertions(+), 14 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java index 972af9b..325944f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java @@ -68,9 +68,9 @@ public class AuthController extends CoreBaseController { result.setUrl("/"); return result; }catch (AuthenticationException e) { - return new ResultBean(false,e.getMessage()); + return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); }catch (ImppBusiException e) { - return ResultBean.fail(e); + return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); }catch (Exception e){ return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java index d1bb494..7f866e1 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogExceptionController.java @@ -34,16 +34,16 @@ public class SysLogExceptionController { @Autowired private ISysLogExceptionService sysLogExceptionService; - @GetMapping(value = "/query") - @ApiOperation(value = "异常日志复杂查询,分页,排序",notes = "异常日志复杂查询,分页,排序") - public ResultBean querySysLogOperateByPager(SysLogException sysLogException, Pager pager){ - try { - ListPager logExceptionList = sysLogExceptionService.querySysLogExceptionByPager(sysLogException, pager); - return ResultBean.success("查询成功").setListPager(logExceptionList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); - }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep); - }catch(Exception e){ - return ImppExceptionBuilder.newInstance().buildExceptionResult(e); - } + @GetMapping(value = "/query") + @ApiOperation(value = "异常日志复杂查询,分页,排序",notes = "异常日志复杂查询,分页,排序") + public ResultBean querySysLogOperateByPager(SysLogException sysLogException, Pager pager){ + try { + ListPager logExceptionList = sysLogExceptionService.querySysLogExceptionByPager(sysLogException, pager); + return ResultBean.success("查询成功").setListPager(logExceptionList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }catch(ImppBusiException busExcep){ + return ResultBean.fail(busExcep); + }catch(Exception e){ + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index eb6915d..d5f2815 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.EncryptTool; import cn.estsh.i3plus.platform.common.tool.StringTool; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; @@ -17,16 +18,19 @@ import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum; +import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.apache.commons.lang3.RandomStringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.List; /** @@ -43,6 +47,9 @@ public class SysUserController extends CoreBaseController{ public static final Logger LOGGER = LoggerFactory.getLogger(SysUserController.class); + @Resource(name="redisCore") + private ImppRedis redisCore; + @Autowired private ISysUserService sysUserService; @@ -337,7 +344,7 @@ public class SysUserController extends CoreBaseController{ } } - @DeleteMapping("/reset-pwd/{id}") + @PostMapping("/reset-pwd/{id}") @ApiOperation(value = "密码重置",notes = "根据id重置用户密码") public ResultBean updateResetPassword(@PathVariable String id){ try { @@ -380,4 +387,90 @@ public class SysUserController extends CoreBaseController{ } } + @GetMapping("/verification/get-email") + @ApiOperation(value = "发送验证码",notes = "发送邮件验证码") + public ResultBean getEmailVerification(String email){ + try { + + SysUser user = sysUserService.getSysUserByEmail(email); + if(user != null){ + String verification = RandomStringUtils.random(6, true, false); + + String redisKey = CommonConstWords.SESSION_VERIFICATION_USER_EMAIL + "_" + getSessionUser().getUserId(); + redisCore.putObject(redisKey, verification + "-" + email, 180); + + String content = "系统提示:\n" + + "\t密码找回验证码:【"+verification+"】"; + + SysMessage message = new SysMessage(); + message.setMessageTitle("验证码"); + message.setMessageContent(content); + message.setMessageType(ImppEnumUtil.MESSAGE_TYPE.MAIL.getValue()); + message.setMessageContentType(ImppEnumUtil.MESSAGE_TYPE_CONTENT.TEXT.getValue()); + message.setMessageSenderId(getSessionUser().getUser().getId()); + message.setMessageSenderNameRdd(getSessionUser().getUserName()); + message.setMessageReceiversId(user.getId().toString()); + message.setMessageReceiversNameRdd(user.getUserName()); + + sysMessageService.doSendSysMessage(message); + + LOGGER.info("系统提示:\t 密码找回验证码【{}】",verification); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }else{ + return ResultBean.success("操作失败") + .setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()) + .setErrorMsg("用户不存在"); + } + } catch (ImppBusiException busExcep) { + LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); + return ResultBean.fail(busExcep); + } catch (Exception e) { + LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}", e.getMessage(), e); + return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + } + } + + + @PostMapping("/password/update-verification") + @ApiOperation(value = "修改密码",notes = "通过邮箱的验证码修改密码") + public ResultBean getEmailVerification(String password,String email,String verification){ + try { + ValidatorBean.checkNotNull(verification,"验证码不能为空"); + ValidatorBean.checkNotNull(password,"新密码不能为空"); + ValidatorBean.checkNotNull(email,"邮件不能为空"); + + String redisKey = CommonConstWords.SESSION_VERIFICATION_USER_EMAIL + "_" + getSessionUser().getUserId(); + Object redisValue = redisCore.getObject(redisKey); + if(redisValue != null){ + if(redisValue.toString().indexOf(verification) >= 0 ){ + if(redisValue.toString().indexOf(email) >= 0 ){ + SysUser user = sysUserService.getSysUserByEmail(email); + user.setUserLoginPassword(EncryptTool.hexMD5(password)); + sysUserService.updateSysUser(user); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }else { + return ResultBean.success("操作失败") + .setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()) + .setErrorMsg("请勿修改邮箱信息"); + } + }else { + return ResultBean.success("操作失败") + .setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()) + .setErrorMsg("验证码错误请重新输入"); + } + }else { + return ResultBean.success("操作失败") + .setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()) + .setErrorMsg("验证码已过期"); + } + } catch (ImppBusiException busExcep) { + LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); + return ResultBean.fail(busExcep); + } catch (Exception e) { + LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}", e.getMessage(), e); + return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + } + } + + } From cb95f7680491db21ec8073961d75657a858f9f86 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Tue, 27 Nov 2018 19:19:35 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i3plus/core/apiservice/controller/base/AuthController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java index 325944f..94de08a 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java @@ -68,9 +68,11 @@ public class AuthController extends CoreBaseController { result.setUrl("/"); return result; }catch (AuthenticationException e) { - return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + ResultBean result = ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + result.setErrorMsg(e.getMessage()); + return result; }catch (ImppBusiException e) { - return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + return ResultBean.fail(e); }catch (Exception e){ return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); } From 3a46256ff0b4ef2fa5382b655567779d8ee48f90 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Tue, 27 Nov 2018 19:26:21 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=20we?= =?UTF-8?q?bsocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/busi/SysConfigController.java | 2 +- .../controller/busi/SysMessageController.java | 2 +- .../core/apiservice/mq/LetterQueueReceiver.java | 13 +++- .../core/apiservice/websocket/DemoWebSocket.java | 10 +-- .../apiservice/websocket/MessageWebSocket.java | 76 ++++++++++------------ 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java index c06b38d..f0ce24b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysConfigController.java @@ -221,7 +221,7 @@ public class SysConfigController extends CoreBaseController { mailUtil.send(); return ResultBean.success("测试邮件已发送").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java index 9493504..3c6ee64 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java @@ -214,7 +214,7 @@ public class SysMessageController extends CoreBaseController { @ApiOperation(value = "查看用户未读站内信") public ResultBean findUnreadUserMessage(){ try { - List userMessageList = sysMessageService.findSysRefUserMessageByUserIdAndStatus(getSessionUser().getUser().getId(), + List userMessageList = sysMessageService.findSysRefUserMessageByUserIdAndStatus(getSessionUser().getUserInfo().getId(), ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); return ResultBean.success("查询成功").setResultList(userMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java index adbd949..da8aab6 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/LetterQueueReceiver.java @@ -8,6 +8,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SysMessage; import cn.estsh.i3plus.pojo.platform.bean.SysRefUserMessage; import cn.estsh.i3plus.pojo.platform.bean.SysUser; +import com.alibaba.fastjson.JSON; import com.rabbitmq.client.Channel; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -18,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.IOException; +import java.util.List; /** * @Description : 站内信队列处理 @@ -42,7 +44,7 @@ public class LetterQueueReceiver { * @param message * 发送:rabbitTemplate.convertAndSend(I3CoreQueueConfig.IMPP_MESSAGE_QUEUE, new SysMessage(....)); */ -// @RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE) + @RabbitListener(queues = I3CoreQueueConfig.IMPP_MESSAGE_LETTER_QUEUE) public void processImppMessage(SysMessage msg, Channel channel, Message message) { try { LOGGER.info("【MQ-IMPP_MESSAGE_LETTER_QUEUE】数据接收成功:{}",msg); @@ -55,6 +57,7 @@ public class LetterQueueReceiver { SysRefUserMessage refUserMessage; SysUser sysUser; + List userMessage; for (int i = 0; i < messageReceiver.length; i++) { sysUser = sysUserService.getSysUserById(Long.parseLong(messageReceiver[i])); @@ -65,14 +68,18 @@ public class LetterQueueReceiver { refUserMessage.setMessageTitleRdd(msg.getMessageTitle()); refUserMessage.setMessageTypeRdd(msg.getMessageType()); refUserMessage.setMessageSenderNameRdd(msg.getMessageSenderNameRdd()); - refUserMessage.setReceiverId(sysUser.getId()); + refUserMessage.setReceiverId(sysUser.getUserInfoId()); refUserMessage.setReceiverNameRdd(sysUser.getUserName()); refUserMessage.setMessageStatus(ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); refUserMessage.setReceiverTime(TimeTool.getNowTime(true)); sysMessageService.insertSysRefUserMessage(refUserMessage); - MessageWebSocket.getWebSocketSet().get(sysUser.getId()).sendMessage(); + userMessage = sysMessageService.findSysRefUserMessageByUserIdAndStatus(sysUser.getUserInfoId(), + ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); + MessageWebSocket.sendMessage(sysUser.getUserInfoId(), + JSON.toJSONString(userMessage) + ); } msg.setMessageSenderNameRdd(StringUtils.join(receiverName, ",")); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java index 786bd9d..1e67d14 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/DemoWebSocket.java @@ -26,7 +26,7 @@ public class DemoWebSocket { private static int onlineCount = 0; //concurrent线程安全集合,存放客户端websocket对象 - private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet(); + private static CopyOnWriteArraySet webSocketMap = new CopyOnWriteArraySet(); //websocket会话 private Session session; @@ -34,7 +34,7 @@ public class DemoWebSocket { @OnOpen public void onOpen(@PathParam("userName")String userName, Session session){ this.session = session; - webSocketSet.add(this); //加入set中 + webSocketMap.add(this); //加入set中 addOnlineCount(); //在线数加1 LOGGER.info("{}加入!当前在线人数为{}",userName,getOnlineCount()); try { @@ -49,7 +49,7 @@ public class DemoWebSocket { */ @OnClose public void onClose() { - webSocketSet.remove(this); //从set中删除 + webSocketMap.remove(this); //从set中删除 subOnlineCount(); //在线数减1 LOGGER.info("有一连接关闭!当前在线人数为" + getOnlineCount()); } @@ -63,7 +63,7 @@ public class DemoWebSocket { LOGGER.info("来自客户端的消息:" + message); //群发消息 - for (DemoWebSocket item : webSocketSet) { + for (DemoWebSocket item : webSocketMap) { try { item.sendMessage(message); } catch (IOException e) { @@ -91,7 +91,7 @@ public class DemoWebSocket { * 群发自定义消息 * */ public static void sendInfo(String message) throws IOException { - for (DemoWebSocket item : webSocketSet) { + for (DemoWebSocket item : webSocketMap) { try { item.sendMessage(message); } catch (IOException e) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java index a438074..61ab42d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/websocket/MessageWebSocket.java @@ -1,18 +1,14 @@ package cn.estsh.i3plus.core.apiservice.websocket; -import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; -import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; -import com.alibaba.fastjson.JSON; +import cn.estsh.impp.framework.base.controller.CoreBaseController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; -import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -23,38 +19,25 @@ import java.util.concurrent.ConcurrentMap; * @CreateDate : 2018-11-24 16:57 * @Modify: **/ -@ServerEndpoint(value="/message-websocket/{userId}") +@ServerEndpoint(value= CoreBaseController.BASE_URL + "/message-websocket/{userId}") @Component public class MessageWebSocket { private static final Logger LOGGER = LoggerFactory.getLogger(MessageWebSocket.class); - private Long userId = 1L; - - //在线连接数 - private static int onlineCount = 0; - + private long userId = 1L; + //websocket会话 + private Session session; // 当前对象会话 + private static int sendCount = 1; //concurrent线程安全集合,存放客户端websocket对象 private static ConcurrentMap webSocketSet = new ConcurrentHashMap(); - //websocket会话 - private Session session; - - public static ConcurrentMap getWebSocketSet() { - return webSocketSet; - } - - @Autowired - private ISysMessageService sysMessageService; - - @OnOpen - public void onOpen(@PathParam("userId")Long userId, Session session){ - this.session = session; + public void onOpen(@PathParam("userId")long userId, Session session){ this.userId = userId; + this.session = session; - webSocketSet.put(userId,this); //加入set中 - addOnlineCount(); //在线数加1 + webSocketSet.put(userId,this); //在线人数添加 LOGGER.info("{}加入!当前在线人数为{}",userId,getOnlineCount()); } @@ -63,8 +46,7 @@ public class MessageWebSocket { */ @OnClose public void onClose() { - webSocketSet.remove(this.userId); //从set中删除 - subOnlineCount(); //在线数减1 + subOnlineUser(this.userId); LOGGER.info("有一连接关闭!当前在线人数为" + getOnlineCount()); } @@ -73,8 +55,13 @@ public class MessageWebSocket { * * @param message 客户端发送过来的消息*/ @OnMessage - public void onMessage(String message, Session session) { - LOGGER.info("来自客户端的消息:" + message); + public void onMessage(@PathParam("userId")Long userId,String message) { + // 心跳 + if("heartBit".equals(message)){ + this.sendMessage(userId,"heartBit"); + }else{ + LOGGER.info("来自客户端的消息:" , message); + } } /** @@ -87,21 +74,28 @@ public class MessageWebSocket { error.printStackTrace(); } - public void sendMessage() throws IOException { - List userMessageList = sysMessageService.findSysRefUserMessageByUserIdAndStatus(this.userId, - ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); - this.session.getBasicRemote().sendText(JSON.toJSONString(userMessageList)); + /** + * 发送消息 + * @param message + * @throws IOException + */ + public static void sendMessage(Long userId, String message){ + try { + MessageWebSocket websocket = webSocketSet.get(userId); + if (websocket != null){ + websocket.session.getBasicRemote().sendText(message + "=" + sendCount); + sendCount++; + } + } catch (IOException e) { + e.printStackTrace(); + } } public static synchronized int getOnlineCount() { - return onlineCount; - } - - public static synchronized void addOnlineCount() { - MessageWebSocket.onlineCount++; + return webSocketSet.size(); } - public static synchronized void subOnlineCount() { - MessageWebSocket.onlineCount--; + public synchronized void subOnlineUser(long userId) { + webSocketSet.remove(userId); } } From de29bed18d79f73183f903e07f22b40ebd3c70e6 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Wed, 28 Nov 2018 10:37:18 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/busi/SysMessageController.java | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java index 3c6ee64..1b350ed 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysMessageController.java @@ -68,7 +68,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.doSendSysMessage(sysMessage); return ResultBean.success("添加成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -84,7 +84,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.deleteSysMessageById(Long.parseLong(id)); return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -106,7 +106,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.updateSysMessage(sysMessage); return ResultBean.success("修改成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -119,7 +119,7 @@ public class SysMessageController extends CoreBaseController { List sysMessageList = sysMessageService.listSysMessage(); return ResultBean.success("查询成功").setResultList(sysMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -136,7 +136,7 @@ public class SysMessageController extends CoreBaseController { return ResultBean.fail("数据不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); } }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -149,7 +149,7 @@ public class SysMessageController extends CoreBaseController { ListPager sysMessageListPager = sysMessageService.querySysMessageByPager(sysMessage,pager); return ResultBean.success("查询成功").setListPager(sysMessageListPager).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -171,7 +171,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.deleteSysMessageByIds(StringTool.getArrayLong(ids)); return ResultBean.success("删除成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -188,7 +188,7 @@ public class SysMessageController extends CoreBaseController { ListPager userMessageList = sysMessageService.querySysRefUserMessageByPager(sysRefUserMessage,pager); return ResultBean.success("查询成功").setListPager(userMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -204,7 +204,7 @@ public class SysMessageController extends CoreBaseController { ListPager sysMessageListPager = sysMessageService.querySysMessageByPager(sysMessage,pager); return ResultBean.success("查询成功").setListPager(sysMessageListPager).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -218,7 +218,7 @@ public class SysMessageController extends CoreBaseController { ImppEnumUtil.MESSAGE_STATUS.UNREAD.getValue()); return ResultBean.success("查询成功").setResultList(userMessageList).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -237,7 +237,7 @@ public class SysMessageController extends CoreBaseController { return ResultBean.fail("数据不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); } }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -260,7 +260,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.updateSysRefUserMessageStatusByIds(StringTool.getArrayLong(ids),status); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -273,7 +273,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.deleteSysRefUserMessageStatusByIds(new Long[]{Long.parseLong(idStr)}); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } @@ -286,7 +286,7 @@ public class SysMessageController extends CoreBaseController { sysMessageService.deleteSysRefUserMessageStatusByIds(StringTool.getArrayLong(idsStr)); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ - return ResultBean.fail(busExcep.getErrorShow()); + return ResultBean.fail(busExcep); }catch(Exception e){ return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } From f31b8e659afa750ac817903c1ba247e4c1694868 Mon Sep 17 00:00:00 2001 From: "wei.peng" Date: Wed, 28 Nov 2018 16:22:25 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/controller/base/AuthController.java | 31 +++++++++++++++++++--- .../controller/busi/SysDepartmentController.java | 6 +++-- .../controller/busi/SysOrganizeController.java | 8 +++--- .../controller/busi/SysPositionController.java | 4 +-- .../serviceimpl/busi/CoreTreeService.java | 26 +++++++++++++++--- 5 files changed, 59 insertions(+), 16 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java index 94de08a..311f2c4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/AuthController.java @@ -4,8 +4,10 @@ import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; import cn.estsh.i3plus.core.api.iservice.busi.ICoreTreeService; import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; import cn.estsh.i3plus.core.apiservice.controller.DemoAuthController; +import cn.estsh.i3plus.core.apiservice.serviceimpl.busi.SysLocaleLanguageService; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import cn.estsh.i3plus.pojo.platform.bean.SysLocaleLanguage; import cn.estsh.i3plus.pojo.platform.bean.SysMenu; import cn.estsh.impp.framework.base.controller.BaseController; import cn.estsh.impp.framework.base.controller.CoreBaseController; @@ -20,9 +22,7 @@ import org.apache.shiro.authc.AuthenticationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.List; @@ -51,6 +51,9 @@ public class AuthController extends CoreBaseController { @Autowired private ICoreTreeService coreTreeService; + @Autowired + private SysLocaleLanguageService localeLanguageService; + @GetMapping(value="/login") @ApiOperation(value="登陆",notes="登陆") public ResultBean login(HttpServletRequest request, String loginName, String loginPwd, String languageCode){ @@ -88,7 +91,7 @@ public class AuthController extends CoreBaseController { LOGGER.info("用户退出..."); try { AuthUtil.logout(); - return new ResultBean(true,""); + return new ResultBean(true,"").build(); } catch (ImppBusiException e) { return new ResultBean(false,e.getErrorDetail() + ",so:" + e.getErrorSolution()); } @@ -146,4 +149,24 @@ public class AuthController extends CoreBaseController { } } + @PutMapping(value = "/update-language") + @ApiOperation(value="修改语言",notes="修改用户会话语言") + public ResultBean updateLanguage(String code){ + try { + SysLocaleLanguage language = localeLanguageService.getSysLocaleLanguageByCode(code); + if(language != null){ + AuthUtil.setSessionLanguage(language.getLanguageCode()); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + }else { + return ResultBean.fail("操作失败").setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()).setErrorMsg("语言信息不存在"); + } + }catch(ImppBusiException busExcep){ + LOGGER.error(busExcep.getErrorMsg() + ":{}",busExcep.getErrorDetail(),busExcep); + return ResultBean.fail(busExcep); + }catch(Exception e){ + LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}",e.getMessage(),e); + return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + } + } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java index 3603d7f..fbde097 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDepartmentController.java @@ -56,8 +56,9 @@ public class SysDepartmentController extends CoreBaseController { //新增初始化 ConvertBean.modelInitialize(department, user); - if(department.getParentId() == null || department.getParentId().intValue() == 0){ + if(department.getParentId() == null || department.getParentId() <= 0){ department.setParentId(CommonEnumUtil.PARENT.DEFAULT.getValue()); + department.setParentNameRdd("顶级部门"); } departmentService.insertSysDepartment(department); @@ -86,8 +87,9 @@ public class SysDepartmentController extends CoreBaseController { .checkNotZero("organizeId",department.getOrganizeId()); ConvertBean.modelUpdate(department, user); - if(department.getParentId() == null || department.getParentId().intValue() == 0){ + if(department.getParentId() == null || department.getParentId() <= 0){ department.setParentId(CommonEnumUtil.PARENT.DEFAULT.getValue()); + department.setParentNameRdd("顶级部门"); } departmentService.updateSysDepartment(department); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrganizeController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrganizeController.java index 8c80bbb..9f8c712 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrganizeController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysOrganizeController.java @@ -53,7 +53,7 @@ public class SysOrganizeController extends CoreBaseController{ //新增初始化 ConvertBean.modelInitialize(organize, AuthUtil.getSessionUser()); - if(organize.getParentId() == null || organize.getParentId().intValue() == 0){ + if(organize.getParentId() == null || organize.getParentId() == 0){ organize.setParentId(CommonEnumUtil.PARENT.DEFAULT.getValue()); } @@ -61,7 +61,7 @@ public class SysOrganizeController extends CoreBaseController{ return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(organize); } catch (ImppBusiException busExcep) { LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); - return ResultBean.fail(busExcep).build(); + return ResultBean.fail(busExcep); } catch (Exception e) { return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); } @@ -79,7 +79,7 @@ public class SysOrganizeController extends CoreBaseController{ .notNull("organizeType", organize.getOrganizeType()); ConvertBean.modelUpdate(organize, AuthUtil.getSessionUser()); - if(organize.getParentId() == null || organize.getParentId().intValue() == 0){ + if(organize.getParentId() == null || organize.getParentId() == 0){ organize.setParentId(CommonEnumUtil.PARENT.DEFAULT.getValue()); } @@ -87,7 +87,7 @@ public class SysOrganizeController extends CoreBaseController{ return ResultBean.success("修改成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); - return ResultBean.fail(busExcep).build(); + return ResultBean.fail(busExcep); } catch (Exception e) { return ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java index 7b419bf..4b675fa 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysPositionController.java @@ -54,7 +54,7 @@ public class SysPositionController extends CoreBaseController { .notNull("positionCode",position.getPositionCode()); ConvertBean.modelInitialize(position,user); - if(position.getParentId() == null || position.getParentId().intValue() == 0){ + if(position.getParentId() == null || position.getParentId() == 0){ position.setParentId(CommonEnumUtil.PARENT.DEFAULT.getValue()); } @@ -85,7 +85,7 @@ public class SysPositionController extends CoreBaseController { //修改初始化 ConvertBean.modelUpdate(position,user); - if(position.getParentId() == null || position.getParentId().intValue() == 0){ + if(position.getParentId() == null || position.getParentId() == 0){ position.setParentId(CommonEnumUtil.PARENT.DEFAULT.getValue()); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java index 0b37e2e..31c1573 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreTreeService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.core.api.iservice.busi.ICoreTreeService; import cn.estsh.i3plus.pojo.base.bean.BaseBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ModelEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.HqlPack; import cn.estsh.i3plus.pojo.model.platform.CommonTreeModel; import cn.estsh.i3plus.pojo.platform.bean.SysDepartment; import cn.estsh.i3plus.pojo.platform.bean.SysMenu; @@ -313,7 +314,11 @@ public class CoreTreeService implements ICoreTreeService { @Override public List findOrganizeDepartment(long parentId) { List result = new ArrayList<>(); - List list = organizeRDao.findByProperty("parentId", parentId); + + StringBuffer hql = new StringBuffer(); + HqlPack.getNumEqualPack(parentId,"parentId",hql); + HqlPack.getOrderByPack(new Object[]{2}, new String[]{"organizeSort"}, hql); + List list = organizeRDao.findByHqlWhere(hql.toString()); // 循环设置子集 if(list != null && list.size() > 0){ @@ -357,7 +362,11 @@ public class CoreTreeService implements ICoreTreeService { if(bean instanceof SysOrganize){ SysOrganize organize = (SysOrganize) bean; - List organizeList = organizeRDao.findByProperty("parentId", organize.getId()); + StringBuffer hql = new StringBuffer(); + HqlPack.getNumEqualPack(organize.getId(),"parentId",hql); + HqlPack.getOrderByPack(new Object[]{2}, new String[]{"organizeSort"}, hql); + List organizeList = organizeRDao.findByHqlWhere(hql.toString()); + if(organizeList != null && organizeList.size() > 0){ for (SysOrganize org : organizeList) { treeModel = new CommonTreeModel(); @@ -370,7 +379,11 @@ public class CoreTreeService implements ICoreTreeService { } } - List departmentList = departmentRDao.findByProperty("organizeId", organize.getId()); + StringBuffer depHQL = new StringBuffer(); + HqlPack.getNumEqualPack(organize.getId(),"organizeId",depHQL); + HqlPack.getOrderByPack(new Object[]{2}, new String[]{"departmentSort"}, depHQL); + List departmentList = departmentRDao.findByHqlWhere(depHQL.toString()); + if(departmentList != null && departmentList.size() > 0){ for (SysDepartment department : departmentList) { if(department.getParentId() != null && department.getParentId() < 0){ @@ -387,7 +400,12 @@ public class CoreTreeService implements ICoreTreeService { LOGGER.info("【{}】包含子集:{},步长:{}", parent.getBean().getClass().getName(), parent.getChildList().size(), step); }else if(bean instanceof SysDepartment){ SysDepartment department = (SysDepartment) bean; - List departmentList = departmentRDao.findByProperty("parentId", department.getId()); + + StringBuffer depHQL = new StringBuffer(); + HqlPack.getNumEqualPack(department.getId(),"parentId",depHQL); + HqlPack.getOrderByPack(new Object[]{2}, new String[]{"departmentSort"}, depHQL); + List departmentList = departmentRDao.findByHqlWhere(depHQL.toString()); + if(departmentList != null && departmentList.size() > 0){ for (SysDepartment dep : departmentList) { treeModel = new CommonTreeModel(); From 49940fd6a69af156e7f5a2c6fff9d7ef8fb12ab1 Mon Sep 17 00:00:00 2001 From: alwaysfrin <39822157+alwaysfrin@users.noreply.github.com> Date: Wed, 28 Nov 2018 17:21:55 +0800 Subject: [PATCH 10/10] =?UTF-8?q?spring=20gateway=E6=B7=BB=E5=8A=A0=20?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/i3plus-core-apiservice/src/main/resources/log4j2.xml | 6 +++--- pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/i3plus-core-apiservice/src/main/resources/log4j2.xml b/modules/i3plus-core-apiservice/src/main/resources/log4j2.xml index 0ab7ca1..cf4275c 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/log4j2.xml +++ b/modules/i3plus-core-apiservice/src/main/resources/log4j2.xml @@ -3,9 +3,9 @@ - [%p] %d{yyyy-MM-dd HH:mm:ss-SSS} %l:%m%n - [%p] %d{HH:mm:ss-SSS} (%c:%L)%M ==》 %m%n - [SYS-%p] %m (%F:%M:%L %d{HH:mm:ss-SSS})%n + [%p] %d{yyyy-MM-dd HH:mm:ss-SSS} %l 信息:%m%n + [%p] %d{HH:mm:ss-SSS} %c(%M:%L) 信息:%m%n + [SYS-%p] 系统:%m (%d{HH:mm:ss-SSS} %F -> %M:%L)%n diff --git a/pom.xml b/pom.xml index f9d07bc..23426f8 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ - + i3core UTF-8 UTF-8