diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java index 5615d16..381f6e5 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemInitService.java @@ -16,25 +16,25 @@ public interface ISystemInitService { * 系统初始化加载 */ @ApiOperation(value = "初始化加载所有数据",notes = "初始化加载所有数据") - void loadAll(); + void putAndLoadAll(); /** * 加载系统配置 */ @ApiOperation(value = "加载系统配置",notes = "加载系统配置") - void loadSysConfig(); + void putAndLoadSysConfig(); /** * 加载系统字典 */ @ApiOperation(value = "加载字典数据",notes = "加载字典数据") - void loadSysDictionary(); + void putAndLoadSysDictionary(); /** * 加载系统语言信息 */ @ApiOperation(value = "加载语言数据",notes = "加载语言数据") - void loadSysLocaleLanguage(); + void putAndLoadSysLocaleLanguage(); /** * 从缓存获取对象数据 diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestService.java index 9e1651f..c7fcc10 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestService.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.platform.bean.SysUser; import io.swagger.annotations.ApiOperation; +import javax.transaction.Transactional; import java.util.List; /** @@ -34,4 +35,8 @@ public interface ITestService { @ApiOperation(value = "查询用户") List listSysUser(); + + @ApiOperation(value = "读写分离测试写") + @Transactional + void write(); } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestTransService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestTransService.java index f27306b..3d652cc 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestTransService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITestTransService.java @@ -1,6 +1,11 @@ package cn.estsh.i3plus.core.api.iservice.busi; +import cn.estsh.i3plus.pojo.platform.bean.TestTransUser; import io.swagger.annotations.ApiOperation; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** * @Description : @@ -15,5 +20,106 @@ public interface ITestTransService { void testListTran(int type,String name); @ApiOperation(value = "自定义dao混用") - void testListTranSec(int type,String name); + void testTran(); + + /******************** 读写分离部分测试 **********************/ + + @ApiOperation(value = "读写分离测试读") + @Transactional + List listRead(); + + @ApiOperation(value = "读写分离测试写") + @Transactional + void write(); + + @ApiOperation(value = "读写分离测试读写-写事务") + void transReadWrite(); + + @ApiOperation(value = "读写分离测试读写-读事务") + void readWrite(); + + /******************** 事务机制部分demo **********************/ + + //@ApiOperation(value = "开始事务,执行过程中休眠seconds秒") + //void readTransTest(int seconds); + + //void testListTranSec(int type,String name); + + @ApiOperation(value = "更新对象") + void updateTestTransUser(String name, double salary); + + @ApiOperation(value = "新增对象") + void insertTestTransUser(String name,double salary); + + /** + * type == 1 按主键删除 + * type == 2 按name删除 + */ + @ApiOperation(value = "删除对象") + void deleteTestTransUser(String name); + + + + @ApiOperation(value = "第一类丢失更新") + void updateLost(String name, int time, boolean execp); + + @ApiOperation(value = "第二类丢失更新") + void updateLostTrans(String name,double salary, int time, boolean execp); + + @ApiOperation(value = "脏读模拟A") + void writeDirtyA(long id); + + @ApiOperation(value = "脏读模拟B") + void writeDirtyB(long id); + + @ApiOperation(value = "不可重复读A") + void writeRepeatA(long id); + + @ApiOperation(value = "不可重复读B") + void writeRepeatB(long id); + + @ApiOperation(value = "幻读模拟A") + void writePhantomA(long id,boolean listOrDelete); + + @ApiOperation(value = "幻读模拟B") + void writePhantomB(); + + @ApiOperation(value = "创建新事务") + void writeRequireNew(); + + @ApiOperation(value = "创建新事务-子方法") + void writeRequireNewMore(); + + @ApiOperation(value = "没有事务抛出异常") + void writeTransMandatory(); + + @ApiOperation(value = "没有事务抛出异常-子方法") + void writeTransMandatoryMore(); + + @ApiOperation(value = "乐观锁 Optimistic lockA") + void writeOptimisticA(long id,int type); + + @ApiOperation(value = "乐观锁 Optimistic lockB") + void writeOptimisticB(long id,int type); + + @ApiOperation(value = "悲观锁 pessimistic lockA") + void writePessimisticA(long id,int type); + + @ApiOperation(value = "悲观锁 pessimistic lockB") + void writePessimisticB(long id,int type); + + @ApiOperation(value = "常见事务处理-可能出现并发问题") + void writePatternWrong(long id,double salary); + + @ApiOperation(value = "事务模式-线程锁") + void writePatternSynchron(long id,double salary); + + @ApiOperation(value = "事务模式-乐观锁") + void writePatternOpti(long id,double salary); + + @ApiOperation(value = "事务模式-悲观锁") + void writePatternPessi(long id,double salary); + + @ApiOperation(value = "属性更新") + void writePatternParamUpdate(long id,double salary); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java index ac9179e..4586d42 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/configuration/AppStartSystemInit.java @@ -42,7 +42,7 @@ public class AppStartSystemInit implements CommandLineRunner { packIMPPResources(); LOGGER.info("【IMPP-Core开始加载基础信息...】"); - systemInitService.loadAll(); + systemInitService.putAndLoadAll(); } /** diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoTransactionController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoTransactionController.java index df9197c..3098ba1 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoTransactionController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoTransactionController.java @@ -1,18 +1,27 @@ package cn.estsh.i3plus.core.apiservice.controller; +import cn.estsh.i3plus.core.api.iservice.busi.ITestService; import cn.estsh.i3plus.core.api.iservice.busi.ITestTransService; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; +import cn.estsh.i3plus.pojo.platform.bean.TestTransUser; import cn.estsh.impp.framework.base.controller.CoreBaseController; +import cn.estsh.impp.framework.boot.datasource.DataSourceConfig; +import cn.estsh.impp.framework.boot.datasource.DynamicDataSourceHolder; import cn.estsh.impp.framework.boot.util.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import javax.persistence.LockModeType; +import java.util.List; + /** * @Description : 对事务以及entityManager的操作演示 * @Reference : @@ -22,13 +31,16 @@ import org.springframework.web.bind.annotation.RestController; **/ @RestController @Api(description = "对事务以及entityManager的操作演示") -@RequestMapping(PlatformConstWords.BASE_URL + "/demo-trans") +@RequestMapping("/demo-trans") public class DemoTransactionController extends CoreBaseController { private static final Logger LOGGER = LoggerFactory.getLogger(DemoTransactionController.class); @Autowired private ITestTransService transService; + @Autowired + private ITestService testService; + /** * dao混合调用 * @@ -45,17 +57,350 @@ public class DemoTransactionController extends CoreBaseController { } /** - * dao混合调用2 + * 测试多数据源切换 * - * @param type 调用参数 - * @param name 名称 * @return 处理结果 */ - @PostMapping("/test2") - @ApiOperation(value = "dao混合调用2") - public ResultBean transTest2(int type, String name) { - transService.testListTranSec(type, name); + @PostMapping("/test-dynamic-datasource") + @ApiOperation(value = "测试多数据源切换") + public ResultBean testDynamicDataSource(int type) { + //多服务调用 + startMultiService(); + + if(type == 1){ + System.out.println("====先查后插入===="); + List uList = transService.listRead(); + System.out.println("对象总数:" + uList.size()); + + System.out.println("开始插入"); + transService.write(); + + uList = transService.listRead(); + System.out.println("再次查询:" + uList.size()); + }else if(type == 2){ + System.out.println("====先插入后查===="); + System.out.println("开始插入"); + transService.write(); + + List uList = transService.listRead(); + System.out.println("对象总数:" + uList.size()); + + if(uList.size() > 0){ + throw new RuntimeException("111"); + } + }else if(type == 3){ + System.out.println("====先查后插入===="); + List uList = transService.listRead(); + System.out.println("对象总数:" + uList.size()); + + System.out.println("开始插入"); + testService.write(); + + uList = transService.listRead(); + System.out.println("再次查询:" + uList.size()); + } return ResultBean.success("测试成功"); } + + + /** + * 测试多数据源切换(Controller调用) + * + * @return 处理结果 + */ + @PostMapping("/test-dynamic-datasource-more") + @ApiOperation(value = "测试多数据源切换") + public ResultBean testDynamicDataSourceWithController(boolean withMulti) { + if(withMulti) { + //多服务调用 + startMultiService(); + } + + //读 + readWriteTransactionTest(1); + //写 + readWriteTransactionTest(2); + + return ResultBean.success("测试成功"); + } + + /** + * 读写分离-事务测试 + * @return 处理结果 + */ + @PostMapping("/read-write-test") + @ApiOperation(value = "读写分离-事务测试") + public ResultBean readWriteTransactionTest(@RequestParam("testType") int testType) { + if(testType == 1) { + //读 + List uList = transService.listRead(); + System.out.println("对象总数:" + uList.size()); + for (TestTransUser u : uList){ + System.out.println(u); + } + }else if(testType == 2) { + //写 + transService.write(); + }else if(testType == 3) { + //读写(写事务) + transService.transReadWrite(); + }else if(testType == 4) { + //读写(写事务) + transService.readWrite(); + } + + return ResultBean.success("测试成功"); + } + + /******************* 事务并发出现的问题*******************/ + + /** + * 第一类丢失更新 + * @param name 更新的name的值 + * @param time 停止时间,秒 + * @param execp 是否抛出异常 + * @return 处理结果 + */ + @PostMapping("/update-lost") + @ApiOperation(value = "第一类丢失更新") + public ResultBean updateLost1(String name,int time,boolean execp) { + transService.updateLost(name,time,execp); + + return ResultBean.success("幻读模拟结束"); + } + + /** + * 第二类丢失更新 + * @return 处理结果 + */ + @PostMapping("/update-lost-trans") + @ApiOperation(value = "第二类丢失更新") + public ResultBean updateLostTrans(String name,double salary,int time,boolean execp) { + transService.updateLostTrans(name,salary,time,execp); + + return ResultBean.success("第二类丢失更新结束"); + } + + /** + * 模拟脏读 + * @return 处理结果 + */ + @PostMapping("/trans-dirty-a") + @ApiOperation(value = "脏读模拟A") + public ResultBean transDirtyA(long id) { + try{ + transService.writeDirtyA(id); + }catch(Exception e){ + System.out.println(e.getMessage()); + } + + return ResultBean.success("脏读模拟A结束"); + } + + /** + * 模拟脏读 + * @return 处理结果 + */ + @PostMapping("/trans-dirty-b") + @ApiOperation(value = "脏读模拟B") + public ResultBean transDirtyB(long id) { + transService.writeDirtyB(id); + + return ResultBean.success("脏读模拟B结束"); + } + + /** + * 模拟不可重复读A + * @return 处理结果 + */ + @PostMapping("/trans-repeat-a") + @ApiOperation(value = "不可重复读A") + public ResultBean transRepeatA(long id) { + transService.writeRepeatA(id); + + return ResultBean.success("不可重复读A结束"); + } + + /** + * 模拟不可重复读B + * @return 处理结果 + */ + @PostMapping("/trans-repeat-b") + @ApiOperation(value = "不可重复读B") + public ResultBean transRepeatB(long id) { + transService.writeRepeatB(id); + + return ResultBean.success("不可重复读B结束"); + } + + /** + * 模拟幻读 + * @return 处理结果 + */ + @PostMapping("/trans-phantom-a") + @ApiOperation(value = "幻读模拟A") + public ResultBean transPhantomA(long id,boolean listOrDelete) { + try { + transService.writePhantomA(id, listOrDelete); + }catch(Exception e){ + System.out.println("幻读异常:" + e.getMessage()); + } + + return ResultBean.success("幻读模拟A结束"); + } + + /** + * 模拟幻读 + * @return 处理结果 + */ + @PostMapping("/trans-phantom-b") + @ApiOperation(value = "幻读模拟B") + public ResultBean transPhantomB() { + transService.writePhantomB(); + + return ResultBean.success("幻读模拟B结束"); + } + + /********************* 事务传播 *******************/ + + /** + * 事务传播-创建新事物 + * @return 处理结果 + */ + @PostMapping("/trans-require-new") + @ApiOperation(value = "创建新事务") + public ResultBean transRequireNew() { + transService.writeRequireNew(); + + return ResultBean.success("require-new结束"); + } + + /** + * 事务传播-mandatory + * @return 处理结果 + */ + @PostMapping("/trans-mandatory") + @ApiOperation(value = "没有事务抛出异常") + public ResultBean transMandatory() { + transService.writeTransMandatory(); + + return ResultBean.success("mandatory结束"); + } + + /******************* 事务隔离级别 *******************/ + //调用事务出现的问题,打开事务注释 + + /********************* 乐观锁 Optimistic lock *******************/ + + /** + * 乐观锁A + * @return 处理结果 + */ + @PostMapping("/trans-optimistic-a") + @ApiOperation(value = "乐观锁 Optimistic lockA") + public ResultBean transOptimisticA(long id,int type) { + transService.writeOptimisticA(id,type); + + return ResultBean.success("乐观锁 Optimistic lockA结束"); + } + + /** + * 乐观锁B + * @return 处理结果 + */ + @PostMapping("/trans-optimistic-b") + @ApiOperation(value = "乐观锁 Optimistic lockB") + public ResultBean transOptimisticB(long id,int type) { + transService.writeOptimisticB(id,type); + + return ResultBean.success("乐观锁 Optimistic lockB结束"); + } + + /********************* 悲观锁 Pessimistic Lock *******************/ + /** + * 悲观锁A + * @return 处理结果 + */ + @PostMapping("/trans-pessimistic-a") + @ApiOperation(value = "悲观锁 pessimistic lockA") + public ResultBean transPessimisticA(long id,int type) { + transService.writePessimisticA(id,type); + + return ResultBean.success("悲观锁 pessimistic lockA结束"); + } + + /** + * 悲观锁B + * @return 处理结果 + */ + @PostMapping("/trans-pessimistic-b") + @ApiOperation(value = "悲观锁 pessimistic lockB") + public ResultBean transPessimisticB(long id,int type) { + transService.writePessimisticB(id,type); + + return ResultBean.success("悲观锁 pessimistic lockB结束"); + } + + /********************* 事务设计 *******************/ + + /** + * 通常(可能出现问题) + * @return 处理结果 + */ + @PostMapping("/trans-pattern-wrong") + @ApiOperation(value = "常见事务处理(可能出现并发问题)") + public ResultBean transPatternWrong(long id,double salary) { + transService.writePatternWrong(id,salary); + + return ResultBean.success("常见事务处理"); + } + + /** + * 线程锁(性能) + * @return 处理结果 + */ + @PostMapping("/trans-pattern-synchronized") + @ApiOperation(value = "事务模式-线程锁") + public ResultBean transPatternSynchron(long id,double salary) { + transService.writePatternSynchron(id,salary); + + return ResultBean.success("事务模式-线程锁"); + } + + /** + * 乐观锁 + * @return 处理结果 + */ + @PostMapping("/trans-pattern-opti") + @ApiOperation(value = "事务模式-乐观锁") + public ResultBean transPatternOpti(long id,double salary) { + transService.writePatternOpti(id,salary); + + return ResultBean.success("事务模式-乐观锁"); + } + + /** + * 悲观锁 + * @return 处理结果 + */ + @PostMapping("/trans-pattern-pessi") + @ApiOperation(value = "事务模式-悲观锁") + public ResultBean transPatternPessi(long id,double salary) { + transService.writePatternPessi(id,salary); + + return ResultBean.success("事务模式-悲观锁"); + } + + /** + * 属性更新 + * @return 处理结果 + */ + @PostMapping("/trans-pattern-param-update") + @ApiOperation(value = "事务模式-属性更新") + public ResultBean transPatternParamUpdate(long id,double salary) { + transService.writePatternParamUpdate(id,salary); + + return ResultBean.success("事务模式-属性更新"); + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/BaseMessageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/BaseMessageController.java index 24d1053..f2c58a0 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/BaseMessageController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/BaseMessageController.java @@ -50,6 +50,8 @@ public class BaseMessageController extends CoreBaseController { */ public ResultBean basaeInsertSysMessage(SysMessage sysMessage) { try { + startMultiService(); + // 条件校验 ValidatorBean.beginValid(sysMessage) .notNull("messageTitle", sysMessage.getMessageTitle()) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index 11c8e99..c0f7633 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -10,6 +10,7 @@ import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.bean.BaseConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.model.platform.UserDetailModel; import cn.estsh.i3plus.pojo.platform.bean.*; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; @@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -110,6 +112,8 @@ public class WhiteController extends CoreBaseController { @ApiOperation(value="登陆",notes="登陆") public ResultBean login(HttpServletRequest request, String loginName, String loginPwd, String languageCode, @RequestParam(required = false) String ipAddr){ + startMultiService(); + LOGGER.info("用户登陆 loginName:{} loginPwd:{} languageCode:{}",loginName,loginPwd,languageCode); ResultBean result = null; try { @@ -207,6 +211,8 @@ public class WhiteController extends CoreBaseController { @ApiOperation(value = "根据语言代码查询资源") public ResultBean findSysLocaleResourceByLanguageCode(String languageCode){ try { + startMultiService(); + ValidatorBean.checkNotNull(languageCode,"语言代码不能为空"); if (sysLocaleLanguageService.getSysLocaleLanguageByCode(languageCode) == null) { throw ImppExceptionBuilder.newInstance() @@ -219,7 +225,7 @@ public class WhiteController extends CoreBaseController { // 从缓存获取语言信息 Map resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + languageCode); if (resourceMap == null || resourceMap.size() == 0) { - systemInitService.loadSysLocaleLanguage(); + systemInitService.putAndLoadSysLocaleLanguage(); resourceMap = redisRes.getHashMap(CommonConstWords.REDIS_PREFIX_CACHE_LANGUAGE + languageCode); } @@ -235,6 +241,8 @@ public class WhiteController extends CoreBaseController { @ApiOperation(value = "新增文件资源", notes = "新增文件资源") public ResultBean insertSysFile(@RequestBody SysFile sysFile){ try { + startMultiService(); + // 条件验证 ValidatorBean.beginValid(sysFile) .notNull("dfsFileName", sysFile.getDfsFileName()) @@ -303,4 +311,17 @@ public class WhiteController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @PostMapping(value = "/sys-find-user/list") + @ApiOperation(value = "查询用户列表信息",notes = "查询用户列表信息") + public ResultBean findSysUserInfoList(UserDetailModel model){ + try { + List userList = personnelService.querySysUserByUserDetailModelOrIds(model, new ArrayList<>()); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(userList); + }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/PersonnelController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java index 1767283..80647c7 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java @@ -64,6 +64,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "添加用户信息", notes = "返回内容添加用户信息") public ResultBean insertUserDetailModel(UserDetailModel model) { try { + startMultiService(); + SysUser user = model.getSysUser(); SysUserInfo info = model.getSysUserInfo(); @@ -143,6 +145,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "修改用户信息", notes = "返回内容添加用户信息") public ResultBean updateUserDetailModel(UserDetailModel model) { try { + startMultiService(); + SysUser user = model.getSysUser(); SysUserInfo info = model.getSysUserInfo(); @@ -228,6 +232,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "修改用户信息", notes = "返回内容添加用户信息") public ResultBean updateUserModel(UserDetailModel model) { try { + startMultiService(); + checkUserModel(model); SysUser user = personnelService.getSysUserById(Long.parseLong(model.getUserId())); initUser(model, user); @@ -334,6 +340,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "删除用户信息", notes = "根据用户信息id删除信息") public ResultBean deleteSysUserInfo(@PathVariable("id") String id) { try { + startMultiService(); + //条件验证 ValidatorBean.checkNotNull(id, "id为空"); @@ -362,6 +370,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "根据id批量删除", notes = "根据id批量删除") public ResultBean deleteSysUserInfoByIds(String[] ids) { try { + startMultiService(); + ids = ConvertBean.modelSafeArrayNumber(ids, true); if (ids.length == 0) { throw ImppExceptionBuilder.newInstance() @@ -405,6 +415,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "删除账号信息", notes = "根据账号信息id删除信息") public ResultBean deleteSysUser(@PathVariable("id") String id) { try { + startMultiService(); + //条件验证 ValidatorBean.checkNotNull(id, "id为空"); @@ -433,6 +445,8 @@ public class PersonnelController extends CoreBaseController { @ApiOperation(value = "根据id批量删除", notes = "根据id批量删除") public ResultBean deleteSysUserByIds(String[] ids) { try { + startMultiService(); + ids = ConvertBean.modelSafeArrayNumber(ids, true); if (ids.length == 0) { throw ImppExceptionBuilder.newInstance() @@ -631,6 +645,8 @@ public class PersonnelController extends CoreBaseController { * @param model 用户模型 */ public void refreshRef(SysUser user, SysUserInfo info, UserDetailModel model) { + startMultiService(); + if (user != null) { // 刷新账号 部门关系 personnelService.refreshRefSysUserDepartment(user.getId(), StringTool.getArrayLong(model.getUserDepartmentIdList())); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysBarcodeRuleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysBarcodeRuleController.java index 9534a57..455772d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysBarcodeRuleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysBarcodeRuleController.java @@ -97,6 +97,8 @@ public class SysBarcodeRuleController extends CoreBaseController { @ApiOperation(value = "删除条码规则",notes = "删除条码规则") public ResultBean deleteSysBarcodeRuleById(@PathVariable("id") String idStr) { try { + startMultiService(); + // 条件验证 ValidatorBean.checkNotNull(idStr,"id不能为空"); SysBarcodeRule sysBarcodeRule = sysBarcodeRuleService.getSysBarcodeRuleById(Long.parseLong(idStr)); 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 f46830c..2bdb25e 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 @@ -75,7 +75,7 @@ public class SysConfigController extends CoreBaseController { ConvertBean.modelInitialize(sysConfig,user); sysConfigService.insertSysConfig(sysConfig); - systemInitService.loadSysConfig(); + systemInitService.putAndLoadSysConfig(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -93,6 +93,8 @@ public class SysConfigController extends CoreBaseController { @ApiOperation(value = "根据id删除系统参数", notes = "根据id删除系统参数") public ResultBean deleteSysConfig(@PathVariable("id") String idStr) { try { + startMultiService(); + // 条件验证 ValidatorBean.checkNotNull(idStr,"id不能为空"); if(sysConfigService.getSysConfigById(Long.parseLong(idStr)) == null){ @@ -105,7 +107,7 @@ public class SysConfigController extends CoreBaseController { } sysConfigService.deleteSysConfigById(Long.parseLong(idStr)); - systemInitService.loadSysConfig(); + systemInitService.putAndLoadSysConfig(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -137,7 +139,7 @@ public class SysConfigController extends CoreBaseController { ConvertBean.modelUpdate(sysConfig,user); sysConfigService.updateSysConfig(sysConfig); - systemInitService.loadSysConfig(); + systemInitService.putAndLoadSysConfig(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -268,7 +270,7 @@ public class SysConfigController extends CoreBaseController { ValidatorBean.checkNotNull(value,"值不能为空"); sysConfigService.updateSysConfigByCode(code,value); - systemInitService.loadSysConfig(); + systemInitService.putAndLoadSysConfig(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java index 371dca1..0ff516e 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysDictionaryController.java @@ -115,6 +115,8 @@ public class SysDictionaryController extends CoreBaseController{ @ApiOperation(value = "根据id删除字典",notes = "根据id删除字典") public ResultBean updateSysDictionary(@PathVariable("id") String idStr) { try { + startMultiService(); + // 条件验证 ValidatorBean.checkNotNull(idStr,"id不能为空"); SysDictionary sysDictionary = sysDictionaryService.getSysDictionaryById(Long.parseLong(idStr)); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java index cc44e9d..bf2a37d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysFileController.java @@ -87,6 +87,8 @@ public class SysFileController extends CoreBaseController{ @ApiOperation(value = "根据id删除文件资源", notes = "根据id删除文件资源") public ResultBean deleteSysFileById(@PathVariable("id") String idStr){ try { + startMultiService(); + ValidatorBean.checkNotNull(idStr, "id不能为空"); SysFile sysFile = sysFileService.getSysFileById(Long.parseLong(idStr)); ValidatorBean.checkNotNull(sysFile, "文件信息不存在"); @@ -201,6 +203,8 @@ public class SysFileController extends CoreBaseController{ @ApiOperation(value = "文件上传", notes = "文件上传") public ResultBean singleFileUpload(@RequestParam("file") MultipartFile file) { try { + startMultiService(); + if(file.isEmpty()){ throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) @@ -239,6 +243,8 @@ public class SysFileController extends CoreBaseController{ @ApiOperation(value = "文件下载", notes = "文件下载") public ResultBean singleDownload(@PathVariable("id")String id, HttpServletResponse response) { try { + startMultiService(); + ValidatorBean.checkIsNumber(id, "文件ID不能为空"); SysFile sysFile = sysFileService.getSysFileById(Long.parseLong(id)); @@ -306,6 +312,8 @@ public class SysFileController extends CoreBaseController{ @ApiOperation(value = "新增文件资源", notes = "新增文件资源") public ResultBean insertSysFile(@RequestBody SysFile sysFile){ try { + startMultiService(); + // 条件验证 ValidatorBean.beginValid(sysFile) .notNull("dfsFileName", sysFile.getDfsFileName()) diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLabelTemplateController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLabelTemplateController.java index 4677662..69388b8 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLabelTemplateController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLabelTemplateController.java @@ -81,6 +81,8 @@ public class SysLabelTemplateController extends CoreBaseController { @ApiOperation(value = "根据id删除打印模板", notes = "根据id删除打印模板") public ResultBean deleteSysLabelTemplate(@PathVariable("id") String idStr) { try { + startMultiService(); + // 条件验证 ValidatorBean.checkNotNull(idStr,"id不能为空"); if(sysLabelTemplateService.getSysLabelTemplateById(Long.parseLong(idStr)) == null){ diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleLanguageController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleLanguageController.java index b677d46..9668077 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleLanguageController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleLanguageController.java @@ -92,7 +92,7 @@ public class SysLocaleLanguageController extends CoreBaseController { sysLocaleLanguageService.updateSysLocaleLanguage(sysLocaleLanguage); // 重新加载资源 - systemInitService.loadSysLocaleLanguage(); + systemInitService.putAndLoadSysLocaleLanguage(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -110,6 +110,8 @@ public class SysLocaleLanguageController extends CoreBaseController { @ApiOperation(value = "根据id删除系统语言",notes = "根据id删除系统语言") public ResultBean deleteSysLocaleLanguageById(@PathVariable("id") String idStr){ try { + startMultiService(); + //条件验证 ValidatorBean.checkNotNull(idStr,"id不能为空"); SysLocaleLanguage sysLocaleLanguage =sysLocaleLanguageService.getSysLocaleLanguageById(Long.parseLong(idStr)); @@ -210,7 +212,7 @@ public class SysLocaleLanguageController extends CoreBaseController { sysLocaleLanguageService.deleteSysLocaleLanguageByIds(StringTool.getArrayLong(idsStr)); // 重新加载语言资源 - systemInitService.loadSysLocaleLanguage(); + systemInitService.putAndLoadSysLocaleLanguage(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java index bca09f7..78b3b74 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java @@ -120,6 +120,8 @@ public class SysLocaleResourceController extends CoreBaseController { @ApiOperation(value = "根据id删除系统语言资源",notes = "根据id删除系统语言资源") public ResultBean deleteSysLocaleResourceById(@PathVariable("id") String idStr){ try { + startMultiService(); + //条件验证 ValidatorBean.checkNotNull(idStr,"id不能为空"); SysLocaleResource sysLocaleResource =sysLocaleResourceService.getSysLocaleResourceById(Long.parseLong(idStr)); @@ -198,7 +200,7 @@ public class SysLocaleResourceController extends CoreBaseController { sysLocaleResourceService.deleteSysLocaleResourceByIds(StringTool.getArrayLong(idsStr)); // 重新加载资源 - systemInitService.loadSysLocaleLanguage(); + systemInitService.putAndLoadSysLocaleLanguage(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); @@ -227,7 +229,7 @@ public class SysLocaleResourceController extends CoreBaseController { sysLocaleResourceService.insertSysLocaleResourceList(sysLocaleResourcesList); // 重新加载资源 - systemInitService.loadSysLocaleLanguage(); + systemInitService.putAndLoadSysLocaleLanguage(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); 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 5e437e0..83f7e97 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 @@ -103,6 +103,8 @@ public class SysLogExceptionController extends CoreBaseController { @GetMapping(value = "/export") @ApiOperation(value = "导出系统异常日志") public ResultBean exportSysLogException(SysLogException sysLogException, String[] colName, int pageSize,boolean isZip) { + startMultiService(); + ListPager listPager; List result = new ArrayList(); File zipFile = null; diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java index 1e05f78..d3c236f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogOperateController.java @@ -190,6 +190,8 @@ public class SysLogOperateController extends CoreBaseController { File excelDir = null; File excelFile; try { + startMultiService(); + Pager pager = new Pager(); pager.setCurrentPage(1); // 判断是否超过excel最大导出数量设定值 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java index 7162179..ee07de4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogSystemController.java @@ -178,6 +178,8 @@ public class SysLogSystemController extends CoreBaseController{ File excelDir = null; File excelFile; try { + startMultiService(); + Pager pager = new Pager(); pager.setCurrentPage(1); // 判断是否超过excel最大导出数量设定值 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 550a9eb..90df351 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 @@ -311,6 +311,8 @@ public class SysOrderNoRuleController extends CoreBaseController { @ApiOperation(value = "下载导入模板") public ResultBean downSysOrderNoRuleTemplate() { try { + startMultiService(); + FastDFSFile fastDFSFile = new FastDFSFile(SysOrderNoRule.class.getSimpleName() + "ImportTemplate.xls", ExcelUtil.importTemplate(SysOrderNoRule.class), "xls"); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java index 4c75aca..317b7f7 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java @@ -52,6 +52,8 @@ public class SysRoleController extends CoreBaseController{ @ApiOperation(value = "新增系统角色", notes = "系统角色") public ResultBean insertSysRole(SysRole role) { try { + startMultiService(); + //条件验证 ValidatorBean.beginValid(role) .notNull("name", role.getName()); @@ -82,6 +84,8 @@ public class SysRoleController extends CoreBaseController{ @ApiOperation(value = "修改系统角色", notes = "系统角色") public ResultBean updateSysRole(SysRole role) { try { + startMultiService(); + // 数据校验 ValidatorBean.beginValid(role) .notNull("id", role.getId()) @@ -283,6 +287,8 @@ public class SysRoleController extends CoreBaseController{ @ApiOperation(value = "新增角色权限关系", notes = "新增角色权限关系") public ResultBean insertRefMenu(String roleId,String[] refIds) { try { + startMultiService(); + // 数据校验 ValidatorBean.checkNotNull(roleId, "角色roleId 不能为空"); @@ -308,6 +314,8 @@ public class SysRoleController extends CoreBaseController{ @ApiOperation(value = "批量新增角色权限关系", notes = "批量新增角色权限关系") public ResultBean insertBatchRefMenu(String[] roleIds,String[] menuIds) { try { + startMultiService(); + roleIds = ConvertBean.modelSafeArrayNumber(roleIds,true); menuIds = ConvertBean.modelSafeArrayNumber(menuIds,true); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskController.java index b3d00c5..2df8449 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskController.java @@ -158,6 +158,8 @@ public class SysTaskController extends CoreBaseController { @ApiOperation(value = "删除任务", notes = "删除任务") public ResultBean deleteSysTaskById(@PathVariable("id") String idStr) { try { + startMultiService(); + // 数据校验 ValidatorBean.checkNotNull(idStr, "id不能为空"); if (sysTaskService.getSysTaskById(Long.parseLong(idStr)) == null) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskCycleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskCycleController.java index 10a20fc..a927f17 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskCycleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskCycleController.java @@ -165,6 +165,8 @@ public class SysTaskCycleController extends CoreBaseController { @ApiOperation(value = "删除任务周期", notes = "删除任务周期") public ResultBean deleteSysTaskCycle(@PathVariable("id") String idStr) { try { + startMultiService(); + // 数据校验 ValidatorBean.checkNotNull(idStr, "时间表达式id 不能为空"); if (sysTaskCycleService.getSysTaskCycleById(Long.parseLong(idStr)) == null) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskPlanController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskPlanController.java index 2de0ddd..c5d2e1c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskPlanController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysTaskPlanController.java @@ -114,6 +114,8 @@ public class SysTaskPlanController extends CoreBaseController { @ApiOperation(value = "新增任务计划", notes = "任务计划") public ResultBean insertSysTaskTime(SysTaskPlan sysTaskPlan, Integer isExecute) { try { + startMultiService(); + // 数据校验 ValidatorBean.beginValid(sysTaskPlan) .notNull("name", sysTaskPlan.getName()) @@ -195,6 +197,8 @@ public class SysTaskPlanController extends CoreBaseController { @ApiOperation(value = "修改任务计划", notes = "任务计划") public ResultBean updateSysTaskTime(SysTaskPlan sysTaskPlan, Integer isExecute) { try { + startMultiService(); + ResultBean resultBean = ResultBean.success("操作成功") .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) .setResultObject(sysTaskPlan); @@ -270,6 +274,8 @@ public class SysTaskPlanController extends CoreBaseController { @ApiOperation(value = "删除任务计划", notes = "删除任务计划") public ResultBean deleteSysTaskTime(@PathVariable("id") String id) { try { + startMultiService(); + // 数据校验 ValidatorBean.checkNotNull(id, "任务计划id 不能为空"); SysTaskPlan sysTaskPlan = sysTaskPlanService.getSysTaskPlanById(Long.parseLong(id)); @@ -339,6 +345,8 @@ public class SysTaskPlanController extends CoreBaseController { @ApiOperation(value = "修改任务计划状态", notes = "根据ID修改任务计划状态") public ResultBean updateQuartzStatus(@PathVariable("id") String idStr, @PathVariable("status") Integer status) { try { + startMultiService(); + // 数据校验 ValidatorBean.checkNotNull(idStr, "id 不能为空"); ValidatorBean.checkNotZero(status, "状态不能为空"); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java index 0894b3a..903cf0b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysToolTypeController.java @@ -102,6 +102,8 @@ public class SysToolTypeController extends CoreBaseController{ @ApiOperation(value = "根据id删除硬件类型",notes = "根据id删除硬件类型") public ResultBean deleteSysToolType(@PathVariable("id") String idStr){ try { + startMultiService(); + ValidatorBean.checkNotNull(idStr,"id不能为空"); if(toolTypeService.getSysToolTypeById(Long.parseLong(idStr)) == null){ throw ImppExceptionBuilder.newInstance() 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 4669dc9..0945239 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,8 @@ public class SysUserController extends CoreBaseController{ @ApiOperation(value = "新增用户", notes = "新增系统用户") public ResultBean insertSysUser(SysUser sysUser,String[] roleIds) { try { + startMultiService(); + ConvertBean.modelSafeArrayNumber(roleIds,true); ValidatorBean.beginValid(sysUser) @@ -133,6 +135,8 @@ public class SysUserController extends CoreBaseController{ @ApiOperation(value = "修改用户", notes = "修改用户信息") public ResultBean updateSysUser(SysUser sysUser,String[] roleIds) { try { + startMultiService(); + ConvertBean.modelSafeArrayNumber(roleIds,true); ValidatorBean.beginValid(sysUser) .numberCheck("id",sysUser.getUserInfoId()) @@ -248,6 +252,8 @@ public class SysUserController extends CoreBaseController{ @ApiOperation(value = "修改密码", notes = "修改当前登录用户密码") public ResultBean updateSysUserPassword(String password,String newPwd) { try { + startMultiService(); + SessionUser sessionUser = AuthUtil.getSessionUser(); // 数据校验 ValidatorBean.checkNotNull(password, "旧密码不能为空"); @@ -382,6 +388,8 @@ public class SysUserController extends CoreBaseController{ @ApiOperation(value = "密码重置",notes = "根据id重置用户密码") public ResultBean updateResetPassword(@PathVariable String id){ try { + startMultiService(); + SysUser user = sysUserService.getSysUserById(Long.parseLong(id)); if(user != null){ Integer num = personnelService.checkSysUserResetPassword(user); @@ -531,6 +539,8 @@ public class SysUserController extends CoreBaseController{ @ApiOperation(value = "修改用户操作组织id") public ResultBean updateSysUserOrganize(String idStr, String organizeIdStr){ try{ + startMultiService(); + ValidatorBean.checkNotNull(idStr, "id不能为空"); SysUser sysUser = sysUserService.getSysUserById(Long.parseLong(idStr)); ValidatorBean.checkNotNull(sysUser, "用户不存在"); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java index 8cea910..5ab49dd 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserInfoController.java @@ -71,6 +71,8 @@ public class SysUserInfoController extends CoreBaseController{ @ApiOperation(value="添加用户信息",notes="返回内容添加用户信息") public ResultBean insertSysUserInfo(SysUserInfo userInfo){ try { + startMultiService(); + //登陆用户 SessionUser user = AuthUtil.getSessionUser(); @@ -103,6 +105,8 @@ public class SysUserInfoController extends CoreBaseController{ @ApiOperation(value="修改用户信息",notes="根据用户信息id修改信息") public ResultBean updateSysUserInfoById(SysUserInfo userInfo){ try { + startMultiService(); + //登陆用户 SessionUser user = AuthUtil.getSessionUser(); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java index 051833d..989e40f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemInitService.java @@ -51,16 +51,16 @@ public class SystemInitService implements ISystemInitService { @Override @ApiOperation(value = "初始化加载所有数据",notes = "初始化加载所有数据") - public void loadAll() { + public void putAndLoadAll() { type = ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue(); - loadSysConfig(); - loadSysDictionary(); - loadSysLocaleLanguage(); + putAndLoadSysConfig(); + putAndLoadSysDictionary(); + putAndLoadSysLocaleLanguage(); } @Override @ApiOperation(value = "加载系统配置",notes = "加载系统配置") - public void loadSysConfig() { + public void putAndLoadSysConfig() { String redisKey = null; List list = configRDao.findAll(); for (SysConfig config : list) { @@ -74,7 +74,7 @@ public class SystemInitService implements ISystemInitService { @Override @ApiOperation(value = "加载字典数据",notes = "加载字典数据") - public void loadSysDictionary() { + public void putAndLoadSysDictionary() { try { List list = dictionaryRDao.findAll(); if(list != null && list.size() > 0){ @@ -99,7 +99,7 @@ public class SystemInitService implements ISystemInitService { @Override @ApiOperation(value = "加载语言数据",notes = "加载语言数据") - public void loadSysLocaleLanguage() { + public void putAndLoadSysLocaleLanguage() { // Redis 缓存 if(type == ImppEnumUtil.SYS_CACHE_TYPE.REDIS.getValue()){ /** diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestService.java index af80f07..9baa9e4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestService.java @@ -13,7 +13,9 @@ import cn.estsh.i3plus.pojo.base.tool.HqlPack; import cn.estsh.i3plus.pojo.platform.bean.SysDepartment; import cn.estsh.i3plus.pojo.platform.bean.SysOrganize; import cn.estsh.i3plus.pojo.platform.bean.SysUser; +import cn.estsh.i3plus.pojo.platform.bean.TestTransUser; import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; +import cn.estsh.i3plus.pojo.platform.repository.TestTransUserRepository; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; @@ -24,6 +26,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Random; /** * @Description : @@ -43,6 +46,9 @@ public class TestService implements ITestService { @Autowired private SysUserRepository sysUserRDao; + @Autowired + private TestTransUserRepository testTransUserRepository; + @Override @ApiOperation(value = "多表查询") public List queryToolAndToolType(Pager pager) { @@ -89,6 +95,18 @@ public class TestService implements ITestService { } @Override + public void write() { + Random ran = new Random(10000); + TestTransUser u = new TestTransUser(); + u.setName("na2me" + ran.nextInt(100)); + u.setSalary(ran.nextDouble()); + System.out.println("插入对象:" + u); + + u = testTransUserRepository.insert(u); + System.out.println("插入对象:" + u); + } + + @Override public void insertSysUser(SysUser sysUser) { sysUserRDao.insert(sysUser); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java index b28f941..ba62cc6 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTransService.java @@ -3,18 +3,22 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.ITestTransService; import cn.estsh.i3plus.core.apiservice.dao.ITestTransDao; import cn.estsh.i3plus.core.apiservice.dao.ITransDaoSec; -import cn.estsh.i3plus.pojo.platform.bean.SysDepartment; -import cn.estsh.i3plus.pojo.platform.bean.SysTool; -import cn.estsh.i3plus.pojo.platform.bean.SysUser; -import cn.estsh.i3plus.pojo.platform.bean.SysUserInfo; +import cn.estsh.i3plus.pojo.platform.bean.*; import cn.estsh.i3plus.pojo.platform.repository.SysDepartmentRepository; import cn.estsh.i3plus.pojo.platform.repository.SysUserInfoRepository; import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; -import com.netflix.discovery.converters.Auto; +import cn.estsh.i3plus.pojo.platform.repository.TestTransUserRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.Lock; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import javax.persistence.LockModeType; import java.util.List; +import java.util.Random; /** * @Description : @@ -41,6 +45,9 @@ public class TestTransService implements ITestTransService { @Autowired private ITransDaoSec testTransSecDao; + @Autowired + private TestTransUserRepository testTransUserRepository; + @Override public void testListTran(int type,String name) { if(type == 1) { @@ -130,8 +137,380 @@ public class TestTransService implements ITestTransService { } } + @Transactional(propagation=Propagation.NESTED,isolation=Isolation.DEFAULT,readOnly = false,rollbackFor = Exception.class) + @Lock(value = LockModeType.PESSIMISTIC_WRITE) + @Override + public void testTran() { + + } + + @Override + public List listRead() { + + List ul = testTransUserRepository.list(); + testTransUserRepository.flush(); + System.out.println("查询333数量:" + ul); + + return ul; + } + + @Override + public void write() { + Random ran = new Random(10000); + TestTransUser u = new TestTransUser(); + u.setName("na2me" + ran.nextInt(100)); + u.setSalary(ran.nextDouble()); + System.out.println("插入对象:" + u); + + u = testTransUserRepository.insert(u); + System.out.println("插入对象:" + u); + } + + @Override + public void transReadWrite() { + System.out.println("===写事务:查询后插入==="); + listRead(); + write(); + } + + @Override + public void readWrite() { + System.out.println("===读事务:查询后插入==="); + listRead(); + write(); + } + + @Override + public void updateTestTransUser(String name, double salary) { + TestTransUser u = testTransUserRepository.getByProperty("name",name); + u.setSalary(salary); + + testTransUserRepository.update(u); + } + + @Override + public void insertTestTransUser(String name, double salary) { + TestTransUser u = new TestTransUser(); + u.setName(name); + u.setSalary(salary); + + u = testTransUserRepository.insert(u); + System.out.println("插入对象:" + u); + } + + @Override + public void deleteTestTransUser(String name) { + testTransUserRepository.deleteByProperty("name",name); + } + + @Override + @Transactional(propagation = Propagation.NEVER) //没有事务 + public void updateLost(String name, int time, boolean execp) { + TestTransUser u = testTransUserRepository.getByProperty("name",name); + u.setSalary(u.getSalary() + 100); + + testTransUserRepository.update(u); + + if(time > 0){ + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + if(execp){ + throw new RuntimeException("手动异常"); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED) //默认事务 + public void updateLostTrans(String name,double salary, int time, boolean execp) { + TestTransUser u = testTransUserRepository.getByProperty("name",name); + u.setSalary(salary); + + testTransUserRepository.update(u); + + if(time > 0){ + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + if(execp){ + throw new RuntimeException("手动异常"); + } + } + + @Override + public void writeDirtyA(long id) { + TestTransUser u = testTransUserRepository.getById(id); + System.out.println("脏读开始,对象值:" + u.getSalary()); + u.setSalary(u.getSalary() + 666); + + testTransUserRepository.update(u); + System.out.println("脏读数据已更新:" + u.getSalary()); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + if(u.getSalary() > 0){ + throw new RuntimeException("手动抛出,数据回滚。"); + } + } + + @Override + @Transactional(isolation = Isolation.READ_UNCOMMITTED) + public void writeDirtyB(long id) { + TestTransUser u = testTransUserRepository.getById(id); + System.out.println("第一次查询:" + u); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + u = testTransUserRepository.getById(id); + System.out.println("第二次查询:" + u); + } + + @Override + public void writeRepeatA(long id) { + TestTransUser u = testTransUserRepository.getById(id); + System.out.println("不可重复读开始,对象值:" + u.getSalary()); + u.setSalary(u.getSalary() + 666); + + testTransUserRepository.update(u); + System.out.println("不可重复读数据已更新:" + u.getSalary()); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("不可重复读已提交数据!"); + } + + @Override + public void writeRepeatB(long id) { + TestTransUser u = testTransUserRepository.getById(id); + System.out.println("第一次查询:" + u); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + u = testTransUserRepository.getById(id); + System.out.println("第二次查询:" + u); + } + + @Override + //@Transactional(isolation = Isolation.SERIALIZABLE) + public void writePhantomA(long id,boolean listOrDelete) { + int count = testTransUserRepository.listCount(); + System.out.println("幻读开始,记录数量:" + count); + + if(listOrDelete){ + TestTransUser u = new TestTransUser(); + u.setName("testPhantom"); + u.setSalary(500d); + + u = testTransUserRepository.insert(u); + System.out.println("插入对象:" + u); + + u.setSalary(u.getSalary() * 10); + testTransUserRepository.update(u); + testTransUserRepository.flush(); + System.out.println("update对象:" + u); + }else{ + testTransUserRepository.deleteById(id); + } + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(count > 0){ + throw new RuntimeException("幻读抛出异常"); + } + + count = testTransUserRepository.listCount(); + System.out.println("幻读结束,记录数量:" + count); + } + @Override - public void testListTranSec(int type,String name) { + @Transactional(isolation = Isolation.SERIALIZABLE) + public void writePhantomB() { + int count = testTransUserRepository.listCount(); + System.out.println("幻读另一个事务开始,记录数量:" + count); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + count = testTransUserRepository.listCount(); + System.out.println("幻读另一个事务结束,记录数量:" + count); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public void writeRequireNew() { + int count = testTransUserRepository.listCount(); + System.out.println("插入前数量:" + count); + insertTestTransUser("require new",100); + + count = testTransUserRepository.listCount(); + System.out.println("插入后数量:" + count); + + TestTransUser u = testTransUserRepository.getByProperty("name","require new"); + System.out.println("查询对象:" + u); + + writeRequireNewMore(); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void writeRequireNewMore() { + int count = testTransUserRepository.listCount(); + System.out.println("【子事务】查询数量:" + count); + + TestTransUser u = testTransUserRepository.getByProperty("name","require new"); + System.out.println("【子事务】查询对象:" + u); + } + + @Override + @Transactional(propagation = Propagation.NEVER) + public void writeTransMandatory() { + int count = testTransUserRepository.listCount(); + System.out.println("数量:" + count); + + writeTransMandatoryMore(); + } + + @Override + @Transactional(propagation = Propagation.MANDATORY) + public void writeTransMandatoryMore() { + int count = testTransUserRepository.listCount(); + System.out.println("【子事务】查询数量:" + count); + } + + @Override + //@Transactional(isolation=Isolation.REPEATABLE_READ) + //@Lock(value = LockModeType.WRITE) + public void writeOptimisticA(long id,int type) { + if(type == 1){ + //脏读 + writeDirtyA(id); + }else if(type == 2){ + writeRepeatA(id); + }else if(type == 3){ + writePhantomA(id,true); + } + } + + @Override + public void writeOptimisticB(long id,int type) { + if(type == 1){ + //脏读 + writeDirtyB(id); + }else if(type == 2){ + writeRepeatB(id); + }else if(type == 3){ + writePhantomB(); + } + } + + @Override + //@Transactional(isolation=Isolation.REPEATABLE_READ) + //@Lock(value = LockModeType.PESSIMISTIC_WRITE) + public void writePessimisticA(long id,int type) { + if(type == 1){ + //脏读 + writeDirtyA(id); + }else if(type == 2){ + writeRepeatA(id); + }else if(type == 3){ + writePhantomA(id,true); + } + } + + @Override + public void writePessimisticB(long id,int type) { + if(type == 1){ + //脏读 + writeDirtyB(id); + }else if(type == 2){ + writeRepeatB(id); + }else if(type == 3){ + writePhantomB(); + } + } + + @Override + public void writePatternWrong(long id,double salary) { + System.out.println("==事务并发问题=="); + TestTransUser u = testTransUserRepository.getById(id); + System.out.println("更新前:" + u.getName() + "," + u.getSalary()); + u.setSalary(salary); + System.out.println("更新后:" + u.getName() + "," + u.getSalary()); + + testTransUserRepository.update(u); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Override + public synchronized void writePatternSynchron(long id,double salary) { + System.out.println("==添加线程锁=="); + writePatternWrong(id,salary); + } + + @Override + public void writePatternOpti(long id,double salary) { + System.out.println("==乐观锁=="); + + try { + writePatternWrong(id, salary); + }catch(Exception e){ + System.out.println("在此处进行再次处理"); + System.out.println("乐观锁抛出异常:" + e.getMessage()); + } + } + + @Override + public void writePatternPessi(long id,double salary) { + writePatternWrong(id, salary); + } + + @Override + public void writePatternParamUpdate(long id,double salary) { + System.out.println("==通过更新属性值保证事务=="); + + TestTransUser u = testTransUserRepository.getById(id); + System.out.println("更新前:" + u.getName() + "," + u.getSalary()); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + //update TestTransUser set salary = salary + :salary where name=:name; + testTransUserRepository.updateByPropertiesWithVal("id",id,"salary",salary); + System.out.println("5秒后更新:" + u.getName() + "," + u.getSalary()); } } diff --git a/pom.xml b/pom.xml index 12a5500..7c2fb76 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,13 @@ i3plus-platform-common ${project.version} + + + i3plus.platform + i3plus-platform-plugin + ${project.version} + + i3plus.pojo i3plus-pojo-platform