|
|
@@ -1,8 +1,7 @@
|
|
|
package nckd.jxccl.swc.init.plugin.operate;
|
|
|
|
|
|
-import kd.bos.context.RequestContext;
|
|
|
import kd.bos.dataentity.entity.DynamicObject;
|
|
|
-
|
|
|
+import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
|
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
|
|
|
import kd.bos.entity.plugin.AddValidatorsEventArgs;
|
|
|
import kd.bos.entity.plugin.PreparePropertysEventArgs;
|
|
|
@@ -12,15 +11,24 @@ import kd.bos.logging.LogFactory;
|
|
|
import kd.bos.orm.query.QCP;
|
|
|
import kd.bos.orm.query.QFilter;
|
|
|
import kd.bos.servicehelper.QueryServiceHelper;
|
|
|
+import kd.bos.servicehelper.operation.SaveServiceHelper;
|
|
|
import kd.sdk.plugin.Plugin;
|
|
|
+import kd.sdk.swc.hcdm.business.helper.HCDMAdjFileServiceHelper;
|
|
|
import kd.sdk.swc.hcdm.business.helper.HCDMApplyBillServiceHelper;
|
|
|
+import kd.sdk.swc.hcdm.business.helper.HCDMSalaryStdServiceHelper;
|
|
|
+import kd.sdk.swc.hcdm.common.dto.stdtab.match.StdTableGradeRankRangeMatchParam;
|
|
|
+import kd.sdk.swc.hcdm.common.dto.stdtab.match.StdTableGradeRankRangeMatchResult;
|
|
|
+import nckd.jxccl.base.common.utils.ConvertUtil;
|
|
|
+import nckd.jxccl.base.common.utils.DateUtil;
|
|
|
+import nckd.jxccl.base.swc.helper.SWCHelper;
|
|
|
|
|
|
-import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* hcdm_applybill 生成定调薪申请单,单据操作插件
|
|
|
+ * hom_personhasonbrd 入职单
|
|
|
+ * hdm_transferapply 调动申请
|
|
|
* author: turborao
|
|
|
* date: 2025/11/24 9:05
|
|
|
*/
|
|
|
@@ -33,6 +41,42 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
private static final String EmployeesField = "nckd_employeefield.id";
|
|
|
private static final String EmployeesNameField = "nckd_employeefield.name";
|
|
|
private static final String BillTypeField = "nckd_billtype";
|
|
|
+ private static final String OrgField = "nckd_hrorg.id";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 定调薪申请单 定调薪明细字段显示方案 员工调薪
|
|
|
+ */
|
|
|
+ private static final Long changeSalaryBillTypeId = 2215975998602655744L;
|
|
|
+ /**
|
|
|
+ * 定调薪申请单 定调薪明细字段显示方案 员工定薪
|
|
|
+ */
|
|
|
+ private static final Long setSalaryBillEntryTypeId = 2215982957338868736L;
|
|
|
+ /**
|
|
|
+ * 定调薪项目 岗位工资标准
|
|
|
+ */
|
|
|
+ private static final Long salaryStdItemId = 2321899710350111744L;
|
|
|
+ /**
|
|
|
+ * 频度 月
|
|
|
+ */
|
|
|
+ private static final Long frequencyItemId = 1095454108284088320L;
|
|
|
+ /**
|
|
|
+ * 汇率表
|
|
|
+ */
|
|
|
+ private static final Long exchangeTableId = 2321965096026258432L;
|
|
|
+ /**
|
|
|
+ * 国家
|
|
|
+ */
|
|
|
+ private static final Long countryItemId = 1000001L;
|
|
|
+ /**
|
|
|
+ * 定调薪方案
|
|
|
+ */
|
|
|
+ private static final Long salaryAdjScmItemId = 2322515162646457344L;
|
|
|
+ /**
|
|
|
+ * 默认币种
|
|
|
+ */
|
|
|
+ private static final Long currencyItemId = 1L;
|
|
|
+
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* this.getDataEntities()中需要加载的字段,增加员工待定调薪清单中员工ID
|
|
|
@@ -46,7 +90,9 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
e.getFieldKeys().add("nckd_newposition.id");
|
|
|
e.getFieldKeys().add("nckd_newsalaryrank.id");
|
|
|
e.getFieldKeys().add("nckd_newhradminorg.id");
|
|
|
- e.getFieldKeys().add("nckd_hrorg.id");
|
|
|
+ e.getFieldKeys().add(OrgField);
|
|
|
+ e.getFieldKeys().add("nckd_applybillid");
|
|
|
+ e.getFieldKeys().add("billstatus");
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -71,20 +117,20 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
* 必填字段
|
|
|
* "billname", "billtype", "org", "billcountry", "salaryadjrsn", "salaryadjscm", "billcurrency", "effectivedate", "exchangeratedate", "exctable"
|
|
|
*/
|
|
|
- applyBill.put("billname","员工待定调薪清单-生成");
|
|
|
+ applyBill.put("billname",generateBillName(datas));
|
|
|
|
|
|
- Long orgId = RequestContext.get().getOrgId();
|
|
|
+ DynamicObjectCollection salaryTypeDyns = SWCHelper.getSalaryTypeDyns();
|
|
|
|
|
|
String uniquecode = UUID.randomUUID().toString().replace("-", "");
|
|
|
applyBill.put("_uniquecode", uniquecode);
|
|
|
- applyBill.put("org",orgId);
|
|
|
- applyBill.put("billtype", 2215975998602655744L); //定调薪明细字段显示方案 调薪明细字段
|
|
|
- applyBill.put("billcountry", 1000001L); //国家
|
|
|
- applyBill.put("salaryadjrsn", 2352340656979984384L); //定调薪类型
|
|
|
- applyBill.put("billcurrency", 1L); //默认币种
|
|
|
- applyBill.put("salaryadjscm", 2322515162646457344L); //定调薪方案
|
|
|
+ //applyBill.put("org",orgId);
|
|
|
+ //applyBill.put("billtype", 2215975998602655744L); //定调薪明细字段显示方案 调薪明细字段
|
|
|
+ applyBill.put("billcountry", countryItemId); //国家
|
|
|
+ //applyBill.put("salaryadjrsn", 2352340656979984384L); //定调薪类型
|
|
|
+ applyBill.put("billcurrency", currencyItemId); //默认币种
|
|
|
+ applyBill.put("salaryadjscm", salaryAdjScmItemId); //定调薪方案
|
|
|
applyBill.put("exchangeratedate", new Date()); //汇率日期
|
|
|
- applyBill.put("exctable", 2321965096026258432L); //汇率表
|
|
|
+ applyBill.put("exctable", exchangeTableId); //汇率表
|
|
|
applyBill.put("effectivedate", new Date()); //默认生效日期
|
|
|
applyBill.put("isdraft", "1"); //草稿状态
|
|
|
applyBill.put("auditstatus", "A"); //审核状态
|
|
|
@@ -94,20 +140,43 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
|
|
|
/**
|
|
|
* 必填字段
|
|
|
- * "adjfile", "standarditem", "frequency", "amount"
|
|
|
+ * "adjfile", "standarditem", "frequency"
|
|
|
*/
|
|
|
for (DynamicObject data : datas) {
|
|
|
Map<String,Object> applyBillEntry = new HashMap<>();
|
|
|
Long employeeId = data.getLong(EmployeesField);
|
|
|
+ // 组织
|
|
|
+ applyBill.put("org",data.getLong(OrgField));
|
|
|
+ String billType = data.getString(BillTypeField);
|
|
|
+ //定调薪明细字段显示方案 调薪明细字段
|
|
|
+ if(billType.equals("调动单")){
|
|
|
+ //定调薪明细字段显示方案
|
|
|
+ applyBill.put("billtype", changeSalaryBillTypeId);
|
|
|
+ //定调薪类型
|
|
|
+ applyBill.put("salaryadjrsn", salaryTypeDyns.get(1).getLong("id"));
|
|
|
+ }else if(billType.equals("入职单")){
|
|
|
+ applyBill.put("billtype", setSalaryBillEntryTypeId);
|
|
|
+ applyBill.put("salaryadjrsn", salaryTypeDyns.get(0).getLong("id"));
|
|
|
+ }
|
|
|
Long positionId = data.getLong("nckd_newposition.id");
|
|
|
- DynamicObject salaryfile = getSalaryFileInfo(employeeId,positionId);
|
|
|
- applyBillEntry.put("adjfile", salaryfile.getLong("boid"));
|
|
|
+ DynamicObject salaryfile = getSalaryFileInfo(employeeId,positionId,salaryStdItemId);
|
|
|
+ applyBillEntry.put("adjfile", salaryfile.getLong("id"));
|
|
|
applyBillEntry.put("employee", employeeId);
|
|
|
- applyBillEntry.put("standarditem", 2321899710350111744L); //定调薪项目 岗位工资标准
|
|
|
- applyBillEntry.put("frequency", 1095454108284088320L); //频度 月
|
|
|
+ applyBillEntry.put("standarditem", salaryStdItemId); //定调薪项目 岗位工资标准
|
|
|
+ applyBillEntry.put("frequency", frequencyItemId); //频度 月
|
|
|
//applyBillEntry.put("amount", BigDecimal.ZERO);
|
|
|
- applyBillEntry.put("nckd_postgrade", salaryfile.getLong("position.nckd_postgrade.id")); //岗级
|
|
|
- applyBillEntry.put("position", positionId);
|
|
|
+ Long postgradeId = salaryfile.getLong("position.nckd_postgrade.id");
|
|
|
+ applyBillEntry.put("nckd_postgrade", postgradeId); //岗级
|
|
|
+ applyBillEntry.put("position", positionId); //岗位
|
|
|
+ /**
|
|
|
+ * 获取标准表
|
|
|
+ */
|
|
|
+ Long salaryStandardId = getSalarystandard(salaryfile.getLong("stdscm.id"),salaryStdItemId);
|
|
|
+ /**
|
|
|
+ * 获取薪等
|
|
|
+ */
|
|
|
+ Long salaryGradeId = getSalaryGradeID(postgradeId,salaryStandardId);
|
|
|
+ applyBillEntry.put("salarygrade", salaryGradeId);
|
|
|
applyBillEntry.put("salaryrank", data.getLong("nckd_newsalaryrank.id"));
|
|
|
applyBillEntryData.add(applyBillEntry);
|
|
|
}
|
|
|
@@ -118,6 +187,7 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
Map<String, String> params = new HashMap<>();
|
|
|
Map<String, Object> result = HCDMApplyBillServiceHelper.saveDraftApplyBill(papams);
|
|
|
System.out.println("BuildApplyBillOpPlugin:"+result.toString());
|
|
|
+ logger.info("BuildApplyBillOpPlugin:"+result.toString());
|
|
|
// 判断整体操作是否成功
|
|
|
Boolean overallSuccess = (Boolean) result.get("success");
|
|
|
String errorCode = (String) result.get("errorCode");
|
|
|
@@ -133,6 +203,13 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
Long idValue = ((Number) dataMap.get("id")).longValue();
|
|
|
System.out.println("提取的ID值为: " + idValue); // 输出 2360318043084569600
|
|
|
logger.info("员工待定调薪清单 操作成功," + idValue);
|
|
|
+
|
|
|
+ for(DynamicObject data : datas) {
|
|
|
+ data.set("nckd_applybillid", idValue);
|
|
|
+ data.set("billstatus", "D"); //处理中
|
|
|
+ }
|
|
|
+ Object[] update = SaveServiceHelper.save(datas);
|
|
|
+
|
|
|
params.put("applyID",idValue.toString());
|
|
|
//区别:绿色提示语显示时间较短。红色一直存在。
|
|
|
this.operationResult.setSuccess(true);
|
|
|
@@ -150,20 +227,69 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
this.operationResult.setShowMessage(true);
|
|
|
System.out.println("操作失败或返回错误码不为success");
|
|
|
}
|
|
|
+ //OperationResult updatepersonOp = OperationServiceHelper.executeOperate("updatepersoninfo_and_match", "", new DynamicObject[]{change}, OperateOption.create());
|
|
|
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取薪等,通过 岗级和标准表ID
|
|
|
+ * @param postgradeId
|
|
|
+ * @param salarystandardId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Long getSalaryGradeID(Long postgradeId,Long salarystandardId){
|
|
|
|
|
|
- //OperationResult updatepersonOp = OperationServiceHelper.executeOperate("updatepersoninfo_and_match", "", new DynamicObject[]{change}, OperateOption.create());
|
|
|
+ List<StdTableGradeRankRangeMatchParam> matchParams = new ArrayList<>();
|
|
|
+ StdTableGradeRankRangeMatchParam stdTableGradeRankMatchParam = new StdTableGradeRankRangeMatchParam();
|
|
|
+ /*
|
|
|
+ * 标准表 hcdm_salarystandard
|
|
|
+ */
|
|
|
+ //DynamicObject salarystandardTable = getLastDecAdjRecords(employeeId,salaryStdItemId);
|
|
|
+ stdTableGradeRankMatchParam.setStdTableId(salarystandardId);
|
|
|
+ /*
|
|
|
+ * 定调薪项目 hsbs_standarditem
|
|
|
+ */
|
|
|
+ stdTableGradeRankMatchParam.setStdItemId(salaryStdItemId);
|
|
|
+ /**
|
|
|
+ * 匹配类型 为0 时
|
|
|
+ * 定调薪人员属性 key 为 定调薪人员属性配置(hcdm_contrastpropconf)的ID
|
|
|
+ * Object为 定调薪人员属性配置(hcdm_contrastpropconf)的属性值 岗级的值
|
|
|
+ */
|
|
|
+ DynamicObject postgradeprop = SWCHelper.getSalaryPersonProperty("岗级");
|
|
|
+ Map<Long, List<Object>> personProp = new HashMap<>();
|
|
|
+ List<Object> postgradeList = new ArrayList<>();
|
|
|
+ postgradeList.add(postgradeId);
|
|
|
+ personProp.put(postgradeprop.getLong("id"), postgradeList);
|
|
|
+ stdTableGradeRankMatchParam.setPersonPropValue(personProp);
|
|
|
+ /**
|
|
|
+ * 匹配类型 0 对照属性匹配 1 标准数据匹配
|
|
|
+ */
|
|
|
+ stdTableGradeRankMatchParam.setMatchType("0");
|
|
|
+
|
|
|
+ matchParams.add(stdTableGradeRankMatchParam);
|
|
|
+ //获取标准表中的薪酬项目、薪等、薪档
|
|
|
+ List<StdTableGradeRankRangeMatchResult> stdTableGradeRankRangeMatchResults = HCDMSalaryStdServiceHelper.matchStdTableGradeRankRange(matchParams);
|
|
|
+ logger.info("获取标准表中的薪酬项目、薪等、薪档:{}",stdTableGradeRankRangeMatchResults.toString());
|
|
|
+ if (!stdTableGradeRankRangeMatchResults.isEmpty()) {
|
|
|
+ for(StdTableGradeRankRangeMatchResult result : stdTableGradeRankRangeMatchResults){
|
|
|
+ return result.getGradeId();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ return 0L;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 获取员工定调薪档案 hcdm_adjfileinfo
|
|
|
* 员工定调薪档案 会有多条,需要按岗位获取
|
|
|
+ * stdscm.entryentity.salarystandard.id 标准表 ID
|
|
|
* @param employeeID 员工ID
|
|
|
* @param positionID 岗位ID
|
|
|
+ * @param salaryStdItemId 定调薪项目ID
|
|
|
*/
|
|
|
- public DynamicObject getSalaryFileInfo(Long employeeID, Long positionID){
|
|
|
+ public DynamicObject getSalaryFileInfo(Long employeeID, Long positionID, Long salaryStdItemId){
|
|
|
|
|
|
QFilter qFilter = new QFilter("employee.id", QCP.equals, employeeID);
|
|
|
QFilter qFilter1 = new QFilter("iscurrentversion", QCP.equals, "1"); // 启用
|
|
|
@@ -175,6 +301,99 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
|
|
|
return employeesFiles;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取员工最新的定调薪记录,如果没有,为了拿到标准表数据
|
|
|
+ * @param adjFileId
|
|
|
+ * @param standardItemId
|
|
|
+ */
|
|
|
+ public DynamicObject getLastDecAdjRecords(Long adjFileId,Long standardItemId ){
|
|
|
+
|
|
|
+ //构建定调薪记录查询条件
|
|
|
+ Map<String, Object> adjRecordParams = new HashMap<>();
|
|
|
+ List<Map<String, Object>> dataList = new ArrayList<>();
|
|
|
+
|
|
|
+ Map<String, Object> dataItem = new HashMap<>();
|
|
|
+ // 调薪档案ID
|
|
|
+ dataItem.put("adjfile", adjFileId);
|
|
|
+ // 调薪项目ID
|
|
|
+ dataItem.put("standarditem", standardItemId);
|
|
|
+ // 查询基准日期
|
|
|
+ dataItem.put("startdate", new Date());
|
|
|
+ // 唯一标识
|
|
|
+ String uniquecode = UUID.randomUUID().toString().replace("-", "");
|
|
|
+ dataItem.put("_uniquecode", uniquecode);
|
|
|
+ dataList.add(dataItem);
|
|
|
+
|
|
|
+ adjRecordParams.put("data", dataList);
|
|
|
+ adjRecordParams.put("selprops", "salarystdv.rankentry.rank.id,salarystdv.rankentry.rank.name,salarystdv.rankentry.rank.number,salarystdv.rankentry.rank.index,salarystdv.rankentry.frankindex,company.id,company.name,");
|
|
|
+ //查询定调薪记录
|
|
|
+ Map<String, Object> lastDecAdjRecordMap = HCDMAdjFileServiceHelper.getLastDecAdjRecords(adjRecordParams);
|
|
|
+ logger.info("员工最新的定调薪记录 查询结果:{}", lastDecAdjRecordMap.toString());
|
|
|
+ if (ConvertUtil.toBoolean(lastDecAdjRecordMap.get("success"))) {
|
|
|
+ List<Map> datas = ConvertUtil.toList(lastDecAdjRecordMap.get("data"), ArrayList::new);
|
|
|
+ for (Map data : datas) {
|
|
|
+ if (ConvertUtil.toBoolean(data.get("success"))) {
|
|
|
+ List<DynamicObject> adjRecordList = ConvertUtil.toList(data.get("data"), ArrayList::new);
|
|
|
+ for (DynamicObject dynamicObject : adjRecordList) {
|
|
|
+ // 人员
|
|
|
+ //DynamicObject employee = dynamicObject.getDynamicObject("adjfile").getDynamicObject("employee");
|
|
|
+
|
|
|
+ //薪酬标准表版本
|
|
|
+ DynamicObject salaryStDv = dynamicObject.getDynamicObject("salarystdv");
|
|
|
+ //薪等(01岗、02岗)
|
|
|
+ //DynamicObject salaryGrade = dynamicObject.getDynamicObject("salarygrade");
|
|
|
+ //薪档(1档、2档)
|
|
|
+ //DynamicObject salaryRank = dynamicObject.getDynamicObject("salaryrank");
|
|
|
+ //金额
|
|
|
+ //BigDecimal amount = dynamicObject.getBigDecimal("amount");
|
|
|
+ //定调薪档案对象
|
|
|
+ //DynamicObject adjFileInfo = dynamicObject.getDynamicObject("adjfile");
|
|
|
+ return salaryStDv;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ logger.error("查询员工最新的定调薪记录失败");
|
|
|
+ this.operationResult.setSuccess(false);
|
|
|
+ this.operationResult.setMessage("查询员工最新的定调薪记录失败");
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取标准表,通过薪酬体系,定调薪项目
|
|
|
+ * @param stdscmId 薪酬体系
|
|
|
+ * @param salaryStdItemId 定调薪项目
|
|
|
+ */
|
|
|
+ public Long getSalarystandard( Long stdscmId, Long salaryStdItemId) {
|
|
|
+ String entryentity = "hcdm_stdscm";
|
|
|
+ String selectField = "id,entryentity.salarystandard.id";
|
|
|
+ QFilter qFilter1 = new QFilter("id", QCP.equals, stdscmId);
|
|
|
+ QFilter qFilter2 = new QFilter("entryentity.standarditem.id", QCP.equals, salaryStdItemId);
|
|
|
+ DynamicObject salarystandardDyn = QueryServiceHelper.queryOne(entryentity, selectField, new QFilter[]{qFilter1,qFilter2});
|
|
|
+ return salarystandardDyn.getLong("entryentity.salarystandard.id");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成单据名称
|
|
|
+ * @param datas DynamicObject[]
|
|
|
+ */
|
|
|
+ public String generateBillName(DynamicObject[] datas) {
|
|
|
+ StringBuilder billname = new StringBuilder();
|
|
|
+ int index = 0;
|
|
|
+ for(DynamicObject data : datas){
|
|
|
+ billname.append(data.getString(EmployeesNameField)).append(",");
|
|
|
+ index++;
|
|
|
+ if(index == 2) break;
|
|
|
+ }
|
|
|
+ String billnameStr = billname.substring(0, billname.length()-1);
|
|
|
+
|
|
|
+ String billnameMonth = DateUtil.format(DateUtil.now(), "yyyyMM");
|
|
|
+ String re = "【"+billnameStr+"】"+billnameMonth+"-员工待定调薪清单-生成";
|
|
|
+ return re;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取员工待定调薪清单中员工ID
|
|
|
* @param datas DynamicObject[]
|