package com.uas.service.Impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.landray.kmss.sys.organization.webservice.in.ISysSynchroSetOrgWebService; import com.landray.kmss.sys.organization.webservice.in.SysSynchroSetOrgContext; import com.landray.kmss.sys.organization.webservice.in.SysSynchroSetResult; import com.uas.core.config.AddSoapHeader; import com.uas.core.config.WebServiceConfig; import com.uas.dao.BaseDao; import com.uas.dao.SqlRowList; import com.uas.service.SyncOrgElementsBaseInfoService; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import sun.misc.BASE64Encoder; import java.util.List; /** * @author koul * @email koul@usoftchina.com * @date 2021-05-07 15:33 */ @Service public class SyncOrgElementsBaseInfoServiceImpl implements SyncOrgElementsBaseInfoService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired BaseDao baseDao; /** * 同步所有组织架构基本信息 * @param setOrgContext 组织架构信息接入上下文 * @return * @throws Exception */ private SysSynchroSetResult syncOrgElementsBaseInfo(SysSynchroSetOrgContext setOrgContext) throws Exception{ return getService().syncOrgElementsBaseInfo(setOrgContext); } /** * 获取组织架构接入 WebService 对象 * @return */ private ISysSynchroSetOrgWebService getService(){ // 定义组织架构接入 WebService 对象 ISysSynchroSetOrgWebService setOrgWebService=null; if(setOrgWebService==null){ // WebService 配置信息对象(读取自 client.properties 配置文件) WebServiceConfig serviceConfig = WebServiceConfig.getInstance(); // 使用 Apache CXF 框架创建组织架构接入 WebService 对象 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.getOutInterceptors().add(new AddSoapHeader()); factory.setServiceClass(serviceConfig.getOrgServiceClass()); // 设置服务请求的 URL 地址 String servicePath = serviceConfig.getOrgAddress(); factory.setAddress(servicePath); setOrgWebService= (ISysSynchroSetOrgWebService) factory.create(); } return setOrgWebService; } /** * 同步组织架构信息 * @param setOrgContext 组织架构信息接入上下文 * @return * @throws Exception */ private SysSynchroSetResult syncOrgElements(SysSynchroSetOrgContext setOrgContext) throws Exception{ return getService().syncOrgElements(setOrgContext); } /** * 同步更新的组织架构信息 * @param setOrgContext 组织架构信息接入上下文 * @return * @throws Exception */ private SysSynchroSetResult updateOrgElement(SysSynchroSetOrgContext setOrgContext) throws Exception{ return getService().updateOrgElement(setOrgContext); } /** * 封装数据 * @return */ private JSONArray getOrgJsonData(){ JSONArray resultArray = new JSONArray(); // 《组织部门》 数据对象 SqlRowList orgs = baseDao.queryForRowSet("select row_number() over (order by or_id) rn, case when nvl" + "(or_landrayid,' ')=' ' then to_char(or_id) else or_landrayid end or_id,or_code,or_name ," + "or_parentname,or_headmancode,or_headmanname,or_path, (select case when nvl(em_landrayemid,' ')=' ' " + "then to_char(em_id) else em_landrayemid end from hrorg ho left join employee on ho" + ".or_headmancode=em_code where ho.or_id=hr.or_subof) as superLeader,or_statuscode,or_landraysubid," + "to_char(or_subof) or_subof,case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else " + "em_landrayemid end emid from hrorg hr left join employee on hr.or_headmancode=em_code where " + "nvl(or_subof,0)>0 order by rn"); while (orgs.next()) { JSONObject orgObj = new JSONObject(); orgObj.put("id", orgs.getGeneralString("or_id")); // 唯一标识 (不允许为空) orgObj.put("lunid", orgs.getGeneralString("or_id")); // 唯一标识 (若不为空,直接作为主健存入数据库,不允许为空) orgObj.put("name", orgs.getGeneralString("or_name")); // 名称 (不允许为空) orgObj.put("type", "dept"); // 组织架构类型 (不允许为空 可选项: org(机构)、dept(部门)、group(群组)、post(岗位)、person(人员)) orgObj.put("no", orgs.getGeneralString("or_code")); // 编号 (可为空) orgObj.put("order", orgs.getGeneralString("rn")); // 排序号 (可为空) orgObj.put("keyword", ""); // 关键字 (内容格式不限制,可为空) String landraysubid = orgs.getObject("or_landraysubid") == null ? orgs.getGeneralString("or_subof") : orgs.getGeneralString("or_landraysubid"); orgObj.put("parent", landraysubid); // 父组织 (可为空) orgObj.put("thisLeader", orgs.getGeneralString("emid")); // 组织架构领导 (可为空) orgObj.put("memo", orgs.getGeneralString("or_path")); // 组织架构说明 (可为空) orgObj.put("superLeader", orgs.getGeneralString("superLeader")); // 组织上级上级领导 (可为空) String statuscode = orgs.getObject("or_statuscode") == null ? "" : orgs.getGeneralString( "or_statuscode"); if ("AUDITED".equals(statuscode)) { orgObj.put("isAvailable", true); // 是否有效,该属性决定该部门架构是否删除 }else { orgObj.put("isAvailable", false); } resultArray.add(orgObj); // 组织机构 } // 《岗位》 数据对象 SqlRowList posts = baseDao.queryForRowSet("select row_number() over (order by jo_level) rn,jo_id joid,case when nvl(jo_landrayid,' ')=' ' then to_char(jo_id) else jo_landrayid end jo_id, jo_code, jo_name, jo_orgid, jo_orgname, jo_headmancode, jo_headmanname , to_char(jo_orgid) jo_orgid, jo_parentname, jo_level, jo_emptype,jo_statuscode,jo_landrayorid," + "case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else em_landrayemid end emid," + "case when nvl(or_landrayid,' ')=' ' then to_char(or_id) else or_landrayid end or_id " + "from job left join employee on em_code=jo_headmancode left join hrorg on jo_orgid=or_id" + " order by rn"); while (posts.next()) { JSONObject postObj = new JSONObject(); postObj.put("id", posts.getGeneralString("jo_id")); // 唯一标识 (不允许为空) postObj.put("lunid", posts.getGeneralString("jo_id")); // 唯一标识 (若不为空,直接作为主健存入数据库,允许为空) postObj.put("name", posts.getGeneralString("jo_name")); // 名称 (不允许为空) postObj.put("type", "post"); // 组织架构类型 (不允许为空 可选项: org(机构)、dept(部门)、group(群组)、post(岗位)、person(人员)) postObj.put("no", posts.getGeneralString("jo_code")); // 编号 (可为空) postObj.put("order", posts.getGeneralString("rn")); // 排序号 (可为空) postObj.put("keyword", ""); // 关键字 (内容格式不限制,可为空) postObj.put("parent", posts.getString("or_id")); // 父部门 (可为空) postObj.put("thisLeader", posts.getGeneralString("emid")); // 部门架构领导 (可为空) int level = posts.getGeneralInt("jo_level"); String memo = posts.getObject("jo_orgname") == null ? "岗位层级" + level : "所属组织部门" + posts.getGeneralString("jo_orgname") + ",岗位层级" + level; postObj.put("memo", memo); // 岗位架构说明 (可为空) List data = baseDao.queryForList("select case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else em_landrayemid end from employee where em_class<>'离职' and nvl(em_islandray,0)=-1 and em_defaulthsid="+posts.getGeneralInt("joid"), String.class); JSONArray persons=null; if (data != null && data.size() > 0) { persons =JSONArray.parseArray(JSON.toJSONString(data)); } postObj.put("persons", persons); // 岗位包含人员 (可为空) String statuscode = posts.getObject("jo_statuscode") == null ? "" : posts.getGeneralString( "jo_statuscode"); if ("AUDITED".equals(statuscode)) { postObj.put("isAvailable", true); // 是否有效,该属性决定该部门架构是否删除 }else { postObj.put("isAvailable", false); } resultArray.add(postObj); // 岗位 } // 《人员》 数据对象 SqlRowList persons = baseDao.queryForRowSet("select row_number() over (order by em_id) rn,em_id emid,case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else em_landrayemid end em_id,em_code,em_name,em_password,em_mobile, em_email,em_cardcode," + "em_departmentcode,em_depart,em_position,em_defaulthsid,em_landrayemid,em_class," + "case when nvl(or_landrayid,' ')=' ' then to_char(or_id) else or_landrayid end or_id,case when nvl" + "(jo_landrayid,' ')=' ' then to_char(jo_id) else jo_landrayid end jo_id " + "from employee left join job on em_defaulthsid=jo_id left join hrorg on em_defaultorid=or_id where " + "nvl(em_islandray,0)=-1 order by rn"); while (persons.next()) { JSONObject personObj = new JSONObject(); // 唯一标识 (不允许为空) personObj.put("id", persons.getGeneralString("em_id")); personObj.put("lunid", persons.getGeneralString("em_id")); // 唯一标识 (若不为空,直接作为主健存入数据库,允许为空) personObj.put("name", persons.getGeneralString("em_name")); // 名称 (不允许为空) personObj.put("type", "person"); // 组织架构类型 (不允许为空 可选项: org(机构)、dept(部门)、group(群组)、post(岗位)、person(人员)) personObj.put("no", persons.getGeneralString("em_code")); // 编号 (可为空) personObj.put("order", persons.getGeneralString("rn")); // 排序号 (可为空) personObj.put("keyword", persons.getGeneralString("em_name")); // 关键字 (内容格式不限制,可为空) String statuscode = persons.getObject("em_class") == null ? "" : persons.getGeneralString("em_class"); if ("离职".equals(statuscode)) { personObj.put("isAvailable", false); // 是否有效,该属性决定该部门架构是否删除 }else { personObj.put("isAvailable", true); } personObj.put("memo", persons.getGeneralString("rn")); // 人员说明 (可为空) personObj.put("parent", persons.getGeneralString("or_id")); // 所在部门 (可为空) List data = baseDao.queryForList("select case when nvl(jo_landrayid,' ')=' ' then to_char(jo_id) else jo_landrayid end from empsjobs left join job on job_id=jo_id where emp_id=" + persons.getGeneralInt("emid"), String.class); data.add(persons.getString("jo_id")); JSONArray jobs=null; if (data != null && data.size() > 0) { jobs =JSONArray.parseArray(JSON.toJSONString(data)); } personObj.put("posts", jobs); // 所属岗位 personObj.put("loginName", persons.getGeneralString("em_mobile")); // 登录名 String password = ""; if (persons.getObject("em_password") != null) { BASE64Encoder encoder = new BASE64Encoder(); password = encoder.encode(persons.getGeneralString("em_password").getBytes());//base64加密 } personObj.put("password", password); // 密码,base64加密后的信息 personObj.put("mobileNo", persons.getGeneralString("em_mobile")); // 手机号 personObj.put("email", persons.getGeneralString("em_email")); // 邮件地址 personObj.put("attendanceCardNumber", persons.getGeneralString("em_cardcode")); // 考勤号 personObj.put("workPhone", "0755878787782"); // 办公电话 (仅当 type 为 person 时,有此信息) personObj.put("rtx", "952701"); // rtx 账号 (仅当 type 为 person 时,有此信息) resultArray.add(personObj); // 人员 } return resultArray; } @Override public String sendSyncOrgElementsBaseInfo() { updateDeptElementAll(); updatePostElementAll(); updatePersonElementAll(); String res = ""; // 定义组织架构信息接入上下文 SysSynchroSetOrgContext setOrgContext = new SysSynchroSetOrgContext(); // 获取测试组织数据 JSONArray orgJsonData = getOrgJsonData(); // 将组织数据设置到组织架构信息接入上下文 setOrgContext.setOrgJsonData(orgJsonData.toString()); setOrgContext.setAppName("UAS"); logger.info(orgJsonData.toString()); logger.info(setOrgContext.toString()); try { // 调用 WebService 接口,并接收请求返回的数据 SysSynchroSetResult result = syncOrgElementsBaseInfo(setOrgContext); if (result.getReturnState()==0){ res="同步蓝凌OA失败,传输错误"; }else if (result.getReturnState()==1){ res="同步蓝凌OA失败,失败信息:"+result.getMessage(); }else if (result.getReturnState()==2){ res="同步蓝凌OA成功"; } } catch (Exception e) { res="同步蓝凌OA失败,接口异常,异常信息:"+e.getMessage(); e.printStackTrace(); } return res; } @Override public String sendSyncOrgElements() { updateDeptElementAll(); updatePostElementAll(); updatePersonElementAll(); String res = ""; // 定义组织架构信息接入上下文 SysSynchroSetOrgContext setOrgContext = new SysSynchroSetOrgContext(); // 获取测试组织数据 JSONArray orgJsonData = getOrgJsonData(); // 将组织数据设置到组织架构信息接入上下文 setOrgContext.setOrgJsonData(orgJsonData.toString()); setOrgContext.setAppName("UAS"); logger.info(orgJsonData.toString()); logger.info(setOrgContext.toString()); try { // 调用 WebService 接口,并接收请求返回的数据 SysSynchroSetResult result = syncOrgElements(setOrgContext); if (result.getReturnState()==0){ res="同步蓝凌OA失败,传输错误"; }else if (result.getReturnState()==1){ res="同步蓝凌OA失败,失败信息:"+result.getMessage(); }else if (result.getReturnState()==2){ res="同步蓝凌OA成功"; } } catch (Exception e) { res="同步蓝凌OA失败,接口异常,异常信息:"+e.getMessage(); e.printStackTrace(); } return res; } /** * 部门更新 */ @Override public void updateDeptElementAll(){ SqlRowList orgs = baseDao.queryForRowSet("select row_number() over (order by or_id) rn, case when nvl" + "(or_landrayid,' ')=' ' then to_char(or_id) else or_landrayid end or_id,or_code,or_name ," + "or_parentname,or_headmancode,or_headmanname,or_path, (select case when nvl(em_landrayemid,' ')=' ' " + "then to_char(em_id) else em_landrayemid end from hrorg ho left join employee on ho" + ".or_headmancode=em_code where ho.or_id=hr.or_subof) as superLeader,or_statuscode,or_landraysubid," + "to_char(or_subof) or_subof,case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else " + "em_landrayemid end emid from hrorg hr left join employee on hr.or_headmancode=em_code where " + "nvl(or_subof,0)>0 order by rn"); while (orgs.next()) { JSONObject orgObj = new JSONObject(); orgObj.put("id", orgs.getGeneralString("or_id")); // 唯一标识 (不允许为空) orgObj.put("lunid", orgs.getGeneralString("or_id")); // 唯一标识 (若不为空,直接作为主健存入数据库,不允许为空) orgObj.put("name", orgs.getGeneralString("or_name")); // 名称 (不允许为空) orgObj.put("type", "dept"); // 组织架构类型 (不允许为空 可选项: org(机构)、dept(部门)、group(群组)、post(岗位)、person(人员)) orgObj.put("no", orgs.getGeneralString("or_code")); // 编号 (可为空) orgObj.put("order", orgs.getGeneralString("rn")); // 排序号 (可为空) orgObj.put("keyword", ""); // 关键字 (内容格式不限制,可为空) String landraysubid = orgs.getObject("or_landraysubid") == null ? orgs.getGeneralString("or_subof") : orgs.getGeneralString("or_landraysubid"); orgObj.put("parent", landraysubid); // 父组织 (可为空) orgObj.put("thisLeader", orgs.getGeneralString("emid")); // 组织架构领导 (可为空) orgObj.put("memo", orgs.getGeneralString("or_path")); // 组织架构说明 (可为空) orgObj.put("superLeader", orgs.getGeneralString("superLeader")); // 组织上级上级领导 (可为空) String statuscode = orgs.getObject("or_statuscode") == null ? "" : orgs.getGeneralString( "or_statuscode"); if ("AUDITED".equals(statuscode)) { orgObj.put("isAvailable", true); // 是否有效,该属性决定该部门架构是否删除 }else { orgObj.put("isAvailable", false); } updateOrgElement(orgObj,null,null); } } /** * 岗位更新 */ @Override public void updatePostElementAll(){ SqlRowList posts = baseDao.queryForRowSet("select row_number() over (order by jo_level) rn,jo_id joid,case when nvl(jo_landrayid,' ')=' ' then to_char(jo_id) else jo_landrayid end jo_id, jo_code, jo_name, jo_orgid, jo_orgname, jo_headmancode, jo_headmanname , to_char(jo_orgid) jo_orgid, jo_parentname, jo_level, jo_emptype,jo_statuscode,jo_landrayorid,case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else em_landrayemid end emid,case when nvl(or_landrayid,' ')=' ' then to_char(or_id) else or_landrayid end or_id from job left join employee on em_code=jo_headmancode left join hrorg on jo_orgid=or_id order by rn"); while (posts.next()) { JSONObject postObj = new JSONObject(); postObj.put("id", posts.getGeneralString("jo_id")); // 唯一标识 (不允许为空) postObj.put("lunid", posts.getGeneralString("jo_id")); // 唯一标识 (若不为空,直接作为主健存入数据库,允许为空) postObj.put("name", posts.getGeneralString("jo_name")); // 名称 (不允许为空) postObj.put("type", "post"); // 组织架构类型 (不允许为空 可选项: org(机构)、dept(部门)、group(群组)、post(岗位)、person(人员)) postObj.put("no", posts.getGeneralString("jo_code")); // 编号 (可为空) postObj.put("order", posts.getGeneralString("rn")); // 排序号 (可为空) postObj.put("keyword", ""); // 关键字 (内容格式不限制,可为空) postObj.put("parent", posts.getString("or_id")); // 父部门 (可为空) postObj.put("thisLeader", posts.getGeneralString("emid")); // 部门架构领导 (可为空) int level = posts.getGeneralInt("jo_level"); String memo = posts.getObject("jo_orgname") == null ? "岗位层级" + level : "所属组织部门" + posts.getGeneralString("jo_orgname") + ",岗位层级" + level; postObj.put("memo", memo); // 岗位架构说明 (可为空) List data = baseDao.queryForList("select case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else em_landrayemid end from employee where em_class<>'离职' and nvl(em_islandray,0)=-1 and em_defaulthsid="+posts.getGeneralInt("joid"), String.class); JSONArray persons=null; if (data != null && data.size() > 0) { persons =JSONArray.parseArray(JSON.toJSONString(data)); } postObj.put("persons", persons); // 岗位包含人员 (可为空) String statuscode = posts.getObject("jo_statuscode") == null ? "" : posts.getGeneralString( "jo_statuscode"); if ("AUDITED".equals(statuscode)) { postObj.put("isAvailable", true); // 是否有效,该属性决定该部门架构是否删除 }else { postObj.put("isAvailable", false); } updateOrgElement(null,postObj,null); } } /** * 人员更新 */ @Override public void updatePersonElementAll(){ SqlRowList persons = baseDao.queryForRowSet("select row_number() over (order by em_id) rn,em_id emid,case when nvl(em_landrayemid,' ')=' ' then to_char(em_id) else em_landrayemid end em_id,em_code,em_name,em_password,em_mobile, em_email,em_cardcode," + "em_departmentcode,em_depart,em_position,em_defaulthsid,em_landrayemid,em_class," + "case when nvl(or_landrayid,' ')=' ' then to_char(or_id) else or_landrayid end or_id,case when nvl" + "(jo_landrayid,' ')=' ' then to_char(jo_id) else jo_landrayid end jo_id " + "from employee left join job on em_defaulthsid=jo_id left join hrorg on em_defaultorid=or_id where " + "nvl(em_islandray,0)=-1 order by rn"); while (persons.next()) { JSONObject personObj = new JSONObject(); // 唯一标识 (不允许为空) personObj.put("id", persons.getGeneralString("em_id")); personObj.put("lunid", persons.getGeneralString("em_id")); // 唯一标识 (若不为空,直接作为主健存入数据库,允许为空) personObj.put("name", persons.getGeneralString("em_name")); // 名称 (不允许为空) personObj.put("type", "person"); // 组织架构类型 (不允许为空 可选项: org(机构)、dept(部门)、group(群组)、post(岗位)、person(人员)) personObj.put("no", persons.getGeneralString("em_code")); // 编号 (可为空) personObj.put("order", persons.getGeneralString("rn")); // 排序号 (可为空) personObj.put("keyword", persons.getGeneralString("em_name")); // 关键字 (内容格式不限制,可为空) String statuscode = persons.getObject("em_class") == null ? "" : persons.getGeneralString("em_class"); if ("离职".equals(statuscode)) { personObj.put("isAvailable", false); // 是否有效,该属性决定该部门架构是否删除 }else { personObj.put("isAvailable", true); } personObj.put("memo", persons.getGeneralString("rn")); // 人员说明 (可为空) personObj.put("parent", persons.getGeneralString("or_id")); // 所在部门 (可为空) List data = baseDao.queryForList("select case when nvl(jo_landrayid,' ')=' ' then to_char(jo_id) else jo_landrayid end from empsjobs left join job on job_id=jo_id where emp_id=" + persons.getGeneralInt("emid"), String.class); data.add(persons.getString("jo_id")); JSONArray jobs=null; if (data != null && data.size() > 0) { jobs =JSONArray.parseArray(JSON.toJSONString(data)); } personObj.put("posts", jobs); // 所属岗位 personObj.put("loginName", persons.getGeneralString("em_mobile")); // 登录名 String password = ""; if (persons.getObject("em_password") != null) { BASE64Encoder encoder = new BASE64Encoder(); password = encoder.encode(persons.getGeneralString("em_password").getBytes());//base64加密 } personObj.put("password", password); // 密码,base64加密后的信息 personObj.put("mobileNo", persons.getGeneralString("em_mobile")); // 手机号 personObj.put("email", persons.getGeneralString("em_email")); // 邮件地址 personObj.put("attendanceCardNumber", persons.getGeneralString("em_cardcode")); // 考勤号 personObj.put("workPhone", "0755878787782"); // 办公电话 (仅当 type 为 person 时,有此信息) personObj.put("rtx", "952701"); // rtx 账号 (仅当 type 为 person 时,有此信息) updateOrgElement(null,null,personObj); } } private void updateOrgElement(JSONObject deptJsonData,JSONObject postJsonData,JSONObject personJsonData) { try { // 定义组织架构信息接入上下文 SysSynchroSetOrgContext setOrgContext = new SysSynchroSetOrgContext(); setOrgContext.setAppName("UAS"); if (deptJsonData!=null) { // 将《部门》组织数据设置到组织架构信息接入上下文 setOrgContext.setOrgJsonData(deptJsonData.toString()); // 调用 WebService 接口,并接收请求返回的数据 SysSynchroSetResult deptResult = updateOrgElement(setOrgContext); // 0:未操作、1:失败、2:成功 logger.info("请求状态:\n" + deptResult.getReturnState()); } if (postJsonData!=null) { // 将《岗位》组织数据设置到组织架构信息接入上下文 setOrgContext.setOrgJsonData(postJsonData.toString()); // 调用 WebService 接口,并接收请求返回的数据 SysSynchroSetResult postResult = updateOrgElement(setOrgContext); // 0:未操作、1:失败、2:成功 logger.info("请求状态:\n" + postResult.getReturnState()); } if (personJsonData!=null) { // 将《人员》组织数据设置到组织架构信息接入上下文 setOrgContext.setOrgJsonData(personJsonData.toString()); // 调用 WebService 接口,并接收请求返回的数据 SysSynchroSetResult personResult = updateOrgElement(setOrgContext); // 0:未操作、1:失败、2:成功 logger.info("请求状态:\n" + personResult.getReturnState()); } } catch (Exception e) { e.printStackTrace(); } } }