EmployeeListHandlerEx.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package com.kingdee.eas.custom.synctask.handler;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.kingdee.bos.BOSException;
  5. import com.kingdee.bos.Context;
  6. import com.kingdee.bos.dao.IObjectValue;
  7. import com.kingdee.bos.metadata.entity.EntityViewInfo;
  8. import com.kingdee.bos.metadata.entity.FilterInfo;
  9. import com.kingdee.bos.metadata.entity.FilterItemInfo;
  10. import com.kingdee.bos.metadata.entity.SelectorItemCollection;
  11. import com.kingdee.bos.metadata.query.util.CompareType;
  12. import com.kingdee.eas.base.permission.IUser;
  13. import com.kingdee.eas.base.permission.UserFactory;
  14. import com.kingdee.eas.base.permission.UserInfo;
  15. import com.kingdee.eas.basedata.org.*;
  16. import com.kingdee.eas.basedata.person.*;
  17. import com.kingdee.eas.common.EASBizException;
  18. import com.kingdee.eas.custom.synctask.ActionTypeEnum;
  19. import com.kingdee.eas.custom.synctask.entity.PersonEntity;
  20. import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntry;
  21. import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryFactory;
  22. import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryInfo;
  23. import com.kingdee.eas.hr.affair.IEmpEnrollBizBillEntry;
  24. import com.kingdee.eas.hr.ats.AtsUtil;
  25. import com.kingdee.eas.hr.base.EmployeeTypeInfo;
  26. import com.kingdee.eas.hr.emp.*;
  27. import com.kingdee.eas.hr.emp.web.handler.EmployeeListHandler;
  28. import com.kingdee.eas.hr.org.JobLevelInfo;
  29. import com.kingdee.shr.base.syssetting.context.SHRContext;
  30. import com.kingdee.util.StringUtils;
  31. import okhttp3.*;
  32. import org.apache.commons.codec.digest.DigestUtils;
  33. import org.apache.log4j.Logger;
  34. import org.springframework.ui.ModelMap;
  35. import javax.servlet.http.HttpServletRequest;
  36. import javax.servlet.http.HttpServletResponse;
  37. import java.io.FileInputStream;
  38. import java.io.IOException;
  39. import java.text.SimpleDateFormat;
  40. import java.util.*;
  41. /**
  42. * @author qingwu
  43. * @date 2024/10/24
  44. * @apiNote 员工信息维护扩展
  45. */
  46. public class EmployeeListHandlerEx extends EmployeeListHandler {
  47. public static Logger logger = Logger.getLogger(EmployeeListHandlerEx.class);
  48. private Context ctx = SHRContext.getInstance().getContext();
  49. private Properties propt = new Properties();
  50. public EmployeeListHandlerEx() {
  51. try {
  52. this.propt.load(new FileInputStream("E:\\Kingdee\\eas\\server\\properties\\scy\\syncOAConfig.properties"));
  53. //propt.load(new FileInputStream(System.getProperty("EAS_HOME") + "/server/properties/scy/syncOAConfig.properties"));
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. public void syncPersonToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, IOException, EASBizException {
  59. String billIds = request.getParameter("billIds");
  60. //同步组织到OA
  61. //SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null);
  62. _syncpersonToOA(billIds, null);
  63. }
  64. /**
  65. * 同步组织
  66. * 1、当参数billIds不为空值时,增量同步参数中的部门数据到OA
  67. * 2、当参数billIds为空时,全量同步所有组织数据到OA
  68. * 3、当参数action不为空时,根据操作类型同步数据
  69. * 4、当参数action为空时,判断部门状态是否为失效,如果失效就执行删除同步,否则就执行编辑同步
  70. * 5、部门新增,调用部门同步方法增量同步,操作类型为新增
  71. *
  72. * @param billds
  73. * @param action
  74. * @throws BOSException
  75. */
  76. public void _syncpersonToOA(String billds, ActionTypeEnum action) throws BOSException, IOException, EASBizException {
  77. logger.error("_syncpersonToOA----------------------start");
  78. logger.error("_syncpersonToOA----------------------billds: " + billds);
  79. IPerson iPerson = PersonFactory.getLocalInstance(ctx);
  80. IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
  81. List<PersonEntity> dataList = new ArrayList();
  82. //当参数billIds不为空值时,增量同步参数中的部门数据到OA
  83. FilterInfo filterInfo = null;
  84. if (!StringUtils.isEmpty(billds)) {
  85. Set<String> personIds = AtsUtil.toSet(billds);
  86. filterInfo = new FilterInfo();
  87. filterInfo.getFilterItems().add(new FilterItemInfo("id", personIds, CompareType.INCLUDE));
  88. }
  89. SelectorItemCollection sic = new SelectorItemCollection();
  90. sic.add("*");
  91. sic.add("person.number");
  92. sic.add("person.name");
  93. sic.add("person.id");
  94. sic.add("person.employeeType.number");
  95. sic.add("personDep.name");
  96. sic.add("personDep.number");
  97. sic.add("personDep.id");
  98. sic.add("jobLevel.name");
  99. sic.add("jobLevel.number");
  100. sic.add("primaryPosition.id");
  101. sic.add("primaryPosition.name");
  102. sic.add("primaryPosition.number");
  103. sic.add("primaryPosition.job.name");
  104. sic.add("primaryPosition.job.number");
  105. sic.add("primaryPosition.job.jobType.name");
  106. sic.add("primaryPosition.job.jobType.number");
  107. EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  108. PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
  109. for (int i = 0; i < personPositionCollection.size(); i++) {
  110. //职业信息
  111. PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
  112. PersonEntity person = packagingPerson(personPositionInfo);
  113. dataList.add(person);
  114. }
  115. ObjectMapper mapper = new ObjectMapper();
  116. logger.error("_syncpersonToOA------------------dataList----- " + mapper.writeValueAsString(dataList));
  117. //调用执行同步组织到OA
  118. //executeSyncOrgUnitToOA(dataList);
  119. }
  120. /**
  121. * 封装人员对象
  122. *
  123. * @param personPositionInfo
  124. * @return
  125. */
  126. public PersonEntity packagingPerson(PersonPositionInfo personPositionInfo) throws BOSException, EASBizException {
  127. SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd");
  128. IUser iuser = UserFactory.getLocalInstance(ctx);
  129. //人员
  130. PersonInfo personInfo = personPositionInfo.getPerson();
  131. //自定义人员实体
  132. PersonEntity person = new PersonEntity();
  133. //编码
  134. person.setWorkcode(personInfo.getNumber());
  135. //人员名称
  136. person.setLastname(personInfo.getName());
  137. //分部
  138. //person.setSubcompany("0");
  139. //部门
  140. AdminOrgUnitInfo personDep = personPositionInfo.getPersonDep();
  141. person.setDepartment(personDep.getName());
  142. //直接上级 @todo
  143. person.setManagerid("");
  144. //助理 @todo
  145. person.setAssistantid("");
  146. //状态
  147. EmployeeTypeInfo employeeType = personInfo.getEmployeeType();
  148. String number = employeeType.getNumber();
  149. String personStatus = "";
  150. switch (number) {
  151. case "001": //正式员工
  152. personStatus = "正式";
  153. break;
  154. case "002": //试用员工
  155. personStatus = "试用";
  156. break;
  157. case "S06": //临时工
  158. personStatus = "临时";
  159. break;
  160. case "021": //解聘
  161. personStatus = "解聘";
  162. break;
  163. case "S09": //离职
  164. personStatus = "离职";
  165. break;
  166. case "011": //退休
  167. personStatus = "退休";
  168. break;
  169. default:
  170. personStatus = "无效";
  171. break;
  172. }
  173. person.setStatus(personStatus);
  174. //办公地点 @todo
  175. person.setLocationid("");
  176. //移动电话
  177. person.setMobile(personInfo.getCell());
  178. //办公室电话
  179. person.setTelephone(personInfo.getOfficePhone());
  180. //电子邮件
  181. person.setEmail(personInfo.getEmail());
  182. //入职日期
  183. IEmpEnrollBizBillEntry iEmpEnrollBizBillEntry = EmpEnrollBizBillEntryFactory.getLocalInstance(ctx);
  184. EmpEnrollBizBillEntryInfo empEnrollBizBillEntryInfo = iEmpEnrollBizBillEntry.getEmpEnrollBizBillEntryInfo("person = '" + personInfo.getId() + "'");
  185. Date enrollDate = empEnrollBizBillEntryInfo.getEnrollDate();
  186. person.setCompanystartdate(originalFormat.format(enrollDate));
  187. //参加工作日期
  188. Date jobStartDate = empEnrollBizBillEntryInfo.getJobStartDate();
  189. person.setWorkstartdate(originalFormat.format(jobStartDate));
  190. UserInfo userInfo = iuser.getUserInfo("where person = '" + personInfo.getId() + "' ");
  191. //登录名称
  192. person.setLastname(userInfo.getName());
  193. //明文密码,会转密文
  194. person.setPassword(userInfo.getPassword());
  195. //安全级别
  196. person.setSeclevel(3);
  197. //人员类别
  198. IObjectValue personnelCa = (IObjectValue) personInfo.get("personnelCa");
  199. if (personnelCa != null) {
  200. Map customMap = new HashMap();
  201. customMap.put("field", personnelCa.get("name"));
  202. person.setWorkCustomData(customMap);
  203. }
  204. //职级
  205. JobLevelInfo jobLevel = personPositionInfo.getJobLevel();
  206. person.setJoblevel(Integer.parseInt(jobLevel.getName()));
  207. return person;
  208. }
  209. /**
  210. * 执行同步组织到OA
  211. *
  212. * @param dataList
  213. */
  214. public void executeSyncOrgUnitToOA(List dataList) throws IOException, BOSException {
  215. if (dataList != null && dataList.size() > 0) {
  216. ObjectMapper mapper = new ObjectMapper();
  217. //封装请求参数
  218. String data = mapper.writeValueAsString(dataList);
  219. String params = String.format("token = %s &data = %s", getToken(), data);
  220. logger.error("executeSyncOrgUnitToOA----------------------params" + params);
  221. //封装请求参数
  222. //String syncOrgUnitApiUrl = "/api/hrm/resful/synDepartment";
  223. String syncOrgUnitApiUrl = this.propt.getProperty("syncOrgUnitApiUrl");
  224. String url = this.propt.getProperty("url");
  225. logger.error("executeSyncOrgUnitToOA----------------------syncOrgUnitApiUrl" + syncOrgUnitApiUrl);
  226. if (StringUtils.isEmpty(syncOrgUnitApiUrl)) {
  227. throw new BOSException("同步组织到OA接口地址不能为空!");
  228. }
  229. OkHttpClient client = new OkHttpClient();
  230. MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
  231. RequestBody body = RequestBody.create(mediaType, params);
  232. Request request = new Request.Builder()
  233. .url(url + syncOrgUnitApiUrl)
  234. .post(body)
  235. .addHeader("Content-Type", "application/json")
  236. .addHeader("Accept", "*/*")
  237. .addHeader("Accept-Encoding", "gzip, deflate, br")
  238. .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
  239. .addHeader("Connection", "keep-alive")
  240. .build();
  241. Response response = client.newCall(request).execute();
  242. String respBody = response.body().string();
  243. if (response.isSuccessful()) {
  244. } else {
  245. }
  246. }
  247. }
  248. /**
  249. * 获取token
  250. *
  251. * @return
  252. */
  253. public String getToken() {
  254. String key = this.propt.getProperty("key");
  255. long l = System.currentTimeMillis();//时间戳毫秒数
  256. String code = key.concat(Long.toString(l));
  257. //String s = DigestUtils.md5Hex(code).toUpperCase();
  258. String s = DigestUtils.md5Hex(code).toUpperCase();
  259. Map<String, String> map = new HashMap<>();
  260. map.put("key", s);
  261. map.put("ts", Long.toString(l));
  262. logger.error("getToken" + JSONObject.toJSONString(map));
  263. return JSONObject.toJSONString(map);
  264. }
  265. }