package com.kingdee.eas.hr.perf.service; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.bsf.service.app.IHRMsfService; import com.kingdee.bos.metadata.MetaDataLoaderFactory; import com.kingdee.bos.metadata.entity.*; import com.kingdee.bos.metadata.management.LanguageCollection; import com.kingdee.bos.metadata.management.SolutionInfo; import com.kingdee.bos.metadata.query.util.CompareType; import com.kingdee.bos.service.message.agent.MessageFactory; import com.kingdee.bos.service.message.agent.SenderAgent; import com.kingdee.bos.service.message.Message; import com.kingdee.eas.base.message.MsgBizType; import com.kingdee.eas.base.message.MsgPriority; import com.kingdee.eas.base.message.MsgSourceStatus; import com.kingdee.eas.base.message.MsgType; import com.kingdee.eas.base.permission.UserInfo; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.csinterface.biz.util.DBUtils; import com.kingdee.eas.util.app.ContextUtil; import com.kingdee.jdbc.rowset.IRowSet; import com.kingdee.shr.perfweb.app.base.evalplan.*; import com.kingdee.util.StringUtils; import org.apache.log4j.Logger; import java.sql.SQLException; import java.util.*; /** * @author qingwu * @date 2024/12/18 * @apiNote */ public class PerfEvaluObjectService implements IHRMsfService { private static Logger logger = Logger.getLogger(PerfEvaluObjectService.class); @Override public Object process(Context ctx, Map map) throws EASBizException, BOSException { //考核等級 Set levelSet = new HashSet(); levelSet.add("C"); levelSet.add("D"); Map evaResultSummaryMap = null; try { //考核结果 IEvaResultSummary iEvaResultSummary = EvaResultSummaryFactory.getLocalInstance(ctx); //面谈 IInterview iInterview = InterviewFactory.getLocalInstance(ctx); Map interviewMap = new HashMap(); InterviewCollection interviewCollection = iInterview.getInterviewCollection(); for (int i = 0; i < interviewCollection.size(); i++) { InterviewInfo interviewInfo = interviewCollection.get(i); String evaResultSummaryId = interviewInfo.getEvaResultSummary().getId().toString(); interviewMap.put(evaResultSummaryId, interviewInfo); } //获取所有人的直接上级 Map personOfParentMap = getPersonOfParentAll(ctx); //获取绩效考核等级为C/D的数据 SelectorItemCollection sic = getSelectorItemCollection(); FilterInfo filterInfo = new FilterInfo(); FilterItemCollection filterItems = filterInfo.getFilterItems(); filterItems.add(new FilterItemInfo("gradeLevel", levelSet, CompareType.INCLUDE)); EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null); EvaResultSummaryCollection evaResultSummaryCollection = iEvaResultSummary.getEvaResultSummaryCollection(entityViewInfo); // StringBuilder body = new StringBuilder(); evaResultSummaryMap = new HashMap(); for (int i = 0; i < evaResultSummaryCollection.size(); i++) { EvaResultSummaryInfo evaResultSummaryInfo = evaResultSummaryCollection.get(i); String id = evaResultSummaryInfo.getId().toString(); String number = evaResultSummaryInfo.getNumber(); String personId = evaResultSummaryInfo.getPerson().getId().toString(); String personName = evaResultSummaryInfo.getPerson().getName(); String gradeLevel = evaResultSummaryInfo.getGradeLevel().toString(); if (!interviewMap.containsKey(id)) { evaResultSummaryMap.put(number, evaResultSummaryInfo); evaResultSummaryMap.put(personId, personOfParentMap.get(personId)); body.append("员工:[").append(personName).append("]绩效为").append(gradeLevel).append(",您还未进行绩效面谈,请及时处理。").append("\n"); } } sendMessage(ctx, body.toString()); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } return evaResultSummaryMap; } public void sendMessage(Context ctx, String body) { logger.error("start-----"); UserInfo currentUserInfo = ContextUtil.getCurrentUserInfo(ctx); //以下是发送一个消息的核心片断,如果针对的是某组织批量发送,自己的需要取得组织的用户ID集合,然后构造receiver SenderAgent senderAgent = SenderAgent.getSenderAgent(); Message message; Locale[] lcla = getContextLocales(ctx);//获取ctx的语言信息列表 logger.error("lcla---" + lcla); Locale locale = null; message = MessageFactory.newMessage("kingdee.workflow");//生成一个消息对象 for (int j = 0, m = lcla.length; j < m; j++) { //此处循环进行多语言消息的设置 locale = lcla[j]; message.setLocaleStringHeader("title", "绩效考核预警", locale);//设置消息标题 message.setLocaleStringHeader("sender", "专员", locale);//设置发送人,属于文本,不是ID message.setLocaleStringHeader("body", body, locale);//设置消息体内容,根据具体业务自己设定 message.setLocaleStringHeader("initiatorName", "专员", locale); } message.setIntHeader("type", MsgType.NOTICE_VALUE);//设置消息类型为通知 message.setIntHeader("bizType", MsgBizType.FORWARN_VALUE);//业务类型设置为工作流 message.setIntHeader("sourceStatus", MsgSourceStatus.EMPTY_VALUE);//设置任务状态,此处是通知消息,所以设置空 message.setIntHeader("priority", MsgPriority.MIDDLE_VALUE);//设置消息优先级,自己根据需要设定相应的级别 message.setStringHeader("databaseCenter", ctx.getAIS());//得到数据中心 message.setStringHeader("solution", ctx.getSolution());//设置解决方案 //设置接收者,后面那参数是用户ID,多个ID可用分号";"分割 message.setStringHeader("receiver", currentUserInfo.getId().toString()); logger.error("senderAgent.getState() -----" + senderAgent.getState()); if (senderAgent.getState() == 1) { senderAgent.start(); } senderAgent.sendMessage(message); //发送消息 logger.error("end-----"); } /** * 获取ctx的语言信息列表 * * @param ctx * @return */ public static Locale[] getContextLocales(Context ctx) { Locale[] locales = null; SolutionInfo solu = MetaDataLoaderFactory.getLocalMetaDataLoader(ctx) .getSolution(); if (solu != null) { LanguageCollection langs = solu.getLanguages(); if (langs != null) { locales = new Locale[langs.size()]; for (int i = 0; i < langs.size(); i++) { locales[i] = langs.get(i).getLocale(); } } } return locales; } /** * 获取所有人员的直接上级 * * @param ctx * @return * @throws BOSException * @throws SQLException */ public Map getPersonOfParentAll(Context ctx) throws BOSException, SQLException { StringBuilder sb = new StringBuilder(); Map map = new HashMap(); sb.append("select ").append("\n"); sb.append("personParent.fnumber as personParentNumber , ").append("\n"); sb.append("personParent.fid as personParentId , ").append("\n"); sb.append("personParent.fname_l2 as personParentName , ").append("\n"); sb.append("person.fnumber as personNumber , ").append("\n"); sb.append("person.fid as personId , ").append("\n"); sb.append("person.fname_l2 as personName ").append("\n"); sb.append("from T_ORG_PositionMember positioonMenber").append("\n"); sb.append(" left join T_ORG_Position position on position.fid = positioonMenber.FPositionID").append("\n"); sb.append(" left join T_ORG_Position positionParent on position.fid = positionParent.FPARENTID").append("\n"); sb.append(" left join T_HR_EmpOrgRelation empOrgRelation on empOrgRelation.FPOSITIONID = positionParent.fid").append("\n"); sb.append(" left join t_Bd_person person on person.fid = empOrgRelation.FPERSONID and empOrgRelation.FIsSystem='1'").append("\n"); sb.append(" left join t_Bd_person personParent on personParent.fid = positioonMenber.FPERSONID").append("\n"); IRowSet iRowSet = DBUtils.executeQuery(ctx, sb.toString()); while (iRowSet.next()) { map.put(iRowSet.getString("personId"), iRowSet.getString("personParentId")); } return map; } /** * 查询字段 * * @return */ public SelectorItemCollection getSelectorItemCollection() { SelectorItemCollection sic = new SelectorItemCollection(); sic.add("gradeLevel");//考核等級 sic.add("id");//考核等級 sic.add("name");//员工名称 sic.add("number");//员工编码 sic.add("evaObj.id");//评估对象 sic.add("evaObj.name"); sic.add("evaObj.number"); sic.add("evaPlan.id");//考核计划 sic.add("evaPlan.name"); sic.add("evaPlan.number"); sic.add("period.id");//考核周期 sic.add("period.name"); sic.add("period.number"); sic.add("period.id");//考核周期 sic.add("period.name"); sic.add("period.number"); sic.add("person.id");//人员 sic.add("person.name"); sic.add("person.number"); return sic; } //@Override //public Object process(Context context, Map map) throws EASBizException, BOSException { // String billId = (String) map.get("billId"); // String day = (String) map.get("day"); // Map result = new HashMap(); // try { // addPerfEvaObject(context, billId == null ? "" : billId, day == null ? 0 : Integer.parseInt(day)); // } catch (SHRWebException e) { // e.printStackTrace(); // throw new RuntimeException(e); // } // //result.put("map", map); // result.put("code", "200"); // result.put("msg", "操作成功"); // return result; //} // ///** // * @param ctx // * @param employeeNumbers 用工关系编码 多个用逗号隔开 // * @param day // * @throws BOSException // * @throws SHRWebException // * @throws EASBizException // */ //public void addPerfEvaObject(Context ctx, String employeeNumbers, int day) throws BOSException, SHRWebException { // //人员 // IPerson iPerson = PersonFactory.getLocalInstance(ctx); // //考核周期 // IPerfPeriod iPerfPeriod = PerfPeriodFactory.getLocalInstance(ctx); // if (StringUtils.isEmpty(employeeNumbers)) { // employeeNumbers = "SY01,QY02,QY03,WB03,PQ03,LS01,SX01,FP01,WB01,QY01"; // } // Set employeeNumberset = AtsUtil.toSet(employeeNumbers); // //查询在职的所有人员 // SelectorItemCollection sic = new SelectorItemCollection(); // sic.add("id"); // sic.add("name"); // sic.add("number"); // sic.add("employeeType.id"); // sic.add("employeeType.name"); // sic.add("employeeType.number"); // FilterInfo filterInfo = new FilterInfo(); // FilterItemCollection filterItems = filterInfo.getFilterItems(); // filterItems.add(new FilterItemInfo("employeeType.number", employeeNumberset, CompareType.INCLUDE)); // EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null); // PersonCollection personCollection = iPerson.getPersonCollection(entityViewInfo); // logger.error("personCollection.size--" + personCollection.size()); // Set personSet = new HashSet(); // StringBuilder sb = new StringBuilder(); // for (int i = 0; i < personCollection.size(); i++) { // PersonInfo personInfo = personCollection.get(i); // String personId = personInfo.getId().toString(); // String personName = personInfo.getName(); // personSet.add(personId); // sb.append(personName).append(","); // } // sb = deleteCharAt(sb); // // //绩效考核档案 获取绩效档案id建立员工考核计划 // IPerfFile iPerfFile = PerfFileFactory.getLocalInstance(ctx); // FilterInfo perfFileFilterInfo = new FilterInfo(); // perfFileFilterInfo.getFilterItems().add(new FilterItemInfo("person", personSet, CompareType.INCLUDE)); // EntityViewInfo perfFileEntityViewInfo = EntityViewInfo.getInstance(perfFileFilterInfo, null, null); // PerfFileCollection perfFileCollection = iPerfFile.getPerfFileCollection(perfFileEntityViewInfo); // logger.error("perfFileCollection.size--" + perfFileCollection.size()); // if (perfFileCollection.size() <= 0) { // throw new ShrWebBizException("[" + sb.toString() + "]这些人员还未生成员工绩效档案,请维护!"); // } // //员工档案人员 // Set perfFileSet = new HashSet(); // for (int i = 0; i < perfFileCollection.size(); i++) { // PerfFileInfo perfFileInfo = perfFileCollection.get(i); // String perfFileId = perfFileInfo.getId().toString(); // perfFileSet.add(perfFileId); // } // //获取当前年的考核周期 // int year = Year.now().getValue(); // PerfPeriodInfo perfPeriodInfo = null; // try { // perfPeriodInfo = iPerfPeriod.getPerfPeriodInfo("where timePeriod = '" + year + "' and name = '公司年度绩效目标_周期" + year + "年'"); // } catch (EASBizException e) { // throw new RuntimeException("未查询到公司年度绩效目标_周期" + year + "年考核计划"); // } // PerfPlanInfo perfPlan = perfPeriodInfo.getPerfPlan(); // String planId = perfPlan.getId().toString(); // String periodId = perfPeriodInfo.getId().toString(); // checkPeriod(periodId); // String hrOrgUnit = "00000000-0000-0000-0000-000000000000CCE7AED4"; // PerfPlanInfo info = null; // try { // info = PerfPlanFactory.getRemoteInstance().getPerfPlanInfo("where id = '" + planId + "'"); // } catch (Exception var10) { // var10.printStackTrace(); // throw new ShrWebBizException((new SHRPerfWebBizException(SHRPerfWebBizException.GETPERFPLANERR)).getMessage()); // } // //通过考核周期获取评估对象 // IPerfEvaObject iPerfEvaObject = PerfEvaObjectFactory.getLocalInstance(ctx); // PerfEvaObjectCollection perfEvaObjectCollection = iPerfEvaObject.getPerfEvaObjectCollection("where period = '" + planId + "'"); // //评估对象里面的员工档案ID // Set perfEvaPerFileSet = new HashSet(); // for (int i = 0; i < perfEvaObjectCollection.size(); i++) { // PerfEvaObjectInfo perfEvaObjectInfo = perfEvaObjectCollection.get(i); // PerfFileInfo perfFile = perfEvaObjectInfo.getPerfFile(); // String perfFileId = perfFile.getId().toString(); // perfEvaPerFileSet.add(perfFileId); // } // logger.error("perfFileSet--" + perfFileSet); // logger.error("perfEvaPerFileSet--" + perfEvaPerFileSet); // //对比去除考核计划已经存在的人员 // perfFileSet.removeAll(perfEvaPerFileSet); // logger.error("perfFileSet--removeAll--" + perfFileSet); // //最后需要保存的员工绩效档案ID // StringJoiner jperfFileJiner = new StringJoiner(","); // for (Object perfFileId : perfFileSet) { // jperfFileJiner.add(perfFileId.toString()); // } // PerfEvaObjectUtils perfEvaObjectUtils = new PerfEvaObjectUtils(); // perfEvaObjectUtils.addFromPerfFile(ctx, jperfFileJiner.toString(), periodId, hrOrgUnit, info); //} // //public static void checkPeriod(String period) throws SHRWebException { // if (org.apache.commons.lang.StringUtils.isEmpty(period)) { // throw new ShrWebBizException((new SHRPerfWebBizException(SHRPerfWebBizException.PERFPERIODNOTEXIST)).getMessage()); // } else { // PerfPeriodInfo info = null; // // try { // info = PerfPeriodFactory.getRemoteInstance().getPerfPeriodInfo("where id = '" + period + "'"); // } catch (Exception var3) { // logger.error(var3.toString()); // throw new ShrWebBizException((new SHRPerfWebBizException(SHRPerfWebBizException.GETPERIODDATAERR)).getMessage()); // } // // if (info.getEvaPeriodStatus().getValue() == 100) { // throw new ShrWebBizException((new SHRPerfWebBizException(SHRPerfWebBizException.OPERATENOTALLOWEDASPERIODISEND)).getMessage()); // } // } //} // //public void addPerfEvaObject(Context ctx, String billid, int day) throws BOSException, SHRWebException, EASBizException { // logger.error("addPerfEvaObject----"); // StringBuilder perfFiles = new StringBuilder();//考勤档案id // // // 获取当前日期 // LocalDate currentDate = LocalDate.now(); // LocalDate threeDaysBefore = null; // if (day != 0) { // // 获取当前日期前三天的日期 // threeDaysBefore = currentDate.minusDays(day); // } else { // threeDaysBefore = currentDate.minusDays(3); // } // logger.error("addPerfEvaObject----1"); // // //入职单 获取最近入职人员 通过人员id去查询绩效档案id // IEmpEnrollBizBillEntry iEmpEnrollBizBillEntry = EmpEnrollBizBillEntryFactory.getLocalInstance(ctx); // SelectorItemCollection sic = new SelectorItemCollection(); // sic.add("bizDate"); // sic.add("empname"); // sic.add("person.id"); // sic.add("person.number"); // sic.add("person.name"); // FilterInfo empEnrollFilterInfo = new FilterInfo(); // empEnrollFilterInfo.getFilterItems().add(new FilterItemInfo("bizDate", threeDaysBefore.toString(), CompareType.GREATER_EQUALS)); // EntityViewInfo empEnrollEntityViewInfo = EntityViewInfo.getInstance(empEnrollFilterInfo, null, null); // EmpEnrollBizBillEntryCollection empEnrollBizBillEntryCollection = iEmpEnrollBizBillEntry.getEmpEnrollBizBillEntryCollection(empEnrollEntityViewInfo); // logger.error("addPerfEvaObject----2"); // Set set = new HashSet(); // StringBuilder sb = new StringBuilder(); // for (int i = 0; i < empEnrollBizBillEntryCollection.size(); i++) { // EmpEnrollBizBillEntryInfo empEnrollBizBillEntryInfo = empEnrollBizBillEntryCollection.get(i); // String empName = empEnrollBizBillEntryInfo.getEmpName(); // PersonInfo person = empEnrollBizBillEntryInfo.getPerson(); // set.add(person.getId()); // sb.append(empName).append(","); // } // logger.error("addPerfEvaObject----3"); // sb = deleteCharAt(sb); // //绩效考核档案 获取绩效档案id建立员工考核计划 // IPerfFile iPerfFile = PerfFileFactory.getLocalInstance(ctx); // FilterInfo perfFileFilterInfo = new FilterInfo(); // perfFileFilterInfo.getFilterItems().add(new FilterItemInfo("person", set, CompareType.INCLUDE)); // EntityViewInfo perfFileEntityViewInfo = EntityViewInfo.getInstance(perfFileFilterInfo, null, null); // PerfFileCollection perfFileCollection = iPerfFile.getPerfFileCollection(perfFileEntityViewInfo); // if (perfFileCollection.size() <= 0) { // throw new ShrWebBizException("[" + sb.toString() + "]这些人员还未生成员工绩效档案,请维护!"); // } // if (!StringUtils.isEmpty(billid)) { // perfFiles.append(billid); // } else { // for (int i = 0; i < perfFileCollection.size(); i++) { // PerfFileInfo perfFileInfo = perfFileCollection.get(i); // perfFiles.append(perfFileInfo.getId().toString()).append(","); // } // perfFiles = deleteCharAt(perfFiles); // } // //考核周期 下面是执行添加操作 // IPerfPeriod iPerfPeriod = PerfPeriodFactory.getLocalInstance(ctx); // //获取当前年 // int year = Year.now().getValue(); // PerfPeriodInfo perfPeriodInfo = iPerfPeriod.getPerfPeriodInfo("where timePeriod = '" + year + "' and name = '公司年度绩效目标_周期" + year + "年'"); // PerfPlanInfo perfPlan = perfPeriodInfo.getPerfPlan(); // String planId = perfPlan.getId().toString(); // String periodId = perfPeriodInfo.getId().toString(); // String addModel = "0"; // String hrOrgUnit = "00000000-0000-0000-0000-000000000000CCE7AED4"; // checkPeriod(periodId); // PerfPlanInfo info = null; // logger.error("addPerfEvaObject----4"); // try { // info = PerfPlanFactory.getRemoteInstance().getPerfPlanInfo("where id = '" + planId + "'"); // } catch (Exception var10) { // var10.printStackTrace(); // logger.error(var10.toString()); // throw new ShrWebBizException((new SHRPerfWebBizException(SHRPerfWebBizException.GETPERFPLANERR)).getMessage()); // } // logger.error("addPerfEvaObject----5" + addModel); // if ("0".equals(addModel)) { // logger.error("addFromPerfFile----" + info.getId()); // this.addFromPerfFile(ctx, perfFiles.toString(), periodId, hrOrgUnit, info); // } //} // public StringBuilder deleteCharAt(StringBuilder sb) { if (sb.length() > 0) { sb.deleteCharAt(sb.lastIndexOf(",")); } return sb; } }