diff --git a/src/main/java/club/joylink/rtss/controller/user/UserController.java b/src/main/java/club/joylink/rtss/controller/user/UserController.java index 04581e68b..a91e45f3a 100644 --- a/src/main/java/club/joylink/rtss/controller/user/UserController.java +++ b/src/main/java/club/joylink/rtss/controller/user/UserController.java @@ -66,6 +66,9 @@ public class UserController { @Role({RoleEnum.SuperAdmin, RoleEnum.Admin}) @GetMapping(path = "sync") public String sync( HttpServletResponse response){ + if(!this.syncService.initData()){ + return "正在同步。。。"; + } File file = this.syncService.sync(); if(Objects.isNull(file) || !file.exists()){ return "未找到统计的同步文件"; diff --git a/src/main/java/club/joylink/rtss/dao/permission/PermissionSubjectDAO.java b/src/main/java/club/joylink/rtss/dao/permission/PermissionSubjectDAO.java index 9678800c9..136bcb247 100644 --- a/src/main/java/club/joylink/rtss/dao/permission/PermissionSubjectDAO.java +++ b/src/main/java/club/joylink/rtss/dao/permission/PermissionSubjectDAO.java @@ -5,6 +5,7 @@ import club.joylink.rtss.entity.permission.PermissionSubjectExample; import club.joylink.rtss.vo.permission.PermissionSubjectStatusEnum; import club.joylink.rtss.vo.permission.subject.PermissionSubjectQueryVO; import club.joylink.rtss.vo.permission.subject.PermissionSubjectVO; +import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -81,6 +82,19 @@ public interface PermissionSubjectDAO { int insert(PermissionSubject record); + @Insert("") + void batchInsert(@Param("list") List list); int insertSelective(PermissionSubject record); List selectByExample(PermissionSubjectExample example); diff --git a/src/main/java/club/joylink/rtss/dao/permission/PermissionSystemAbilityDAO.java b/src/main/java/club/joylink/rtss/dao/permission/PermissionSystemAbilityDAO.java index d6be054d7..dfd3b95cb 100644 --- a/src/main/java/club/joylink/rtss/dao/permission/PermissionSystemAbilityDAO.java +++ b/src/main/java/club/joylink/rtss/dao/permission/PermissionSystemAbilityDAO.java @@ -1,8 +1,11 @@ package club.joylink.rtss.dao.permission; +import club.joylink.rtss.entity.permission.PermissionSubject; import club.joylink.rtss.entity.permission.PermissionSystemAbility; import club.joylink.rtss.entity.permission.PermissionSystemAbilityExample; import java.util.List; + +import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -16,6 +19,14 @@ public interface PermissionSystemAbilityDAO { int deleteByPrimaryKey(Long id); + @Insert("") + void batchInsert(@Param("list") List list); int insert(PermissionSystemAbility record); int insertSelective(PermissionSystemAbility record); @@ -31,4 +42,4 @@ public interface PermissionSystemAbilityDAO { int updateByPrimaryKeySelective(PermissionSystemAbility record); int updateByPrimaryKey(PermissionSystemAbility record); -} \ No newline at end of file +} diff --git a/src/main/java/club/joylink/rtss/services/mapFunction/RtsMapFunctionServiceImpl.java b/src/main/java/club/joylink/rtss/services/mapFunction/RtsMapFunctionServiceImpl.java index 067d48fb7..02d7b8acd 100644 --- a/src/main/java/club/joylink/rtss/services/mapFunction/RtsMapFunctionServiceImpl.java +++ b/src/main/java/club/joylink/rtss/services/mapFunction/RtsMapFunctionServiceImpl.java @@ -135,6 +135,7 @@ public class RtsMapFunctionServiceImpl implements RtsMapFunctionService { return msgList; } + @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) @Override public List generateLpf(long mapId, long creatorId) { List pfDataList = mapPassengerFlowDataService.queryAllPassengerFlowBaseDataOfMap(mapId); diff --git a/src/main/java/club/joylink/rtss/services/permission/OldPermissionDataSyncService.java b/src/main/java/club/joylink/rtss/services/permission/OldPermissionDataSyncService.java index 491aa6576..946d3ece9 100644 --- a/src/main/java/club/joylink/rtss/services/permission/OldPermissionDataSyncService.java +++ b/src/main/java/club/joylink/rtss/services/permission/OldPermissionDataSyncService.java @@ -38,6 +38,7 @@ import java.io.FileWriter; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; import java.util.stream.Collectors; @@ -68,14 +69,16 @@ public class OldPermissionDataSyncService { @Autowired private MapInfoDAO mapInfoDAO; - static final Map MAPID_TYPE_MAP = Maps.newHashMap(); + private final static AtomicBoolean ISRUN = new AtomicBoolean(false); + static final Map MAPID_TYPE_MAP = Maps.newHashMap(); static final List SYNC_RESULT_LIST = Lists.newArrayList(); static{ - MAPID_TYPE_MAP.put(154L,Simulation.Type.RAILWAY); //大铁标准站 -// MAPID_TYPE_MAP.put(81L,Simulation.Type.RAILWAY); //北交大客流 - MAPID_TYPE_MAP.put(161L,Simulation.Type.EMERGENCY); //武汉8号线应急调度 + MAPID_TYPE_MAP.put(154L,GgenerateType.RAILWAY); //大铁标准站 + MAPID_TYPE_MAP.put(81L,GgenerateType.DAKE_STREAM); //北交大客流 + MAPID_TYPE_MAP.put(161L,GgenerateType.EMERGENCY); //武汉8号线应急调度 } + private void truncateAllTable(){ syncDAO.clearRtsPermission(); syncDAO.clearRtsDistribute(); @@ -83,42 +86,69 @@ public class OldPermissionDataSyncService { syncDAO.clearRtsPermissionSystemAbility(); syncDAO.clearRtsPermissionSubject(); } + + public boolean initData(){ + if(ISRUN.compareAndSet(false,true)){ + SYNC_RESULT_LIST.clear(); + try{ + truncateAllTable(); + MapInfoExample example = new MapInfoExample(); + example.createCriteria().andStatusEqualTo("1" ); + List mapInfoList = this.mapInfoDAO.selectByExample(example); + for (MapInfo mapInfo : mapInfoList) { + this.generate(mapInfo); + } + this.abilityService.autoSynchMapSystemData(0L); + }catch (Exception e){ + log.error("用户权限初始化失败 msg:" + e.getMessage(),e); + ISRUN.compareAndSet(true,false); + } + + return true; + }else{ + return false; + } + } + @Transactional(rollbackFor = Exception.class) public File sync(){ - SYNC_RESULT_LIST.clear(); - truncateAllTable(); - List userPermissionList = syncDAO.findCanUsedData(); - List syncVOList = findAllPermission(userPermissionList); - List distributeDataVOList = distributeData(syncVOList); - List psList = this.userPermission(userPermissionList); - insertPermission(syncVOList); - insertDistribute(distributeDataVOList); - insertUserPermission(psList); - return outErrorMsg(); + + try{ + + List userPermissionList = syncDAO.findCanUsedData(); + Map> funMapIdMap = this.findSystemAbilityGroupMapId(); + List syncVOList = findAllPermission(userPermissionList,funMapIdMap); + List distributeDataVOList = distributeData(syncVOList); + List psList = this.userPermission(userPermissionList,funMapIdMap); + insertPermission(syncVOList); + insertDistribute(distributeDataVOList); + insertUserPermission(psList); + File file = outErrorMsg(); + return file; + }catch (Exception e){ + log.error("用户权限同步失败 msg:" + e.getMessage(),e); + throw e; + }finally { + ISRUN.compareAndSet(true,false); + } + } private File outErrorMsg(){ - List createMapErrorList = SYNC_RESULT_LIST.stream().filter(d->d.errorType == ErrorType.CREATE_MAP).map(d->d.getPermissionVO().getMapId()).distinct().collect(Collectors.toList()); - MapInfoExample example = new MapInfoExample(); - example.createCriteria().andIdIn(createMapErrorList); - List mapInfoList = this.mapInfoDAO.selectByExample(example); - - List xiajiaList = mapInfoList.stream().filter(d->!Objects.equals(d.getStatus(),"1")).map(d->String.format("%s [%s] [%s]",d.getId(),d.getName(),Objects.equals(d.getStatus(),"1")?"正常":"下架")).collect(Collectors.toList()); - List zhengchangList = mapInfoList.stream().filter(d->Objects.equals(d.getStatus(),"1")).map(d->String.format("%s [%s] [%s]",d.getId(),d.getName(),Objects.equals(d.getStatus(),"1")?"正常":"下架")).collect(Collectors.toList()); BufferedWriter bw = null; try{ File file = File.createTempFile("error",".txt"); bw = new BufferedWriter(new FileWriter(file)); bw.write("------------------------------\n"); - bw.write("创建子系统错误【下架】的数据\n"); - bw.write(Joiner.on(",").join(xiajiaList)); - bw.write("\n\n"); - bw.write("------------------------------\n"); - bw.write("创建子系统正常【创建失败】的数据\n"); - bw.write(Joiner.on(",").join(zhengchangList)); - bw.write("\n\n\n\n"); +// bw.write("创建子系统错误【下架】的数据\n"); +// bw.write(Joiner.on(",").join(xiajiaList)); +// bw.write("\n\n"); +// bw.write("------------------------------\n"); +// bw.write("创建子系统正常【创建失败】的数据\n"); +// bw.write(Joiner.on(",").join(zhengchangList)); +// bw.write("\n\n\n\n"); bw.write("------------------------------\n"); for (ErrorMsgVO errorMsgVO : SYNC_RESULT_LIST) { bw.write(errorMsgVO.toString()); @@ -144,11 +174,10 @@ public class OldPermissionDataSyncService { for (SyncVO syncVO : syncVOList) { syncVO.permission.setIsSync(true); this.acPermissionDAO.customerSyncInsert(syncVO.permission); - for (PermissionSystemAbility sa : syncVO.getSystemAbility()) { - sa.setIsSync(true); - permissionSystemAbilityDAO.insert(sa); - } + syncVO.getSystemAbility().forEach(d->d.setIsSync(true)); } + List tmpList = syncVOList.stream().map(d->d.getSystemAbility()).flatMap(d->d.stream()).collect(Collectors.toList()); + this.permissionSystemAbilityDAO.batchInsert(tmpList); } private void insertDistribute(List distributeDataVOList){ @@ -164,15 +193,19 @@ public class OldPermissionDataSyncService { } } private void insertUserPermission(List psList){ + if(CollectionUtils.isEmpty(psList)){ + return; + } for (PermissionSubject ps : psList) { ps.setIsSync(true); - this.subjectDAO.insert(ps); +// this.subjectDAO.insert(ps); } + + this.subjectDAO.batchInsert(psList); } - private List userPermission(List voList){ + private List userPermission(List voList,Map> funMapIdMap){ List psList = Lists.newArrayList(); - Map> funMapIdMap = this.findSystemAbilityGroupMapId(); for (UserPermissionVO userPermissionVO : voList) { List mapList = funMapIdMap.get(userPermissionVO.getMapId()); if(CollectionUtils.isEmpty(mapList)){ @@ -197,18 +230,15 @@ public class OldPermissionDataSyncService { return datavoList; } - private List findAllPermission(List userPermissionList){ + private List findAllPermission(List userPermissionList,Map> funMapIdMap){ List handleDataList = this.easyBeforehand(userPermissionList); - this.abilityService.autoSynchMapSystemData(0L); - - Map> funMapIdMap = this.findSystemAbilityGroupMapId(); List syncVOList = Lists.newArrayList(); Set existPermissionIdSet = Sets.newHashSet(); for (UserPermissionVO permissionVO : handleDataList) { List mapList = funMapIdMap.get(permissionVO.getMapId()); if(CollectionUtils.isEmpty(mapList)){ log.error("{} 为找到对应的功能",permissionVO.getMapId()); - SYNC_RESULT_LIST.add(new ErrorMsgVO(ErrorType.PERSSION_NOTFIND_MAP,permissionVO,"")); + SYNC_RESULT_LIST.add(new ErrorMsgVO(ErrorType.PERSSION_NOTFIND_MAP,permissionVO,String.format("mapid[%s] 未在 rts_permission_system_ability 表中找到对应的数据",permissionVO.getMapId()))); continue; } if(!existPermissionIdSet.add(permissionVO.getPermissionId())){ @@ -251,29 +281,50 @@ public class OldPermissionDataSyncService { return null; } - private List easyBeforehand(List userPermissionList){ - Set existMapIdSet = Sets.newHashSet(); - userPermissionList.forEach(d-> { - if(Objects.isNull(d.getMapId())){ - d.setErrorData(true); - }else{ - if(existMapIdSet.add(d.getMapId())){ - Simulation.Type type = Objects.isNull(MAPID_TYPE_MAP.get(d.getMapId())) ? Simulation.Type.METRO : MAPID_TYPE_MAP.get(d.getMapId()); - RtsMapFunctionGenerateParamVO paramVO = new RtsMapFunctionGenerateParamVO(); - paramVO.setSimTypes(Arrays.asList(type)); - try{ - this.rtsMapFunctionService.generate(d.getMapId(),paramVO,0L); - }catch(Exception e){ + private void generate(MapInfo mi){ + Simulation.Type type = Simulation.Type.METRO; + GgenerateType gt = MAPID_TYPE_MAP.get(mi.getId()); + if(gt == GgenerateType.RAILWAY){ + type = Simulation.Type.RAILWAY; + this.generate(type,mi); + }else if(gt == GgenerateType.EMERGENCY){ + type = Simulation.Type.EMERGENCY; + this.generate(type,mi); + }else if(gt == GgenerateType.DAKE_STREAM){ + this.generateLpf(mi); + return; + }else{ + this.generate(type,mi); + } + } - d.setErrorData(true); - SYNC_RESULT_LIST.add(new ErrorMsgVO(ErrorType.CREATE_MAP,d,e.getMessage())); - } - } - if(Objects.isNull(d.getIsPackage())) d.setIsPackage(false); + private void generateLpf(MapInfo mi){ + try{ + this.rtsMapFunctionService.generateLpf(mi.getId(),0L); + }catch(Exception e){ + SYNC_RESULT_LIST.add(new ErrorMsgVO(ErrorType.CREATE_MAP,mi,e.getMessage())); + } + } + private void generate(Simulation.Type type,MapInfo mi){ + RtsMapFunctionGenerateParamVO paramVO = new RtsMapFunctionGenerateParamVO(); + paramVO.setSimTypes(Arrays.asList(type)); + try{ + this.rtsMapFunctionService.generate(mi.getId(),paramVO,0L); + }catch(Exception e){ + + SYNC_RESULT_LIST.add(new ErrorMsgVO(ErrorType.CREATE_MAP,mi,e.getMessage())); + } + } + private List easyBeforehand(List userPermissionList){ +// Set existMapIdSet = Sets.newHashSet(); + for (UserPermissionVO d : userPermissionList) { + if(Objects.isNull(d.getIsPackage())) d.setIsPackage(false); + if(Objects.isNull(d.getMapId())){ +// d.setErrorData(true); + continue; } - }); - userPermissionList.stream().filter(UserPermissionVO::isErrorData).collect(Collectors.toList()); - Map> userPermissionMapList = userPermissionList.stream().filter(d->!d.getIsPackage()).collect(Collectors.groupingBy(UserPermissionVO::getIsPackage)); + } + Map> userPermissionMapList = userPermissionList.stream().collect(Collectors.groupingBy(UserPermissionVO::getIsPackage)); List voList = userPermissionMapList.get(false); List packAgeVOList = userPermissionMapList.get(true); if(!CollectionUtils.isEmpty(packAgeVOList)){ @@ -390,7 +441,15 @@ public class OldPermissionDataSyncService { } } - + public enum GgenerateType { + /** 地铁 */ + METRO, + /** 铁路/大铁 */ + RAILWAY, + /** 应急调度(Emergency dispatching command system) */ + EMERGENCY, + DAKE_STREAM, + } public enum ErrorType{ CREATE_MAP, PERSSION_NOTFIND_MAP; @@ -400,7 +459,7 @@ public class OldPermissionDataSyncService { @AllArgsConstructor public static class ErrorMsgVO{ ErrorType errorType; - UserPermissionVO permissionVO; + Object permissionVO; String msg; @Override public String toString(){ diff --git a/src/main/java/club/joylink/rtss/vo/permission/sync/UserPermissionVO.java b/src/main/java/club/joylink/rtss/vo/permission/sync/UserPermissionVO.java index f3ce6a251..9b126fee9 100644 --- a/src/main/java/club/joylink/rtss/vo/permission/sync/UserPermissionVO.java +++ b/src/main/java/club/joylink/rtss/vo/permission/sync/UserPermissionVO.java @@ -34,6 +34,6 @@ public class UserPermissionVO { private Integer amount; private Integer remains; private String mapName; - private boolean errorData; +// private boolean errorData; private List permissionVO; } diff --git a/src/main/resources/mybatis/mapper/permission/SyncDAO.xml b/src/main/resources/mybatis/mapper/permission/SyncDAO.xml index 345142c89..d2f06500b 100644 --- a/src/main/resources/mybatis/mapper/permission/SyncDAO.xml +++ b/src/main/resources/mybatis/mapper/permission/SyncDAO.xml @@ -7,6 +7,6 @@ ,A.forever,A.amount,A.remains,C.name as map_name from user_permission A left join permission B on A.permission_id = B.id left join map_info C on B.map_id = C.id - where 1 = 1 and C.id is not null + where 1 = 1 and C.id is not null and C.status = '1' diff --git a/src/test/java/club/joylink/rtss/services/permission/SyncServiceTest.java b/src/test/java/club/joylink/rtss/services/permission/SyncServiceTest.java index 68f7a3f7c..c82c49d67 100644 --- a/src/test/java/club/joylink/rtss/services/permission/SyncServiceTest.java +++ b/src/test/java/club/joylink/rtss/services/permission/SyncServiceTest.java @@ -14,6 +14,7 @@ public class SyncServiceTest { private OldPermissionDataSyncService syncService; @Test public void sync(){ + this.syncService.initData(); File file = this.syncService.sync(); if(Objects.isNull(file)){