|
@@ -1,33 +1,24 @@
|
|
package nckd.jimin.jyyy.fi.task;
|
|
package nckd.jimin.jyyy.fi.task;
|
|
|
|
|
|
-import com.google.common.collect.Lists;
|
|
|
|
import kd.bos.context.RequestContext;
|
|
import kd.bos.context.RequestContext;
|
|
import kd.bos.dataentity.entity.DynamicObject;
|
|
import kd.bos.dataentity.entity.DynamicObject;
|
|
-import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
|
|
-import kd.bos.entity.operate.result.OperationResult;
|
|
|
|
-import kd.bos.exception.KDBizException;
|
|
|
|
|
|
+import kd.bos.entity.EntityMetadataCache;
|
|
import kd.bos.exception.KDException;
|
|
import kd.bos.exception.KDException;
|
|
import kd.bos.logging.Log;
|
|
import kd.bos.logging.Log;
|
|
import kd.bos.logging.LogFactory;
|
|
import kd.bos.logging.LogFactory;
|
|
-import kd.bos.login.utils.DateUtils;
|
|
|
|
-import kd.bos.orm.ORM;
|
|
|
|
import kd.bos.orm.query.QCP;
|
|
import kd.bos.orm.query.QCP;
|
|
import kd.bos.orm.query.QFilter;
|
|
import kd.bos.orm.query.QFilter;
|
|
import kd.bos.schedule.api.StopTask;
|
|
import kd.bos.schedule.api.StopTask;
|
|
import kd.bos.schedule.executor.AbstractTask;
|
|
import kd.bos.schedule.executor.AbstractTask;
|
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
import kd.bos.servicehelper.QueryServiceHelper;
|
|
import kd.bos.servicehelper.QueryServiceHelper;
|
|
-import kd.bos.servicehelper.operation.SaveServiceHelper;
|
|
|
|
-import kd.bos.util.CollectionUtils;
|
|
|
|
-import kd.bos.util.StringUtils;
|
|
|
|
-import nckd.jimin.jyyy.fi.common.SyncStatusEnum;
|
|
|
|
-import nckd.jimin.jyyy.fi.common.constant.BillTypeConstants;
|
|
|
|
-import nckd.jimin.jyyy.fi.common.constant.PersonReimSyncTaskConstant;
|
|
|
|
-import nckd.jimin.jyyy.fi.common.util.CommonUtils;
|
|
|
|
|
|
+import nckd.jimin.jyyy.fi.common.ReimAmountSourceTypeEnum;
|
|
|
|
+import nckd.jimin.jyyy.fi.common.constant.JobPositionBakBillConstant;
|
|
|
|
+import nckd.jimin.jyyy.fi.common.constant.LimitRelasetConstant;
|
|
|
|
+import nckd.jimin.jyyy.fi.plugin.operate.Helper.PersonReimQuotaHelper;
|
|
|
|
+import nckd.jimin.jyyy.fi.plugin.operate.Helper.PersonReimQuotaVO;
|
|
|
|
|
|
-import java.time.LocalDate;
|
|
|
|
-import java.time.YearMonth;
|
|
|
|
-import java.time.ZoneId;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -36,252 +27,163 @@ import java.util.stream.Collectors;
|
|
*/
|
|
*/
|
|
public class PersonReimQuotaSyncTask extends AbstractTask implements StopTask {
|
|
public class PersonReimQuotaSyncTask extends AbstractTask implements StopTask {
|
|
|
|
|
|
|
|
+ private PersonReimQuotaHelper personReimQuotaHelper = new PersonReimQuotaHelper();
|
|
|
|
+
|
|
private static final Log logger = LogFactory.getLog(PersonReimQuotaSyncTask.class);
|
|
private static final Log logger = LogFactory.getLog(PersonReimQuotaSyncTask.class);
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
|
|
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
|
|
- logger.info("map data {}" , map);
|
|
|
|
- Date beginDate = getBeginDate(map);
|
|
|
|
- Date endDate = getEndDate(map);
|
|
|
|
- syncMonthPersonReim(beginDate,endDate);
|
|
|
|
- }
|
|
|
|
|
|
+ logger.info("-----------PersonReimQuotaSyncTask begin--------------" , map);
|
|
|
|
+ // 查询员工额度备份全部数据,
|
|
|
|
+ DynamicObject[] personPositionJobBakArray = getPersonPositionJobBakCol();
|
|
|
|
+ // 查询费用标准配置 按照费用项目分组
|
|
|
|
+ Map<Long, Map<Long, List<DynamicObject>>> limitRelasetExpenseItemMap = getLimitRelasetMap();
|
|
|
|
|
|
- /**
|
|
|
|
- * 1.参数中有值取参数
|
|
|
|
- * 2.参数没有值则默认取上个月第一天
|
|
|
|
- * @param map
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- protected Date getBeginDate(Map<String, Object> map){
|
|
|
|
- if(map.containsKey("beginDate") && StringUtils.isNotEmpty((String)map.get("beginDate"))){
|
|
|
|
- String beginDateStr = (String)map.get("beginDate");
|
|
|
|
- return DateUtils.parseDate(beginDateStr);
|
|
|
|
- }else{
|
|
|
|
- LocalDate today = LocalDate.now();
|
|
|
|
- // 获取上个月的YearMonth对象
|
|
|
|
- YearMonth lastMonth = YearMonth.from(today).minusMonths(1);
|
|
|
|
- // 获取上个月的第一天
|
|
|
|
- LocalDate firstDayOfLastMonth = lastMonth.atDay(1);
|
|
|
|
- // 转换为Date对象(默认时区)
|
|
|
|
- return Date.from(firstDayOfLastMonth.atStartOfDay()
|
|
|
|
- .atZone(ZoneId.systemDefault())
|
|
|
|
- .toInstant());
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- /**
|
|
|
|
- * 1.参数中有值取参数
|
|
|
|
- * 2.参数没有值则默认取上个月最后一天
|
|
|
|
- * @param map
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- protected Date getEndDate(Map<String, Object> map){
|
|
|
|
- if(map.containsKey("endDate") && StringUtils.isNotEmpty((String)map.get("endDate"))){
|
|
|
|
- String endDateStr = (String)map.get("endDate");
|
|
|
|
- return DateUtils.parseDate(endDateStr);
|
|
|
|
- }else{
|
|
|
|
- // 获取当前日期
|
|
|
|
- LocalDate today = LocalDate.now();
|
|
|
|
|
|
+ Arrays.stream(personPositionJobBakArray).forEach(jobBakInfo -> createPersonPotitionJobQuota(jobBakInfo,limitRelasetExpenseItemMap));
|
|
|
|
|
|
- // 获取上个月的最后一天
|
|
|
|
- LocalDate lastDayOfLastMonth = today.withDayOfMonth(1).minusDays(1);
|
|
|
|
|
|
+ logger.info("-----------PersonReimQuotaSyncTask end--------------" );
|
|
|
|
|
|
- // 转换为Date对象(默认时区)
|
|
|
|
- return Date.from(lastDayOfLastMonth.atStartOfDay()
|
|
|
|
- .atZone(ZoneId.systemDefault())
|
|
|
|
- .toInstant());
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 查询指定时间范围存在职位变更的人员信息,创建个人额度
|
|
|
|
- * @param beginDate 开始时间
|
|
|
|
- * @param endDate 结束时间
|
|
|
|
- */
|
|
|
|
- protected void syncMonthPersonReim(Date beginDate , Date endDate){
|
|
|
|
-
|
|
|
|
- // 从任职经历中查询岗位发生变化的数据
|
|
|
|
- Set<Object> positionPersonSet = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPPOSORGREL, "person.id", new QFilter[]{
|
|
|
|
- new QFilter("startdate", QCP.large_equals, beginDate),
|
|
|
|
- new QFilter("startdate", QCP.less_equals, endDate),
|
|
|
|
- new QFilter("businessstatus", QCP.equals, "1"),
|
|
|
|
- new QFilter("iscurrentversion", QCP.equals, "1"),
|
|
|
|
- new QFilter("isprimary", QCP.equals, "1")
|
|
|
|
- }).stream().map(r -> r.get("person.id")).collect(Collectors.toSet());
|
|
|
|
-
|
|
|
|
- // 从职级职等中共查询职级发生变化的数据
|
|
|
|
- Set<Object> jobPersonSet = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPJOBREL, "person.id", new QFilter[]{
|
|
|
|
- new QFilter("startdate", QCP.large_equals, beginDate),
|
|
|
|
- new QFilter("startdate", QCP.less_equals, endDate),
|
|
|
|
- new QFilter("businessstatus", QCP.equals, "1"),
|
|
|
|
- new QFilter("iscurrentversion", QCP.equals, "1")
|
|
|
|
- }).stream().map(r -> r.get("person.id")).collect(Collectors.toSet());
|
|
|
|
-
|
|
|
|
- // 合并去重,得到日期范围内变动了岗位或者职级的人员信息
|
|
|
|
- positionPersonSet.addAll(jobPersonSet);
|
|
|
|
- logger.info(String.format("查询到岗位或者职级发生变化人员数量为:{} 将开始按照100分批处理。",positionPersonSet.size()));
|
|
|
|
- List<List<Object>> partition = Lists.partition(new ArrayList<>(positionPersonSet), 100);
|
|
|
|
-
|
|
|
|
- boolean hasErrorData = false;
|
|
|
|
- for(List<Object> patchList : partition){
|
|
|
|
-
|
|
|
|
- try{
|
|
|
|
- List<DynamicObject> taskCol = new ArrayList<>();
|
|
|
|
- // 根据人员生成额度信息
|
|
|
|
- patchList.stream().forEach(r -> taskCol.add(generalPersonReimTask(r,beginDate,endDate)));
|
|
|
|
-
|
|
|
|
- // 移除人员、年、月已存在的数据;移除岗位没有发生变化的数据
|
|
|
|
- removeErrorData(taskCol);
|
|
|
|
-// Object[] successBillIds = SaveServiceHelper.save(taskCol.toArray(new DynamicObject[0]));
|
|
|
|
-// List<Object> successBillIdList = Arrays.stream(successBillIds).filter(r -> r instanceof DynamicObject).map(r -> ((DynamicObject) r).getPkValue()).collect(Collectors.toList());
|
|
|
|
-// OperationResult operationResult = OperationServiceHelper.executeOperate(PersonReimSyncTaskConstant.OPERATE.SYNCPERSONREIM,
|
|
|
|
-// PersonReimSyncTaskConstant.ENTITYID, successBillIdList.toArray(), OperateOption.create());
|
|
|
|
-// if(!operationResult.isSuccess()){
|
|
|
|
-// hasErrorData = true;
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
- }catch (Exception e){
|
|
|
|
- // 发生异常时通过调任务通知,通过任务日志和monitor日志查看失败原因。
|
|
|
|
- logger.error("分批执行创建人员额度同步任务异常",e);
|
|
|
|
- hasErrorData = true;
|
|
|
|
- }
|
|
|
|
|
|
+ protected void createPersonPotitionJobQuota(DynamicObject jobBakInfo,Map<Long, Map<Long, List<DynamicObject>>> limitRelasetExpenseItemMap){
|
|
|
|
+
|
|
|
|
+ String userNumber = jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_USER).getString(JobPositionBakBillConstant.KEY_NUMBER);
|
|
|
|
+ // 判断组织是否发生变更
|
|
|
|
+ // 1.旧公司为空 新公司不为空
|
|
|
|
+ if( (jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD) == null && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW) != null)){
|
|
|
|
+ //创建新公司下的个人额度
|
|
|
|
+ logger.info(String.format("人员【%s】新增公司,开始创建公司【%s】下的个人额度。",userNumber,jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW).getString(JobPositionBakBillConstant.KEY_NAME)));
|
|
|
|
+ createQuotaJobleverChange(jobBakInfo,limitRelasetExpenseItemMap,ReimAmountSourceTypeEnum.COMPANYCHANGE);
|
|
|
|
+ createQuotaPositionChange(jobBakInfo,limitRelasetExpenseItemMap,ReimAmountSourceTypeEnum.COMPANYCHANGE);
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
- if(hasErrorData){
|
|
|
|
- throw new KDBizException("同步人员额度时发生异常,请查询原因后再执行。");
|
|
|
|
|
|
+ // 2.旧公司不为空 新公司为空
|
|
|
|
+ if( (jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD) != null && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW) == null)){
|
|
|
|
+ logger.info(String.format("人员【%s】离职,开始作废公司【%s】下的个人额度。",userNumber,jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW).getString(JobPositionBakBillConstant.KEY_NAME)));
|
|
|
|
+ //将旧公司下创建的个人额度关闭
|
|
|
|
+ personReimQuotaHelper.doInvalidPersonReim(new QFilter[]{
|
|
|
|
+ new QFilter("company.id", QCP.equals, jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD).getLong(JobPositionBakBillConstant.ID)),
|
|
|
|
+ new QFilter("user.id", QCP.equals, jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_USER).getLong(JobPositionBakBillConstant.ID))
|
|
|
|
+ });
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 2.新、旧公司不为空且不相等
|
|
|
|
+ if( (jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD) != null && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW) != null)
|
|
|
|
+ && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD).getLong(JobPositionBakBillConstant.ID) != jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW).getLong(JobPositionBakBillConstant.ID)){
|
|
|
|
+ logger.info(String.format("人员【%s】组织变更,开始作废公司【%s】下的个人额度,同时创建公司【%s】下的个人额度",userNumber,
|
|
|
|
+ jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD).getString(JobPositionBakBillConstant.KEY_NAME),
|
|
|
|
+ jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW).getString(JobPositionBakBillConstant.KEY_NAME)));
|
|
|
|
+ //判断新旧公司是否一致
|
|
|
|
+ //将旧公司下创建的个人额度关闭
|
|
|
|
+ personReimQuotaHelper.doInvalidPersonReim(new QFilter[]{
|
|
|
|
+ new QFilter("company.id", QCP.equals, jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_OLD).getLong(JobPositionBakBillConstant.ID)),
|
|
|
|
+ new QFilter("user.id", QCP.equals, jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_USER).getLong(JobPositionBakBillConstant.ID))
|
|
|
|
+ });
|
|
|
|
+ createQuotaJobleverChange(jobBakInfo,limitRelasetExpenseItemMap,ReimAmountSourceTypeEnum.COMPANYCHANGE);
|
|
|
|
+ createQuotaPositionChange(jobBakInfo,limitRelasetExpenseItemMap,ReimAmountSourceTypeEnum.COMPANYCHANGE);
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 移除不符合条件的数据
|
|
|
|
- * @param taskCol
|
|
|
|
- */
|
|
|
|
- protected void removeErrorData(List<DynamicObject> taskCol){
|
|
|
|
|
|
+ // 判断职级是否发生变更
|
|
|
|
+ if( jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_OLD) != null && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_NEW) != null
|
|
|
|
+ && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_OLD).getLong(JobPositionBakBillConstant.ID) != jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_NEW).getLong(JobPositionBakBillConstant.ID)){
|
|
|
|
+ logger.info(String.format("人员【%s】职级发生变动,开始创建个人额度。",userNumber));
|
|
|
|
+ createQuotaJobleverChange(jobBakInfo,limitRelasetExpenseItemMap,null);
|
|
|
|
+ }
|
|
|
|
|
|
- Iterator<DynamicObject> it = taskCol.iterator();
|
|
|
|
- while (it.hasNext()){
|
|
|
|
- DynamicObject taskInfo = it.next();
|
|
|
|
- // 移除空数据
|
|
|
|
- if(taskInfo == null){
|
|
|
|
- it.remove();
|
|
|
|
- }
|
|
|
|
|
|
+ // 判断岗位是否发生变更
|
|
|
|
+ if( jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_POSITION_OLD) != null && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_POSITION_OLD) != null
|
|
|
|
+ && jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_POSITION_OLD).getLong(JobPositionBakBillConstant.ID) != jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_POSITION_NEW).getLong(JobPositionBakBillConstant.ID)){
|
|
|
|
+ logger.info(String.format("人员【%s】岗位发生变动,开始创建个人额度。",userNumber));
|
|
|
|
+ createQuotaPositionChange(jobBakInfo,limitRelasetExpenseItemMap,null);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- // 移除岗位、职级没有发生变化的数据(只有公司发生变动不处理)
|
|
|
|
- if(taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_POSITIONHR_PRE) != null
|
|
|
|
- && taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_POSITIONHR).getPkValue().equals(taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_POSITIONHR_PRE).getPkValue())
|
|
|
|
- && taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_JOBLEVELHR_PRE) != null
|
|
|
|
- && taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_JOBLEVELHR).getPkValue().equals(taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_JOBLEVELHR_PRE).getPkValue())){
|
|
|
|
- it.remove();
|
|
|
|
|
|
+ protected void createQuotaJobleverChange(DynamicObject jobBakInfo, Map<Long, Map<Long, List<DynamicObject>>> limitRelasetExpenseItemMap, ReimAmountSourceTypeEnum sourcetype){
|
|
|
|
+ DynamicObject joblever_new = jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_NEW);
|
|
|
|
+ for(Map.Entry<Long, Map<Long, List<DynamicObject>>> currencyRow : limitRelasetExpenseItemMap.entrySet()){
|
|
|
|
+ // 币别ID
|
|
|
|
+ Long currencyId = currencyRow.getKey();
|
|
|
|
+ // 费用项目分组
|
|
|
|
+ Map<Long, List<DynamicObject>> expenseItemGroupMap = currencyRow.getValue();
|
|
|
|
+
|
|
|
|
+ for(Map.Entry<Long, List<DynamicObject>> expenseItemRow : expenseItemGroupMap.entrySet()){
|
|
|
|
+ Long expenseItemId = expenseItemRow.getKey();
|
|
|
|
+ List<DynamicObject> limitRelasetList = expenseItemRow.getValue();
|
|
|
|
+
|
|
|
|
+ Optional<DynamicObject> findJobleverOp = limitRelasetList.stream().filter(r -> joblever_new.getPkValue()
|
|
|
|
+ .equals(r.getDynamicObject(LimitRelasetConstant.KEY_NCKD_CLASSFIELD_JOBPOS).getPkValue())).findFirst();
|
|
|
|
+ if(findJobleverOp.isPresent()){
|
|
|
|
+ BigDecimal quotaAmont = findJobleverOp.get().getBigDecimal(LimitRelasetConstant.KEY_NCKD_AMOUNT);
|
|
|
|
+ PersonReimQuotaVO personReimQuotaVO = new PersonReimQuotaVO(
|
|
|
|
+ jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_USER).getLong(JobPositionBakBillConstant.ID),
|
|
|
|
+ jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW).getLong(JobPositionBakBillConstant.ID),
|
|
|
|
+ expenseItemId,
|
|
|
|
+ currencyId,
|
|
|
|
+ quotaAmont,
|
|
|
|
+ Optional.ofNullable(sourcetype).orElse(ReimAmountSourceTypeEnum.JOBLEVELCHANGE));
|
|
|
|
+ personReimQuotaHelper.createPersonReimAmount(personReimQuotaVO);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- // 移除已存在的数据
|
|
|
|
- QFilter[] filterList = new QFilter[]{
|
|
|
|
- new QFilter(PersonReimSyncTaskConstant.KEY_NCKD_USER,QCP.equals,taskInfo.getDynamicObject(PersonReimSyncTaskConstant.KEY_NCKD_USER).getPkValue()),
|
|
|
|
- new QFilter(PersonReimSyncTaskConstant.KEY_NCKD_YEAR,QCP.equals,taskInfo.getInt(PersonReimSyncTaskConstant.KEY_NCKD_YEAR)),
|
|
|
|
- new QFilter(PersonReimSyncTaskConstant.KEY_NCKD_MONTH,QCP.equals,taskInfo.getInt(PersonReimSyncTaskConstant.KEY_NCKD_MONTH))
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if(ORM.create().exists(PersonReimSyncTaskConstant.ENTITYID,filterList)){
|
|
|
|
- it.remove();
|
|
|
|
|
|
+ protected void createQuotaPositionChange(DynamicObject jobBakInfo,Map<Long, Map<Long, List<DynamicObject>>> limitRelasetExpenseItemMap,ReimAmountSourceTypeEnum sourcetype){
|
|
|
|
+ DynamicObject joblever_new = jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_JOBLEVEL_NEW);
|
|
|
|
+ DynamicObject position_new = jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_POSITION_NEW);
|
|
|
|
+ for(Map.Entry<Long, Map<Long, List<DynamicObject>>> currencyRow : limitRelasetExpenseItemMap.entrySet()){
|
|
|
|
+ // 币别ID
|
|
|
|
+ Long currencyId = currencyRow.getKey();
|
|
|
|
+ // 费用项目分组
|
|
|
|
+ Map<Long, List<DynamicObject>> expenseItemGroupMap = currencyRow.getValue();
|
|
|
|
+
|
|
|
|
+ for(Map.Entry<Long, List<DynamicObject>> expenseItemRow : expenseItemGroupMap.entrySet()){
|
|
|
|
+ Long expenseItemId = expenseItemRow.getKey();
|
|
|
|
+ List<DynamicObject> limitRelasetList = expenseItemRow.getValue();
|
|
|
|
+
|
|
|
|
+ Optional<DynamicObject> findJobleverOp = limitRelasetList.stream().filter(r -> joblever_new.getPkValue()
|
|
|
|
+ .equals(r.getDynamicObject(LimitRelasetConstant.KEY_NCKD_CLASSFIELD_JOBPOS).getPkValue())).findFirst();
|
|
|
|
+ Optional<DynamicObject> findPositionOp = limitRelasetList.stream().filter(r -> position_new.getPkValue()
|
|
|
|
+ .equals(r.getDynamicObject(LimitRelasetConstant.KEY_NCKD_CLASSFIELD_JOBPOS).getPkValue())).findFirst();
|
|
|
|
+
|
|
|
|
+ // 人员岗位发生变化时,如果存在职级的费用标准,则不需要调整额度
|
|
|
|
+ if(!findJobleverOp.isPresent() && findPositionOp.isPresent()){
|
|
|
|
+ BigDecimal quotaAmont = findPositionOp.get().getBigDecimal(LimitRelasetConstant.KEY_NCKD_AMOUNT);
|
|
|
|
+ PersonReimQuotaVO personReimQuotaVO = new PersonReimQuotaVO(
|
|
|
|
+ jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_USER).getLong(JobPositionBakBillConstant.ID),
|
|
|
|
+ jobBakInfo.getDynamicObject(JobPositionBakBillConstant.KEY_NCKD_ORG_NEW).getLong(JobPositionBakBillConstant.ID),
|
|
|
|
+ expenseItemId,
|
|
|
|
+ currencyId,
|
|
|
|
+ quotaAmont,
|
|
|
|
+ Optional.ofNullable(sourcetype).orElse(ReimAmountSourceTypeEnum.POSITIONCHANGE));
|
|
|
|
+ personReimQuotaHelper.createPersonReimAmount(personReimQuotaVO);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- /**
|
|
|
|
- * 生成人员额度同步任务
|
|
|
|
- * @param personId
|
|
|
|
- * @param beginDate
|
|
|
|
- * @param endDate
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- protected DynamicObject generalPersonReimTask(Object personId,Date beginDate , Date endDate){
|
|
|
|
- Date now = new Date();
|
|
|
|
- DynamicObject taskInfo = BusinessDataServiceHelper.newDynamicObject(PersonReimSyncTaskConstant.ENTITYID);
|
|
|
|
- // 设置人员
|
|
|
|
- DynamicObject hrPerson = QueryServiceHelper.queryOne(BillTypeConstants.HRPI_PERSON, "number", new QFilter("id", QCP.equals, personId).toArray());
|
|
|
|
- DynamicObject userInfo = BusinessDataServiceHelper.loadSingleFromCache("bos_user", new QFilter("number", QCP.equals, hrPerson.getString("number")).toArray());
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_USER,userInfo);
|
|
|
|
- // 设置人员最新的岗位、公司信息
|
|
|
|
- setNewPosition(taskInfo,personId,beginDate,endDate);
|
|
|
|
- // 设置人员最新的职级信息
|
|
|
|
- setNewJob(taskInfo,personId,beginDate,endDate);
|
|
|
|
- // 设置人员上个月之前的最新岗位、公司信息
|
|
|
|
- setOldPosition(taskInfo,personId,beginDate,endDate);
|
|
|
|
- // 设置人员上个月之前的最新的职级信息
|
|
|
|
- setOldJob(taskInfo,personId,beginDate,endDate);
|
|
|
|
-
|
|
|
|
- // 其他字段初始化赋值
|
|
|
|
- int year = CommonUtils.getDateFeild(now, Calendar.YEAR);
|
|
|
|
- int month = CommonUtils.getDateFeild(now, Calendar.MONTH);
|
|
|
|
-
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_YEAR,year);
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_MONTH,month+1);
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_ENABLE,"1");
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_STATUS,"C");
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_SYNCSTATUS, SyncStatusEnum.UNSYNC.getValue());
|
|
|
|
- // 返回对象
|
|
|
|
- return taskInfo;
|
|
|
|
- }
|
|
|
|
|
|
|
|
- protected void setNewPosition(DynamicObject taskInfo,Object personId,Date beginDate , Date endDate){
|
|
|
|
- // 设置人员最新的岗位、公司信息
|
|
|
|
- DynamicObject potisionInfo = QueryServiceHelper.queryOne(BillTypeConstants.HRPI_EMPPOSORGREL, "position.id,company.number", new QFilter[]{
|
|
|
|
- new QFilter("businessstatus", QCP.equals, "1"),
|
|
|
|
- new QFilter("iscurrentversion", QCP.equals, "1"),
|
|
|
|
- new QFilter("person.id", QCP.equals, personId),
|
|
|
|
- new QFilter("isprimary", QCP.equals, "1")
|
|
|
|
- });
|
|
|
|
- if(potisionInfo == null){
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_POSITIONHR,potisionInfo.get("position.id"));
|
|
|
|
- DynamicObject orgInfo = BusinessDataServiceHelper
|
|
|
|
- .loadSingleFromCache("bos_org", new QFilter("number", QCP.equals, potisionInfo.getString("company.number")).toArray());
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_ORG,orgInfo);
|
|
|
|
|
|
+ protected DynamicObject[] getPersonPositionJobBakCol() {
|
|
|
|
+ Set<Long> bakBillIdSet = QueryServiceHelper.query(JobPositionBakBillConstant.ENTITYID, JobPositionBakBillConstant.ID, QFilter.isNotNull(JobPositionBakBillConstant.ID).toArray())
|
|
|
|
+ .stream()
|
|
|
|
+ .map(r -> r.getLong(JobPositionBakBillConstant.ID))
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
+ return BusinessDataServiceHelper.load(bakBillIdSet.toArray(), EntityMetadataCache.getDataEntityType(JobPositionBakBillConstant.ENTITYID));
|
|
}
|
|
}
|
|
|
|
|
|
- protected void setNewJob(DynamicObject taskInfo,Object personId,Date beginDate , Date endDate){
|
|
|
|
- // 设置人员最新的岗位、公司信息
|
|
|
|
- DynamicObject jobInfo = QueryServiceHelper.queryOne(BillTypeConstants.HRPI_EMPJOBREL, "joblevel.id", new QFilter[]{
|
|
|
|
- new QFilter("businessstatus", QCP.equals, "1"),
|
|
|
|
- new QFilter("iscurrentversion", QCP.equals, "1"),
|
|
|
|
- new QFilter("person.id", QCP.equals, personId)
|
|
|
|
- });
|
|
|
|
- if(jobInfo == null){
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_JOBLEVELHR,jobInfo.get("joblevel.id"));
|
|
|
|
- }
|
|
|
|
- protected void setOldPosition(DynamicObject taskInfo,Object personId,Date beginDate , Date endDate){
|
|
|
|
- // 开始日期之前,最新的岗位
|
|
|
|
- DynamicObjectCollection positionCol = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPPOSORGREL, "position.id,company.number", new QFilter[]{
|
|
|
|
- new QFilter("enddate", QCP.less_than, beginDate),
|
|
|
|
- new QFilter("iscurrentversion", QCP.equals, "1"),
|
|
|
|
- new QFilter("person.id", QCP.equals, personId),
|
|
|
|
- new QFilter("isprimary", QCP.equals, "1")
|
|
|
|
- }, "enddate desc", 1);
|
|
|
|
- if(CollectionUtils.isEmpty(positionCol)){
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
- DynamicObject potisionInfo = positionCol.get(0);
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_POSITIONHR_PRE,potisionInfo.get("position.id"));
|
|
|
|
- DynamicObject orgInfo = BusinessDataServiceHelper
|
|
|
|
- .loadSingleFromCache("bos_org", new QFilter("number", QCP.equals, potisionInfo.getString("company.number")).toArray());
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_ORG_PRE,orgInfo);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- protected void setOldJob(DynamicObject taskInfo,Object personId,Date beginDate , Date endDate){
|
|
|
|
- // 设置人员最新的岗位、公司信息
|
|
|
|
- DynamicObjectCollection jobCol = QueryServiceHelper.query(BillTypeConstants.HRPI_EMPJOBREL, "joblevel.id", new QFilter[]{
|
|
|
|
- new QFilter("startdate", QCP.equals, beginDate),
|
|
|
|
- new QFilter("iscurrentversion", QCP.equals, "1"),
|
|
|
|
- new QFilter("person.id", QCP.equals, personId)
|
|
|
|
- }, "enddate desc", 1);
|
|
|
|
- if(CollectionUtils.isEmpty(jobCol)){
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
- taskInfo.set(PersonReimSyncTaskConstant.KEY_NCKD_JOBLEVELHR_PRE,jobCol.get(0).get("joblevel.id"));
|
|
|
|
|
|
+ protected Map<Long, Map<Long, List<DynamicObject>>> getLimitRelasetMap() {
|
|
|
|
+ Set<Long> bakBillIdSet = QueryServiceHelper.query(LimitRelasetConstant.ENTITYID, LimitRelasetConstant.ID, new QFilter[]{
|
|
|
|
+ new QFilter(LimitRelasetConstant.KEY_STATUS, QFilter.equals, "C")
|
|
|
|
+ }).stream().map(r -> r.getLong(JobPositionBakBillConstant.ID)).collect(Collectors.toSet());
|
|
|
|
+
|
|
|
|
+ DynamicObject[] limitRelasetCol = BusinessDataServiceHelper.load(bakBillIdSet.toArray(), EntityMetadataCache.getDataEntityType(LimitRelasetConstant.ENTITYID));
|
|
|
|
+ return Arrays.stream(limitRelasetCol)
|
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
|
+ r -> r.getDynamicObject(LimitRelasetConstant.KEY_NCKD_CURRENCY).getLong(LimitRelasetConstant.ID),
|
|
|
|
+ Collectors.groupingBy(r -> r.getDynamicObject(LimitRelasetConstant.KEY_NCKD_EXPENSEITEM).getLong(LimitRelasetConstant.ID)
|
|
|
|
+ )));
|
|
}
|
|
}
|
|
}
|
|
}
|