//package com.my.task;
//
//import cn.gov.customs.casp.sdk.h4a.AccreditBeanReaderHelper;
//import cn.gov.customs.casp.sdk.h4a.accredit.ws.*;
//import cn.gov.customs.casp.sdk.h4a.entity.FunctionsInApplication;
//import cn.gov.customs.casp.sdk.h4a.entity.FunctionsInRoles;
//import cn.gov.customs.casp.sdk.h4a.entity.Roles;
//import cn.gov.customs.casp.sdk.h4a.entity.UsersInRoles;
//import cn.gov.customs.casp.sdk.h4a.enumdefines.AccreditCategory;
//import cn.gov.customs.casp.sdk.h4a.enumdefines.DelegationCategories;
//import cn.gov.customs.casp.sdk.h4a.enumdefines.FunctionCategories;
//import cn.gov.customs.casp.sdk.h4a.enumdefines.RoleCategories;
//import entity.domain.core.com.my.common.SysMenu;
//import entity.domain.core.com.my.common.SysRole;
//import spring.utils.com.my.common.SpringUtils;
//import com.constant.my.H4ABasicProperty;
//import domain.com.my.system.SysRoleMenu;
//import domain.com.my.system.SysUserRole;
//import mapper.com.my.system.SysRoleDeptMapper;
//import mapper.com.my.system.SysRoleMenuMapper;
//import mapper.com.my.system.SysUserRoleMapper;
//import service.com.my.system.ISysMenuService;
//import service.com.my.system.ISysRoleService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.text.ParseException;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * 角色权限同步
// */
//@Slf4j
//@Component("syncH4ARoleTask")
//public class SyncH4ARoleTask {
//
//    public void syncMenuAndRole(){
//        log.info("-----------------开始同步权限和菜单信息-------------------");
//        AccreditBeanReaderHelper abrh = new AccreditBeanReaderHelper();
//        String rIds = "";
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        try {
//            //获取系统所有菜单
//            FunctionsInApplication[] functions = abrh
//                    .getBeanFunctionsInApplication("", AccreditCategory.None,
//                            H4ABasicProperty.APP_GUID,
//                            AccreditCategory.Code, FunctionCategories.All,
//                            "FUNC_NAME,CODE_NAME,SORT_ID,PARENT_CODE");
//            if (functions != null) {
//                ISysMenuService menuService = SpringUtils.getBean(ISysMenuService.class);
//
//                // 将所有菜单状态设置为停用
//                menuService.updateAllMenuStatus();
//                // 然后获取所有菜单
//                List<SysMenu> sysMenus = menuService.selectAllMenu();
//                Map<String, SysMenu> deptMap = sysMenus.stream().collect(Collectors.toMap(SysMenu::getMenuCode, menu -> menu));
//
//                for (FunctionsInApplication functionsInApplication : functions) {
//                    //三统一平台自带的几个功能不存入
//                    if(!functionsInApplication.getCode_name().contains("A") && functionsInApplication.getCode_name().startsWith(H4ABasicProperty.PREFIX_CODE) ){
//                        SysMenu menu = deptMap.get(functionsInApplication.getCode_name());
//                        boolean flag ;
//                        if(menu!=null){
//                            flag = false;
//                        } else {
//                            flag = true;
//                            menu = new SysMenu();
//                            menu.setCreateTime(new Date());
//                            menu.setOrderNum(Integer.valueOf(functionsInApplication.getSort_id()));
//                        }
//                        String menuName = functionsInApplication.getFunc_name().substring(H4ABasicProperty.PREFIX_NAME.length());//截取掉监控指挥_
//                        String menuCode = functionsInApplication.getCode_name().substring(H4ABasicProperty.PREFIX_CODE.length());//截取掉JKZH_
//                        menu.setMenuCode(menuCode);
//                        menu.setMenuName(menuName);
//
//                        String parent_code = functionsInApplication.getParent_code();
//                        menu.setParentCode(parent_code);
//                        menu.setStatus("0");
//                        if(flag){
//                            menuService.insertMenu(menu);
//                        } else {
//                            menuService.updateMenu(menu);
//                        }
//                    }
//                }
//                // 更新菜单 parentId
//                menuService.updateAllMenuParent();
//            }
//
//            // 获取系统所有存在角色
//            Roles[] funcs = abrh.getBeanRoles("", AccreditCategory.None,
//                    H4ABasicProperty.APP_GUID, AccreditCategory.Code,
//                    H4ABasicProperty.VIEW_GUID, AccreditCategory.Code,
//                    RoleCategories.All, "ROLE_ID,ROLE_NAME,CODE_NAME,ROLE_DESCRIPTION,SORT_ID,CREATE_TIME,MODIFY_TIME");
//            if(funcs != null){
//                ISysRoleService roleService = SpringUtils.getBean(ISysRoleService.class);
//                log.info("角色长度："+funcs.length);
//
//                SysRoleDeptMapper roleDeptMapper = SpringUtils.getBean(SysRoleDeptMapper.class);
//                // 先逻辑删除
//                roleService.deleteRole();
//                StringBuilder sb = new StringBuilder();
//                for (Roles role : funcs) {
//                    if(role.getRole_name().startsWith(H4ABasicProperty.PREFIX_NAME)){
//                        SysRole r = new SysRole();
//                        r.setH4aGuid(role.getRole_id());
//                        r.setRoleName(role.getRole_name().substring(H4ABasicProperty.PREFIX_NAME.length()));//同步过来后监控指挥_不要
//                        r.setRoleKey(role.getCode_name().substring(H4ABasicProperty.PREFIX_CODE.length())); // MSZZ_
//                        r.setRemark(role.getRole_description().substring(5));
//                        r.setRoleSort(Integer.valueOf(role.getSort_id()));
//                        r.setStatus("0");
//                        r.setDelFlag("0");
//                        r.setCreateTime(sdf.parse(role.getCreate_time()));
//                        r.setUpdateTime(sdf.parse(role.getModify_time()));
//                        r.setMenuCheckStrictly(true);
//                        r.setDeptCheckStrictly(true);
//                        roleService.insertRole(r);
//
//                        roleDeptMapper.insertAll();
//                        sb.append(role.getRole_id()).append(",");
//                    }
//                }
//                rIds = sb.substring(0, sb.length()-1);
//            }
//
//            //获取每个角色下对应的用户
//            UsersInRoles[] userRoles = abrh.getBeanUsersInRoles(H4ABasicProperty.APP_ROOT_ORG_GUID,
//                    OrganizationCategory.ORG_CUSTOMS_CODE,
//                    H4ABasicProperty.APP_GUID, AccreditCategory.Code,
//                    H4ABasicProperty.VIEW_GUID, AccreditCategory.Code,
//                    rIds, AccreditCategory.Guid, DelegationCategories.All, "USER_GUID,ROLE_VALUE");
//            if (userRoles != null) {
//                SysUserRoleMapper userRoleMapper = SpringUtils.getBean(SysUserRoleMapper.class);
//                // 先清空表中数据，再重新插入
//                userRoleMapper.deleteAll();
//                // 新增用户与角色管理
//                List<SysUserRole> list = new ArrayList<>();
//                long id = 1;
//                for (UsersInRoles user : userRoles) {
//                    SysUserRole ru = new SysUserRole();
//                    // roleid 和userid 是主键不能为空，设置值，所有数据插入后，再更新为实际值
//                    ru.setRoleId(id);
//                    ru.setUserId(id);
//                    ru.setUserGuid(user.getUser_guid());
//                    ru.setRoleGuid(user.getRole_value());
//                    list.add(ru);
//                    id++;
//                }
//                if (list.size() > 0) {
//                    userRoleMapper.batchUserRole(list);
//                    //  更新原有 long类型id
//                    userRoleMapper.updateAllId();
//                }
//            }
//
//            //获取角色对应的菜单，由于三统一只会返回功能菜单，即最下级菜单不会返回上级所以需要自己处理
//            FunctionsInRoles[] funR = abrh.getBeanFunctionsInRoles(H4ABasicProperty.APP_GUID, AccreditCategory.Code,
//                    H4ABasicProperty.VIEW_GUID, AccreditCategory.Code,
//                    rIds, AccreditCategory.Guid, "ROLE_VALUE,CODE_NAME");
//            //由于共用一个应用服务，风险防控会在一起所以单独建了系统管理员权限，上面角色剃掉了三统一自带的系统管理员、应用管理员
//            if (funR != null) {
//                SysRoleMenuMapper roleMenuMapper = SpringUtils.getBean(SysRoleMenuMapper.class);
//                //系统管理员由于是默认不能操作保存菜单，但可以查看所有这个接口返回的没有菜单信息，需要系统所有菜单接口将菜单数据全部再存一遍
//                roleMenuMapper.deleteAll();
//                List<SysRoleMenu>  list = new ArrayList<>();
//                long id = 1;
//                for (FunctionsInRoles user : funR) {
//                    if(!user.getCode_name().contains("A")&&user.getCode_name().startsWith(H4ABasicProperty.PREFIX_CODE)){
//                        SysRoleMenu ru = new SysRoleMenu();
//                        // roleid 和 menuid 是主键不能为空，设置值，所有数据插入后，再更新为实际值
//                        ru.setMenuId(id);
//                        ru.setRoleId(id);
//
//                        ru.setRoleGuid(user.getRole_value());
//                        String menuCode = user.getCode_name().substring(H4ABasicProperty.PREFIX_CODE.length());
//                        ru.setMenuCode(menuCode);
//                        list.add(ru);
//                        id++;
//                    }
////					else {
////						//如果CODE_NAME中均含有A则是系统管理员角色，只需保存一次
////						if(index == 0){
////							List<KSysMenus> allMenus = (List<KSysMenus>) kingDao.getQueryList("from KSysMenus");
////							for(KSysMenus menu :allMenus){
////								GRolePermissions ru = new GRolePermissions();
////								ru.setRoleId(user.getRole_value());
////								ru.setMenuId(menu.getMenuCode());
////								kingDao.save(ru);
////							}
////							index ++;
////						}
////					}
//                }
//                roleMenuMapper.batchRoleMenu(list);
//                //  更新 long类型id
//                roleMenuMapper.updateAllId();
//            }
//        } catch (IAccreditReaderGetRolesCupaaFaultArgsFaultFaultMessage | ParseException | IAccreditReaderGetFunctionsInApplicationCupaaFaultArgsFaultFaultMessage | IAccreditReaderGetFunctionsInRolesCupaaFaultArgsFaultFaultMessage | IAccreditReaderGetUsersInRolesCupaaFaultArgsFaultFaultMessage e) {
//            e.printStackTrace();
//        }
//        log.info("-----------------结束同步权限和菜单信息-------------------");
//
//    }
//
//}
