package cn.com.goldenwater.dcproj.service.impl.synchronous; import cn.com.goldenwater.dcproj.dao.BisInspAllOrganizationZjDao; import cn.com.goldenwater.dcproj.dao.BisInspAllRlationPersOrgaDao; import cn.com.goldenwater.dcproj.dao.BisInspAllRlationPersZjDao; import cn.com.goldenwater.dcproj.model.BisInspAllOrganizationZj; import cn.com.goldenwater.dcproj.model.BisInspAllRlationPersOrga; import cn.com.goldenwater.dcproj.model.BisInspAllRlationPersZj; import cn.com.goldenwater.dcproj.service.SynchronousDataService; import cn.com.goldenwater.dcproj.utils.http.SsoHttpHelper; import com.alibaba.fastjson.JSON; import com.dcxx.framework.watermanagesdk.utils.EncryptHelper; import io.micrometer.core.instrument.util.StringUtils; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import com.dcxx.framework.watermanagesdk.model.ResponseMessage; import org.apache.commons.collections.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * @Description 浙江水管理平台定时任务获取部门人员信息入库 * @date 2020-07-15 * 水管理平台用户同步流程 * 设置定时任务,定时获取权限下部门以及用户数据 * 获取业务接口信息时,在请求头中添加waterManageAccessToken * 获取权限下部门数据过后,部门数据按接口返回的父子级关系保存, * 用户信息按接口返回信息保存。 * * 设计页面维护本地用户数据与浙江用户数据关系。 */ @Service @Transactional public class SynchronousDataServiceImpl implements SynchronousDataService { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private SsoHttpHelper ssoHttpHelper; @Autowired private BisInspAllOrganizationZjDao bisInspAllOrganizationZjDao; @Autowired private BisInspAllRlationPersZjDao bisInspAllRlationPersZjDao; @Autowired private BisInspAllRlationPersOrgaDao bisInspAllRlationPersOrgaDao; @Value("${watermanage.appsecret}") private String appsecret; // 定义接口常量 public static String GET_ACCESS_TOKEN = "/service/v1/token/getAccessToken";//获取access_token public static String LIST_SUB_DEPT_IDS = "/service/v1/api/102/dept/listSubDeptIds";//获取直属下级部门ID列表 public static String LIST_SUB_DEPTS = "/service/v1/api/102/dept/listSubDepts";//获取直属下级部门信息 public static String LIST_ALL_SUB_DEPTS = "/service/v1/api/102/dept/listAllSubDepts";//获取所有的下级部门信息 public static String GET_DEPT_INFO = "/service/v1/api/102/dept/getDeptInfo";//获取部门详情 public static String LIST_SIMPLE_DEPT_USER = "/service/v1/api/102/user/listSimpleDeptUser";//根据部门获取用户信息列表 public static String LIST_DEPT_USER = "/service/v1/api/102/user/listDeptUser";//获取部门用户 public static String GET_USER_INFO = "/service/v1/api/102/user/getUserInfo";//获取用户详情 public static String GET_ORG_SCOPE = "/service/v1/api/102/auth/getOrgScope";//获取当前token的权限范围 /** * @Description 用户同步流程 * 获取通讯录授权范围(返回授权范围的部门编码及独立的授权用户编码) * 根据授权范围返回的部门及人员编码获取对应的部门及下级部门和独立授权人员信息 * 根据获取的部门信息获取部门下属的人员信息 * @date 2020-07-15 */ @Override public void listAll() throws Exception { //获取waterManageAccessToken,如果为空则请求waterManageAccessToken,保存至redis,时长为7300秒,过期后需重新生成放入 String waterManageAccessToken = ssoHttpHelper.getAccessToken(); logger.info("waterManageAccessToken:" + waterManageAccessToken + ",--------开始获取权限下部门信息"); //调用通讯录接口能获取哪些部门和员工的数据是受通讯录权限范围控制的。 // 在开发者获取到可以访问企业通讯录接口的access_token后,正式获取通讯录数据前,应该先调用本接口,获取当前token的权限范围 Map OrgScopeMap = getOrgScope(waterManageAccessToken); Map authOrgScopes = MapUtils.getMap(OrgScopeMap, "authOrgScopes"); List authedDepts = (List) authOrgScopes.get("authedDept"); // 入库权限部门信息; if (authedDepts.size() > 0) { logger.info("入库开始" + authedDepts); for (String authedDept : authedDepts) { getAuthedDepts(authedDept, waterManageAccessToken); listAllDepts(authedDept, waterManageAccessToken); } } } /** * @Description //获取当前token的权限范围 * @date 2020-07-15 * 获取权限下部门以及用户数据 * 获取业务接口信息时,在请求头中添加waterManageAccessToken * 获取权限下部门数据过后,部门数据按接口返回的父子级关系保存, * 用户信息按接口返回信息保存。 */ public Map getOrgScope(String waterManageAccessToken) throws Exception { ResponseMessage responseMessage = ssoHttpHelper.allMethod(null, GET_ORG_SCOPE, waterManageAccessToken); if (0 == responseMessage.getStatus()) { Map map = (Map) responseMessage.getMessage(); return map; } else { this.logger.info("请求业务接口异常 ==> " + responseMessage.getErrmsg()); throw new Exception("请求业务接口异常 ==> " + responseMessage.getErrmsg()); } } /** * @Description获取权限下部门详细信息 * @date 2020-07-15 */ public void getAuthedDepts(String authedDept, String waterManageAccessToken) throws Exception { this.logger.info("权限部门id ==> " + authedDept); Map map = new HashMap<>(); map.put("deptId", authedDept); ResponseMessage responseMessage = ssoHttpHelper.allMethod(map, GET_DEPT_INFO, waterManageAccessToken); if (0 == responseMessage.getStatus()) { Map resultMap = (Map) responseMessage.getMessage(); BisInspAllOrganizationZj Dept = JSON.parseObject(JSON.toJSONString(resultMap), BisInspAllOrganizationZj.class); //获取部门下人员信息 listSimpleDeptUser(Dept.getOrganizationId(), waterManageAccessToken); if (Dept != null && StringUtils.isNotBlank(Dept.getOrganizationId())) { int deptcoun = bisInspAllOrganizationZjDao.selectCount(Dept.getOrganizationId()); if (deptcoun == 0) { this.logger.info("新增权限部门信息" + authedDept); bisInspAllOrganizationZjDao.insert(Dept); } } } else { this.logger.info("请求获取权限下部门详细信息业务接口异常 ==> " + responseMessage.getErrmsg()); } } /** * @Description获取权限下部门的所有下级部门详细信息 * @date 2020-07-15 */ public void listAllDepts(String authedDepts, String waterManageAccessToken) throws Exception { Map map = new HashMap<>(); map.put("parentId", authedDepts); ResponseMessage responseMessage = ssoHttpHelper.allMethod(map, LIST_ALL_SUB_DEPTS, waterManageAccessToken); if (0 == responseMessage.getStatus()) { JSONObject jsonObject = JSONObject.fromObject(responseMessage); JSONArray organizationJsonArray = jsonObject.getJSONArray("message"); List bisInspAllOrganizationZjList = JSONArray.toList(organizationJsonArray, new BisInspAllOrganizationZj(), new JsonConfig()); //获取权限下部门下级部门的所有信息 for (BisInspAllOrganizationZj bisInspAllOrganizationZjxj : bisInspAllOrganizationZjList) { //请求所有下级部门下属人员信息 listSimpleDeptUser(bisInspAllOrganizationZjxj.getOrganizationId(), waterManageAccessToken); if (bisInspAllOrganizationZjxj != null && StringUtils.isNotBlank(bisInspAllOrganizationZjxj.getOrganizationId())) { int deptcount = bisInspAllOrganizationZjDao.selectCount(bisInspAllOrganizationZjxj.getOrganizationId()); if (deptcount == 0) { this.logger.info("新增权限下部门下级部门的所有信息" + authedDepts); bisInspAllOrganizationZjDao.insert(bisInspAllOrganizationZjxj); } } } } else { this.logger.info("请求业务接口获取所有的下级部门信息异常 ==> " + responseMessage.getErrmsg()); } } /** * @Description根据部门获取用户信息列表 * @date 2020-07-15 */ public void listSimpleDeptUser(String deptId, String waterManageAccessToken) throws Exception { Map map = new HashMap<>(); map.put("deptId", deptId); //获取所有下级部门信息 ResponseMessage responseMessage = ssoHttpHelper.allMethod(map, LIST_SIMPLE_DEPT_USER, waterManageAccessToken); if (0 == responseMessage.getStatus()) { JSONObject jsonObject = JSONObject.fromObject(responseMessage); JSONArray listSimpleDeptUsers = jsonObject.getJSONArray("message"); List> listSimpleDeptUserList = JSONArray.toList(listSimpleDeptUsers, new HashMap<>(), new JsonConfig()); for (Map listSimpleDeptUserMap : listSimpleDeptUserList) { String userCode = listSimpleDeptUserMap.get("userCode").toString(); //同步部门下用户信息 getAuthedUsers(userCode, waterManageAccessToken); } } else { this.logger.info("请求业务接口获取所有的下级部门信息异常 ==> " + responseMessage.getErrmsg()); } } /** * @Description获取人员详细信息 * @date 2020-07-15 */ public void getAuthedUsers(String authedUser, String waterManageAccessToken) throws Exception { Map map = new HashMap<>(); map.put("userCode", authedUser); ResponseMessage responseMessage = ssoHttpHelper.allMethod(map, GET_USER_INFO, waterManageAccessToken); if (0 == responseMessage.getStatus()) { Map resultMap = (Map) responseMessage.getMessage(); this.logger.info("权限用户id ==> " + authedUser); BisInspAllRlationPersZj user = JSON.parseObject(JSON.toJSONString(resultMap), BisInspAllRlationPersZj.class); if (user != null && StringUtils.isNotBlank(user.getUserCode())) { int pers = bisInspAllRlationPersZjDao.selectCount(user.getUserCode()); if (0 == pers) { user.setUserName(EncryptHelper.aesDecrypt(user.getUserName(), appsecret)); user.setMobile(EncryptHelper.aesDecrypt(user.getMobile(), appsecret)); bisInspAllRlationPersZjDao.insert(user); JSONObject jsonObject = JSONObject.fromObject(responseMessage.getMessage()); JSONArray listSimpleDeptUsers = jsonObject.getJSONArray("dept"); List depts = JSONArray.toList(listSimpleDeptUsers, new BisInspAllRlationPersOrga(), new JsonConfig()); for (BisInspAllRlationPersOrga dept : depts) { int persOrgacount = bisInspAllRlationPersOrgaDao.selectCount(user.getUserCode(), dept.getDeptId()); if (persOrgacount == 0) { dept.setUserCode(user.getUserCode()); this.logger.info("新增用户部门信息 ==》" + user.getUserCode() + "部门信息:==》" + dept.getDeptId()); bisInspAllRlationPersOrgaDao.insert(dept); } } } else { this.logger.info("用户数据存在 ==> " + authedUser); } } } else { this.logger.info("请求获取人员详细信息业务接口异常 ==> " + responseMessage.getErrmsg()); } } @Override public String getAccessToken() throws Exception { String waterManageAccessToken = ssoHttpHelper.getAccessToken(); return waterManageAccessToken; } }