Explorar o código

绩效辅导调度计划,绩效辅导表单插件

彭佳杰 hai 3 días
pai
achega
46e83d928c

+ 101 - 0
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/helper/KpiImportUtils.java

@@ -0,0 +1,101 @@
+package nckd.jxccl.opmc.pm.helper;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import nckd.jxccl.base.common.utils.DateUtil;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName: KpiImportUtils
+ * @Description: 绩效导入工具类
+ * @Author: PJJ
+ * @Date: 2026/1/14 下午2:36
+ * @Version: 1.0
+ */
+public class KpiImportUtils {
+    /**
+     * 查询去年绩效考核不合格员工
+     * @return
+     */
+    public static List<DynamicObject> yearUnqualifiedUser(){
+        //获取去年第一天
+        LocalDateTime localDateTime = DateUtil.minusYears(DateUtil.now(), 1);
+        localDateTime = DateUtil.beginOfYear(localDateTime);
+        //去年年度绩效不合格员工
+        QFilter qFilter = new QFilter("nckd_perfmanagerentry.nckd_appraisalresult.number", QCP.in, new String[]{"04", "10"});
+        qFilter.and("nckd_perfmanagerentry.nckd_appraisalyear",QCP.equals,localDateTime);
+        //查询考核周期获取年度绩效考核结果为 不合格 人员
+        DynamicObjectCollection user = QueryServiceHelper.query("nckd_perfmanager", "nckd_person.id", qFilter.toArray());
+        List<Long> userIds = user.stream().map(i -> i.getLong("nckd_person.id")).collect(Collectors.toList());
+        QFilter userqFilter = new QFilter("employee", QCP.in, userIds);
+        userqFilter.and("posstatus.poststatecls.number",QCP.equals,"1010_S");
+        //最新任职经历
+        DynamicObject[] empposorgrel = BusinessDataServiceHelper.load("hrpi_empposorgrel", "employee.empnumber", userqFilter.toArray());
+        List<String> userNumber = Arrays.stream(empposorgrel).map(i -> i.getString("employee.empnumber")).collect(Collectors.toList());
+        DynamicObject[] bos_ser = BusinessDataServiceHelper.load("bos_user", "id,number,name,entryentity.dpt,entryentity.ispartjob", new QFilter[]{new QFilter("number", QCP.in, userNumber)});
+        return Arrays.asList(bos_ser);
+    }
+
+    public static List<DynamicObject> monthUnqualifiedUser(){
+        //查询月度考核不合格员工
+        QFilter qFilter = new QFilter("status", QCP.equals, "C");
+        qFilter.and("enable",QCP.equals,"1");
+        qFilter.and("nckd_entryentity.nckd_examine_dimension.number",QCP.equals,"JT-00011");
+        qFilter.and("nckd_entryentity.nckd_result",QCP.in,new String[]{"视同不合格","不合格"});
+        //绩效导入结果
+        DynamicObject[] result = BusinessDataServiceHelper.load("nckd_examinproject_result","nckd_user,nckd_importplan" , qFilter.toArray());
+        Map<Long, List<Integer>> userId_month = Arrays.stream(result)
+                .collect(Collectors.groupingBy(i -> i.getLong("nckd_user.id"),
+                        Collectors.mapping(obj -> obj.getInt("nckd_month"), Collectors.toList())));
+        ArrayList<Long> objects = new ArrayList<>();
+        //过滤连续三个月考核不合格员工
+        for (Long userId : userId_month.keySet()) {
+            List<Integer> integers = userId_month.get(userId);
+            //校验连续三月
+            boolean check = check(integers);
+            if(check){
+                objects.add(userId);
+            }
+        }
+        DynamicObject[] bos_ser = BusinessDataServiceHelper.load("bos_user", "id,number,name,entryentity.dpt,entryentity.ispartjob", new QFilter[]{new QFilter("id", QCP.in, objects)});
+        return Arrays.asList(bos_ser);
+    }
+
+    private static boolean check(List<Integer> months){
+        if (months == null || months.size() < 3) {
+            return false;
+        }
+
+        // 1. 去重并排序
+        Set<Integer> uniqueMonths = new TreeSet<>(months);
+        List<Integer> sortedMonths = new ArrayList<>(uniqueMonths);
+
+        // 2. 检查连续三个月
+        for (int i = 0; i <= sortedMonths.size() - 3; i++) {
+            int month1 = sortedMonths.get(i);
+            int month2 = sortedMonths.get(i + 1);
+            int month3 = sortedMonths.get(i + 2);
+
+            // 检查是否连续
+            if (month2 == month1 + 1 && month3 == month2 + 1) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+}

+ 69 - 0
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/form/KpiTutoringFormPlugin.java

@@ -0,0 +1,69 @@
+package nckd.jxccl.opmc.pm.plugin.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import nckd.jxccl.opmc.pm.helper.KpiImportUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.EventObject;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName: KpiTutoringFormPlugin
+ * @Description: 绩效辅导表单插件
+ * @Author: PJJ
+ * @Date: 2026/1/15 上午10:19
+ * @Version: 1.0
+ */
+public class KpiTutoringFormPlugin extends AbstractFormPlugin implements BeforeF7SelectListener {
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        BasedataEdit user = this.getControl("nckd_user");
+        user.addBeforeF7SelectListener(this);
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent e) {
+        String name = e.getProperty().getName();
+        if(StringUtils.equals(name,"nckd_user")){
+            List<DynamicObject> dynamicObjects = KpiImportUtils.yearUnqualifiedUser();
+            List<DynamicObject> dynamicObjects1 = KpiImportUtils.monthUnqualifiedUser();
+            List<Object> collect = dynamicObjects.stream().map(i -> i.getPkValue()).collect(Collectors.toList());
+            collect.addAll(dynamicObjects1.stream().map(i->i.getPkValue()).collect(Collectors.toList()));
+            QFilter qFilter = new QFilter("id", QCP.in, collect);
+            e.getCustomQFilters().add(qFilter);
+        }
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        String name = e.getProperty().getName();
+        if( StringUtils.equals(name,"nckd_user") ){
+            Object changeData = e.getChangeSet()[0].getNewValue();
+            if(ObjectUtils.isNotEmpty(changeData)){
+                DynamicObject user = (DynamicObject) changeData;
+                DynamicObject userData = BusinessDataServiceHelper.loadSingle(user.getPkValue(), "bos_user");
+                DynamicObjectCollection dynamicObjectCollection = userData.getDynamicObjectCollection("entryentity");
+                List<DynamicObject> collect = dynamicObjectCollection.stream().filter(i -> !i.getBoolean("ispartjob")).collect(Collectors.toList());
+                this.getModel().setValue("nckd_org",collect.get(0).getDynamicObject("dpt"));
+                this.getModel().setValue("nckd_position",collect.get(0).getDynamicObject("post"));
+            }else{
+                this.getModel().setValue("nckd_user",null);
+                this.getModel().setValue("nckd_org",null);
+                this.getModel().setValue("nckd_position",null);
+            }
+        }
+    }
+}

+ 122 - 0
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/task/NoticeKpiUnqualifiedTask.java

@@ -0,0 +1,122 @@
+package nckd.jxccl.opmc.pm.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.exception.KDException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.workflow.MessageCenterServiceHelper;
+import kd.bos.workflow.engine.msg.info.MessageInfo;
+import nckd.jxccl.opmc.pm.helper.KpiImportUtils;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName: NoticeKpiUnqualifiedTask
+ * @Description: 定时推送绩效导入结果不合格人员
+ * @Author: PJJ
+ * @Date: 2026/1/14 上午9:39
+ * @Version: 1.0
+ */
+public class NoticeKpiUnqualifiedTask extends AbstractTask {
+    private static final Log logger = LogFactory.getLog(NoticeKpiUnqualifiedTask.class);
+
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        //去年年度绩效不合格用户
+        List<DynamicObject> yearUnqualifiedUser = KpiImportUtils.yearUnqualifiedUser();
+        //查询连续三个月绩效考核 不合格 人员
+        List<DynamicObject> monthUnqualifiedUser = KpiImportUtils.monthUnqualifiedUser();
+        //根据部门汇总人员数据
+        HashMap<Long, List<DynamicObject>> org_userMap = new HashMap<>();
+        yearUnqualifiedUser.addAll(monthUnqualifiedUser);
+        for (DynamicObject user : yearUnqualifiedUser) {
+            //过滤主任职
+            DynamicObjectCollection entry = user.getDynamicObjectCollection("entryentity");
+            List<DynamicObject> collect = entry.stream().filter(i -> !i.getBoolean("ispartjob")).collect(Collectors.toList());
+            Long orgId = collect.get(0).getLong("dpt.id");
+
+            List<DynamicObject> users = org_userMap.get(orgId);
+            if(ObjectUtils.isEmpty(users)){
+                ArrayList<DynamicObject> objects = new ArrayList<>();
+                objects.add(user);
+                org_userMap.put(orgId, objects);
+            }else{
+                users.add(user);
+            }
+
+        }
+        //查询所有绩效辅导组织负责人
+        DynamicObject[] tutor_head = BusinessDataServiceHelper.load("nckd_kpi_tutor_head", "nckd_user,nckd_org", null);
+        Map<Long, DynamicObject> org_head = Arrays.stream(tutor_head).collect(Collectors.toMap(i -> i.getLong("nckd_org.id"), i -> i));
+        //查询组织架构表
+        DynamicObjectCollection structure = QueryServiceHelper.query("bos_org_structure", "parent.id,org.id",
+                new QFilter[]{new QFilter("view.number", QCP.equals,"01").and("status",QCP.equals,"C").and("enable",QCP.equals,"1")});
+        //组织和上级组织map
+        Map<Long, Long> orgParent = structure.stream().collect(Collectors.toMap(i -> i.getLong("org.id"), i -> i.getLong("parent.id")));
+        //发送消息
+        List<MessageInfo> messageInfos = new ArrayList<>();
+        for (Long curOrgId : org_userMap.keySet()) {
+            //员工对应组织先找负责人
+            DynamicObject userHead = org_head.get(curOrgId);
+            //找不到往上找一级
+            if ( ObjectUtils.isEmpty(userHead) ) {
+                Long org_parent = orgParent.get(curOrgId);
+                DynamicObject userHead_parent = org_head.get(org_parent);
+                //为空再找一级
+                if( ObjectUtils.isEmpty(userHead_parent) ){
+                    Long org_grandParent = orgParent.get(org_parent);
+                    DynamicObject userHead_grandParent = org_head.get(org_grandParent);
+                    if( ObjectUtils.isEmpty(userHead_grandParent) ){
+                        logger.info("当前组织id" + curOrgId + "往上两级也未找到对应负责人");
+                    }else{
+                        buildMessage(messageInfos,userHead_grandParent,org_userMap.get(curOrgId));
+                    }
+                }else{
+                    buildMessage(messageInfos,userHead_parent,org_userMap.get(curOrgId));
+                }
+            }else{
+                buildMessage(messageInfos,userHead,org_userMap.get(curOrgId));
+            }
+
+        }
+
+        Map<String, Object> stringObjectMap = MessageCenterServiceHelper.batchSendMessages(messageInfos);
+        logger.info("员工绩效不合格消息提醒发送结果" + stringObjectMap.get("success") + "返回结果" + stringObjectMap.get("description"));
+
+    }
+
+    private void buildMessage(List<MessageInfo> messageInfos, DynamicObject user, List<DynamicObject> dynamicObjects) {
+        // 构建 消息
+        MessageInfo messageInfo = new MessageInfo();
+        // 设置 消息标题
+        messageInfo.setMessageTitle(new LocaleString("员工绩效评估不合格提醒"));
+        // 设置 文本消息内容
+        Set<String> collect = dynamicObjects.stream().map(i -> i.getLocaleString("name").getLocaleValue_zh_CN() + ":" + i.getString("number")).collect(Collectors.toSet());
+//        String.format("",collect);
+        messageInfo.setMessageContent(new LocaleString(collect.toString()));
+        // 设置 消息类型
+        messageInfo.setType(MessageInfo.TYPE_TASK);
+        // 设置 标签
+        messageInfo.setTag("员工绩效");
+        // 设置 消息接收人
+        messageInfo.setUserIds(Collections.singletonList(user.getLong("id")));
+        messageInfos.add(messageInfo);
+    }
+
+}