|
@@ -0,0 +1,391 @@
|
|
|
+package nckd.jimin.jyyy.hr.swc.hsas.formplugin.web.helper;
|
|
|
+
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
+import kd.bos.dataentity.utils.ObjectUtils;
|
|
|
+import kd.bos.exception.KDBizException;
|
|
|
+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.servicehelper.BusinessDataServiceHelper;
|
|
|
+import kd.bos.servicehelper.QueryServiceHelper;
|
|
|
+import kd.fi.cal.common.util.CloneUtils;
|
|
|
+import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
|
|
|
+import kd.sdk.swc.hcdm.common.stdtab.SalaryStdMatchResultNew;
|
|
|
+import kd.sdk.swc.hcdm.common.stdtab.StdMatchParamWithDepEmp;
|
|
|
+import kd.sdk.swc.hcdm.service.spi.SalaryStdQueryService;
|
|
|
+import kd.swc.hcdm.business.salaryadjfile.DecAdjInfoServiceHelper;
|
|
|
+import kd.swc.hsbp.common.util.SWCMServiceUtils;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * description: 新增定调薪信息帮助类
|
|
|
+ * @author Tyx
|
|
|
+ * @date 2025/6/4
|
|
|
+ */
|
|
|
+public class AdjSalFileHelper {
|
|
|
+
|
|
|
+ private static String onBrd_entity = "hom_onbrdinfo";
|
|
|
+ private static String salaryAdjRecord_entity = "hcdm_salaryadjrecord";
|
|
|
+ private static String salaryAdjRecordRel_entity = "hcdm_decadjrelperson";
|
|
|
+ private static String adjFileInfo_entity = "hcdm_adjfileinfo";
|
|
|
+ private static String standardItem_entity = "hsbs_standarditem";
|
|
|
+ private static String stdScm_entity = "hcdm_stdscm";
|
|
|
+ private static DecAdjInfoServiceHelper helper = new DecAdjInfoServiceHelper();
|
|
|
+ private static final Log log = LogFactory.getLog(AdjSalFileHelper.class);
|
|
|
+ private static String[] grItemNumber = new String[]{"004","005","006"};
|
|
|
+ private static String[] grItemKey = new String[]{"nckd_jbgzyx","nckd_jngzyx","nckd_jxgzyx"};
|
|
|
+ /**
|
|
|
+ * 根据变动记录ID找入职单ID
|
|
|
+ * @param chgRecordId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Long getOnBrdBillId (Long chgRecordId) {
|
|
|
+ Map<String, Object> recordResult = SWCMServiceUtils.invokeBizService("hr", "hpfs", "IHPFSPersonChgService",
|
|
|
+ "getChgInfoByRecordId", new Object[] {chgRecordId});
|
|
|
+ return Long.valueOf(((Map) recordResult.get("data")).get("billId").toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据入职办理单Dyn构建待保存的定调薪信息Dyn
|
|
|
+ * 具体规则:
|
|
|
+ * 1.共用部分:N薪系数反写定调薪档案上
|
|
|
+ * 2.是否药业工人入职(nckd_isgrrz) = false时:年度薪酬标准(定调薪项目) = 实习期月薪 * 12,发薪系数 = 实习期系数,
|
|
|
+ * 或者 年度薪酬标准(定调薪项目) = 转正后年薪,发薪系数 = 试用期系数,实习期月薪 和 转正后年薪 如果都填了 只生成实习期的
|
|
|
+ * 3.是否药业工人入职(nckd_isgrrz) = true时:基本工资(定调薪项目) = 基本工资(月薪),技能工资(定调薪项目) = 技能工资(月薪),绩效工资(定调薪项目) = 绩效工资(月薪)
|
|
|
+ * @param onBrdBillDyn 入职单Dyn
|
|
|
+ */
|
|
|
+ public static Map<String, Object> execute (DynamicObject onBrdBillDyn, Map<String, Object> commonParams) {
|
|
|
+ //分情况处理
|
|
|
+ boolean isGr = onBrdBillDyn.getBoolean("nckd_isgrrz");
|
|
|
+ List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
|
|
|
+ if(isGr) {
|
|
|
+ dealRecordByGr(onBrdBillDyn, list, commonParams);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dealRecordByNotGr(onBrdBillDyn, list, commonParams);
|
|
|
+ }
|
|
|
+ //调用标准服务保存定调薪方法返回信息
|
|
|
+ Map<String, Object> returnMap = helper.saveDecAdjRecord(list);
|
|
|
+ return returnMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 工人入职:
|
|
|
+ * 定调薪项目:基本工资 004,技能工资 005,绩效工资 006,年度薪酬标准 001
|
|
|
+ * 入职单上字段:基本工资 nckd_jbgzyx,技能工资 nckd_jngzyx,绩效工资 nckd_jxgzyx
|
|
|
+ * @param onBrdBillDyn
|
|
|
+ * @param dynList
|
|
|
+ */
|
|
|
+ public static void dealRecordByGr(DynamicObject onBrdBillDyn, List<Map<String,Object>> dynList, Map<String, Object> commonParams) {
|
|
|
+ Long personId = getPersonId(commonParams);
|
|
|
+ for(int i = 0; i < 3; i++) {
|
|
|
+ //档案基本信息Id - 取定调薪档案boid
|
|
|
+ DynamicObject salaryAdjFile = getSalaryAdjFile(personId);
|
|
|
+ //薪酬结构ID
|
|
|
+ Long salaystructureId = salaryAdjFile.getLong("salaystructure.id");
|
|
|
+ Map map = dealCommonFields(onBrdBillDyn, personId, commonParams, salaystructureId);
|
|
|
+ map.put("salaryadjfile", salaryAdjFile.getLong("boid"));
|
|
|
+ //薪酬体系ID
|
|
|
+ Long stdscmId = salaryAdjFile.getLong("stdscm.id");
|
|
|
+ //定调薪项目
|
|
|
+ DynamicObject standardItem = getStandardItem(grItemNumber[i]);
|
|
|
+ map.put("standarditem", standardItem.getPkValue());
|
|
|
+ //定调薪项目ID
|
|
|
+ Long standardItemId = standardItem.getLong("id");
|
|
|
+ //频度
|
|
|
+ Long frequencyId = getFrequency(salaystructureId, stdscmId, standardItemId);
|
|
|
+ map.put("frequency", frequencyId);
|
|
|
+ //匹配薪等薪档
|
|
|
+ matchStdTable(map, personId, stdscmId, salaystructureId, standardItemId);
|
|
|
+ //金额 发薪系数
|
|
|
+ map.put("amount", onBrdBillDyn.getBigDecimal(grItemKey[i]));
|
|
|
+ map.put("nckd_fxxs", onBrdBillDyn.getBigDecimal("nckd_syqxs"));
|
|
|
+ dynList.add(map);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 非工人入职:
|
|
|
+ * 定调薪项目:年度薪酬标准 001
|
|
|
+ * 入职单上字段:实习期系数 nckd_sxqxs,实习期月薪 nckd_sxqyx,试用期系数 nckd_syqxs,转正后年薪 nckd_zzhnx
|
|
|
+ * 入职单上如果填写了实习期月薪 年度薪酬标准(定调薪项目) = 实习期月薪 * 12,发薪系数 = 实习期系数,
|
|
|
+ * 如果填写了转正后年薪 年度薪酬标准(定调薪项目) = 转正后年薪,发薪系数 = 试用期系数
|
|
|
+ * @param onBrdBillDyn
|
|
|
+ * @param dynList
|
|
|
+ */
|
|
|
+ public static void dealRecordByNotGr(DynamicObject onBrdBillDyn, List<Map<String,Object>> dynList, Map<String, Object> commonParams) {
|
|
|
+ Long personId = getPersonId(commonParams);
|
|
|
+ //档案基本信息Id - 取定调薪档案boid
|
|
|
+ DynamicObject salaryAdjFile = getSalaryAdjFile(personId);
|
|
|
+ //薪酬结构ID
|
|
|
+ Long salaystructureId = salaryAdjFile.getLong("salaystructure.id");
|
|
|
+
|
|
|
+ Map map = dealCommonFields(onBrdBillDyn, personId, commonParams, salaystructureId);
|
|
|
+ map.put("salaryadjfile", salaryAdjFile.getLong("boid"));
|
|
|
+ //薪酬体系ID
|
|
|
+ Long stdscmId = salaryAdjFile.getLong("stdscm.id");
|
|
|
+ //填写了实习期月薪的情况
|
|
|
+ if(onBrdBillDyn.getBigDecimal("nckd_sxqyx").compareTo(BigDecimal.ZERO) == 1) {
|
|
|
+ //定调薪项目
|
|
|
+ DynamicObject standardItem = getStandardItem("001");
|
|
|
+ map.put("standarditem", standardItem.getPkValue());
|
|
|
+ //定调薪项目ID
|
|
|
+ Long standardItemId = standardItem.getLong("id");
|
|
|
+ //频度
|
|
|
+ Long frequencyId = getFrequency(salaystructureId, stdscmId, standardItemId);
|
|
|
+ map.put("frequency", frequencyId);
|
|
|
+ //匹配薪等薪档
|
|
|
+ matchStdTable(map, personId, stdscmId, salaystructureId, standardItemId);
|
|
|
+ //金额 发薪系数
|
|
|
+ map.put("amount", onBrdBillDyn.getBigDecimal("nckd_sxqyx").multiply(new BigDecimal("12")));
|
|
|
+ map.put("nckd_fxxs", onBrdBillDyn.getBigDecimal("nckd_sxqxs"));
|
|
|
+ }
|
|
|
+ //未填写实习期月薪的情况
|
|
|
+ else {
|
|
|
+ //定调薪项目
|
|
|
+ DynamicObject standardItem = getStandardItem("001");
|
|
|
+ map.put("standarditem", standardItem.getPkValue());
|
|
|
+ //定调薪项目ID
|
|
|
+ Long standardItemId = standardItem.getLong("id");
|
|
|
+ //频度
|
|
|
+ Long frequencyId = getFrequency(salaystructureId, stdscmId, standardItemId);
|
|
|
+ //匹配薪等薪档
|
|
|
+ matchStdTable(map, personId, stdscmId, salaystructureId, standardItemId);
|
|
|
+ map.put("frequency", frequencyId);
|
|
|
+ //金额 发薪系数
|
|
|
+ map.put("amount", onBrdBillDyn.getBigDecimal("nckd_zzhnx"));
|
|
|
+ map.put("nckd_fxxs", onBrdBillDyn.getBigDecimal("nckd_syqxs"));
|
|
|
+ }
|
|
|
+ dynList.add(map);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理定调薪信息公用字段
|
|
|
+ * @param onBrdBillDyn
|
|
|
+ * @param personId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Map dealCommonFields (DynamicObject onBrdBillDyn, Long personId, Map<String, Object> commonParams, Long salaystructureId) {
|
|
|
+ Map info = new HashMap();
|
|
|
+ //数据模式 1-变更 2-禁用
|
|
|
+ info.put("datamode", "1");
|
|
|
+ //UUID码
|
|
|
+ String uuid = UUID.randomUUID().toString().replace("-", "");
|
|
|
+ info.put("uuid", uuid);
|
|
|
+ //唯一识别码
|
|
|
+ info.put("uniquecode", uuid);
|
|
|
+ //频度 根据定调薪档案-薪酬结构 + 定调薪项目 取 薪酬体系中的频度
|
|
|
+ //调薪方式
|
|
|
+ info.put("calctype", "2");
|
|
|
+ //info.put("frequency", 0L);
|
|
|
+ //币别 默认人民币
|
|
|
+ info.put("currency", 1L);
|
|
|
+ //定调薪类型 默认入职定薪
|
|
|
+ info.put("salaryadjrsn", 1030L);
|
|
|
+ //生效日期 取入职办理-入职日期
|
|
|
+ info.put("bsed", onBrdBillDyn.getDate("effectdate"));
|
|
|
+ //定调薪数据来源 TODO 标品是下拉 看是否增加一个选项
|
|
|
+ info.put("datasource", "4");
|
|
|
+ //业务数据来源ID-入职单ID
|
|
|
+ info.put("businessid", onBrdBillDyn.getPkValue().toString());
|
|
|
+ //处理人员相关信息
|
|
|
+ dealRelPersonFields(onBrdBillDyn, personId, info, commonParams, salaystructureId);
|
|
|
+ return info;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理人员相关信息
|
|
|
+ * @param onBrdBillDyn
|
|
|
+ * @param personId
|
|
|
+ * @param map
|
|
|
+ */
|
|
|
+ private static void dealRelPersonFields(DynamicObject onBrdBillDyn, Long personId, Map map, Map<String, Object> commonParams, Long salaystructureId) {
|
|
|
+ Map relperson_data = new HashMap();
|
|
|
+ relperson_data.put("personname", onBrdBillDyn.getString("name"));
|
|
|
+ relperson_data.put("empnumber", onBrdBillDyn.getString("employeeno"));
|
|
|
+ Long orgId = Long.valueOf(((Map) commonParams.get("executeInfoMap")).get("orgId").toString());
|
|
|
+ Long depEmpId = Long.valueOf(((Map) commonParams.get("executeInfoMap")).get("depEmpId").toString());
|
|
|
+ relperson_data.put("org", orgId);
|
|
|
+ relperson_data.put("depemp", depEmpId);
|
|
|
+ //定调薪管理属地 默认中国 1000001L
|
|
|
+ relperson_data.put("country", 1000001L);
|
|
|
+ //职级
|
|
|
+ DynamicObject jobLevel = getjobLevel(personId);
|
|
|
+ relperson_data.put("joblevel",jobLevel.getLong("joblevel.id"));
|
|
|
+ //薪酬结构
|
|
|
+ relperson_data.put("salaystructure", salaystructureId);
|
|
|
+ map.put("relperson_data", relperson_data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新N薪系数
|
|
|
+ * @param onBrdBillDyn
|
|
|
+ * @param commonParams
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Map<String, Object> updateNXXS (DynamicObject onBrdBillDyn, Map<String, Object> commonParams) {
|
|
|
+ List<Map<String,Object>> dynList = new ArrayList<Map<String,Object>>();
|
|
|
+ //分情况处理
|
|
|
+ boolean isGr = onBrdBillDyn.getBoolean("nckd_isgrrz");
|
|
|
+ List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
|
|
|
+ if(isGr) {
|
|
|
+ dealRecordByGr(onBrdBillDyn, list, commonParams);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dealRecordByNotGr(onBrdBillDyn, list, commonParams);
|
|
|
+ }
|
|
|
+ //调用标准服务保存定调薪方法返回信息
|
|
|
+ Map<String, Object> returnMap = helper.saveDecAdjRecord(list);
|
|
|
+ return returnMap;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据PersonId获取定调薪档案
|
|
|
+ * @param personId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static DynamicObject getSalaryAdjFile (Long personId) {
|
|
|
+ QFilter filter = QFilterUtil.getCurrentQf();
|
|
|
+ filter.and("person.id", QCP.equals, personId);
|
|
|
+ DynamicObject[] cols = BusinessDataServiceHelper.load(adjFileInfo_entity, "id,boid,stdscm.id,salaystructure.id,nckd_ncoefficient", new QFilter[]{filter});
|
|
|
+ if(cols.length == 0) {
|
|
|
+ log.info("根据personId查询定调薪档案失败: {}", personId);
|
|
|
+ throw new KDBizException("未找到对应的定调薪档案,终止执行");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return cols[0];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取定调薪项目 001-年度薪酬标准 002-岗位工资 004-基本工资 005-技能工资 006-绩效工资
|
|
|
+ * @param number
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static DynamicObject getStandardItem (String number) {
|
|
|
+ QFilter filter = new QFilter("number", QCP.equals, number);
|
|
|
+ DynamicObject[] cols = BusinessDataServiceHelper.load(standardItem_entity, "id,number,name", new QFilter[]{filter});
|
|
|
+ if(cols.length == 0) {
|
|
|
+ log.info("根据number查询定调薪项目失败: {}", number);
|
|
|
+ throw new KDBizException("未找到对应的定调薪项目,终止执行");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return cols[0];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据薪酬体系+薪酬结构+定条调薪项目取薪酬体系分录中的频度,薪酬标准.频度
|
|
|
+ * @param salaystructureId
|
|
|
+ * @param stdscmId
|
|
|
+ * @param standardItemId
|
|
|
+ */
|
|
|
+ public static Long getFrequency(Long salaystructureId, Long stdscmId, Long standardItemId) {
|
|
|
+ QFilter currentQf = QFilterUtil.getCurrentQf();
|
|
|
+ QFilter dataStatusFilter = QFilterUtil.getDataStatusFilter();
|
|
|
+ QFilter filter = new QFilter("entryentity.salstructurent.id", "=", salaystructureId);
|
|
|
+ filter.and("entryentity.standarditem.id", "=", standardItemId);
|
|
|
+ filter.and("id", "=", stdscmId);
|
|
|
+ DynamicObject stdScm = QueryServiceHelper.queryOne(stdScm_entity, "entryentity.salarystandard.frequency.id", new QFilter[]{currentQf, dataStatusFilter, filter});
|
|
|
+ if(ObjectUtils.isEmpty(stdScm)) {
|
|
|
+ log.info("查询频度失败");
|
|
|
+ throw new KDBizException("未找到对应的频度,终止执行");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return stdScm.getLong("entryentity.salarystandard.frequency.id");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取入职办理单Dyn
|
|
|
+ * @param onBrdBillId 入职ID
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static DynamicObject getOnBrdBillDyn (Long onBrdBillId) {
|
|
|
+ return BusinessDataServiceHelper.loadSingle(onBrdBillId, onBrd_entity);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取人员Id
|
|
|
+ * @param commonParams
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Long getPersonId (Map<String, Object> commonParams) {
|
|
|
+ return Long.valueOf(((Map) commonParams.get("executeInfoMap")).get("personId").toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据人员获取职级职等
|
|
|
+ * @param personId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static DynamicObject getjobLevel(Long personId) {
|
|
|
+ QFilter filter = QFilterUtil.getCurrentQf();
|
|
|
+ filter.and(QFilterUtil.getDataStatusFilter());
|
|
|
+ filter.and("person.id", QCP.equals, Long.valueOf(personId));
|
|
|
+ DynamicObject bill = QueryServiceHelper.queryOne("hrpi_empjobrel", "joblevel.id,joblevel.number", new QFilter[]{filter});
|
|
|
+ if(ObjectUtils.isEmpty(bill)) {
|
|
|
+ log.info("查询职级失败");
|
|
|
+ throw new KDBizException("未找到对应的职级,终止执行");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return bill;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 匹配薪等薪档
|
|
|
+ * @param map
|
|
|
+ * @param personId
|
|
|
+ * @param stdscmId
|
|
|
+ * @param salaystructureId
|
|
|
+ * @param standardItemId
|
|
|
+ */
|
|
|
+ private static void matchStdTable(Map map, Long personId, Long stdscmId, Long salaystructureId, Long standardItemId) {
|
|
|
+ List paramList = new ArrayList<>();
|
|
|
+ StdMatchParamWithDepEmp param = new StdMatchParamWithDepEmp();
|
|
|
+ param.setStdScmId(stdscmId);
|
|
|
+ param.setSalayStructureId(salaystructureId);
|
|
|
+ param.setStandardItemId(standardItemId);
|
|
|
+ param.setUnionId(UUID.randomUUID().toString().replace("-", ""));
|
|
|
+
|
|
|
+ DynamicObject jobLevel = getjobLevel(personId);
|
|
|
+
|
|
|
+ List<Long> list = new ArrayList<Long>();
|
|
|
+ list.add(jobLevel.getLong("jobLevel.id"));
|
|
|
+ Map personPropValue = new HashMap();
|
|
|
+ personPropValue.put(1050L,list);
|
|
|
+ param.setPersonPropValue(personPropValue);
|
|
|
+ paramList.add(param);
|
|
|
+ //标品匹配方法
|
|
|
+ List<SalaryStdMatchResultNew> resultList = SalaryStdQueryService.get().batchMatchStdTableWithDepEmp(paramList);
|
|
|
+ if(resultList.size() > 0) {
|
|
|
+ SalaryStdMatchResultNew matchResult = resultList.get(0);
|
|
|
+ if("0".equals(matchResult.getIsMatchGradeRank())) {
|
|
|
+ log.info("薪酬体系是否显示薪等薪档为否");
|
|
|
+ throw new KDBizException("薪酬体系是否显示薪等薪档未打开,终止执行");
|
|
|
+ }
|
|
|
+ if(matchResult.getGradeId() == null) {
|
|
|
+ log.info("薪等为空");
|
|
|
+ throw new KDBizException("未匹配到薪等,终止执行");
|
|
|
+ }
|
|
|
+ if(matchResult.getRankId() == null) {
|
|
|
+ log.info("薪档为空");
|
|
|
+ throw new KDBizException("未匹配到薪档,终止执行");
|
|
|
+ }
|
|
|
+ map.put("grade", matchResult.getGradeId());
|
|
|
+ map.put("rank", matchResult.getRankId());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ log.info("匹配薪等薪档失败");
|
|
|
+ throw new KDBizException("未匹配到对应的薪等薪档,终止执行");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|