package com.uas.eis.serviceImpl; import com.netease.qiye.qiyeopenplatform.common.constant.ResultEnum; import com.netease.qiye.qiyeopenplatform.common.dto.open.account.AccountResp; import com.netease.qiye.qiyeopenplatform.common.dto.open.mailbox.MailBoxUnreadMsgResp; import com.netease.qiye.qiyeopenplatform.common.dto.open.unit.UnitAccountResp; import com.netease.qiye.qiyeopenplatform.sdk.QiyeOpenPlatSDK; import com.netease.qiye.qiyeopenplatform.sdk.dto.Q; import com.netease.qiye.qiyeopenplatform.sdk.dto.R; import com.netease.qiye.qiyeopenplatform.sdk.util.CommonUtils; import com.uas.eis.core.config.NetEasyConfig; import com.uas.eis.dao.BaseDao; import com.uas.eis.dto.CreateUnitResp; import com.uas.eis.dto.GetUnitListDTO; import com.uas.eis.dto.UpdateEmpReq; import com.uas.eis.entity.Employee; import com.uas.eis.entity.HrOrg; import com.uas.eis.sdk.NetEasySDK; import com.uas.eis.utils.JacksonUtil; import com.uas.eis.utils.PinyinUtils; import com.uas.eis.utils.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @Service public class NetEasyService { @Autowired @Lazy private NetEasySDK netEasySDK; @Autowired private NetEasyConfig netEasyConfig; @Autowired private UasSyncService uasSyncService; @Autowired private BaseDao baseDao; private final Logger logger = LoggerFactory.getLogger(getClass()); /** * 单点登录 * */ public String ssoLogin(String accountName){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("accountName", accountName) .addParam("pass_2fa", 1) .addHeader("qiye-sso-auth-token", netEasySDK.getSsoAuthToken()); R mapR = instanceSDK.commonInvoke(q, "/api/sso/ssoSign"); if (!mapR.getCode().equals(ResultEnum.SUCCESS.getCode())) { throw new RuntimeException("调用单点登录异常," + mapR.getCode() + ":" + mapR.getMessage()); } String ssoSign = (String) mapR.getData().get("sign"); String endpoint = (String) mapR.getData().get("endpoint"); String lang = "0"; return endpoint + "?sso_token=" + ssoSign + "&lang=" + lang+"&module=mbox.ListModule%7C%7B%22fid%22%3A1%2C%22order%22%3A%22date%22%2C%22desc%22%3Atrue%7D"; } /** * 同步人员资料 * */ public void syncEmployee(){ List employeeList = uasSyncService.getNetEasyUserList(); for (Employee employee : employeeList) { if(StringUtil.hasText(employee.getEm_neteasyid())) { if(!"离职".equals(employee.getEm_class())) { updateNetEasyEmployee(employee); if(employee.getEm_neteasystatus() == 0) { recoverNetEasyEmployee(employee); } }else { if(employee.getEm_neteasystatus()==-1) { disableNetEasyEmployee(employee); } } }else{ if(employee.getEm_isneteasy() != null && employee.getEm_isneteasy() == -1){ //开通账号 createNetEasyEmployee(employee); } } } } /** * 创建账号信息 * */ public void createNetEasyEmployee(Employee employee){ logger.info("创建邮箱账号:{}",employee.toString()); /* AccountResp getAccountResp = getNetEasyEmployee(employee); if(getAccountResp != null){ if (getAccountResp.getStatus() == 0){ //账号正常 baseDao.updateByCondition("employee","em_neteasyid='"+getAccountResp.getAccountName()+"'","em_code='"+employee.getEm_code()+"'"); logger.info("账号已存在,更新人员信息:{}",employee.toString()); return; }else if(getAccountResp.getStatus() == 1){ //账号禁用恢复账号 employee.setEm_neteasyid(getAccountResp.getAccountName()); recoverNetEasyEmployee(employee); baseDao.updateByCondition("employee","em_neteasyid='"+getAccountResp.getAccountName()+"'","em_code='"+employee.getEm_code()+"'"); return; } }*/ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); String initAccount = getNetEasyID(employee); Q q = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("accountName", initAccount) .addParam("name", employee.getEm_name()) .addParam("job", employee.getEm_position()) .addParam("jobNumber", employee.getEm_code()) .addParam("unitId", employee.getOrneteasyid()); String initPWD = employee.getEm_password(); if(! StringUtil.hasText(initPWD) || initPWD.length() <8 || ! hasThreeCharacterTypes(initPWD)){ //初始密码拼音+系统账号+SI initPWD = initAccount+employee.getEm_code()+"SI"; q.addParam("password", initAccount+employee.getEm_code()+"SI"); }else{ q.addParam("password", initPWD); } if(StringUtil.hasText(employee.getEm_mobile())){ q.addParam("mobile", employee.getEm_mobile()); } R r = instanceSDK.commonInvoke(q, "/api/open/account/createAccount"); if(StringUtil.hasText(employee.getEm_name())){} if(ResultEnum.SUCCESS.getCode() == r.getCode()){ AccountResp accountResp = (AccountResp) r.getDataBean(AccountResp.class); baseDao.updateByCondition("employee","em_neteasystatus=-1,em_neteasyid='"+accountResp.getAccountName()+"'","em_code='"+employee.getEm_code()+"'"); baseDao.execute("insert into UAPPROVALMSG(ID_,TYPE_,TITLE_,MSG_,EMS_) " + "select UAPPROVALMSG_SEQ.NEXTVAL,'TEXT','邮箱开通提醒','"+employee.getEm_name()+" 您的企业邮箱账号已创建\n" + "账号:"+initAccount+"@sisemi.com.cn\n" + "初始密码:"+initPWD+"\n" + "登录地址:https://mail.sisemi.com.cn/\n" + "您也可以通过UAS系统首页-->右上角 网易邮箱 进行SSO免密登录。',em_qywx" + " from employee where em_code='"+employee.getEm_code()+"' and em_qywx is not null"); logger.info("创建账号成功,账号名称:{}",employee.getEm_name()); }else { logger.info("创建账号失败,账号名称:{},错误信息:{}",employee.getEm_name(),r.getMessage()); } } /** * 更新账号信息 * */ public void updateNetEasyEmployee(Employee employee){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("jobNumber", employee.getEm_code()) .addParam("accountName", employee.getEm_neteasyid()); if (StringUtils.hasText(employee.getEm_position())){ q1.addParam("job", employee.getEm_position()); } if (StringUtils.hasText(employee.getEm_name())){ q1.addParam("name", employee.getEm_name()); } if (StringUtils.hasText(employee.getOrneteasyid())){ q1.addParam("unitId", employee.getOrneteasyid()); } /* if(StringUtil.hasText(employee.getEm_mobile())){ q1.addParam("mobile", employee.getEm_mobile()); }*/ R r2 = instanceSDK.commonInvoke(q1, "/api/open/account/updateAccount"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ logger.info("更新账号信息成功,账号信息:{}",employee.toString()); }else { logger.info("更新账号信息失败,账号名称:{},错误信息:{}",employee.toString(),r2.getMessage()); } } /** * 禁用账号信息 * */ public void disableNetEasyEmployee(Employee employee){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("accountName", employee.getEm_neteasyid()); R r2 = instanceSDK.commonInvoke(q1, "/api/open/account/suspendAccount"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ //禁用邮箱不更新ID baseDao.updateByCondition("employee","em_neteasystatus=0","em_code='"+employee.getEm_code()+"'"); logger.info("禁用账号成功,账号信息:{}",employee.toString()); }else { logger.info("禁用账号失败,账号名称:{},错误信息:{}",employee.toString(),r2.getMessage()); } } /** * 恢复账号 * */ public void recoverNetEasyEmployee(Employee employee){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("accountName", employee.getEm_neteasyid()); R r2 = instanceSDK.commonInvoke(q1, "/api/open/account/recoverAccount"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ baseDao.updateByCondition("employee","em_neteasystatus=-1","em_code='"+employee.getEm_code()+"'"); logger.info("恢复账号成功,账号信息:{}",employee.toString()); }else { logger.info("恢复账号失败,账号名称:{},错误信息:{}",employee.toString(),r2.getMessage()); } } /** * 获取邮箱账号 * */ public AccountResp getNetEasyEmployee(Employee employee) { QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("accountName", PinyinUtils.getCustomPinyin(employee.getEm_name())); R r2 = instanceSDK.commonInvoke(q1, "/api/open/account/getAccount"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ AccountResp accountResp = (AccountResp) r2.getDataBean(AccountResp.class); logger.info("查询账号成功,账号信息:{}",employee.toString()); return accountResp; }else { logger.info("查询账号失败,账号名称:{},错误信息:{}",employee.toString(),r2.getMessage()); return null; } } /** * 获取账号列表 * */ public void getNetEasyUserList(Integer pageNum, List userList){ logger.info("getNetEasyUserList page:{}",pageNum); QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q = Q.init(null).addParam("domain", netEasyConfig.getDomain()) .addParam("pageSize", 50) .addParam("pageNum", pageNum); R r = instanceSDK.commonInvoke(q, "/api/open/unit/getAccountList"); if(ResultEnum.SUCCESS.getCode() == r.getCode()){ UnitAccountResp unitAccountResp = (UnitAccountResp) r.getDataBean(UnitAccountResp.class); userList.addAll(unitAccountResp.getList()); if (unitAccountResp.getCount() > unitAccountResp.getPageNum()*50){ getNetEasyUserList(pageNum+1, userList); } } } /* 初始化人员资料 */ public void initEmployee(){ List userList = new ArrayList(); getNetEasyUserList(1, userList); List employeeList = uasSyncService.getNetEasyUserList(); for (AccountResp accountResp : userList) { if (accountResp.getName().contains("曾泽华") || accountResp.getName().contains("师盼博")) { logger.info("账号信息:{}",accountResp.toString()); } //Optional employeeOptional = employeeList.stream().filter(employee -> employee.getEm_name().equals(accountResp.getName())).findFirst(); //employeeOptional.ifPresent(employee -> baseDao.updateByCondition("employee", "em_neteasyid='" + accountResp.getAccountName() + "'", "em_code='" + employee.getEm_code() + "'")); } /* List employeeList = uasSyncService.getNetEasyUserList(); for (Employee employee : employeeList) { if( StringUtil.hasText(employee.getEm_neteasyid())) { updateNetEasyEmployee(employee); }else{ if(StringUtil.hasText(employee.getEm_emptype())&& (employee.getEm_emptype().startsWith("管理序列") || "技术序列".equals(employee.getEm_emptype()) || "营销序列".equals(employee.getEm_emptype()) || "职能序列".equals(employee.getEm_emptype()))){ //开通账号 createNetEasyEmployee(employee); } } }*/ } /** * 组织资料同步 * */ public void syncNetEasyOrg(){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q = Q.init(null) .addParam("domain", netEasyConfig.getDomain()); R r1 = instanceSDK.commonInvoke(q, "/api/open/unit/getUnitList"); List orgList = uasSyncService.getADOrgList(); List unitList = null; if(ResultEnum.SUCCESS.getCode() == r1.getCode()){ logger.info("获取组织列表成功"); List> dataList = (List>) r1.getData(); String jsonArrayStr = JacksonUtil.toJsonArray(dataList); unitList = CommonUtils.parseArray(jsonArrayStr, GetUnitListDTO.class); for (HrOrg org : orgList) { Optional unitOptional = unitList.stream().filter(unit -> unit.getUnitName().equals(org.getOr_name()) || unit.getUnitId().equals(org.getOr_neteasyid())).findFirst(); if(!StringUtils.hasText(org.getOr_neteasyid()) && "已审核".equals(org.getOr_status()) ){ //邮箱组织ID为空,判断是否需要创建组织 if(unitOptional.isPresent()){ logger.info("更新组织id为空,组织编号:{},组织名称:{}",org.getOr_code(),org.getOr_name()); baseDao.updateByCondition("HRORG","OR_NETEASYID='"+unitOptional.get().getUnitId()+"'","OR_CODE='"+org.getOr_code()+"'"); }else { logger.info("创建组织组织id为空,组织编号:{},组织名称:{},父组织:{}",org.getOr_code(),org.getOr_name(),org.getParentnetEasyId()); createNetEasyOrg(org, StringUtil.hasText(org.getParentnetEasyId()) ? org.getParentnetEasyId() : null ); } }else if(StringUtils.hasText(org.getOr_neteasyid())){ if(unitOptional.isPresent()){ //邮箱组织ID不为空,且邮箱服务器存在对应的组织 if ("已禁用".equals(org.getOr_status())){ //删除组织 logger.info("删除组织,组织id:{},组织编号:{},组织名称:{}",org.getOr_neteasyid(),org.getOr_code(),org.getOr_name()); deleteNetEasyOrg(org); }else if(!"已禁用".equals(org.getOr_status()) && !unitOptional.get().getUnitName().equals(org.getOr_name())){ //更新组织 logger.info("更新组织名称,组织id:{},组织编号:{},组织名称:{}",org.getOr_neteasyid(),org.getOr_code(),org.getOr_name()); updateNetEasyOrg(org); } } else { //邮箱组织ID不为空,但网易邮箱不存在如后台删除等,需要重新创建组织 if("已审核".equals(org.getOr_status())){ logger.info("重新创建组织,组织id不为空,组织编号:{},组织名称:{}",org.getOr_code(),org.getOr_name()); createNetEasyOrg(org, StringUtil.hasText(org.getParentnetEasyId()) ? org.getParentnetEasyId() : null ); } } } } //整体再刷新一次层级,防止一次性新增多层级组织 refreshNetEasyOrg(); } } /* * init初始化 * */ public void initNetEasyOrg() { QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q = Q.init(null) .addParam("domain", netEasyConfig.getDomain()); R r1 = instanceSDK.commonInvoke(q, "/api/open/unit/getUnitList"); List orgList = uasSyncService.getADOrgList(); if(ResultEnum.SUCCESS.getCode() == r1.getCode()){ List> dataList = (List>) r1.getData(); String jsonArrayStr = JacksonUtil.toJsonArray(dataList); List unitList = CommonUtils.parseArray(jsonArrayStr, GetUnitListDTO.class); for (GetUnitListDTO unit : unitList) { Optional orgOptional = orgList.stream().filter(org -> org.getOr_name().equals(unit.getUnitName())).findFirst(); if(orgOptional.isPresent()){ baseDao.updateByCondition("HRORG","OR_NETEASYID='"+unit.getUnitId()+"'","OR_CODE='"+orgOptional.get().getOr_code()+"'"); } } } for (HrOrg org : orgList) { if(org.getOr_neteasyid() == null && "已审核".equals(org.getOr_status())){ createNetEasyOrg(org, null); } } refreshNetEasyOrg(); } /** * 刷新组织层级 * */ public void refreshNetEasyOrg() { logger.info("刷新组织层级"); QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q = Q.init(null) .addParam("domain", netEasyConfig.getDomain()); R r1 = instanceSDK.commonInvoke(q, "/api/open/unit/getUnitList"); List orgList = uasSyncService.getADOrgList(); List unitList = null; if(ResultEnum.SUCCESS.getCode() == r1.getCode()){ List> dataList = (List>) r1.getData(); String jsonArrayStr = JacksonUtil.toJsonArray(dataList); unitList = CommonUtils.parseArray(jsonArrayStr, GetUnitListDTO.class); } if (unitList != null){ for (HrOrg org : orgList) { Optional unitOptional = unitList.stream().filter(unit -> unit.getUnitId().equals(org.getOr_neteasyid())).findFirst(); if(unitOptional.isPresent()){ if(StringUtil.hasText(org.getParentnetEasyId()) && !org.getParentnetEasyId().equals(unitOptional.get().getUnitParentId())){ logger.info("组织{}的父组织id错误,正确父组织id:{},错误父组织id:{}",org.getOr_name(),unitOptional.get().getUnitParentId(),org.getParentnetEasyId()); moveNetEasyOrg(org,org.getParentnetEasyId()); } } } } } /** * 创建组织 * */ public String createNetEasyOrg(HrOrg org,String parentId){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("unitName", org.getOr_name()); if (parentId != null){ q1.addParam("parentId", parentId); } R r2 = instanceSDK.commonInvoke(q1, "/api/open/unit/createUnit"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ CreateUnitResp createUnitResp = (CreateUnitResp) r2.getDataBean(CreateUnitResp.class); baseDao.updateByCondition("HRORG","OR_NETEASYID='"+createUnitResp.getUnitId()+"'","OR_CODE='"+org.getOr_code()+"'"); logger.info("创建组织成功,组织id:{},组织编号:{},组织名称:{} ,父级组织:{}",createUnitResp.getUnitId(),org.getOr_code(),org.getOr_name() ,parentId); return createUnitResp.getUnitId(); }else { return null; } } /** * 删除组织 * */ public void deleteNetEasyOrg(HrOrg org){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("unitId", org.getOr_neteasyid()); R r2 = instanceSDK.commonInvoke(q1, "/api/open/unit/deleteUnit"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ baseDao.updateByCondition("HRORG","OR_NETEASYID=null","OR_CODE='"+org.getOr_code()+"'"); logger.info("删除组织成功,组织id:{},组织编号:{},组织名称:{}",org.getOr_neteasyid(),org.getOr_code(),org.getOr_name()); }else { logger.info("删除组织失败,组织id:{},组织编号:{},组织名称:{}",org.getOr_neteasyid(),org.getOr_code(),org.getOr_name()); } } /** *更新组织名称 * */ public void updateNetEasyOrg(HrOrg org ){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("unitId", org.getOr_neteasyid()) .addParam("unitName", org.getOr_name()); R r2 = instanceSDK.commonInvoke(q1, "/api/open/unit/updateUnit"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ logger.info("更新组织成功,组织id:{},组织编号:{},组织名称:{}",org.getOr_neteasyid(),org.getOr_code(),org.getOr_name()); } } /** * 移动组织 * */ public void moveNetEasyOrg(HrOrg org ,String parentId){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("unitId", org.getOr_neteasyid()) .addParam("unitParentId", parentId); R r2 = instanceSDK.commonInvoke(q1, "/api/open/unit/moveUnit"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ logger.info("移动组织成功,组织id:{},父组织id:{}",org.getOr_neteasyid(),parentId); } } /** * 待办邮件 * */ public Number getUnreadMsg(String accountName){ QiyeOpenPlatSDK instanceSDK = netEasySDK.getSDKInstance(); Q q1 = Q.init(null) .addParam("domain", netEasyConfig.getDomain()) .addParam("accountName", accountName) .addParam("fid",1) .addParam("needAll",0) .addParam("countByFolder",0); R r2 = instanceSDK.commonInvoke(q1, "/api/open/mailbox/getUnreadMsg"); if(ResultEnum.SUCCESS.getCode() == r2.getCode()){ MailBoxUnreadMsgResp getUnreadMsgResp = (MailBoxUnreadMsgResp) r2.getDataBean(MailBoxUnreadMsgResp.class); return getUnreadMsgResp.getCount(); } return 0; } public boolean hasThreeCharacterTypes(String password) { int typeCount = 0; // 检查是否包含大写字母 if (password.matches(".*[A-Z].*")) typeCount++; // 检查是否包含小写字母 if (password.matches(".*[a-z].*")) typeCount++; // 检查是否包含数字 if (password.matches(".*[0-9].*")) typeCount++; // 检查是否包含特殊符号(非字母数字) if (password.matches(".*[^A-Za-z0-9].*")) typeCount++; return typeCount >= 3; } public String getNetEasyID(Employee employee) { Object accountid= baseDao.getFieldDataByCondition("dual","get_4a_id('"+employee.getEm_code()+"','"+PinyinUtils.getCustomPinyin(employee.getEm_name())+"','NETEASY')","1=1"); return String.valueOf(accountid); } }