package jnpf.message.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jnpf.base.UserInfo; import jnpf.base.entity.SuperBaseEntity; import jnpf.base.service.SysconfigService; import jnpf.constant.CodeConst; import jnpf.exception.WxErrorException; import jnpf.message.entity.SynThirdInfoEntity; import jnpf.message.model.message.DingTalkDeptModel; import jnpf.message.model.message.QyWebChatDeptModel; import jnpf.message.model.message.QyWebChatUserModel; import jnpf.message.service.SynThirdInfoService; import jnpf.message.service.SynThirdQyService; import jnpf.base.util.SynQyWebChatUtil; import jnpf.message.util.SynThirdConsts; import jnpf.model.SocialsSysConfig; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.PositionEntity; import jnpf.permission.entity.UserEntity; import jnpf.permission.entity.UserRelationEntity; import jnpf.permission.model.organize.OrganizeModel; import jnpf.permission.service.*; import jnpf.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.Assert; import java.text.ParseException; import java.util.*; import java.util.stream.Collectors; /** * 本系统的公司、部门、用户与企业微信的同步 * * @版本: V3.1.0 * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com) * @作者: JNPF开发平台组 * @日期: 2021/4/27 11:12 */ @Component public class SynThirdQyServiceImpl implements SynThirdQyService { public static final String DEFAULT_POS = "默认岗位"; @Autowired private SynThirdInfoService synThirdInfoService; @Autowired private UserService userService; @Autowired private PositionService positionService; @Autowired private OrganizeService organizeService; @Autowired private SysconfigService sysconfigService; @Autowired private UserRelationService userRelationService; @Autowired private CodeNumService codeNumService; //------------------------------------本系统同步公司、部门到企业微信------------------------------------- /** * 根据部门的同步表信息判断同步情况 * 不带第三方错误定位判断的功能代码 20210604 * * @param synThirdInfoEntity * @return */ public JSONObject checkDepartmentSysToQy(SynThirdInfoEntity synThirdInfoEntity) { JSONObject retMsg = new JSONObject(); retMsg.put("code", true); retMsg.put("flag", ""); retMsg.put("error", ""); if (BeanUtil.isEmpty(synThirdInfoEntity)||synThirdInfoEntity.getThirdObjId()==null) { // 上级部门未同步 retMsg.put("code", false); retMsg.put("flag", "3"); retMsg.put("error", "部门未同步到企业微信!"); }else { if (synThirdInfoEntity.getThirdObjId().equals("-1")) { retMsg.put("code", true); } // 同步表的企业微信ID为空 assert synThirdInfoEntity.getThirdObjId() != null; if (synThirdInfoEntity.getThirdObjId().isEmpty() || "null".equals(synThirdInfoEntity.getThirdObjId())) { retMsg.put("code", false); retMsg.put("flag", "2"); retMsg.put("error", "同步表中部门对应的企业微信ID为空!"); } } return retMsg; } /** * 同步到企业微信的部门名称、部门英文名称是否重复 * 有带第三方错误定位判断的功能代码 20210604 * @param isEnglish * @param name * @param parentId * @param id * @param qyDeptList * @return */ // public JSONObject checkDeptObjectNameSysToQy(boolean isEnglish, String name, String parentId, String id, List qyDeptList, // String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType, // Integer dataType, String sysObjId, String thirdObjId, String deptFlag){ // boolean isDiff = false; // JSONObject retMsg = new JSONObject(); // retMsg.put("code",true); // retMsg.put("error",""); // // // 创建时:判断同一个层级的部门名称、部门英文名称不能重复 // if(StringUtil.isEmpty(id)){ // isDiff = qyDeptList.stream().filter(t -> t.getName().equals(name) && t.getParentid().toString().equals(parentId)).count() > 0 ? true : false; // }else{ // isDiff = qyDeptList.stream().filter(t -> t.getName().equals(name) && t.getParentid().toString().equals(parentId) && !(t.getId().toString().equals(id)) ).count() > 0 ? true : false; // } // if(isDiff){ // // 同步失败 // Integer synState = SynThirdConsts.SYN_STATE_FAIL; // String description = deptFlag + (isEnglish ? "同一层次的部门英文名称重复" : "同一层次的部门名称重复"); // // // 更新同步表 // saveSynThirdInfoEntity(opType,synThirdInfoEntity,thirdType,dataType,sysObjId,thirdObjId,synState,description); // // retMsg.put("code", false); // retMsg.put("error",description); // } // return retMsg; // } /** * 检查部门中文名称与英文名称是否相同 * * @param cnName * @param EnName * @param opType * @param synThirdInfoEntity * @param thirdType * @param dataType * @param sysObjId * @param thirdObjId * @param deptFlag * @return */ public JSONObject checkCnEnName(String cnName, String EnName, String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType, Integer dataType, String sysObjId, String thirdObjId, String deptFlag) { JSONObject retMsg = new JSONObject(); retMsg.put("code", true); retMsg.put("error", ""); if (cnName.equals(EnName)) { // 同步失败 Integer synState = SynThirdConsts.SYN_STATE_FAIL; String description = deptFlag + "部门中文名称与英文名称不能相同"; // 更新同步表 saveSynThirdInfoEntity(opType, synThirdInfoEntity, thirdType, dataType, sysObjId, thirdObjId, synState, description, ""); retMsg.put("code", false); retMsg.put("error", description); } return retMsg; } /** * 将组织、用户的信息写入同步表 * * @param opType "add":创建 “upd”:修改 * @param synThirdInfoEntity 本地同步表信息 * @param thirdType 第三方类型 * @param dataType 数据类型 * @param sysObjId 本地对象ID * @param thirdObjId 第三方对象ID * @param synState 同步状态(0:未同步;1:同步成功;2:同步失败) * @param description */ public void saveSynThirdInfoEntity(String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType, Integer dataType, String sysObjId, String thirdObjId, Integer synState, String description, String thirdName) { UserInfo userInfo = UserProvider.getUser(); SynThirdInfoEntity entity = new SynThirdInfoEntity(); String compValue = SynThirdConsts.OBJECT_OP_ADD; if (compValue.equals(opType)) { entity.setId(RandomUtil.uuId()); entity.setThirdType(thirdType); entity.setDataType(dataType); entity.setSysObjId(sysObjId); entity.setThirdObjId(thirdObjId); entity.setEnabledMark(synState); entity.setThirdName(thirdName); // 备注当作同步失败信息来用 entity.setDescription(description); entity.setCreatorUserId(userInfo.getUserId()); entity.setCreatorTime(DateUtil.getNowDate()); entity.setLastModifyUserId(userInfo.getUserId()); // 修改时间当作最后同步时间来用 entity.setLastModifyTime(DateUtil.getNowDate()); synThirdInfoService.create(entity); } else { entity = synThirdInfoEntity; entity.setThirdName(thirdName); entity.setThirdType(thirdType); entity.setDataType(dataType); entity.setThirdObjId(thirdObjId); entity.setEnabledMark(synState); // 备注当作同步失败信息来用 entity.setDescription(description); entity.setLastModifyUserId(userInfo.getUserId()); // 修改时间当作最后同步时间来用 entity.setLastModifyTime(DateUtil.getNowDate()); synThirdInfoService.update(entity.getId(), entity); } } /** * 往企业微信创建部门 * 有带错误定位判断的功能代码 20210604 * @param isBatch 是否批量(批量不受开关限制) * @param deptEntity * @return * @throws WxErrorException */ // @Override // public JSONObject createDepartmentSysToQy(boolean isBatch, OrganizeEntity deptEntity) throws WxErrorException { // SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getQyhCorpId(); // String corpSecret = config.getQyhCorpSecret(); // String compValue = SynThirdConsts.OBJECT_TYPE_COMPANY; // // 单条记录执行时,受开关限制 // int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); // JSONObject tokenObject = new JSONObject(); // String access_token = ""; // JSONObject retMsg = new JSONObject(); // JSONObject object = new JSONObject(); // List qyDeptList = new ArrayList<>(); // String thirdObjId = ""; // Integer synState = 0; // String description = ""; // boolean isDeptDiff = true; // String deptFlag = "创建:"; // // // 返回值初始化 // retMsg.put("code", true); // retMsg.put("error", "创建:系统未设置单条同步"); // // // 支持同步 // if(qyhIsSyn==1){ // // 获取 access_token 值 // tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); // access_token = tokenObject.getString("access_token"); // // if (access_token != null && !"".equals(access_token)) { // // 获取企业微信上的所有部门列表信息 // JSONObject deptObject = SynQyWebChatUtil.getDepartmentList(SynThirdConsts.QY_ROOT_DEPT_ID,access_token); // if(deptObject.getBoolean("code")) { // qyDeptList = JsonUtil.getJsonToList(deptObject.getString("department"), QyWebChatDeptModel.class); // }else{ // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + "获取企业微信的部门列表信息失败"; // // retMsg.put("code", false); // retMsg.put("error", description); // retMsg.put("retDeptId", "0"); // // // 更新同步表 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD,null,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } // // object.put("id", null); // // name:必填项,同一个层级的部门名称不能重复 // // name_en:必填项,同一个层级的部门名称不能重复 // // name与name_en的值不能相同,否则会报错, 20210429 // object.put("name", deptEntity.getFullName()); // object.put("name_en", deptEntity.getEnCode()); // // 从本地数据库的同步表获取对应的企业微信ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理 // if(compValue.equals(deptEntity.getCategory()) && "-1".equals(deptEntity.getParentId())){ // //顶级节点时,企业微信的父节点设置为1 // object.put("parentid", 1); // }else{ // SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,deptEntity.getParentId()); // // retMsg = checkDepartmentSysToQy(synThirdInfoEntity,qyDeptList); // isDeptDiff = retMsg.getBoolean("code"); // if(isDeptDiff) { // object.put("parentid", synThirdInfoEntity.getThirdObjId()); // } // } // object.put("order", deptEntity.getSortCode()); // // // 创建时:部门中文名称与英文名称不能相同 // retMsg = checkCnEnName(object.getString("name"),object.getString("name_en"),SynThirdConsts.OBJECT_OP_ADD,null, // Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY),Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 创建时:判断同一个层级的部门中文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(false,object.getString("name"),object.getString("parentid"),thirdObjId,qyDeptList, // SynThirdConsts.OBJECT_OP_ADD,null,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 创建时:判断同一个层级的部门英文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(true,object.getString("name_en"),object.getString("parentid"),thirdObjId,qyDeptList, // SynThirdConsts.OBJECT_OP_ADD,null,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // if(isDeptDiff) { // if(qyhIsSyn==1) { // // 往企业微信写入公司或部门 // retMsg = SynQyWebChatUtil.createDepartment(object.toJSONString(), access_token); // // // 往同步写入本系统与第三方的对应信息 // if (retMsg.getBoolean("code")) { // // 同步成功 // thirdObjId = retMsg.getString("retDeptId"); // synState = SynThirdConsts.SYN_STATE_OK; // } else { // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + retMsg.getString("error"); // } // }else{ // // 未设置单条同步,归并到未同步状态 // // 未同步 // synState = SynThirdConsts.SYN_STATE_NO; // description = deptFlag + "系统未设置单条同步"; // // retMsg.put("code", true); // retMsg.put("error", description); // retMsg.put("retDeptId", "0"); // } // }else{ // // 同步失败,上级部门无对应的企业微信ID // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + "部门所属的上级部门未同步到企业微信"; // // retMsg.put("code", false); // retMsg.put("error", description); // retMsg.put("retDeptId", "0"); // } // }else{ // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + "access_token值为空,不能同步信息"; // // retMsg.put("code", false); // retMsg.put("error", description); // retMsg.put("retDeptId", "0"); // } // } // // // 更新同步表 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD,null,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } /** * 往企业微信更新部门 * 有带错误定位判断的功能代码 20210604 * @param isBatch 是否批量(批量不受开关限制) * @param deptEntity * @return * @throws WxErrorException */ // @Override // public JSONObject updateDepartmentSysToQy(boolean isBatch, OrganizeEntity deptEntity) throws WxErrorException { // SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getQyhCorpId(); // String corpSecret = config.getQyhCorpSecret(); // String compValue = SynThirdConsts.OBJECT_TYPE_COMPANY; // // 单条记录执行时,受开关限制 // int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); // JSONObject tokenObject = new JSONObject(); // String access_token = ""; // JSONObject retMsg = new JSONObject(); // JSONObject object = new JSONObject(); // List qyDeptList = new ArrayList<>(); // SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity(); // String opType = ""; // Integer synState = 0; // String description = ""; // String thirdObjId = ""; // SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity(); // boolean isDeptDiff = true; // String deptFlag = "更新:"; // // // 返回值初始化 // retMsg.put("code", true); // retMsg.put("error", "系统未设置单条同步"); // // // 支持同步,设置需要同步到企业微信的对象属性值 // if(qyhIsSyn==1) { // // 获取 access_token // tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); // access_token = tokenObject.getString("access_token"); // // // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,deptEntity.getId()); // // if (access_token != null && !"".equals(access_token)) { // // 获取企业微信上的所有部门列表信息 // JSONObject deptObject = SynQyWebChatUtil.getDepartmentList(SynThirdConsts.QY_ROOT_DEPT_ID,access_token); // if(deptObject.getBoolean("code")) { // qyDeptList = JsonUtil.getJsonToList(deptObject.getString("department"), QyWebChatDeptModel.class); // }else{ // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + "获取企业微信的部门列表信息失败"; // // retMsg.put("code", false); // retMsg.put("error", description); // // // 更新同步表 // saveSynThirdInfoEntity(opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } // // object.put("id", null); // object.put("name", deptEntity.getFullName()); // object.put("name_en", deptEntity.getEnCode()); // // 从本地数据库的同步表获取对应的企业微信ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理 // if(compValue.equals(deptEntity.getCategory()) && "-1".equals(deptEntity.getParentId())){ // //顶级节点时,企业微信的父节点设置为1 // object.put("parentid", 1); // } else { // // 判断上级部门的合法性 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,deptEntity.getParentId()); // retMsg = checkDepartmentSysToQy(synThirdInfoEntity, qyDeptList); // isDeptDiff = retMsg.getBoolean("code"); // if (isDeptDiff) { // object.put("parentid", synThirdInfoEntity.getThirdObjId()); // } // } // object.put("order", deptEntity.getSortCode()); // // // 上级部门检查是否异常 // if(isDeptDiff){ // // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,deptEntity.getId()); // // // 判断当前部门对应的第三方的合法性 // retMsg = checkDepartmentSysToQy(synThirdInfoEntity, qyDeptList); // if (!retMsg.getBoolean("code")) { // if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) { // // flag:3 未同步,需要创建同步到企业微信、写入同步表 // // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到企业微信、写入同步表 // if("1".equals(retMsg.getString("flag"))) { // synThirdInfoService.delete(synThirdInfoEntity); // } // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // // // 部门中文名称与英文名称不能相同 // retMsg = checkCnEnName(object.getString("name"),object.getString("name_en"), // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 判断同一个层级的部门中文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(false,object.getString("name"),object.getString("parentid"),thirdObjId,qyDeptList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 判断同一个层级的部门英文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(true,object.getString("name_en"),object.getString("parentid"),thirdObjId,qyDeptList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 往企业微信写入公司或部门 // retMsg = SynQyWebChatUtil.createDepartment(object.toJSONString(), access_token); // // // 往同步写入本系统与第三方的对应信息 // if(retMsg.getBoolean("code")) { // // 同步成功 // thirdObjId = retMsg.getString("retDeptId"); // synState = SynThirdConsts.SYN_STATE_OK; // description = ""; // }else{ // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + retMsg.getString("error"); // } // } // // if ("2".equals(retMsg.getString("flag"))) { // // flag:2 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = ""; // // // 部门中文名称与英文名称不能相同 // retMsg = checkCnEnName(object.getString("name"),object.getString("name_en"), // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 判断同一个层级的部门中文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(false,object.getString("name"),object.getString("parentid"),thirdObjId,qyDeptList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 判断同一个层级的部门英文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(true,object.getString("name_en"),object.getString("parentid"),thirdObjId,qyDeptList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 往企业微信写入公司或部门 // retMsg = SynQyWebChatUtil.createDepartment(object.toJSONString(), access_token); // // // 往同步表更新本系统与第三方的对应信息 // if (retMsg.getBoolean("code")) { // // 同步成功 // thirdObjId = retMsg.getString("retDeptId"); // synState = SynThirdConsts.SYN_STATE_OK; // description = ""; // } else { // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + retMsg.getString("error"); // } // } // // } else { // // 更新同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // // // 部门中文名称与英文名称不能相同 // retMsg = checkCnEnName(object.getString("name"),object.getString("name_en"), // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 判断同一个层级的部门中文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(false,object.getString("name"),object.getString("parentid"),thirdObjId,qyDeptList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 判断同一个层级的部门英文名称不能重复 // retMsg = checkDeptObjectNameSysToQy(true,object.getString("name_en"),object.getString("parentid"),thirdObjId,qyDeptList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 往企业微信写入公司或部门 // object.put("id", synThirdInfoEntity.getThirdObjId()); // retMsg = SynQyWebChatUtil.updateDepartment(object.toJSONString(), access_token); // // // 往同步表更新本系统与第三方的对应信息 // if (retMsg.getBoolean("code")) { // // 同步成功 // synState = SynThirdConsts.SYN_STATE_OK; // description = ""; // } else { // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + retMsg.getString("error"); // } // } // }else{ // // 同步失败,上级部门检查有异常 // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + "上级部门无对应的企业微信ID"; // // retMsg.put("code", false); // retMsg.put("error", description); // } // // }else{ // // 同步失败 // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_FAIL; // description = deptFlag + "access_token值为空,不能同步信息"; // // retMsg.put("code", true); // retMsg.put("error", description); // } // // }else{ // // 未设置单条同步,归并到未同步状态 // // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,deptEntity.getId()); // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_NO; // description = deptFlag + "系统未设置单条同步"; // // retMsg.put("code", true); // retMsg.put("error", description); // } // // // 更新同步表 // saveSynThirdInfoEntity(opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } /** * 往企业微信删除部门 * 有带错误定位判断的功能代码 20210604 * @param isBatch 是否批量(批量不受开关限制) * @param id 本系统的公司或部门ID * @return * @throws WxErrorException */ // @Override // public JSONObject deleteDepartmentSysToQy(boolean isBatch, String id) throws WxErrorException { // SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getQyhCorpId(); // String corpSecret = config.getQyhCorpSecret(); // // 单条记录执行时,受开关限制 // int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); // JSONObject tokenObject = new JSONObject(); // String access_token = ""; // JSONObject retMsg = new JSONObject(); // List qyDeptList = new ArrayList<>(); // SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,id); // String deptFlag = "删除:"; // // // 返回值初始化 // retMsg.put("code", true); // retMsg.put("error", "系统未设置单条同步"); // // // 支持同步 // if(synThirdInfoEntity!=null) { // if(qyhIsSyn==1){ // // 获取 access_token // tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); // access_token = tokenObject.getString("access_token"); // // if (access_token != null && !"".equals(access_token)) { // // 获取企业微信上的所有部门列表信息 // JSONObject deptObject = SynQyWebChatUtil.getDepartmentList(SynThirdConsts.QY_ROOT_DEPT_ID,access_token); // if(deptObject.getBoolean("code")) { // qyDeptList = JsonUtil.getJsonToList(deptObject.getString("department"), QyWebChatDeptModel.class); // // // 删除企业对应的部门 // if (qyDeptList.stream().filter(t -> t.getId().toString().equals(synThirdInfoEntity.getThirdObjId())).count() > 0 ? true : false) { // retMsg = SynQyWebChatUtil.deleteDepartment(synThirdInfoEntity.getThirdObjId(), access_token); // if (retMsg.getBoolean("code")) { // // 同步成功,直接删除同步表记录 // synThirdInfoService.delete(synThirdInfoEntity); // } else { // // 同步失败 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + retMsg.getString("error")); // } // }else{ // // 根据企业微信ID找不到相应的信息,直接删除同步表记录 // synThirdInfoService.delete(synThirdInfoEntity); // } // }else{ // // 同步失败,获取部门列表失败 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + "获取企业微信的部门列表信息失败"); // // retMsg.put("code", false); // retMsg.put("error", deptFlag + "获取企业微信的部门列表信息失败"); // } // // }else{ // // 同步失败 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + "access_token值为空,不能同步信息"); // // retMsg.put("code", false); // retMsg.put("error", deptFlag + "access_token值为空,不能同步信息!"); // } // // }else{ // // 未设置单条同步,归并到未同步状态 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_NO, deptFlag + "系统未设置单条同步"); // // retMsg.put("code", true); // retMsg.put("error", deptFlag + "系统未设置单条同步"); // } // } // // return retMsg; // } /** * 往企业微信创建部门 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param deptEntity * @param accessToken (单条调用时为空) * @return * @throws WxErrorException */ @Override public JSONObject createDepartmentSysToQy(boolean isBatch, OrganizeEntity deptEntity, String accessToken) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); JSONObject tokenObject = new JSONObject(); String access_token = ""; JSONObject retMsg = new JSONObject(); JSONObject object = new JSONObject(); String thirdObjId = ""; String thirdName = ""; Integer synState = 0; String description = ""; boolean isDeptDiff = true; String deptFlag = "创建:"; // 返回值初始化 retMsg.put("code", true); retMsg.put("error", "创建:系统未设置单条同步"); // 支持同步 if (isBatch || qyhIsSyn == 1) { if (isBatch) { access_token = accessToken; } else { // 获取 access_token 值 String corpId = config.getQyhCorpId(); // 向企业微信插入数据需要另外token(应用密钥) String corpSecret = config.getQyhAgentSecret(); tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); access_token = tokenObject.getString("access_token"); } if (access_token != null && !access_token.isEmpty()) { object.put("id", null); // name:必填项,同一个层级的部门名称不能重复 // name_en:必填项,同一个层级的部门名称不能重复 // name与name_en的值不能相同,否则会报错, 20210429 object.put("name", deptEntity.getFullName()); object.put("name_en", deptEntity.getEnCode()); // 从本地数据库的同步表获取对应的企业微信ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理 if ( "-1".equals(deptEntity.getParentId())) { //顶级节点时,企业微信的父节点设置为1 object.put("parentid", 1); } else { SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getParentId()); retMsg = checkDepartmentSysToQy(synThirdInfoEntity); isDeptDiff = retMsg.getBoolean("code"); if (isDeptDiff) { object.put("parentid", synThirdInfoEntity.getThirdObjId()); } } object.put("order", deptEntity.getSortCode()); // 创建时:部门中文名称与英文名称不能相同 // retMsg = checkCnEnName(object.getString("name"),object.getString("name_en"),SynThirdConsts.OBJECT_OP_ADD,null, // Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY),Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG),deptEntity.getId(),thirdObjId,deptFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } if (isDeptDiff) { // 往企业微信写入公司或部门 if (!"-1".equals(deptEntity.getParentId())) { retMsg = SynQyWebChatUtil.createDepartment(object.toJSONString(), access_token); } else { retMsg.put("code", true); retMsg.put("error", "顶级不同步,默认值id1"); retMsg.put("retDeptId", "1"); } // 往同步写入本系统与第三方的对应信息 if (retMsg.getBoolean("code")) { // 同步成功 thirdObjId = retMsg.getString("retDeptId"); thirdName = deptEntity.getFullName(); synState = SynThirdConsts.SYN_STATE_OK; description = "创建成功"; } else { if (retMsg.getString("error").contains("department existed")){ List organizeListVOS = getOrganizeListVOS(config); List collect = organizeListVOS.stream() .filter(t -> t.getFullName().equals(deptEntity.getFullName())) .collect(Collectors.toList()); thirdObjId=collect.get(0).getId(); synState = SynThirdConsts.SYN_STATE_OK; thirdName = deptEntity.getFullName(); description = "组织已存在"; }else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + retMsg.getString("error"); } } } else { // 同步失败,上级部门无对应的企业微信ID synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "部门所属的上级部门未同步到企业微信"; retMsg.put("code", false); retMsg.put("error", description); retMsg.put("retDeptId", "0"); } } else { synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "access_token值为空,不能同步信息"; retMsg.put("code", false); retMsg.put("error", description); retMsg.put("retDeptId", "0"); } } else { description = retMsg.getString("error"); return retMsg; } // 更新同步表 saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, synState, description, thirdName); return retMsg; } private static List getOrganizeListVOS(SocialsSysConfig config) throws WxErrorException { List QyDeptAllList = new ArrayList<>(); JSONObject tokenObject = SynQyWebChatUtil.getAccessToken(config.getQyhCorpId(), config.getQyhCorpSecret()); String access_token = tokenObject.getString("access_token"); // 获取企业微信上的部门列表 String departId = SynThirdConsts.QY_ROOT_DEPT_ID; JSONObject retMsg = SynQyWebChatUtil.getDepartmentList(departId, access_token); QyDeptAllList = JsonUtil.getJsonToList(retMsg.get("department").toString(), QyWebChatDeptModel.class); // 部门进行树结构化,固化上下层级序列化 List organizeModelList = QyDeptAllList.stream().map(t -> { OrganizeModel model = JsonUtil.getJsonToBean(t, OrganizeModel.class); model.setFullName(t.getName()); model.setParentId(t.getParentid() + ""); return model; }).collect(Collectors.toList()); return organizeModelList; } @Override public JSONObject createUserSysToQy(boolean isBatch, List userList, String accessToken, String positionId) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); List organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(config.getQyhDepartment()); PositionEntity info = positionService.getInfo(positionId); if (BeanUtil.isNotEmpty(info) && !organizeEntitiesBind.stream() .map(SuperBaseEntity.SuperIBaseEntity::getId) .collect(Collectors.toList()).contains(info.getOrganizeId())) { return null; } for (UserEntity userEntity : userList) { createUserSysToQy(isBatch, userEntity, accessToken); } return new JSONObject(); } @Override public JSONObject createUserSysToQy(boolean isBatch, UserEntity userEntity, String accessToken, List ids) throws ParseException, WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); List organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(config.getQyhDepartment()); for (String id : ids) { if (organizeEntitiesBind.stream() .map(SuperBaseEntity.SuperIBaseEntity::getId) .collect(Collectors.toList()).contains(id)) { userEntity.setOrganizeId(id); createUserSysToQy(isBatch, userEntity, accessToken); } } return null; } /** * 往企业微信更新部门 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param deptEntity * @param accessToken (单条调用时为空) * @return * @throws WxErrorException */ @Override public JSONObject updateDepartmentSysToQy(boolean isBatch, OrganizeEntity deptEntity, String accessToken) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); JSONObject tokenObject = new JSONObject(); String access_token = ""; JSONObject retMsg = new JSONObject(); JSONObject object = new JSONObject(); SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity(); String opType = ""; Integer synState = 0; String description = ""; String thirdObjId = ""; String thirdName = ""; SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity(); boolean isDeptDiff = true; String deptFlag = "更新:"; // 返回值初始化 retMsg.put("code", true); retMsg.put("error", "系统未设置单条同步"); // 支持同步,设置需要同步到企业微信的对象属性值 if (isBatch || qyhIsSyn == 1) { if (isBatch) { access_token = accessToken; } else { String corpId = config.getQyhCorpId(); // 向企业微信插入数据需要另外token(凭证密钥) String corpSecret = config.getQyhAgentSecret(); // 获取 access_token tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); access_token = tokenObject.getString("access_token"); } // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId()); if (StringUtil.isNotEmpty(access_token)) { object.put("id", null); object.put("name", deptEntity.getFullName()); object.put("name_en", deptEntity.getEnCode()); // 从本地数据库的同步表获取对应的企业微信ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理 if ("-1".equals(deptEntity.getParentId())) { //顶级节点时,企业微信的父节点设置为1 object.put("parentid", 1); } else { // 判断上级部门的合法性 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getParentId()); //如果是最高级 if (Objects.equals(deptEntity.getParentId(), "-1")) { synThirdInfoEntity = new SynThirdInfoEntity(); synThirdInfoEntity.setThirdObjId("-1"); } retMsg = checkDepartmentSysToQy(synThirdInfoEntity); isDeptDiff = retMsg.getBoolean("code"); if (isDeptDiff) { object.put("parentid", synThirdInfoEntity.getThirdObjId()); } } object.put("order", deptEntity.getSortCode()); // 上级部门检查是否异常 if (isDeptDiff) { // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId()); // 判断当前部门对应的第三方的合法性 retMsg = checkDepartmentSysToQy(synThirdInfoEntity); if (!retMsg.getBoolean("code")) { if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) { // flag:3 未同步,需要创建同步到企业微信、写入同步表 // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到企业微信、写入同步表 if ("1".equals(retMsg.getString("flag"))) { synThirdInfoService.delete(synThirdInfoEntity); } opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; // 部门中文名称与英文名称不能相同 retMsg = checkCnEnName(object.getString("name"), object.getString("name_en"), opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag); if (!retMsg.getBoolean("code")) { return retMsg; } // 往企业微信写入公司或部门 retMsg = SynQyWebChatUtil.updateDepartment(object.toJSONString(), access_token); //如果部门已存在,需要进行比对 if (retMsg.getString("error").contains("\"errcode\":60008")){ } // 往同步写入本系统与第三方的对应信息 if (retMsg.getBoolean("code")) { // 同步成功 thirdObjId = retMsg.getString("retDeptId"); thirdName = deptEntity.getFullName(); synState = SynThirdConsts.SYN_STATE_OK; description = "更新成功"; } else { // 同步失败 if (retMsg.getString("error").contains("department existed")){ List organizeListVOS = getOrganizeListVOS(config); List collect = organizeListVOS.stream() .filter(t -> t.getFullName().equals(deptEntity.getFullName())) .collect(Collectors.toList()); thirdObjId=collect.get(0).getId(); synState = SynThirdConsts.SYN_STATE_OK; thirdName = deptEntity.getFullName(); description = "组织已存在"; }else { synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + retMsg.getString("error"); } } } if ("2".equals(retMsg.getString("flag"))) { // flag:2 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = ""; // 部门中文名称与英文名称不能相同 retMsg = checkCnEnName(object.getString("name"), object.getString("name_en"), opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag); if (!retMsg.getBoolean("code")) { return retMsg; } // 往企业微信写入公司或部门 if (!Objects.equals(object.getString("parentid"), "1")){ retMsg = SynQyWebChatUtil.createDepartment(object.toJSONString(), access_token); }else { retMsg.put("retDeptId", "1"); } // 往同步表更新本系统与第三方的对应信息 if (retMsg.getBoolean("code")) { // 同步成功 thirdObjId = retMsg.getString("retDeptId"); thirdName = deptEntity.getFullName(); synState = SynThirdConsts.SYN_STATE_OK; description = "更新成功"; } else { // 同步失败 if (retMsg.getString("error").contains("department existed")){ List organizeListVOS = getOrganizeListVOS(config); List collect = organizeListVOS.stream() .filter(t -> t.getFullName().equals(deptEntity.getFullName())) .collect(Collectors.toList()); thirdObjId=collect.get(0).getId(); synState = SynThirdConsts.SYN_STATE_OK; thirdName = deptEntity.getFullName(); description = "组织已存在"; }else { synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + retMsg.getString("error"); } } } } else { // 更新同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); // 部门中文名称与英文名称不能相同 retMsg = checkCnEnName(object.getString("name"), object.getString("name_en"), opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag); if (!retMsg.getBoolean("code")) { return retMsg; } object.put("id", synThirdInfoEntity.getThirdObjId()); if (!deptEntity.getParentId().equals("-1")) { retMsg = SynQyWebChatUtil.updateDepartment(object.toJSONString(), access_token); } // 往同步表更新本系统与第三方的对应信息 if (retMsg.getBoolean("code")) { // 同步成功 synState = SynThirdConsts.SYN_STATE_OK; thirdName = deptEntity.getFullName(); description = "同步成功"; } else { if (retMsg.getString("error").contains("department existed")){ List organizeListVOS = getOrganizeListVOS(config); List collect = organizeListVOS.stream() .filter(t -> t.getFullName().equals(deptEntity.getFullName())) .collect(Collectors.toList()); thirdObjId=collect.get(0).getId(); synState = SynThirdConsts.SYN_STATE_OK; thirdName = deptEntity.getFullName(); description = "组织已存在"; }else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + retMsg.getString("error"); } } } } else { // 同步失败,上级部门检查有异常 if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "上级部门无对应的企业微信ID"; retMsg.put("code", false); retMsg.put("error", description); } } else { // 同步失败 if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "access_token值为空,不能同步信息"; retMsg.put("code", true); retMsg.put("error", description); } } else { // 未设置单条同步,归并到未同步状态 // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId()); if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_NO; description = deptFlag + "系统未设置单条同步"; retMsg.put("code", true); retMsg.put("error", description); return retMsg; } // 更新同步表 saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, synState, description, thirdName); return retMsg; } @Override public JSONObject unifyDepartmentSysToQy(boolean isBatch, OrganizeEntity deptEntity, String accessToken,String choice) throws WxErrorException { SocialsSysConfig socialsConfig = sysconfigService.getSocialsConfig(); String qyhDepartment = socialsConfig.getQyhDepartment(); if (StringUtil.isEmpty(qyhDepartment)){ return null; } List organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(qyhDepartment); List collect = organizeEntitiesBind.stream().map(SuperBaseEntity.SuperIBaseEntity::getId) .collect(Collectors.toList()); if (!collect.contains(deptEntity.getId())) { if (!choice.equals(SynThirdConsts.DELETE_DEP)) { return null; } } switch (choice) { case SynThirdConsts.CREAT_DEP: return this.createDepartmentSysToQy(isBatch, deptEntity, accessToken); case SynThirdConsts.UPDATE_DEP: return this.updateDepartmentSysToQy(isBatch, deptEntity, accessToken); case SynThirdConsts.DELETE_DEP: return this.deleteDepartmentSysToQy(isBatch, deptEntity.getId(), accessToken); default: return null; } } @Override public JSONObject unifyDepartmentSysToQy(boolean isBatch, List organizeEntities, String accessToken, String choice) throws WxErrorException { for (OrganizeEntity organizeEntity : organizeEntities) { this.deleteDepartmentSysToQy(isBatch, organizeEntity.getId(), accessToken); } return null; } /** * 往企业微信删除部门 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param id 本系统的公司或部门ID * @param accessToken (单条调用时为空) * @return * @throws WxErrorException */ @Override public JSONObject deleteDepartmentSysToQy(boolean isBatch, String id, String accessToken) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); JSONObject tokenObject = new JSONObject(); String access_token = ""; JSONObject retMsg = new JSONObject(); SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, id); String deptFlag = "删除:"; // 返回值初始化 retMsg.put("code", true); retMsg.put("error", "系统未设置单条同步"); // 支持同步 if (synThirdInfoEntity != null) { if (qyhIsSyn == 1) { if (isBatch) { access_token = accessToken; } else { String corpId = config.getQyhCorpId(); String corpSecret = config.getQyhAgentSecret(); // 获取 access_token tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); access_token = tokenObject.getString("access_token"); } if (StringUtil.isNotEmpty(access_token)) { if (!"".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) && !"null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) { retMsg = SynQyWebChatUtil.deleteDepartment(synThirdInfoEntity.getThirdObjId(), access_token); if (retMsg.getBoolean("code")) { // 同步成功,直接删除同步表记录 synThirdInfoService.delete(synThirdInfoEntity); } else { // 同步失败 saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG) , id, synThirdInfoEntity.getThirdObjId() , SynThirdConsts.SYN_STATE_FAIL, deptFlag + retMsg.getString("error"), ""); } } else { // 根据企业微信ID找不到相应的信息,直接删除同步表记录 synThirdInfoService.delete(synThirdInfoEntity); } } else { // 同步失败 saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG) , id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL , deptFlag + "access_token值为空,不能同步信息", ""); retMsg.put("code", false); retMsg.put("error", deptFlag + "access_token值为空,不能同步信息!"); } } else { // 未设置单条同步,归并到未同步状态 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG) // , id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_NO // , deptFlag + "系统未设置单条同步", ""); retMsg.put("code", true); retMsg.put("error", deptFlag + "系统未设置单条同步"); } } return retMsg; } @Override public JSONObject deleteUserSysToQy(boolean isBatch, List ids, String accessToken, String positionId) throws WxErrorException { for (String id : ids) { this.deleteUserSysToQy(isBatch, id, accessToken); } return new JSONObject(); } @Override public JSONObject deleteUserSysToQy(boolean isBatch, UserEntity userEntity, String accessToken, List ids) throws ParseException, WxErrorException { SocialsSysConfig socialsConfig = sysconfigService.getSocialsConfig(); List organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(socialsConfig.getQyhDepartment()); for (String string : ids) { if (organizeEntitiesBind.stream() .map(SuperBaseEntity.SuperIBaseEntity::getId) .collect(Collectors.toList()).contains(string)) { deleteUserSysToQy(isBatch,userEntity.getId(),accessToken); } } return new JSONObject(); } //------------------------------------本系统同步用户到企业微信------------------------------------- /** * 获取企业微信的单个成员列表,用于更新成员信息使用 * * @param id * @param accessToken * @return * @throws WxErrorException */ public QyWebChatUserModel getQyUserById(String id, String accessToken) throws WxErrorException { QyWebChatUserModel userModel = new QyWebChatUserModel(); JSONObject userObject = SynQyWebChatUtil.getUserById(id, accessToken); if (userObject.getBoolean("code")) { userModel = JsonUtil.getJsonToBean(userObject.getString("userinfo"), QyWebChatUserModel.class); } return userModel; } /** * 设置需要提交给企业微信接口的单个成品JSON信息 * 有带第三方错误定位判断的功能代码 20210604 * @param userEntity 本地用户信息 * @param qyDeptList 企业微信的部门信息 * @param qyWebChatUserModel * @return */ // public JSONObject setQyUserObject(UserEntity userEntity, List qyDeptList, QyWebChatUserModel qyWebChatUserModel) { // List userList = userService.getList(); // JSONObject object = new JSONObject(); // JSONObject retMsg = new JSONObject(); // retMsg.put("code", true); // retMsg.put("error", ""); // // // 验证邮箱格式的合法性 // if(StringUtil.isNotEmpty(userEntity.getEmail())){ // if(!RegexUtils.checkEmail(userEntity.getEmail())){ // retMsg.put("code", false); // retMsg.put("error", "邮箱格式不合法!"); // retMsg.put("qyUserObject", ""); // return retMsg; // } // } // // object.put("userid", userEntity.getId()); // object.put("name", userEntity.getRealName()); // object.put("mobile",userEntity.getMobilePhone()); // // SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,userEntity.getOrganizeId()); // retMsg = checkDepartmentSysToQy(synThirdInfoEntity,qyDeptList); // if(retMsg.getBoolean("code")){ // String formatString = "[%s]"; // object.put("department",String.format(formatString,synThirdInfoEntity.getThirdObjId())); // object.put("main_department",synThirdInfoEntity.getThirdObjId()); // QyWebChatDeptModel qyWebChatDeptModel = qyDeptList.stream().filter(t -> t.getId().toString().equals(synThirdInfoEntity.getThirdObjId())).findFirst().orElse(null); // object.put("order",String.format(formatString,qyWebChatDeptModel.getOrder())); // String isLeader = userList.stream().filter(t -> t.getOrganizeId().equals(userEntity.getOrganizeId()) && t.getManagerId().equals(userEntity.getId()) ).count()==0 ? "0" : "1"; // object.put("is_leader_in_dept",String.format(formatString,isLeader)); // }else{ // retMsg.put("code", false); // retMsg.put("error", "部门找不到对应的企业微信ID!"); // retMsg.put("qyUserObject", ""); // return retMsg; // } // object.put("email",userEntity.getEmail()); // PositionEntity positionEntity = positionService.getInfo(userEntity.getPositionId()); // if(positionEntity!=null){ // object.put("position",positionEntity.getFullName()); // }else{ // object.put("position",""); // } // object.put("gender",userEntity.getGender().toString()); // object.put("telephone",userEntity.getTelePhone()); // object.put("enable",userEntity.getEnabledMark()); // JSONObject extattr = new JSONObject(); // extattr.put("attrs","[]"); // object.put("extattr",extattr.toJSONString()); //// // 创建企业微信成员时才会赋值的 //// object.put("to_invite", true); // object.put("address",userEntity.getPostalAddress()); // object.put("alias",""); // object.put("avatar_mediaid",""); // JSONObject external_profile = new JSONObject(); // external_profile.put("external_corp_name",""); // external_profile.put("external_attr","[]"); // object.put("external_profile",external_profile.toJSONString()); // object.put("external_position",""); // // // 修改时:未更新字段信息来源企业微信 // if(qyWebChatUserModel!=null) { // object.put("alias", qyWebChatUserModel.getAlias()); // object.put("avatar_mediaid", qyWebChatUserModel.getAvatar_mediaid()); // object.put("external_profile", qyWebChatUserModel.getExternal_profile()); // object.put("external_position", qyWebChatUserModel.getExternal_position()); // } // // String jsonString = object.toJSONString(); // // 格式与用户的格式不一致就需要做处理,否则提交JSON格式验证无法通过 // jsonString = jsonString.replaceAll("\\\\",""); // jsonString = jsonString.replaceAll("\"\\{","{"); // jsonString = jsonString.replaceAll("}\"","}"); // jsonString = jsonString.replaceAll("\"\\[","["); // jsonString = jsonString.replaceAll("\\]\"","]"); // // retMsg.put("qyUserObject", jsonString); // return retMsg; // } /** * 设置需要提交给企业微信接口的单个成品JSON信息 * 不带第三方错误定位判断的功能代码 20210604 * * @param userEntity 本地用户信息 * @param qyWebChatUserModel * @return */ public JSONObject setQyUserObject(UserEntity userEntity, QyWebChatUserModel qyWebChatUserModel) { List userList = userService.getList(false); JSONObject object = new JSONObject(); JSONObject retMsg = new JSONObject(); retMsg.put("code", true); retMsg.put("error", ""); // 验证邮箱格式的合法性 if (StringUtil.isNotEmpty(userEntity.getEmail())) { if (!RegexUtils.checkEmail(userEntity.getEmail())) { retMsg.put("code", false); retMsg.put("error", "邮箱格式不合法!"); retMsg.put("qyUserObject", ""); return retMsg; } } object.put("userid", userEntity.getId()); object.put("name", userEntity.getRealName()); object.put("mobile", userEntity.getMobilePhone()); SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, userEntity.getOrganizeId()); retMsg = checkDepartmentSysToQy(synThirdInfoEntity); if (retMsg.getBoolean("code")) { String formatString = "[%s]"; object.put("department", String.format(formatString, synThirdInfoEntity.getThirdObjId())); object.put("main_department", synThirdInfoEntity.getThirdObjId()); // QyWebChatDeptModel qyWebChatDeptModel = qyDeptList.stream().filter(t -> t.getId().toString().equals(synThirdInfoEntity.getThirdObjId())).findFirst().orElse(null); // object.put("order",String.format(formatString,qyWebChatDeptModel.getOrder())); String isLeader = userList.stream().filter(t -> userEntity.getOrganizeId().equals(t.getOrganizeId()) && userEntity.getId().equals(t.getManagerId())).count() == 0 ? "0" : "1"; object.put("is_leader_in_dept", String.format(formatString, isLeader)); } else { retMsg.put("code", false); retMsg.put("error", "部门找不到对应的企业微信ID!"); retMsg.put("qyUserObject", ""); return retMsg; } object.put("email", userEntity.getEmail()); PositionEntity positionEntity = positionService.getInfo(userEntity.getPositionId()); if (positionEntity != null) { object.put("position", positionEntity.getFullName()); } else { object.put("position", ""); } object.put("gender", userEntity.getGender()); object.put("telephone", userEntity.getTelePhone()); object.put("enable", userEntity.getEnabledMark()); JSONObject extattr = new JSONObject(); extattr.put("attrs", "[]"); object.put("extattr", extattr.toJSONString()); // // 创建企业微信成员时才会赋值的 // object.put("to_invite", true); object.put("address", userEntity.getPostalAddress()); object.put("alias", ""); object.put("avatar_mediaid", ""); JSONObject external_profile = new JSONObject(); external_profile.put("external_corp_name", ""); external_profile.put("external_attr", "[]"); object.put("external_profile", external_profile.toJSONString()); object.put("external_position", ""); // 修改时:未更新字段信息来源企业微信 if (qyWebChatUserModel != null) { object.put("alias", qyWebChatUserModel.getAlias()); object.put("avatar_mediaid", qyWebChatUserModel.getAvatar_mediaid()); object.put("external_profile", qyWebChatUserModel.getExternal_profile()); object.put("external_position", qyWebChatUserModel.getExternal_position()); } String jsonString = object.toJSONString(); // 格式与用户的格式不一致就需要做处理,否则提交JSON格式验证无法通过 jsonString = jsonString.replaceAll("\\\\", ""); jsonString = jsonString.replaceAll("\"\\{", "{"); jsonString = jsonString.replaceAll("}\"", "}"); jsonString = jsonString.replaceAll("\"\\[", "["); jsonString = jsonString.replaceAll("\\]\"", "]"); retMsg.put("qyUserObject", jsonString); return retMsg; } /** * 判断用户的手机号、邮箱是否唯一,企业微信不允许重复 * * @param mobile * @param email * @param userId * @param qyUserList * @param opType * @param synThirdInfoEntity * @param thirdType * @param dataType * @param sysObjId * @param thirdObjId * @param deptFlag * @return */ public JSONObject checkUserMobileEmailRepeat(String mobile, String email, String userId, List qyUserList, String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType, Integer dataType, String sysObjId, String thirdObjId, String deptFlag) { boolean isDiff = true; String description = ""; JSONObject retMsg = new JSONObject(); // 企业微信限制:手机号唯一性 if (StringUtil.isNotEmpty(mobile)) { if (StringUtil.isNotEmpty(userId)) { if (qyUserList.stream().filter(t -> String.valueOf(t.getMobile()).equals(mobile) && !(t.getUserid().equals(userId))).count() > 0 ? true : false) { isDiff = false; description = deptFlag + "企业内已有绑定手机号:" + mobile; } } else { if (qyUserList.stream().filter(t -> String.valueOf(t.getMobile()).equals(mobile)).count() > 0) { isDiff = false; description = deptFlag + "企业内已有绑定手机号:" + mobile; } } } // 企业微信限制:邮箱地址唯一性 if (StringUtil.isNotEmpty(email)) { if (StringUtil.isNotEmpty(userId)) { if (qyUserList.stream().filter(t -> String.valueOf(t.getEmail()).equals(email) && !(t.getUserid().equals(userId))).count() > 0) { isDiff = false; description = deptFlag + "企业内已有绑定此邮箱:" + email; } } else { if (qyUserList.stream().filter(t -> String.valueOf(t.getEmail()).equals(email)).count() > 0) { isDiff = false; description = deptFlag + "企业内已有绑定此邮箱:" + email; } } } retMsg.put("code", isDiff); retMsg.put("error", description); if (!isDiff) { // 同步失败 Integer synState = SynThirdConsts.SYN_STATE_FAIL; // 更新同步表 saveSynThirdInfoEntity(opType, synThirdInfoEntity, thirdType, dataType, sysObjId, thirdObjId, synState, description, ""); } return retMsg; } /** * 根据用户的同步表信息判断同步情况 * 带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * @param synThirdInfoEntity * @param qyUserList * @return */ // public JSONObject checkUserSysToQy(SynThirdInfoEntity synThirdInfoEntity, List qyUserList) { // JSONObject retMsg = new JSONObject(); // retMsg.put("code",true); // retMsg.put("flag",""); // retMsg.put("error",""); // // if(synThirdInfoEntity!=null){ // if(StringUtil.isNotEmpty(synThirdInfoEntity.getThirdObjId())) { // // 同步表存在企业微信ID,仍需要判断企业微信上有没此用户 // if(qyUserList.stream().filter(t -> t.getUserid().equals(synThirdInfoEntity.getThirdObjId())).count() == 0 ? true : false){ // retMsg.put("code",false); // retMsg.put("flag","1"); // retMsg.put("error","企业微信不存在同步表对应的用户ID!"); // } // }else{ // // 同步表的企业微信ID为空 // retMsg.put("code",false); // retMsg.put("flag","2"); // retMsg.put("error","同步表中用户对应的第三方ID为空!"); // } // }else{ // // 上级用户未同步 // retMsg.put("code",false); // retMsg.put("flag","3"); // retMsg.put("error","用户未同步!"); // } // // return retMsg; // } /** * 根据用户的同步表信息判断同步情况 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param synThirdInfoEntity * @return */ public JSONObject checkUserSysToQy(SynThirdInfoEntity synThirdInfoEntity) { JSONObject retMsg = new JSONObject(); retMsg.put("code", true); retMsg.put("flag", ""); retMsg.put("error", ""); if (synThirdInfoEntity != null) { if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) { // 同步表的企业微信ID为空 retMsg.put("code", false); retMsg.put("flag", "2"); retMsg.put("error", "同步表中用户对应的第三方ID为空!"); } } else { // 上级用户未同步 retMsg.put("code", false); retMsg.put("flag", "3"); retMsg.put("error", "用户未同步!"); } return retMsg; } /** * 往企业微信创建成员信息 * 带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * @param isBatch 是否批量(批量不受开关限制) * @param userEntity * @return * @throws WxErrorException */ // @Override // public JSONObject createUserSysToQy(boolean isBatch, UserEntity userEntity) throws WxErrorException { // SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getQyhCorpId(); // String corpSecret = config.getQyhCorpSecret(); // // 单条记录执行时,受开关限制 // int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynUser(); // JSONObject tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); // String access_token = tokenObject.getString("access_token"); // JSONObject retMsg = new JSONObject(); // String userObjectModel = ""; // List qyDeptList = new ArrayList<>(); // List qyUserList = new ArrayList<>(); // String thirdObjId = ""; // Integer synState = 0; // String description = ""; // String userFlag = "创建:"; // // // 返回值初始化 // retMsg.put("code", true); // retMsg.put("error", userFlag + "系统未设置单条同步"); // // // 企业微信限制:不能手机号、邮箱同时为空 // if(StringUtil.isEmpty(userEntity.getMobilePhone()) && StringUtil.isEmpty(userEntity.getEmail()) && "1".equals(qyhIsSyn)){ // retMsg.put("code", false); // retMsg.put("error", userFlag + "企业微信不允许手机号、邮箱不能同时为空!"); // } // // if (qyhIsSyn==1){ // if(retMsg.getBoolean("code")){ // if (access_token != null && !"".equals(access_token)) { // // 获取企业微信上的所有部门列表信息 // JSONObject deptObject = SynQyWebChatUtil.getDepartmentList(SynThirdConsts.QY_ROOT_DEPT_ID,access_token); // if(deptObject.getBoolean("code")) { // qyDeptList = JsonUtil.getJsonToList(deptObject.getString("department"), QyWebChatDeptModel.class); // }else{ // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "获取企业微信的部门列表信息失败"; // // retMsg.put("code", false); // retMsg.put("error", description); // // // 更新同步表 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, synState, description); // // return retMsg; // } // // // 获取企业微信上的所有成员列表信息 // JSONObject userObject = SynQyWebChatUtil.getUserDetailList(SynThirdConsts.QY_ROOT_DEPT_ID,"1",access_token); // if(userObject.getBoolean("code")) { // qyUserList = JsonUtil.getJsonToList(userObject.getString("userlist"), QyWebChatUserModel.class); // }else{ // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "获取企业微信的成员列表信息失败"; // // retMsg.put("code", false); // retMsg.put("error", description); // // // 更新同步表 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, synState, description); // // return retMsg; // } // // // 判断用户的手机号、邮箱是否唯一,不能重复 // retMsg = checkUserMobileEmailRepeat(userEntity.getMobilePhone(),userEntity.getEmail(),thirdObjId,qyUserList, // SynThirdConsts.OBJECT_OP_ADD,null,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,userFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 要同步到企业微信的对象赋值 // retMsg = setQyUserObject(userEntity, qyDeptList, null); // if (retMsg.getBoolean("code")) { // userObjectModel = retMsg.getString("qyUserObject"); // // 往企业微信写入成员 // retMsg = SynQyWebChatUtil.createUser(userObjectModel, access_token); // // // 往同步写入本系统与第三方的对应信息 // if (retMsg.getBoolean("code")) { // // 同步成功 // thirdObjId = userEntity.getId(); // synState = SynThirdConsts.SYN_STATE_OK; // } else { // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // } // }else{ // // 同步失败,原因:部门找不到对应的第三方ID、邮箱格式不合法 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // } // // }else{ // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "access_token值为空,不能同步信息"; // // retMsg.put("code", false); // retMsg.put("error", description); // } // // }else { // // 同步失败,原因:企业微信不允许手机号、邮箱不能同时为空 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // } // }else{ // // 无须同步,未同步状态 // synState = SynThirdConsts.SYN_STATE_NO; // description = userFlag + "系统未设置单条同步"; // // retMsg.put("code", true); // retMsg.put("error", description); // } // // // 更新同步表 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, synState, description); // // return retMsg; // } /** * 往企业微信更新成员信息 * 带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * @param isBatch 是否批量(批量不受开关限制) * @param userEntity * @return * @throws WxErrorException */ // @Override // public JSONObject updateUserSysToQy(boolean isBatch, UserEntity userEntity) throws WxErrorException { // SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getQyhCorpId(); // String corpSecret = config.getQyhCorpSecret(); // // 单条记录执行时,受开关限制 // int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynUser(); // JSONObject tokenObject = new JSONObject(); // String access_token = ""; // JSONObject retMsg = new JSONObject(); // String userObjectModel = ""; // List qyDeptList = new ArrayList<>(); // List qyUserList = new ArrayList<>(); // SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity(); // SynThirdInfoEntity entity = new SynThirdInfoEntity(); // String opType = ""; // SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity(); // String thirdObjId = ""; // Integer synState = 0; // String description = ""; // String userFlag = "更新:"; // // // 返回值初始化 // retMsg.put("code", true); // retMsg.put("error", userFlag + "系统未设置单条同步"); // // // 企业微信限制:不能手机号、邮箱同时为空 // if(StringUtil.isEmpty(userEntity.getMobilePhone()) && StringUtil.isEmpty(userEntity.getEmail()) && "1".equals(qyhIsSyn)){ // retMsg.put("code", false); // retMsg.put("error", userFlag + "企业微信不允许手机号、邮箱不能同时为空!"); // } // // // 支持同步 // if (qyhIsSyn==1){ // if(retMsg.getBoolean("code")){ // // 获取 access_token // tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); // access_token = tokenObject.getString("access_token"); // // // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_USER,userEntity.getId()); // if (access_token != null && !"".equals(access_token)) { // // 获取企业微信上的所有部门列表信息 // JSONObject deptObject = SynQyWebChatUtil.getDepartmentList(SynThirdConsts.QY_ROOT_DEPT_ID,access_token); // if(deptObject.getBoolean("code")) { // qyDeptList = JsonUtil.getJsonToList(deptObject.getString("department"), QyWebChatDeptModel.class); // }else{ // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "获取企业微信的部门列表信息失败"; // // retMsg.put("code", false); // retMsg.put("error", description); // // // 更新同步表 // saveSynThirdInfoEntity(opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } // // // 获取企业微信上的所有成员列表信息 // JSONObject userObject = SynQyWebChatUtil.getUserDetailList(SynThirdConsts.QY_ROOT_DEPT_ID,"1",access_token); // if(userObject.getBoolean("code")) { // qyUserList = JsonUtil.getJsonToList(userObject.getString("userlist"), QyWebChatUserModel.class); // }else{ // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "获取企业微信的成员列表信息失败"; // // retMsg.put("code", false); // retMsg.put("error", description); // // // 更新同步表 // saveSynThirdInfoEntity(opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } // // // 要同步到企业微信的对象赋值 // retMsg = setQyUserObject(userEntity,qyDeptList,null); // if (retMsg.getBoolean("code")) { // // 判断当前用户对应的第三方的合法性 // userObjectModel = retMsg.getString("qyUserObject"); // retMsg = checkUserSysToQy(synThirdInfoEntity, qyUserList); // if (!retMsg.getBoolean("code")) { // if("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))){ // // flag:3 未同步,需要创建同步到企业微信、写入同步表 // // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到企业微信、写入同步表 // if("1".equals(retMsg.getString("flag"))) { // synThirdInfoService.delete(synThirdInfoEntity); // } // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // // // 判断用户的手机号、邮箱是否唯一,不能重复 // retMsg = checkUserMobileEmailRepeat(userEntity.getMobilePhone(),userEntity.getEmail(),thirdObjId,qyUserList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,userFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 往企业微信写入成员 // retMsg = SynQyWebChatUtil.createUser(userObjectModel, access_token); // if(retMsg.getBoolean("code")) { // // 同步成功 // thirdObjId = userEntity.getId(); // synState = SynThirdConsts.SYN_STATE_OK; // description = ""; // }else{ // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // } // } // // if("2".equals(retMsg.getString("flag"))){ // // 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = ""; // // // 判断用户的手机号、邮箱是否唯一,不能重复 // retMsg = checkUserMobileEmailRepeat(userEntity.getMobilePhone(),userEntity.getEmail(),thirdObjId,qyUserList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,userFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 往企业微信写入成员 // retMsg = SynQyWebChatUtil.createUser(userObjectModel, access_token); // if(retMsg.getBoolean("code")) { // // 同步成功 // thirdObjId = userEntity.getId(); // synState = SynThirdConsts.SYN_STATE_OK; // description = ""; // }else{ // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // } // } // }else{ // // 更新同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // // // 判断用户的手机号、邮箱是否唯一,不能重复 // retMsg = checkUserMobileEmailRepeat(userEntity.getMobilePhone(),userEntity.getEmail(),thirdObjId,qyUserList, // opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,userFlag); // if (!retMsg.getBoolean("code")) { // return retMsg; // } // // // 获取当前成员信息 // QyWebChatUserModel qyWebChatUserModel = getQyUserById(synThirdInfoEntity.getThirdObjId(),access_token); // if("0".equals(qyWebChatUserModel.getErrcode())){ // // 要同步到企业微信的对象重新赋值 // retMsg = setQyUserObject(userEntity,qyDeptList,qyWebChatUserModel); // userObjectModel = retMsg.getString("qyUserObject"); // // // 往企业微信更新成员信息 // retMsg = SynQyWebChatUtil.updateUser(userObjectModel, access_token); // if(retMsg.getBoolean("code")) { // // 同步成功 // synState = SynThirdConsts.SYN_STATE_OK; // description = ""; // }else{ // // 同步失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // } // }else{ // // 同步失败,获取企业微信当前用户信息失败 // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "获取企业微信当前用户信息失败"; // } // } // }else{ // // 同步失败,原因:用户所属部门找不到相应的企业微信ID、邮箱格式不合法 // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // // retMsg.put("code", false); // retMsg.put("error", description); // } // }else{ // // 同步失败 // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + "access_token值为空,不能同步信息"; // // retMsg.put("code", true); // retMsg.put("error", description); // } // }else { // // 同步失败,原因:企业微信不允许手机号、邮箱不能同时为空; // // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_USER,userEntity.getId()); // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // synState = SynThirdConsts.SYN_STATE_FAIL; // description = userFlag + retMsg.getString("error"); // // retMsg.put("code", false); // retMsg.put("error", description); // } // }else{ // // 未设置单条同步,归并到未同步状态 // // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_USER,userEntity.getId()); // if(synThirdInfoEntity!=null){ // // 修改同步表 // opType = SynThirdConsts.OBJECT_OP_UPD; // synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); // }else{ // // 写入同步表 // opType = SynThirdConsts.OBJECT_OP_ADD; // synThirdInfoPara = null; // thirdObjId = ""; // } // // synState = SynThirdConsts.SYN_STATE_NO; // description = userFlag + "系统未设置单条同步"; // // retMsg.put("code", true); // retMsg.put("error", description); // } // // // 更新同步表 // saveSynThirdInfoEntity(opType,synThirdInfoPara,Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER),userEntity.getId(),thirdObjId,synState,description); // // return retMsg; // } /** * 往企业微信删除成员信息 * 带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * @param isBatch 是否批量(批量不受开关限制) * @param id 本系统的公司或部门ID * @return * @throws WxErrorException */ // @Override // public JSONObject deleteUserSysToQy(boolean isBatch, String id) throws WxErrorException { // SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getQyhCorpId(); // String corpSecret = config.getQyhCorpSecret(); // // 单条记录执行时,受开关限制 // int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynUser(); // JSONObject tokenObject = new JSONObject(); // String access_token = ""; // JSONObject retMsg = new JSONObject(); // List qyUserList = new ArrayList<>(); // SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_USER,id); // // // 返回值初始化 // retMsg.put("code", true); // retMsg.put("error", "系统未设置单条同步"); // // // 支持同步 // if(synThirdInfoEntity!=null) { // if(qyhIsSyn==1) { // // 获取 access_token // tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); // access_token = tokenObject.getString("access_token"); // if (access_token != null && !"".equals(access_token)) { // // 获取企业微信上的所有成员信息列表 // JSONObject userObject = SynQyWebChatUtil.getUserList(SynThirdConsts.QY_ROOT_DEPT_ID,"1",access_token); // if(userObject.getBoolean("code")) { // qyUserList = JsonUtil.getJsonToList(userObject.getString("userlist"), QyWebChatUserModel.class); // // // 删除企业对应的用户 // if(qyUserList.stream().filter(t -> t.getUserid().equals(synThirdInfoEntity.getThirdObjId())).count() > 0 ? true : false){ // retMsg = SynQyWebChatUtil.deleteUser(synThirdInfoEntity.getThirdObjId(), access_token); // if (retMsg.getBoolean("code")) { // // 同步成功,直接删除同步表记录 // synThirdInfoService.delete(synThirdInfoEntity); // }else{ // // 同步失败 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, retMsg.getString("error")); // } // }else{ // // 根据企业微信ID找不到相应的信息,直接删除同步表记录 // synThirdInfoService.delete(synThirdInfoEntity); // } // }else{ // // 同步失败,获取企业微信的成员列表信息失败 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, "获取企业微信的成员列表信息失败"); // // retMsg.put("code", false); // retMsg.put("error", "获取企业微信的成员列表信息失败"); // } // }else{ // // 同步失败 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, "access_token值为空,不能同步信息"); // // retMsg.put("code", false); // retMsg.put("error", "access_token值为空,不能同步信息!"); // } // }else{ // // 未设置单条同步,归并到未同步状态 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_NO, "系统未设置同步"); // // retMsg.put("code", true); // retMsg.put("error", "系统未设置单条同步"); // } // } // // return retMsg; // } /** * 往企业微信创建成员信息 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param userEntity * @param accessToken (单条调用时为空) * @return * @throws WxErrorException */ @Override public JSONObject createUserSysToQy(boolean isBatch, UserEntity userEntity, String accessToken) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynUser(); JSONObject tokenObject = new JSONObject(); String access_token = ""; JSONObject retMsg = new JSONObject(); String userObjectModel = ""; String thirdObjId = ""; String thirdName = ""; Integer synState = 0; String description = ""; String userFlag = "创建:"; // 返回值初始化 retMsg.put("code", true); retMsg.put("error", userFlag + "系统未设置单条同步"); // 企业微信限制:不能手机号、邮箱同时为空 if (StringUtil.isEmpty(userEntity.getMobilePhone()) && StringUtil.isEmpty(userEntity.getEmail()) && qyhIsSyn == 1) { retMsg.put("code", false); retMsg.put("error", userFlag + "企业微信不允许手机号、邮箱不能同时为空!"); } if (isBatch || qyhIsSyn == 1) { if (retMsg.getBoolean("code")) { if (isBatch) { access_token = accessToken; } else { // 获取 access_token String corpId = config.getQyhCorpId(); // 向企业微信插入数据需要另外token(凭证密钥) String corpSecret = config.getQyhAgentSecret(); tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); access_token = tokenObject.getString("access_token"); } if (access_token != null && !access_token.isEmpty()) { // 要同步到企业微信的对象赋值 retMsg = setQyUserObject(userEntity, null); if (retMsg.getBoolean("code")) { userObjectModel = retMsg.getString("qyUserObject"); // 往企业微信写入成员 retMsg = SynQyWebChatUtil.createUser(userObjectModel, access_token); // 往同步写入本系统与第三方的对应信息 if (retMsg.getBoolean("code")) { // 同步成功 thirdObjId = userEntity.getId(); thirdName = userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; } else { if (retMsg.getString("error").contains("60104")){ QyWebChatUserModel model = getQyUserList(config, userEntity.getMobilePhone()); assert model != null; thirdObjId = model.getUserid(); thirdName = userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; }else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } } else { // 同步失败,原因:部门找不到对应的第三方ID、邮箱格式不合法 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + "access_token值为空,不能同步信息"; retMsg.put("code", false); retMsg.put("error", description); } } else { // 同步失败,原因:企业微信不允许手机号、邮箱不能同时为空 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } else { // 无须同步,未同步状态 synState = SynThirdConsts.SYN_STATE_NO; description = userFlag + "系统未设置单条同步"; retMsg.put("code", true); retMsg.put("error", description); return retMsg; } // 更新同步表 saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, synState, description, thirdName); return retMsg; } private QyWebChatUserModel getQyUserList(SocialsSysConfig config,String mobile) throws WxErrorException { JSONObject tokenObject = SynQyWebChatUtil.getAccessToken(config.getQyhCorpId(), config.getQyhAgentSecret()); String token = tokenObject.getString("access_token"); // 获取企业微信的用户列表 JSONObject retMsg = SynQyWebChatUtil.getUserIdByMobile(mobile, token); String string = retMsg.getString("userid"); QyWebChatUserModel qyWebChatUserModel = new QyWebChatUserModel(); qyWebChatUserModel.setUserid(string); return qyWebChatUserModel; } /** * 往企业微信更新成员信息 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param userEntity * @param accessToken (单条调用时为空) * @return * @throws WxErrorException */ @Override public JSONObject updateUserSysToQy(boolean isBatch, UserEntity userEntity, String accessToken,String corpToken) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynUser(); JSONObject tokenObject = new JSONObject(); String access_token = ""; String access_tokens = ""; JSONObject retMsg = new JSONObject(); String userObjectModel = ""; SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity(); SynThirdInfoEntity entity = new SynThirdInfoEntity(); String opType = ""; SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity(); String thirdObjId = ""; String thirdName = ""; Integer synState = 0; String description = ""; String userFlag = "更新:"; // 返回值初始化 retMsg.put("code", true); retMsg.put("error", userFlag + "系统未设置单条同步"); // 企业微信限制:不能手机号、邮箱同时为空 if (StringUtil.isEmpty(userEntity.getMobilePhone()) && StringUtil.isEmpty(userEntity.getEmail()) && qyhIsSyn == 1) { retMsg.put("code", false); retMsg.put("error", userFlag + "企业微信不允许手机号、邮箱不能同时为空!"); } // 支持同步 if (isBatch || qyhIsSyn == 1) { if (retMsg.getBoolean("code")) { if (!isBatch) { tokenObject = SynQyWebChatUtil.getAccessToken(config.getQyhCorpId(), config.getQyhAgentSecret()); access_token = tokenObject.getString("access_token"); JSONObject corpTokenObject = SynQyWebChatUtil .getAccessToken(config.getQyhCorpId(), config.getQyhCorpSecret()); corpToken = corpTokenObject.getString("access_token"); }else { access_token = accessToken; } // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_USER, userEntity.getId()); if (StringUtil.isNotEmpty(access_token)) { // 要同步到企业微信的对象赋值 retMsg = setQyUserObject(userEntity, null); if (retMsg.getBoolean("code")) { // 判断当前用户对应的第三方的合法性 userObjectModel = retMsg.getString("qyUserObject"); retMsg = checkUserSysToQy(synThirdInfoEntity); if (!retMsg.getBoolean("code")) { if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) { // flag:3 未同步,需要创建同步到企业微信、写入同步表 // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到企业微信、写入同步表 if ("1".equals(retMsg.getString("flag"))) { synThirdInfoService.delete(synThirdInfoEntity); } opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; // 往企业微信写入成员 retMsg = SynQyWebChatUtil.createUser(userObjectModel, access_token); if (retMsg.getBoolean("code")) { // 同步成功 thirdObjId = userEntity.getId(); thirdName=userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; description = ""; } else { if (retMsg.getString("error").contains("60104")){ QyWebChatUserModel model = getQyUserList(config, userEntity.getMobilePhone()); assert model != null; thirdObjId = model.getUserid(); thirdName = userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; }else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } } if ("2".equals(retMsg.getString("flag"))) { // 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = ""; // 往企业微信写入成员 retMsg = SynQyWebChatUtil.createUser(userObjectModel, access_token); if (retMsg.getBoolean("code")) { // 同步成功 thirdObjId = userEntity.getId(); thirdName=userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; description = ""; } else { if (retMsg.getString("error").contains("60104")){ QyWebChatUserModel model = getQyUserList(config, userEntity.getMobilePhone()); assert model != null; thirdObjId = model.getUserid(); thirdName = userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; }else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } } } else { // 更新同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); // 获取当前成员信息 QyWebChatUserModel qyWebChatUserModel = getQyUserById(synThirdInfoEntity.getThirdObjId(), corpToken); if ("0".equals(qyWebChatUserModel.getErrcode())) { // 要同步到企业微信的对象重新赋值 retMsg = setQyUserObject(userEntity, qyWebChatUserModel); userObjectModel = retMsg.getString("qyUserObject"); // 往企业微信更新成员信息 retMsg = SynQyWebChatUtil.updateUser(userObjectModel, access_token); if (retMsg.getBoolean("code")) { // 同步成功 synState = SynThirdConsts.SYN_STATE_OK; description = ""; } else { if (retMsg.getString("error").contains("60104")){ QyWebChatUserModel model = getQyUserList(config, userEntity.getMobilePhone()); assert model != null; thirdObjId = model.getUserid(); thirdName = userEntity.getRealName(); synState = SynThirdConsts.SYN_STATE_OK; }else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } } else { // 同步失败,获取企业微信当前用户信息失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + "获取企业微信当前用户信息失败"; } } } else { // 同步失败,原因:用户所属部门找不到相应的企业微信ID、邮箱格式不合法 if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); retMsg.put("code", false); retMsg.put("error", description); } } else { // 同步失败 if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + "access_token值为空,不能同步信息"; retMsg.put("code", true); retMsg.put("error", description); } } else { // 同步失败,原因:企业微信不允许手机号、邮箱不能同时为空; // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_USER, userEntity.getId()); if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); retMsg.put("code", false); retMsg.put("error", description); } } else { // 未设置单条同步,归并到未同步状态 // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_USER, userEntity.getId()); if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; thirdObjId = synThirdInfoEntity.getThirdObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; thirdObjId = ""; } synState = SynThirdConsts.SYN_STATE_NO; description = userFlag + "系统未设置单条同步"; retMsg.put("code", true); retMsg.put("error", description); return retMsg; } // 更新同步表 saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, synState, description, thirdName); return retMsg; } @Override public JSONObject updateUserSysToQy(boolean isBatch, UserEntity userEntity, String accessToken, Integer single) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); String qyhDepartment = config.getQyhDepartment(); List organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(qyhDepartment); List listByUserId = userRelationService.getListByUserId(userEntity.getId(), "organize"); List collect = organizeEntitiesBind.stream() .map(SuperBaseEntity.SuperIBaseEntity::getId) .collect(Collectors.toList()); List relationEntities = listByUserId.stream() .filter(t ->collect.contains(t.getObjectId())) .collect(Collectors.toList()); if (CollectionUtil.isEmpty(relationEntities)) { return new JSONObject(); } userEntity.setOrganizeId(relationEntities.get(0).getObjectId()); return updateUserSysToQy(isBatch, userEntity, accessToken,""); } /** * 往企业微信删除成员信息 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param id 本系统的公司或部门ID * @param accessToken (单条调用时为空) * @return * @throws WxErrorException */ @Override public JSONObject deleteUserSysToQy(boolean isBatch, String id, String accessToken) throws WxErrorException { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int qyhIsSyn = isBatch ? 1 : config.getQyhIsSynUser(); JSONObject tokenObject = new JSONObject(); String access_token = ""; JSONObject retMsg = new JSONObject(); SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_USER, id); // 返回值初始化 retMsg.put("code", true); retMsg.put("error", "系统未设置单条同步"); // 支持同步 if (synThirdInfoEntity != null) { if (qyhIsSyn == 1) { // 获取 access_token if (isBatch) { access_token = accessToken; } else { String corpId = config.getQyhCorpId(); String corpSecret = config.getQyhAgentSecret(); tokenObject = SynQyWebChatUtil.getAccessToken(corpId, corpSecret); access_token = tokenObject.getString("access_token"); } if (access_token != null && !access_token.isEmpty()) { if (!"".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) && !"null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) { retMsg = SynQyWebChatUtil.deleteUser(synThirdInfoEntity.getThirdObjId(), access_token); if (retMsg.getBoolean("code")) { // 同步成功,直接删除同步表记录 synThirdInfoService.delete(synThirdInfoEntity); } else { // 同步失败 saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER) , id, synThirdInfoEntity.getThirdObjId() , SynThirdConsts.SYN_STATE_FAIL, retMsg.getString("error"), ""); } } else { // 根据企业微信ID找不到相应的信息,直接删除同步表记录 synThirdInfoService.delete(synThirdInfoEntity); } } else { // 同步失败 saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER) , id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL , "access_token值为空,不能同步信息", ""); retMsg.put("code", false); retMsg.put("error", "access_token值为空,不能同步信息!"); } } else { // 未设置单条同步,归并到未同步状态 // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER) // , id, synThirdInfoEntity.getThirdObjId() // , SynThirdConsts.SYN_STATE_NO, "系统未设置同步", ""); retMsg.put("code", true); retMsg.put("error", "系统未设置单条同步"); } } return retMsg; } /** * 企业微信同步组织部门到本地 * 企业微信同步单个公司或部门到本地(供调用) * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param accessToken (单条调用时为空) */ @Override public JSONObject createDepartmentQyToSys(boolean isBatch, QyWebChatDeptModel deptEntity, String accessToken) { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // 单条记录执行时,受开关限制 int dingIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); Integer dingDeptId = deptEntity.getId(); String dingDeptName = deptEntity.getName(); Integer dingParentId = deptEntity.getParentid(); Integer synState = 0; String deptFlag = "创建:"; String description = ""; JSONObject retMsg = new JSONObject(); boolean isDeptDiff = true; String sysParentId = ""; String sysObjId = ""; // 返回值初始化 retMsg.put("code", true); retMsg.put("error", "创建:系统未设置单条同步"); boolean createOrUpdate = true; SynThirdInfoEntity entity = new SynThirdInfoEntity(); // 支持同步 if (isBatch || dingIsSyn == 1) { boolean tag = false; if (dingDeptId == 1) { tag = true; } SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, dingParentId + ""); // retMsg = checkDepartmentDingToSys(synThirdInfoEntity); isDeptDiff = retMsg.getBoolean("code"); if (isDeptDiff || tag) { sysParentId = tag ? " -1" : synThirdInfoEntity.getSysObjId(); // 新增保存组织 OrganizeEntity newOrg = new OrganizeEntity(); sysObjId = RandomUtil.uuId(); newOrg.setId(sysObjId); if (!"1".equals(dingDeptId + "")) { Assert.notNull(sysParentId, "父级组织未同步"); newOrg.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT); newOrg.setParentId(sysParentId); // 通过组织id获取父级组织 List depsByParentId = organizeService.getDepsByParentId(sysParentId); if (depsByParentId.stream().noneMatch(t->t.getFullName().equals(dingDeptName))){ String organizeIdTree = organizeService.getOrganizeIdTree(newOrg); newOrg.setOrganizeIdTree(organizeIdTree + "," + sysObjId); newOrg.setFullName(dingDeptName); newOrg.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L); organizeService.create(newOrg);} } else { String qyhDepartment = config.getQyhDepartment(); //绑定最高组织 OrganizeEntity info = organizeService.getInfo(qyhDepartment); sysObjId = info.getId(); entity = synThirdInfoService .getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_QY , SynThirdConsts.DATA_TYPE_ORG, info.getId()); if (BeanUtil.isNotEmpty(entity)) { createOrUpdate = false; } } // 中间表 retMsg.put("retDeptId", sysObjId); synState = SynThirdConsts.SYN_STATE_OK; } else { // 同步失败,上级部门无对应的企业微信ID synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "部门所属的上级部门未同步到本地"; retMsg.put("code", false); retMsg.put("error", description); retMsg.put("retDeptId", "0"); } } // 更新同步表 saveSynThirdInfoEntity(createOrUpdate ? SynThirdConsts.OBJECT_OP_ADD : SynThirdConsts.OBJECT_OP_UPD , createOrUpdate ? null : entity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG) , sysObjId, dingDeptId + "", synState, description, deptEntity.getName()); return retMsg; } /** * 企业微信更新组织-部门到本地 * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604 * * @param isBatch 是否批量(批量不受开关限制) * @param deptEntity * @param accessToken (单条调用时为空) * @return */ @Override public JSONObject updateDepartmentQyToSys(boolean isBatch, QyWebChatDeptModel deptEntity, String accessToken) { SocialsSysConfig config = sysconfigService.getSocialsConfig(); // String corpId = config.getDingSynAppKey(); // String corpSecret = config.getDingSynAppSecret(); // String compValue = SynThirdConsts.OBJECT_TYPE_COMPANY; // 单条记录执行时,受开关限制 int dingIsSyn = isBatch ? 1 : config.getQyhIsSynOrg(); // JSONObject tokenObject = new JSONObject(); // String access_token = ""; JSONObject retMsg = new JSONObject(); DingTalkDeptModel deptModel = new DingTalkDeptModel(); SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity(); SynThirdInfoEntity synThirdInfoParentEntity = new SynThirdInfoEntity(); String opType = ""; Integer synState = 0; String description = ""; // String thirdObjId = ""; String sysObjId = ""; String sysParentId = ""; SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity(); boolean isDeptDiff = true; String deptFlag = "更新:"; Integer dingDeptId = deptEntity.getId(); String dingDeptName = deptEntity.getName(); Integer dingParentId = deptEntity.getParentid(); OrganizeEntity orgInfo = new OrganizeEntity(); // 返回值初始化 retMsg.put("code", true); retMsg.put("error", "系统未设置单条同步"); if (isBatch || dingIsSyn == 1) { // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + ""); synThirdInfoParentEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, dingParentId + ""); if (synThirdInfoParentEntity == null) { retMsg.put("code", false); retMsg.put("error", "上级部门未同步"); return retMsg; } // retMsg = checkDepartmentDingToSys(synThirdInfoEntity); isDeptDiff = retMsg.getBoolean("code"); if (isDeptDiff) { // sysParentId = synThirdInfoEntity.getSysObjId(); sysParentId = synThirdInfoParentEntity.getSysObjId(); // 获取同步表信息 // synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY,SynThirdConsts.DATA_TYPE_ORG,dingDeptId+""); // 判断当前部门对应的第三方的合法性 // retMsg = checkDepartmentDingToSys(synThirdInfoEntity); if (!retMsg.getBoolean("code")) { if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) { // flag:3 未同步,需要创建同步到企业微信、写入同步表 // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到企业微信、写入同步表 if ("1".equals(retMsg.getString("flag"))) { synThirdInfoService.delete(synThirdInfoEntity); } opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; // thirdObjId = dingDeptId+""; // 新增保存组织 orgInfo = new OrganizeEntity(); sysObjId = RandomUtil.uuId(); orgInfo.setId(sysObjId); if (!"1".equals(dingDeptId + "")) { // newOrg.setCategory(SynThirdConsts.OBJECT_TYPE_COMPANY); // newOrg.setParentId("-1"); // newOrg.setOrganizeIdTree(sysObjId); orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT); orgInfo.setParentId(sysParentId); // 通过组织id获取父级组织 String organizeIdTree = organizeService.getOrganizeIdTree(orgInfo); orgInfo.setOrganizeIdTree(organizeIdTree + "," + sysObjId); orgInfo.setFullName(dingDeptName); orgInfo.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L); organizeService.save(orgInfo); } else { sysObjId = organizeService.getOrganizeByParentId("-1").get(0).getId(); } // 同步成功 // thirdObjId = retMsg.getString("retDeptId"); retMsg.put("retDeptId", sysObjId); synState = SynThirdConsts.SYN_STATE_OK; description = ""; } if ("2".equals(retMsg.getString("flag"))) { // flag:2 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; // thirdObjId = dingDeptId+""; // 新增保存组织 orgInfo = new OrganizeEntity(); sysObjId = RandomUtil.uuId(); orgInfo.setId(sysObjId); if (!"1".equals(dingDeptId + "")) { // newOrg.setCategory(SynThirdConsts.OBJECT_TYPE_COMPANY); // newOrg.setParentId("-1"); // newOrg.setOrganizeIdTree(sysObjId); orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT); orgInfo.setParentId(sysParentId); // 通过组织id获取父级组织 String organizeIdTree = organizeService.getOrganizeIdTree(orgInfo); orgInfo.setOrganizeIdTree(organizeIdTree + "," + sysObjId); orgInfo.setFullName(dingDeptName); orgInfo.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L); organizeService.save(orgInfo); } else { sysObjId = organizeService.getOrganizeByParentId("-1").get(0).getId(); } // 同步成功 retMsg.put("retDeptId", sysObjId); synState = SynThirdConsts.SYN_STATE_OK; description = ""; } } else { // 更新同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; // thirdObjId = synThirdInfoEntity.getThirdObjId(); sysObjId = synThirdInfoEntity.getSysObjId(); orgInfo = organizeService.getInfo(sysObjId); if (orgInfo != null) { // orgInfo.setParentId(dingParentId+""); orgInfo.setFullName(dingDeptName); if (!"1".equals(dingDeptId + "")) { // orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_COMPANY); // orgInfo.setParentId("-1"); // orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT); orgInfo.setParentId(sysParentId); orgInfo.setOrganizeIdTree(orgInfo.getOrganizeIdTree().replace("," + orgInfo.getId(), "")); organizeService.update(orgInfo.getId(), orgInfo); } // 同步成功 synState = SynThirdConsts.SYN_STATE_OK; description = ""; } else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "未找到对应的部门"; } } } else { synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + ""); // 同步失败,上级部门检查有异常 if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; sysObjId = synThirdInfoEntity.getSysObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; sysObjId = ""; } synState = SynThirdConsts.SYN_STATE_FAIL; description = deptFlag + "上级部门无对应的本地ID"; retMsg.put("code", false); retMsg.put("error", description); } } else { // 未设置单条同步,归并到未同步状态 // 获取同步表信息 synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + ""); if (synThirdInfoEntity != null) { // 修改同步表 opType = SynThirdConsts.OBJECT_OP_UPD; synThirdInfoPara = synThirdInfoEntity; sysObjId = synThirdInfoEntity.getSysObjId(); } else { // 写入同步表 opType = SynThirdConsts.OBJECT_OP_ADD; synThirdInfoPara = null; sysObjId = ""; } synState = SynThirdConsts.SYN_STATE_NO; description = deptFlag + "系统未设置单条同步"; retMsg.put("code", true); retMsg.put("error", description); } // 更新同步表 saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG) , sysObjId, dingDeptId + "", synState, description, deptEntity.getName()); return retMsg; } /** * 企业微信同步用户到本地 * * @param isBatch 是否批量(批量不受开关限制) * @param qyWebChatUserModel * @return */ @Override public JSONObject createUserQyToSys(boolean isBatch, QyWebChatUserModel qyWebChatUserModel, String access_token) throws Exception { String dingUserId = qyWebChatUserModel.getUserid(); SocialsSysConfig config = sysconfigService.getSocialsConfig(); String corpId = config.getQyhCorpId(); JSONObject retMsg2 = SynQyWebChatUtil.getLinkedcorpUserById(corpId + "/" + dingUserId, access_token); String dingUserName = qyWebChatUserModel.getName(); String dingMobile = retMsg2.getJSONObject("userinfo").getString("mobile"); String dingTelephone = qyWebChatUserModel.getTelephone(); Integer status = qyWebChatUserModel.getStatus(); // 工号不唯一的情况,不能用于做本系统的账号 // String dingJobNumber = qyWebChatUserModel.getJobNumber(); // 职位:是字符串,手入的 // String title = qyWebChatUserModel.getTitle(); String sysObjId = ""; // 单条记录执行时,受开关限制 int dingIsSyn = config.getQyhIsSynUser(); JSONObject retMsg = new JSONObject(); int synState = 0; String description = ""; String userFlag = "创建:"; UserEntity userEntity = new UserEntity(); String tag = SynThirdConsts.OBJECT_OP_ADD; // if (status != 1) { // return retMsg; // } if (isBatch || dingIsSyn == 1) { // 检测账户唯一 UserEntity userAccount = userService.getUserByMobile(dingMobile); if (userAccount != null) { // 查询用户id在不在同步表 sysObjId = userAccount.getId(); boolean hasExist = synThirdInfoService.getBySysObjId(sysObjId, SynThirdConsts.THIRD_TYPE_QY); if (hasExist) { // 说明创建过了,直接跳过 tag = SynThirdConsts.OBJECT_OP_UPD; synState = 1; description = "创建过,更新对象"; return retMsg; } else { retMsg.put("code", true); description = "账户名重复:线上手机账号" + dingMobile + "自动合并为本地账号"; synState = SynThirdConsts.SYN_STATE_OK; retMsg.put("msg", description); } } else { // 判断中间表用户组织是否存在 List deptIdList = qyWebChatUserModel.getDepartment(); List deptIdStrList = deptIdList.stream().map(t -> t + "").collect(Collectors.toList()); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(SynThirdInfoEntity::getThirdObjId, deptIdStrList); wrapper.lambda().eq(SynThirdInfoEntity::getThirdType, SynThirdConsts.THIRD_TYPE_QY); List synThirdInfoEntities = synThirdInfoService.list(wrapper); if (synThirdInfoEntities != null && !synThirdInfoEntities.isEmpty()) { // 返回值初始化 retMsg.put("code", true); retMsg.put("error", userFlag + "系统未设置单条同步"); userEntity.setId(RandomUtil.uuId()); userEntity.setHeadIcon("001.png"); userEntity.setAccount(dingMobile); // 工号 // userEntity.setDingJobNumber(qyWebChatUserModel.getJobNumber()); userEntity.setEmail(qyWebChatUserModel.getEmail()); // userEntity.setCertificatesNumber(qyWebChatUserModel.getJobNumber()); userEntity.setMobilePhone(dingMobile); // userEntity.setGender(2); userEntity.setRealName(dingUserName); userEntity.setEnabledMark(1); if (StringUtil.isBlank(userEntity.getOrganizeId())) { String orgId = synThirdInfoService.getSysByThird(String.valueOf(deptIdList.get(0))); userEntity.setOrganizeId(orgId); } sysObjId = userEntity.getId(); List orgIdList = new ArrayList<>(); List posIdList = new ArrayList<>(); for (String deptIdStr : deptIdStrList) { String orgId = synThirdInfoService.getSysByThird(deptIdStr); List ids = new ArrayList<>(); ids.add(orgId); List listByOrganizeId = positionService.getListByOrganizeId(ids, true); List positionEntityList = listByOrganizeId.stream() .filter(t -> t.getDefaultMark().equals(1)) .collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(positionEntityList)) { posIdList.add(positionEntityList.get(0).getId()); } orgIdList.add(orgId); } userEntity.setPositionId(String.join(",", posIdList)); userEntity.setOrganizeId(String.join(",", orgIdList)); userEntity.setSortCode(0L); userService.create(userEntity); userRelationService.syncDingUserRelation(sysObjId,deptIdList,SynThirdConsts.THIRD_TYPE_QY); // 往同步写入本系统与第三方的对应信息 if (retMsg.getBoolean("code")) { // 同步成功 synState = SynThirdConsts.SYN_STATE_OK; } else { // 同步失败 synState = SynThirdConsts.SYN_STATE_FAIL; description = userFlag + retMsg.getString("error"); } } else { // 无须同步,未同步状态 synState = SynThirdConsts.SYN_STATE_NO; description = userFlag + "用户未同步组织信息"; retMsg.put("code", false); retMsg.put("error", description); } } } else { // 无须同步,未同步状态 synState = SynThirdConsts.SYN_STATE_NO; description = userFlag + "系统未设置单条同步"; retMsg.put("code", true); retMsg.put("error", description); } // 更新同步表 saveSynThirdInfoEntity(tag, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER) , sysObjId, dingUserId, synState, description, qyWebChatUserModel.getName()); return retMsg; } // 更新同步表 /** * 企业微信更新用户信息到本地 * 将组织、用户的信息写入同步表 */ @Override public JSONObject updateUserQyToSystem(boolean isBatch, QyWebChatUserModel qyWebChatUserModel, String access_token) throws Exception { SocialsSysConfig config = sysconfigService.getSocialsConfig(); JSONObject retMsg = new JSONObject(); SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity(); String opType = ""; String thirdObjId = ""; Integer synState = 0; String description = ""; String userFlag = "更新:"; // 赋值第三方id thirdObjId = qyWebChatUserModel.getUserid(); // 返回值初始化 retMsg.put("code", true); retMsg.put("error", userFlag + "系统未设置单条同步"); // 单条记录执行时,受开关限制 int dingIsSyn = config.getQyhIsSynUser(); // 支持同步 if (isBatch || dingIsSyn == 1) { // 获取同步表信息 /** * 获取指定第三方工具、指定数据类型、本地对象ID的同步信息 * // 获取方式如果第三方用户id和第三方组织id会一致则须修改 * thirdType 22 企业微信 * dataType 2 用户 * thirdId 第三方id */ synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_QY, SynThirdConsts.DATA_TYPE_USER, thirdObjId); if (synThirdInfoEntity != null && StringUtil.isNoneBlank(synThirdInfoEntity.getSysObjId())) { opType = SynThirdConsts.OBJECT_OP_UPD; String sysObjId = synThirdInfoEntity.getSysObjId(); UserEntity info = userService.getInfo(sysObjId); if (info == null) { synState = SynThirdConsts.SYN_STATE_NO; description = "本地更新记录未找到"; retMsg.put("code", false); retMsg.put("error", description); synThirdInfoService.removeById(synThirdInfoEntity.getId()); } else { String dingUserName = qyWebChatUserModel.getName(); String dingMobile = qyWebChatUserModel.getMobile(); // 更新系统用户表 List deptIdList = qyWebChatUserModel.getDepartment(); List deptIdStrList = deptIdList.stream().map(t -> t + "").collect(Collectors.toList()); // info.setMobilePhone(dingMobile); // info.setAccount(dingMobile); // info.setRealName(dingUserName); List orgIdList = new ArrayList<>(); List posIdList = new ArrayList<>(); for (String deptIdStr : deptIdStrList) { String orgId = synThirdInfoService.getSysByThird(deptIdStr, Integer.valueOf(SynThirdConsts.THIRD_TYPE_QY)); orgIdList.add(orgId); List ids = new ArrayList<>(); List listByOrganizeId = positionService.getListByOrganizeId(ids, true); List positionEntityList = listByOrganizeId.stream() .filter(t -> t.getDefaultMark().equals(1)) .collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(positionEntityList)) { posIdList.add(positionEntityList.get(0).getId()); } } info.setPositionId(String.join(",", posIdList)); info.setOrganizeId(String.join(",", orgIdList)); userService.update(info.getId(), info); // 检测是否未同步用户组织关联 userRelationService.syncDingUserRelation(info.getId(), deptIdList, SynThirdConsts.THIRD_TYPE_QY); synState = 1; // 更新同步表记录 description = "账号同步更新完成"; saveSynThirdInfoEntity(opType, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER) , synThirdInfoEntity.getSysObjId(), thirdObjId, synState, description, qyWebChatUserModel.getName()); } } else { if ((synThirdInfoEntity != null && StringUtil.isBlank(synThirdInfoEntity.getSysObjId()))) { // 删除记录 synThirdInfoService.removeById(synThirdInfoEntity.getId()); } opType = SynThirdConsts.OBJECT_OP_ADD; thirdObjId = synThirdInfoEntity.getThirdObjId(); try { this.createUserQyToSys(true, qyWebChatUserModel, access_token); } catch (ParseException e) { e.printStackTrace(); } } } else { // 未设置单条同步,归并到未同步状态 synState = SynThirdConsts.SYN_STATE_NO; description = userFlag + "系统未设置单条同步"; retMsg.put("code", true); retMsg.put("error", description); opType = SynThirdConsts.OBJECT_OP_ADD; saveSynThirdInfoEntity(opType, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_QY), Integer.parseInt(SynThirdConsts.DATA_TYPE_USER) , null, thirdObjId, synState, description, ""); } return retMsg; } }