Browse Source

提交 同步人员信息

“luojun” 9 months ago
parent
commit
2a02aa9f77

+ 278 - 0
websrc/com/kingdee/eas/custom/synctask/handler/EmployeeListHandlerEx.java

@@ -0,0 +1,278 @@
+package com.kingdee.eas.custom.synctask.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.IObjectValue;
+import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.metadata.entity.FilterInfo;
+import com.kingdee.bos.metadata.entity.FilterItemInfo;
+import com.kingdee.bos.metadata.entity.SelectorItemCollection;
+import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.base.permission.IUser;
+import com.kingdee.eas.base.permission.UserFactory;
+import com.kingdee.eas.base.permission.UserInfo;
+import com.kingdee.eas.basedata.org.*;
+import com.kingdee.eas.basedata.person.*;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.synctask.ActionTypeEnum;
+import com.kingdee.eas.custom.synctask.entity.PersonEntity;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntry;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryFactory;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryInfo;
+import com.kingdee.eas.hr.affair.IEmpEnrollBizBillEntry;
+import com.kingdee.eas.hr.ats.AtsUtil;
+import com.kingdee.eas.hr.base.EmployeeTypeInfo;
+import com.kingdee.eas.hr.emp.*;
+import com.kingdee.eas.hr.emp.web.handler.EmployeeListHandler;
+import com.kingdee.eas.hr.org.JobLevelInfo;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.util.StringUtils;
+import okhttp3.*;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author qingwu
+ * @date 2024/10/24
+ * @apiNote 员工信息维护扩展
+ */
+public class EmployeeListHandlerEx extends EmployeeListHandler {
+    public static Logger logger = Logger.getLogger(EmployeeListHandlerEx.class);
+
+    private Context ctx = SHRContext.getInstance().getContext();
+    private Properties propt = new Properties();
+
+    public EmployeeListHandlerEx() {
+        try {
+            this.propt.load(new FileInputStream("E:\\Kingdee\\eas\\server\\properties\\scy\\syncOAConfig.properties"));
+            //propt.load(new FileInputStream(System.getProperty("EAS_HOME") + "/server/properties/scy/syncOAConfig.properties"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void syncPersonToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, IOException, EASBizException {
+        String billIds = request.getParameter("billIds");
+        //同步组织到OA
+        //SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null);
+        _syncpersonToOA(billIds, null);
+    }
+
+    /**
+     * 同步组织
+     * 1、当参数billIds不为空值时,增量同步参数中的部门数据到OA
+     * 2、当参数billIds为空时,全量同步所有组织数据到OA
+     * 3、当参数action不为空时,根据操作类型同步数据
+     * 4、当参数action为空时,判断部门状态是否为失效,如果失效就执行删除同步,否则就执行编辑同步
+     * 5、部门新增,调用部门同步方法增量同步,操作类型为新增
+     *
+     * @param billds
+     * @param action
+     * @throws BOSException
+     */
+    public void _syncpersonToOA(String billds, ActionTypeEnum action) throws BOSException, IOException, EASBizException {
+        logger.error("_syncpersonToOA----------------------start");
+        logger.error("_syncpersonToOA----------------------billds: " + billds);
+        IPerson iPerson = PersonFactory.getLocalInstance(ctx);
+        IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
+        List<PersonEntity> dataList = new ArrayList();
+        //当参数billIds不为空值时,增量同步参数中的部门数据到OA
+        FilterInfo filterInfo = null;
+        if (!StringUtils.isEmpty(billds)) {
+            Set<String> personIds = AtsUtil.toSet(billds);
+            filterInfo = new FilterInfo();
+            filterInfo.getFilterItems().add(new FilterItemInfo("id", personIds, CompareType.INCLUDE));
+        }
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("*");
+        sic.add("person.number");
+        sic.add("person.name");
+        sic.add("person.id");
+        sic.add("person.employeeType.number");
+        sic.add("personDep.name");
+        sic.add("personDep.number");
+        sic.add("personDep.id");
+        sic.add("jobLevel.name");
+        sic.add("jobLevel.number");
+        sic.add("primaryPosition.id");
+        sic.add("primaryPosition.name");
+        sic.add("primaryPosition.number");
+        sic.add("primaryPosition.job.name");
+        sic.add("primaryPosition.job.number");
+        sic.add("primaryPosition.job.jobType.name");
+        sic.add("primaryPosition.job.jobType.number");
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
+        for (int i = 0; i < personPositionCollection.size(); i++) {
+            //职业信息
+            PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
+            PersonEntity person = packagingPerson(personPositionInfo);
+            dataList.add(person);
+        }
+        ObjectMapper mapper = new ObjectMapper();
+        logger.error("_syncpersonToOA------------------dataList----- " + mapper.writeValueAsString(dataList));
+        //调用执行同步组织到OA
+        //executeSyncOrgUnitToOA(dataList);
+    }
+
+    /**
+     * 封装人员对象
+     *
+     * @param personPositionInfo
+     * @return
+     */
+    public PersonEntity packagingPerson(PersonPositionInfo personPositionInfo) throws BOSException, EASBizException {
+        SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd");
+
+        IUser iuser = UserFactory.getLocalInstance(ctx);
+        //人员
+        PersonInfo personInfo = personPositionInfo.getPerson();
+        //自定义人员实体
+        PersonEntity person = new PersonEntity();
+        //编码
+        person.setWorkcode(personInfo.getNumber());
+        //人员名称
+        person.setLastname(personInfo.getName());
+        //分部
+        //person.setSubcompany("0");
+        //部门
+        AdminOrgUnitInfo personDep = personPositionInfo.getPersonDep();
+        person.setDepartment(personDep.getName());
+        //直接上级 @todo
+        person.setManagerid("");
+        //助理 @todo
+        person.setAssistantid("");
+        //状态
+        EmployeeTypeInfo employeeType = personInfo.getEmployeeType();
+        String number = employeeType.getNumber();
+        String personStatus = "";
+        switch (number) {
+            case "001": //正式员工
+                personStatus = "正式";
+                break;
+            case "002": //试用员工
+                personStatus = "试用";
+                break;
+            case "S06": //临时工
+                personStatus = "临时";
+                break;
+            case "021": //解聘
+                personStatus = "解聘";
+                break;
+            case "S09": //离职
+                personStatus = "离职";
+                break;
+            case "011": //退休
+                personStatus = "退休";
+                break;
+            default:
+                personStatus = "无效";
+                break;
+        }
+        person.setStatus(personStatus);
+        //办公地点 @todo
+        person.setLocationid("");
+        //移动电话
+        person.setMobile(personInfo.getCell());
+        //办公室电话
+        person.setTelephone(personInfo.getOfficePhone());
+        //电子邮件
+        person.setEmail(personInfo.getEmail());
+        //入职日期
+        IEmpEnrollBizBillEntry iEmpEnrollBizBillEntry = EmpEnrollBizBillEntryFactory.getLocalInstance(ctx);
+        EmpEnrollBizBillEntryInfo empEnrollBizBillEntryInfo = iEmpEnrollBizBillEntry.getEmpEnrollBizBillEntryInfo("person = '" + personInfo.getId() + "'");
+        Date enrollDate = empEnrollBizBillEntryInfo.getEnrollDate();
+        person.setCompanystartdate(originalFormat.format(enrollDate));
+        //参加工作日期
+        Date jobStartDate = empEnrollBizBillEntryInfo.getJobStartDate();
+        person.setWorkstartdate(originalFormat.format(jobStartDate));
+        UserInfo userInfo = iuser.getUserInfo("where person = '" + personInfo.getId() + "' ");
+        //登录名称
+        person.setLastname(userInfo.getName());
+        //明文密码,会转密文
+        person.setPassword(userInfo.getPassword());
+        //安全级别
+        person.setSeclevel(3);
+        //人员类别
+        IObjectValue personnelCa = (IObjectValue) personInfo.get("personnelCa");
+        if (personnelCa != null) {
+            Map customMap = new HashMap();
+            customMap.put("field", personnelCa.get("name"));
+            person.setWorkCustomData(customMap);
+        }
+        //职级
+        JobLevelInfo jobLevel = personPositionInfo.getJobLevel();
+        person.setJoblevel(Integer.parseInt(jobLevel.getName()));
+        return person;
+    }
+
+    /**
+     * 执行同步组织到OA
+     *
+     * @param dataList
+     */
+    public void executeSyncOrgUnitToOA(List dataList) throws IOException, BOSException {
+        if (dataList != null && dataList.size() > 0) {
+            ObjectMapper mapper = new ObjectMapper();
+            //封装请求参数
+            String data = mapper.writeValueAsString(dataList);
+            String params = String.format("token = %s &data = %s", getToken(), data);
+            logger.error("executeSyncOrgUnitToOA----------------------params" + params);
+            //封装请求参数
+            //String syncOrgUnitApiUrl = "/api/hrm/resful/synDepartment";
+            String syncOrgUnitApiUrl = this.propt.getProperty("syncOrgUnitApiUrl");
+            String url = this.propt.getProperty("url");
+            logger.error("executeSyncOrgUnitToOA----------------------syncOrgUnitApiUrl" + syncOrgUnitApiUrl);
+            if (StringUtils.isEmpty(syncOrgUnitApiUrl)) {
+                throw new BOSException("同步组织到OA接口地址不能为空!");
+            }
+            OkHttpClient client = new OkHttpClient();
+            MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
+            RequestBody body = RequestBody.create(mediaType, params);
+            Request request = new Request.Builder()
+                    .url(url + syncOrgUnitApiUrl)
+                    .post(body)
+                    .addHeader("Content-Type", "application/json")
+                    .addHeader("Accept", "*/*")
+                    .addHeader("Accept-Encoding", "gzip, deflate, br")
+                    .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
+                    .addHeader("Connection", "keep-alive")
+                    .build();
+            Response response = client.newCall(request).execute();
+            String respBody = response.body().string();
+            if (response.isSuccessful()) {
+
+            } else {
+
+            }
+        }
+    }
+
+    /**
+     * 获取token
+     *
+     * @return
+     */
+    public String getToken() {
+        String key = this.propt.getProperty("key");
+        long l = System.currentTimeMillis();//时间戳毫秒数
+        String code = key.concat(Long.toString(l));
+        //String s = DigestUtils.md5Hex(code).toUpperCase();
+        String s = DigestUtils.md5Hex(code).toUpperCase();
+        Map<String, String> map = new HashMap<>();
+        map.put("key", s);
+        map.put("ts", Long.toString(l));
+        logger.error("getToken" + JSONObject.toJSONString(map));
+        return JSONObject.toJSONString(map);
+    }
+}

+ 145 - 7
websrc/com/kingdee/eas/custom/synctask/handler/OrgUnitListHandlerEx.java

@@ -1,18 +1,34 @@
 package com.kingdee.eas.custom.synctask.handler;
 
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.kingdee.bos.BOSException;
 import com.kingdee.bos.Context;
-import com.kingdee.eas.common.EASBizException;
-import com.kingdee.eas.custom.synctask.SyncTranForOAFacadeFactory;
-import com.kingdee.eas.custom.synctask.utils.SynctaskUtils;
+import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.metadata.entity.FilterInfo;
+import com.kingdee.bos.metadata.entity.FilterItemInfo;
+import com.kingdee.bos.metadata.entity.SelectorItemCollection;
+import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.basedata.org.AdminOrgUnitCollection;
+import com.kingdee.eas.basedata.org.AdminOrgUnitFactory;
+import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
+import com.kingdee.eas.basedata.org.IAdminOrgUnit;
+import com.kingdee.eas.custom.synctask.ActionTypeEnum;
+import com.kingdee.eas.custom.synctask.entity.AdminOrg;
+import com.kingdee.eas.hr.ats.AtsUtil;
 import com.kingdee.eas.hr.org.web.handler.OrgUnitListHandler;
 import com.kingdee.shr.base.syssetting.context.SHRContext;
-import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.util.StringUtils;
+import okhttp3.*;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.log4j.Logger;
 import org.springframework.ui.ModelMap;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.*;
 
 /**
  * @author qingwu
@@ -22,10 +38,132 @@ import javax.servlet.http.HttpServletResponse;
 public class OrgUnitListHandlerEx extends OrgUnitListHandler {
     Logger logger = Logger.getLogger(OrgUnitListHandlerEx.class);
     private Context ctx = SHRContext.getInstance().getContext();
+    private Properties propt = new Properties();
 
-    public void syncOrgUnitToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, EASBizException {
+    public OrgUnitListHandlerEx() {
+        try {
+            this.propt.load(new FileInputStream("E:\\Kingdee\\eas\\server\\properties\\scy\\syncOAConfig.properties"));
+            //propt.load(new FileInputStream(System.getProperty("EAS_HOME") + "/server/properties/scy/syncOAConfig.properties"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void syncOrgUnitToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, IOException {
         String billIds = request.getParameter("billIds");
-        //同步组织到OA
-        SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null);
+        _syncPersonToOA(ctx, billIds, null);
+    }
+
+    /**
+     * 同步组织
+     * 1、当参数billIds不为空值时,增量同步参数中的部门数据到OA
+     * 2、当参数billIds为空时,全量同步所有组织数据到OA
+     * 3、当参数action不为空时,根据操作类型同步数据
+     * 4、当参数action为空时,判断部门状态是否为失效,如果失效就执行删除同步,否则就执行编辑同步
+     * 5、部门新增,调用部门同步方法增量同步,操作类型为新增
+     *
+     * @param billds
+     * @param action
+     * @throws BOSException
+     */
+    public void _syncPersonToOA(Context ctx, String billds, ActionTypeEnum action) throws BOSException, IOException {
+        logger.error("_syncPersonToOA----------------------start");
+        logger.error("_syncPersonToOA----------------------billds: " + billds);
+        IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
+        List dataList = new ArrayList();
+        //当参数billIds不为空值时,增量同步参数中的部门数据到OA
+        FilterInfo filterInfo = null;
+        if (!StringUtils.isEmpty(billds)) {
+            Set<String> adminOrgIds = AtsUtil.toSet(billds);
+            filterInfo = new FilterInfo();
+            filterInfo.getFilterItems().add(new FilterItemInfo("id", adminOrgIds, CompareType.INCLUDE));
+        }
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("*");
+        sic.add("parent.number");
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection(entityViewInfo);
+        for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
+            AdminOrgUnitInfo adminOrgUnitInfo = adminOrgUnitCollection.get(i);
+            String orgName = adminOrgUnitInfo.getName();
+            AdminOrg adminOrg = new AdminOrg();
+            boolean isSealUp = adminOrgUnitInfo.isIsSealUp();
+            if (isSealUp) {
+                adminOrg.setAction("delete");
+                adminOrg.setCanceled("0");
+            } else {
+                adminOrg.setAction("add");
+            }
+            adminOrg.setCode(adminOrgUnitInfo.getNumber());
+            adminOrg.setShortname(orgName);
+            adminOrg.setFullname(orgName);
+            //adminOrg.setParent_code("ITCS");
+            adminOrg.setOrg_code("0");
+            adminOrg.setParent_code(adminOrgUnitInfo.getParent().getNumber());
+            //adminOrg.setOrder((String.valueOf(adminOrgUnitInfo.getIndex())));
+            dataList.add(adminOrg);
+        }
+        //调用执行同步组织到OA
+        executeSyncOrgUnitToOA(dataList);
+    }
+
+    /**
+     * 执行同步组织到OA
+     *
+     * @param dataList
+     */
+    public void executeSyncOrgUnitToOA(List dataList) throws IOException, BOSException {
+        if (dataList != null && dataList.size() > 0) {
+            ObjectMapper mapper = new ObjectMapper();
+            //封装请求参数
+            String data = mapper.writeValueAsString(dataList);
+            String params = String.format("token = %s &data = %s", getToken(), data);
+            logger.error("executeSyncOrgUnitToOA----------------------params" + params);
+            //封装请求参数
+            //String syncOrgUnitApiUrl = "/api/hrm/resful/synDepartment";
+            String syncOrgUnitApiUrl = this.propt.getProperty("syncOrgUnitApiUrl");
+            String url = this.propt.getProperty("url");
+            logger.error("executeSyncOrgUnitToOA----------------------syncOrgUnitApiUrl" + syncOrgUnitApiUrl);
+            if (StringUtils.isEmpty(syncOrgUnitApiUrl)) {
+                throw new BOSException("同步组织到OA接口地址不能为空!");
+            }
+            OkHttpClient client = new OkHttpClient();
+            MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
+            RequestBody body = RequestBody.create(mediaType, params);
+            Request request = new Request.Builder()
+                    .url(url + syncOrgUnitApiUrl)
+                    .post(body)
+                    .addHeader("Content-Type", "application/json")
+                    .addHeader("Accept", "*/*")
+                    .addHeader("Accept-Encoding", "gzip, deflate, br")
+                    .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
+                    .addHeader("Connection", "keep-alive")
+                    .build();
+            Response response = client.newCall(request).execute();
+            String respBody = response.body().string();
+            if (response.isSuccessful()) {
+
+            } else {
+
+            }
+        }
+    }
+
+    /**
+     * 获取token
+     *
+     * @return
+     */
+    public String getToken() {
+        String key = this.propt.getProperty("key");
+        long l = System.currentTimeMillis();//时间戳毫秒数
+        String code = key.concat(Long.toString(l));
+        //String s = DigestUtils.md5Hex(code).toUpperCase();
+        String s = DigestUtils.md5Hex(code).toUpperCase();
+        Map<String, String> map = new HashMap<>();
+        map.put("key", s);
+        map.put("ts", Long.toString(l));
+        logger.error("getToken" + JSONObject.toJSONString(map));
+        return JSONObject.toJSONString(map);
     }
 }