Forráskód Böngészése

1.薪酬/职级调整单逻辑优化
2.岗位信息维护列表新增编制数,兼岗数,缺岗数
3.临时/年度招聘需求申请编制数字段优化

Tyx 2 hete
szülő
commit
16b9aa41af

+ 24 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/opplugin/web/position/PositionDataProviderEx.java

@@ -8,6 +8,7 @@ import kd.bos.logging.LogFactory;
 import kd.bos.mvc.list.ListDataProvider;
 import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.model.org.staff.StaffResponse;
 import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
 
 import java.util.*;
@@ -32,9 +33,19 @@ public class PositionDataProviderEx extends ListDataProvider {
         List<Long> ids = rows.stream().map(dyx -> dyx.getLong("id")).collect(Collectors.toList());
 
         Map<Long, List<DynamicObject>> map = PositionUtils.getAllUPersonOfPosition("1", ids);
+
+        Map staffMap = new HashMap();
+        StaffResponse staffResponse = PositionUtils.getStaffByPosition(ids);
+        if(staffResponse.isSuccess()) {
+            staffMap = (Map) staffResponse.getData();
+        }
         if(map.isEmpty())
             return rows;
         for(DynamicObject position : rows) {
+            int personCount = 0;
+            int personCountPart = 0;
+            int staffCount = 0;
+            int lackCount = 0;
             Long positionId = position.getLong("id");
             //在岗数:
             List<DynamicObject> personList = map.get(positionId);
@@ -42,11 +53,23 @@ public class PositionDataProviderEx extends ListDataProvider {
                 continue;
             //获取在岗数,排除兼职
             List filterList = personList.stream().filter(dyx -> dyx.getString("postype.number").equals("1010_S")).collect(Collectors.toList());
-            position.set("nckd_personcount", filterList.size());
+            personCount = filterList.size();
+            position.set("nckd_personcount", personCount);
+            //获取兼职数
+            List filterList1 = personList.stream().filter(dyx -> dyx.getString("postype.number").equals("1020_S")).collect(Collectors.toList());
+            personCountPart = filterList1.size();
+            position.set("nckd_personcountpart", personCountPart);
+            //获取编制数
+            if(staffMap.keySet().contains(positionId.toString())) {
+                staffCount = (int) ((Map) staffMap.get(positionId.toString())).get("staffNum");
+                position.set("nckd_staffcount", staffCount);
+            }
             //人员姓名拼接:
             String personName = personList.stream().map(dyx -> dyx.getString("postype.number").equals("1010_S") ? dyx.getString("person.name") : dyx.getString("person.name") + "(兼)")
                     .collect(Collectors.joining(", "));
             position.set("nckd_personname", personName);
+            //缺岗数 = 编制数 - 在岗数
+            position.set("nckd_lackcount", staffCount - personCount);
         }
 
         return rows;

+ 16 - 4
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/opplugin/web/position/PositionUtils.java

@@ -2,13 +2,13 @@ package nckd.jimin.jyyy.hr.hrmp.hbpm.opplugin.web.position;
 
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.DispatchServiceHelper;
+import kd.hr.haos.mservice.api.IHAOSStaffService;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.model.org.staff.StaffResponse;
 import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -38,4 +38,16 @@ public class PositionUtils {
         return map;
     }
 
+    /**
+     * 获取职位的编制信息
+     * @param positionIds
+     */
+    public static StaffResponse getStaffByPosition (List<Long> positionIds) {
+        Object[] param = new Object[2];
+        param[0] = new Date();
+        param[1] = positionIds;
+        StaffResponse<Map<String, Map<String, Object>>> staffResponse =  DispatchServiceHelper.invokeService("kd.hrmp.haos.servicehelper","haos","IHAOSStaffService","queryPositionStaffInfo",param);
+        return staffResponse;
+    }
+
 }

+ 16 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncUtil.java

@@ -17,6 +17,7 @@ import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.bos.util.HttpClientUtils;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
 import nckd.jimin.jyyy.hr.tsrsc.plugin.util.MokaApiUtil;
 
 import java.io.IOException;
@@ -599,7 +600,7 @@ public class SyncUtil {
         sb.append(" from t_hrpi_person a \n");
         sb.append(" left join t_hrpi_perserlen b on a.fid = b.fpersonid and b.fiscurrentversion = '1' and b.fbusinessstatus = '1' and b.fdatastatus = '1' \n");
         sb.append(" left join ( select row_number() over (partition by fpersonid order by fmodifytime desc) r, fpersonid, fstartdate, fenddate \n");
-        sb.append("             from t_hlcm_contract where fiscurrentversion = '1' ) c on c.fpersonid = a.fid and c.r = 1 \n");
+        sb.append("             from t_hlcm_contract where fiscurrentversion = '1' and fcontractstatus = '1' and fprotocoltype = '1' ) c on c.fpersonid = a.fid and c.r = 1 \n");
         sb.append(" left join t_hrpi_empjobrel d on a.fid = d.fpersonid and d.fiscurrentversion = '1' and d.fbusinessstatus = '1' and d.fdatastatus = '1' \n");
         sb.append(" left join t_hbjm_joblevel e on e.fjoblevelid = d.fjoblevelid \n");
         sb.append(" left join t_hrpi_baselocation f on f.fpersonid = a.fid and f.fiscurrentversion = '1' and f.fbusinessstatus = '1' and f.fdatastatus = '1' \n");
@@ -642,5 +643,19 @@ public class SyncUtil {
         return sb;
     }
 
+    /**
+     * 获取人员主任职的岗位和部门
+     * @param employeeId
+     * @return
+     */
+    public static DynamicObject getAdminOrgAndPositionByEmployeeId(Long employeeId) {
+        QFilter filter = QFilterUtil.getCurrentQf();
+        filter.and("employee", QCP.equals, employeeId);
+        filter.and("isprimary", QCP.equals, "1");
+        String selectFields = "adminorg.id,position.id";
+        return QueryServiceHelper.queryOne("hrpi_empposorgrel", selectFields, new QFilter[]{filter});
+    }
+
+
 
 }

+ 6 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/web/AdjustJobBillEdit.java

@@ -61,6 +61,7 @@ import kd.tdc.tjga.business.formservice.BatchChangeGradeLevelFormService;
 import kd.tdc.tjga.common.util.CommUtils;
 import kd.tdc.tjga.common.util.ControlDataSyn;
 import kd.tdc.tjga.common.util.TjgaObjectUtils;
+import nckd.jimin.jyyy.hr.hrmp.hbpm.task.SyncUtil;
 import org.apache.commons.lang3.StringUtils;
 
 import java.text.ParseException;
@@ -587,6 +588,11 @@ public class AdjustJobBillEdit extends HRDataBaseEdit implements BeforeF7SelectL
                     model.setValue("name", changeRowObj.getString("person.name"), rowNum);
                     model.setValue("number", changeRowObj.getString("person.number"), rowNum);
                     Long employeeId = changeRowObj.getLong("employee.id");
+                    DynamicObject dyn = SyncUtil.getAdminOrgAndPositionByEmployeeId(employeeId);
+                    if(!ObjectUtils.isEmpty(dyn)) {
+                        model.setValue("adminorg", dyn.getLong("adminorg.id"), rowNum);
+                        model.setValue("position", dyn.getLong("position.id"), rowNum);
+                    }
                     DynamicObject empJobObj = (DynamicObject)empJobMap.get(employeeId);
                     if (!HRObjectUtils.isEmpty(empJobObj)) {
                         entryGradeId = empJobObj.getLong("hrbu.id");

+ 6 - 4
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hsas/util/CalPersonUtil.java

@@ -83,6 +83,7 @@ public class CalPersonUtil {
         Date lastDate = getLastMonthDay(date);
         //人员
         QFilter personFilter = new QFilter("person.id", QCP.in, personIds);
+        personFilter.and("protocoltype", QCP.equals, "1");  //合同
         personFilter.and("iscurrentversion", QCP.equals, "1");
         personFilter.and("datastatus", QCP.equals, "1");
         personFilter.and("signstatus", QCP.not_equals2, "7");
@@ -95,8 +96,8 @@ public class CalPersonUtil {
         filter2.and("startdate", QCP.less_equals, lastDate);
         QFilter dateFilter = filter1.or(filter2);
         QFilter filter = personFilter.and(dateFilter);
-        String selectFields = "person.id,actualsigncompany.id,startdate,signstatus";
-        DynamicObjectCollection contractCols = QueryServiceHelper.query(CONTRACT_ENTITY, selectFields, new QFilter[]{filter},"startdate desc,signstatus desc");
+        String selectFields = "person.id,actualsigncompany.id,startdate,signstatus,signeddate";
+        DynamicObjectCollection contractCols = QueryServiceHelper.query(CONTRACT_ENTITY, selectFields, new QFilter[]{filter},"signeddate desc,signstatus desc");
         //按照person.id提取
         Map contractMap = contractCols.stream().collect(Collectors.toMap((dyx) -> {
             return dyx.getLong("person.id");
@@ -117,6 +118,7 @@ public class CalPersonUtil {
     public static Map<Long, Long> getBContractInfoByPersonID (List<Long> personIds, Date date) {
         //人员
         QFilter personFilter = new QFilter("person.id", QCP.in, personIds);
+        personFilter.and("protocoltype", QCP.equals, "1");  //合同
         personFilter.and("iscurrentversion", QCP.equals, "1");
         personFilter.and("datastatus", QCP.equals, "1");
         personFilter.and("signstatus", QCP.not_equals2, "7");
@@ -129,8 +131,8 @@ public class CalPersonUtil {
         filter2.and("startdate", QCP.less_equals, date);
         QFilter dateFilter = filter1.or(filter2);
         QFilter filter = personFilter.and(dateFilter);
-        String selectFields = "person.id,actualsigncompany.id,startdate,signstatus";
-        DynamicObjectCollection contractCols = QueryServiceHelper.query(CONTRACT_ENTITY, selectFields, new QFilter[]{filter},"startdate desc,signstatus desc");
+        String selectFields = "person.id,actualsigncompany.id,startdate,signstatus,signeddate";
+        DynamicObjectCollection contractCols = QueryServiceHelper.query(CONTRACT_ENTITY, selectFields, new QFilter[]{filter},"signeddate desc,signstatus desc");
         //按照person.id提取
         Map contractMap = contractCols.stream().collect(Collectors.toMap((dyx) -> {
             return dyx.getLong("person.id");

+ 36 - 25
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/CasRecrApplyFormPlugin.java

@@ -32,6 +32,8 @@ import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.org.OrgUnitServiceHelper;
 import kd.hr.hbp.business.openservicehelper.hrpi.HRPIPersonServiceHelper;
+import kd.hr.hbp.common.model.org.staff.StaffResponse;
+import nckd.jimin.jyyy.hr.hrmp.hbpm.opplugin.web.position.PositionUtils;
 import nckd.jimin.jyyy.hr.tsrsc.plugin.util.RecUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -551,33 +553,42 @@ public class CasRecrApplyFormPlugin extends AbstractBillPlugIn implements Before
     public Object getFieldValue(DynamicObject nckd_recruitpost) {
         Object num = null;
         if(ObjectUtils.isNotEmpty(nckd_recruitpost)){
-            Object nckdSftaff = this.getModel().getValue("nckd_sftaff");
-
-            DynamicObject haosStaff = null;
-            if(ObjectUtils.isNotEmpty(nckdSftaff)){
-                haosStaff = BusinessDataServiceHelper.loadSingle(nckdSftaff,"haos_staff");
-            }else{
-                QFilter qFilter = new QFilter("enable", QCP.equals, "1");
-                DynamicObject[] haosStaffs = BusinessDataServiceHelper.load("haos_staff", "id,name,number", new QFilter[]{qFilter},"year desc");
-                if (haosStaffs != null && haosStaffs.length > 0) {
-                    haosStaff = haosStaffs[0];
-                } else {
-                    return null;
+            //Tyx 2025-09-19 改成直接按照岗位获取编制数
+            List<Long> ids = new ArrayList<Long>();
+            ids.add(nckd_recruitpost.getLong("id"));
+            StaffResponse staffResponse = PositionUtils.getStaffByPosition(ids);
+            if(staffResponse.isSuccess()) {
+                Map data = (Map) staffResponse.getData();
+                if(data.keySet().contains(ids.get(0).toString())) {
+                    Map staffMap = (Map) data.get(ids.get(0).toString());
+                    num = staffMap.get("staffNum");
                 }
-                this.getModel().setValue("nckd_sftaff",haosStaff.getPkValue());
-            }
-
-            Object pkValue = nckd_recruitpost.get("id");
-            QFilter qFilter3 = new QFilter("staff.id", QCP.equals, haosStaff.getPkValue())
-                    .and("enable", QCP.not_equals, "0")
-                    .and("datastatus",QCP.not_equals,"-2")
-                    .and("datastatus",QCP.not_equals,"2")
-                    .and("datastatus",QCP.not_equals,"-1")
-                    .and("dutyworkrole.boid",QCP.equals,pkValue);
-            DynamicObject[] haosDutyorgdetails = BusinessDataServiceHelper.load("haos_muldimendetail", "id,staff,dutyworkrole,dutyworkrole.boid,yearstaff", new QFilter[]{qFilter3});
-            if(haosDutyorgdetails.length > 0) {
-                num = haosDutyorgdetails[0].get("yearstaff");
             }
+//            DynamicObject haosStaff = null;
+//            if(ObjectUtils.isNotEmpty(nckdSftaff)){
+//                haosStaff = BusinessDataServiceHelper.loadSingle(nckdSftaff,"haos_staff");
+//            }else{
+//                QFilter qFilter = new QFilter("enable", QCP.equals, "1");
+//                DynamicObject[] haosStaffs = BusinessDataServiceHelper.load("haos_staff", "id,name,number", new QFilter[]{qFilter},"year desc");
+//                if (haosStaffs != null && haosStaffs.length > 0) {
+//                    haosStaff = haosStaffs[0];
+//                } else {
+//                    return null;
+//                }
+//                this.getModel().setValue("nckd_sftaff",haosStaff.getPkValue());
+//            }
+//
+//            Object pkValue = nckd_recruitpost.get("id");
+//            QFilter qFilter3 = new QFilter("staff.id", QCP.equals, haosStaff.getPkValue())
+//                    .and("enable", QCP.not_equals, "0")
+//                    .and("datastatus",QCP.not_equals,"-2")
+//                    .and("datastatus",QCP.not_equals,"2")
+//                    .and("datastatus",QCP.not_equals,"-1")
+//                    .and("dutyworkrole.boid",QCP.equals,pkValue);
+//            DynamicObject[] haosDutyorgdetails = BusinessDataServiceHelper.load("haos_muldimendetail", "id,staff,dutyworkrole,dutyworkrole.boid,yearstaff", new QFilter[]{qFilter3});
+//            if(haosDutyorgdetails.length > 0) {
+//                num = haosDutyorgdetails[0].get("yearstaff");
+//            }
         }
         return num;
     }

+ 38 - 25
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyFormPlugin.java

@@ -36,7 +36,9 @@ import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.org.OrgUnitServiceHelper;
 import kd.hr.hbp.business.openservicehelper.hrpi.HRPIPersonServiceHelper;
+import kd.hr.hbp.common.model.org.staff.StaffResponse;
 import kd.hr.hbp.common.util.HRDBUtil;
+import nckd.jimin.jyyy.hr.hrmp.hbpm.opplugin.web.position.PositionUtils;
 import nckd.jimin.jyyy.hr.tsrsc.plugin.util.RecUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -468,33 +470,44 @@ public class YearCrApplyFormPlugin extends AbstractBillPlugIn implements BeforeF
     private Object getFieldValue(DynamicObject nckd_recruitpost) {
         Object num = null;
         if(ObjectUtils.isNotEmpty(nckd_recruitpost)){
-            Object nckdSftaff = this.getModel().getValue("nckd_sftaff");
-
-            DynamicObject haosStaff = null;
-            if(ObjectUtils.isNotEmpty(nckdSftaff)){
-                haosStaff = BusinessDataServiceHelper.loadSingle(nckdSftaff,"haos_staff");
-            }else{
-                QFilter qFilter = new QFilter("enable", QCP.equals, "1");
-                DynamicObject[] haosStaffs = BusinessDataServiceHelper.load("haos_staff", "id,name,number", new QFilter[]{qFilter},"year desc");
-                if (haosStaffs != null && haosStaffs.length > 0) {
-                    haosStaff = haosStaffs[0];
-                    this.getModel().setValue("nckd_sftaff",haosStaff.getPkValue());
-                } else {
-                    return null;
+            //Tyx 2025-09-19 改成直接按照岗位获取编制数
+            List<Long> ids = new ArrayList<Long>();
+            ids.add(nckd_recruitpost.getLong("id"));
+            StaffResponse staffResponse = PositionUtils.getStaffByPosition(ids);
+            if(staffResponse.isSuccess()) {
+                Map data = (Map) staffResponse.getData();
+                if(data.keySet().contains(ids.get(0).toString())) {
+                    Map staffMap = (Map) data.get(ids.get(0).toString());
+                    num = staffMap.get("staffNum");
                 }
             }
-
-            Object pkValue = nckd_recruitpost.get("id");
-            QFilter qFilter3 = new QFilter("staff.id", QCP.equals, haosStaff.getPkValue())
-                    .and("enable", QCP.not_equals, "0")
-                    .and("datastatus",QCP.not_equals,"-2")
-                    .and("datastatus",QCP.not_equals,"2")
-                    .and("datastatus",QCP.not_equals,"-1")
-                    .and("dutyworkrole.boid",QCP.equals,pkValue);
-            DynamicObject[] haosDutyorgdetails = BusinessDataServiceHelper.load("haos_muldimendetail", "id,staff,dutyworkrole,dutyworkrole.boid,yearstaff", new QFilter[]{qFilter3});
-            if(haosDutyorgdetails.length > 0) {
-                num = haosDutyorgdetails[0].get("yearstaff");
-            }
+//            Object nckdSftaff = this.getModel().getValue("nckd_sftaff");
+//
+//            DynamicObject haosStaff = null;
+//            if(ObjectUtils.isNotEmpty(nckdSftaff)){
+//                haosStaff = BusinessDataServiceHelper.loadSingle(nckdSftaff,"haos_staff");
+//            }else{
+//                QFilter qFilter = new QFilter("enable", QCP.equals, "1");
+//                DynamicObject[] haosStaffs = BusinessDataServiceHelper.load("haos_staff", "id,name,number", new QFilter[]{qFilter},"year desc");
+//                if (haosStaffs != null && haosStaffs.length > 0) {
+//                    haosStaff = haosStaffs[0];
+//                    this.getModel().setValue("nckd_sftaff",haosStaff.getPkValue());
+//                } else {
+//                    return null;
+//                }
+//            }
+//
+//            Object pkValue = nckd_recruitpost.get("id");
+//            QFilter qFilter3 = new QFilter("staff.id", QCP.equals, haosStaff.getPkValue())
+//                    .and("enable", QCP.not_equals, "0")
+//                    .and("datastatus",QCP.not_equals,"-2")
+//                    .and("datastatus",QCP.not_equals,"2")
+//                    .and("datastatus",QCP.not_equals,"-1")
+//                    .and("dutyworkrole.boid",QCP.equals,pkValue);
+//            DynamicObject[] haosDutyorgdetails = BusinessDataServiceHelper.load("haos_muldimendetail", "id,staff,dutyworkrole,dutyworkrole.boid,yearstaff", new QFilter[]{qFilter3});
+//            if(haosDutyorgdetails.length > 0) {
+//                num = haosDutyorgdetails[0].get("yearstaff");
+//            }
         }
         return num;
     }