Kaynağa Gözat

feat(hr): 添加员工调动和合同管理相关功能

- 在FormConstant中添加HR通用服务和员工信息中心常量
- 新增调动单服务类TransferApplyBillServiceHelper
- 在调动申请单常量中添加劳动合同档案和解除合同相关标识
- 实现调动生效后解除合同的操作插件CancelContractAfterEffectOpPlugin
- 更新岗位单据服务助手中的HR通用服务应用标识
jtd 4 gün önce
ebeveyn
işleme
db046a822a

+ 8 - 0
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java

@@ -19,6 +19,10 @@ public class FormConstant {
     public static final String WFTASK_APP = "wftask";
     /** 组织管理 */
     public static final String HOMS_APP = "homs";
+    /** HR通用服务 */
+    public static final String HRCS_APP = "hrcs";
+    /** 员工信息中心 */
+    public static final String HRPI_APP = "hrpi";
 
     //====================================== 标品实体标识(需要小写) ======================================
     /**学历-实体标识*/
@@ -160,6 +164,10 @@ public class FormConstant {
     public static final String HAOS_ADMINORGDETAIL_ENTITY = "haos_adminorgdetail";
     /** 企业建模-岗位实体标识 */
     public static final String BOS_POSITION_ENTITY = "bos_position";
+    /** 合同申请父页面实体标识 */
+    public static final String HLCM_CONTRACTAPPLY_ENTITY = "hlcm_contractapply";
+    /** 合同解除实体标识 */
+    public static final String HLCM_CONTRACTAPPLYCANCEL_ENTITY = "hlcm_contractapplycancel";
 
     //====================================== 标品op ======================================
     /** 确认框确认按钮 */

+ 12 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/business/transfer/TransferApplyBillServiceHelper.java

@@ -0,0 +1,12 @@
+package nckd.jxccl.hr.hdm.business.transfer;
+
+/**
+ * 调动单服务类
+ * @author: jtd
+ * @date: 2026/1/6 19:54
+ */
+public class TransferApplyBillServiceHelper {
+
+
+
+}

+ 135 - 1
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/common/transfer/TransferApplyBillConstant.java

@@ -10,15 +10,148 @@ import nckd.jxccl.base.common.constant.FormConstant;
 public class TransferApplyBillConstant extends FormConstant {
     /** 获取员工近亲属关系查询实体标识 */
     public static final String NCKD_HRPI_GETFAMILYRELATION_ENTITY = "nckd_hrpi_getfamilyrelation";
+    /** 劳动合同档案实体标识 */
+    public static final String HLCM_CONTRACTSOURCE_ENTITY = "hlcm_contractsource";
+    /** 劳动合同档案实体标识 */
+    public static final String HLCM_CONTRACT_ENTITY = "hlcm_contract";
+    /** 解除/终止合同原因实体标识 */
+    public static final String HLCM_CONTRACTREASON_ENTITY = "hlcm_contractreason";
 
+    /** 调动生效后解除合同OP标识 */
+    public static final String CANCLECONTRACT_AFTEREFFECT_OP = "canclecontract_aftereffect";
+
+    /** 调出公司(业务对象) */
+    public static final String BCOMPANYBO_KEY = "bcompanybo";
     /** 调出公司 */
     public static final String BCOMPANY_KEY = "bcompany";
     /** 调入公司 */
     public static final String ACOMPANY_KEY = "acompany";
-    /** 配偶、近亲属关系.员工 */
+    /** 原组织分配 */
+    public static final String BB_A_TID_KEY = "bb_a_tid";
+    /** 实际调动日期 */
+    public static final String B_EFFECTIVEDATE_KEY = "b_effectivedate";
+    /** 常驻工作地 */
+    public static final String BB_PO_WORKPLACE_KEY = "bb_po_workplace";
+    /** 国籍 */
+    public static final String NATIONALITY_KEY = "nationality";
+    /** 联系电话 */
+    public static final String EMPPHONE_KEY = "empphone";
+    /** 行政组织(业务对象) */
+    public static final String BB_PO_ADMINORGBO_KEY = "bb_po_adminorgbo";
+    /** 行政组织 */
+    public static final String BB_PO_ADMINORG_KEY = "bb_po_adminorg";
+    /** 岗位(业务对象) */
+    public static final String BB_PO_POSITIONBO_KEY = "bb_po_positionbo";
+    /** 职位 */
+    public static final String BB_PO_JOB_KEY = "bb_po_job";
+    /** 任职序号 */
+    public static final String BB_PO_ORGRELSEQ_KEY = "bb_po_orgrelseq";
+    /** 员工组 */
+    public static final String BB_A_EMPGROUP_KEY = "bb_a_empgroup";
+
+    /** 员工 */
     public static final String NCKD_EMPID_KEY = "nckd_empid";
+
+    /** 合同协议类型 */
+    public static final String PROTOCOLTYPE_KEY = "protocoltype";
+    /** 合同状态 */
+    public static final String CONTRACTSTATUS_KEY = "contractstatus";
+    /** 合同开始日期 */
+    public static final String STARTDATE_KEY = "startdate";
+    /** 计划结束日期 */
+    public static final String PLANENDDATE_KEY = "planenddate";
+    /** 应签单位 */
+    public static final String SUGGESTSIGNCOMPANY_KEY = "suggestsigncompany";
+    /** 实签单位 */
+    public static final String ACTUALSIGNCOMPANY_KEY = "actualsigncompany";
+    /** 证件类型 */
+    public static final String CARDTYPE_KEY = "cardtype";
+    /** 证件号码 */
+    public static final String CARDNUMBER_KEY = "cardnumber";
+    /** 户籍地址 */
+    public static final String HOUSEHOLDREGISTER_KEY = "householdregister";
+    /** 居住地址 */
+    public static final String RESIDENTIALADDRESS_KEY = "residentialaddress";
+    /** 实签单位历史 */
+    public static final String ACTUALSIGNCOMPANYHIS_KEY = "actualsigncompanyhis";
+    /** 合同期限类型 */
+    public static final String PERIODTYPE_KEY = "periodtype";
+    /** 合同期限单位 */
+    public static final String PERIODUNIT_KEY = "periodunit";
+    /** 合同期限 */
+    public static final String PERIOD_KEY = "period";
+    /** 签署方式 */
+    public static final String SIGNWAY_KEY = "signway";
+    /** 实际结束日期 */
+    public static final String ENDDATE_KEY = "enddate";
+    /** 签订日期 */
+    public static final String SIGNEDDATE_KEY = "signeddate";
+    /** 部门 */
+    public static final String ORGMODEL_KEY = "orgmodel";
+    /** 岗位 */
+    public static final String POSITIONMODEL_KEY = "positionmodel";
+
+
+
     /** 原合同是否解除 */
     public static final String NCKD_ISTERMORIGCONT_KEY = "nckd_istermorigcont";
+    /** 任职类型(变动前) */
+    public static final String BB_PO_POSTYPE_KEY = "bb_po_postype";
+    /** 姓名 */
+    public static final String EMPNAME_KEY = "empname";
+    /** 公司历史 */
+    public static final String SIGNEDCOMPANYHIS_KEY = "signedcompanyhis";
+    /** 行政组织历史F7 */
+    public static final String DEPARTMENTHIS_KEY = "departmenthis";
+    /** 岗位历史 */
+    public static final String POSTIONHIS_KEY = "postionhis";
+    /** 国籍 */
+    public static final String NATION_KEY = "nation";
+    /** 签署业务类型 */
+    public static final String BUSINESSTYPE_KEY = "businesstype";
+    /** 常驻工作地 */
+    public static final String BASELOCATION_KEY = "baselocation";
+    /** 合同解除日期 */
+    public static final String CANCELDATE_KEY = "canceldate";
+    /** 合同编号 */
+    public static final String OLDCONTRACT_KEY = "oldcontract";
+    /** 业务处理状态 */
+    public static final String HANDLESTATUS_KEY = "handlestatus";
+    /** 实际签订日期 */
+    public static final String ACTUALSIGNDATE_KEY = "actualsigndate";
+    /** 职位 */
+    public static final String JOB_KEY = "job";
+    /** 公司 */
+    public static final String CURCOMPANY_KEY = "curcompany";
+    /** 部门 */
+    public static final String CURDEPT_KEY = "curdept";
+    /** 岗位 */
+    public static final String CURPOSTION_KEY = "curpostion";
+    /** 职位 */
+    public static final String CURJOB_KEY = "curjob";
+    /** 任职序号 */
+    public static final String ORGRELSEQ_KEY = "orgrelseq";
+
+    /** 续签次数(续签用) */
+    public static final String RENEWCOUNT_KEY = "renewcount";
+    /** 人事管理组织 */
+    public static final String ERMANORG_KEY = "ermanorg";
+    /** 员工管理部门 */
+    public static final String ADMINORORG_KEY = "adminororg";
+    /** 员工组 */
+    public static final String ERMANPERORG_KEY = "ermanperorg";
+    /** 档案类型 */
+    public static final String CONTRACTCATEGORY_KEY = "contractcategory";
+    /** 解除原因 */
+    public static final String CANCELREASONTYPE_KEY = "cancelreasontype";
+
+    /** 常驻工作地 */
+    public static final String LOCALTION_KEY = "location";
+    /** 员工组 */
+    public static final String PERSONGROUP_KEY = "persongroup";
+    /** 员工管理部门 */
+    public static final String AFFILIATEADMINORG_KEY = "affiliateadminorg";
+
 
     /** 员工.员工编码 */
     public static final String EMPLOYEE_EMPNUMBER = "employee.empnumber";
@@ -37,4 +170,5 @@ public class TransferApplyBillConstant extends FormConstant {
 
     /** 近亲属关系确认回调 */
     public static final String FAMILY_RELATION_CONFIRM_CALLBACK = "familyRelationConfirm";
+
 }

+ 322 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/plugin/operate/transfer/CancelContractAfterEffectOpPlugin.java

@@ -0,0 +1,322 @@
+package nckd.jxccl.hr.hdm.plugin.operate.transfer;
+
+import com.google.common.collect.Lists;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.exception.BosErrorCode;
+import kd.bos.exception.ErrorCode;
+import kd.bos.exception.KDBizException;
+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.orm.util.CollectionUtils;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRMServiceHelper;
+import kd.hr.hbp.common.api.HrApiResponse;
+import kd.hr.hbp.common.util.HRObjectUtils;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.hr.hlcm.common.enums.ContractCategoryEnum;
+import kd.hr.hlcm.common.enums.PostypeEnum;
+import kd.sdk.hr.hdm.common.enums.reg.RegBillStatusEnum;
+import kd.sdk.hr.hlcm.common.enums.BusinessTypeEnum;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.hr.hdm.common.transfer.TransferApplyBillConstant;
+import nckd.jxccl.hr.homs.common.application.event.GECEventConstant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 调动生效后解除合同操作插件
+ * @entity: nckd_hdm_transferbase_ext
+ * @operate: canclecontract_aftereffect
+ * @author: jtd
+ * @date: 2026/1/6 11:38
+ */
+public class CancelContractAfterEffectOpPlugin extends AbstractOperationServicePlugIn {
+    private static final Log log = LogFactory.getLog(CancelContractAfterEffectOpPlugin.class);
+    private static final HRBaseServiceHelper contractSourceHelper = HRBaseServiceHelper.create(TransferApplyBillConstant.HLCM_CONTRACTSOURCE_ENTITY);
+    private static final HRBaseServiceHelper contractHelper = HRBaseServiceHelper.create(TransferApplyBillConstant.HLCM_CONTRACT_ENTITY);
+    private static final HRBaseServiceHelper contractApplyCancelHelper = HRBaseServiceHelper.create(TransferApplyBillConstant.HLCM_CONTRACTAPPLYCANCEL_ENTITY);
+    private static final HRBaseServiceHelper contractReasonHelper = HRBaseServiceHelper.create(TransferApplyBillConstant.HLCM_CONTRACTREASON_ENTITY);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+
+        DynamicObject[] dataEntites = e.getDataEntities();
+        List<DynamicObject> transferData = Arrays.stream(dataEntites).filter(data -> data.getBoolean(TransferApplyBillConstant.NCKD_ISTERMORIGCONT_KEY)).collect(Collectors.toList());
+        List<DynamicObject> cancelConstractDyoList = new ArrayList<DynamicObject>();
+        for (DynamicObject data : transferData) {
+            cancelConstractDyoList.add(buildContract(data));
+        }
+
+        OperationResult operationResult;
+        try {
+            operationResult = SaveServiceHelper.saveOperate(TransferApplyBillConstant.HLCM_CONTRACTAPPLYCANCEL_ENTITY, cancelConstractDyoList.toArray(new DynamicObject[0]));
+        } catch (KDException ex) {
+            throw new KDBizException(new ErrorCode(ex.getErrorCode().getCode(), ex.getErrorCode().getMessage()), ex.getCause());
+        }
+
+        if (!operationResult.isSuccess()) {
+            List<String> errorMsgList = new ArrayList<String>();
+            for (IOperateInfo operateInfo : operationResult.getAllErrorOrValidateInfo()) {
+                errorMsgList.add(operateInfo.getMessage());
+            }
+
+            if(StringUtils.isBlank(operationResult.getMessage())){
+                errorMsgList.add(operationResult.getMessage());
+            }
+            throw new KDBizException(new ErrorCode("CancelContractAfterEffect.SaveContract.Error", String.join(System.lineSeparator(), errorMsgList)));
+        }
+    }
+
+    private  DynamicObject buildContract(DynamicObject data) {
+        DynamicObject cancelContract = getCancelContractByErManFile(data);
+
+        DynamicObject contractApplyCancelDyo = contractApplyCancelHelper.generateEmptyDynamicObject();
+        // 设置 姓名
+        contractApplyCancelDyo.set(TransferApplyBillConstant.EMPNAME_KEY, data.get(String.join(".", TransferApplyBillConstant.BB_EM_TID, TransferApplyBillConstant.NAME_KEY)));
+        // 设置 人事管理组织
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ORG_KEY, data.get(TransferApplyBillConstant.ORG_KEY));
+        // 设置 工号
+        contractApplyCancelDyo.set(TransferApplyBillConstant.EMP_NUMBER_KEY, data.get(String.join(".", TransferApplyBillConstant.BB_EM_TID, TransferApplyBillConstant.EMP_NUMBER_KEY)));
+        // 设置 证件类型
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CARDTYPE_KEY, cancelContract.get(TransferApplyBillConstant.CARDTYPE_KEY));
+        // 设置 证件号码
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CARDNUMBER_KEY, cancelContract.get(TransferApplyBillConstant.CARDNUMBER_KEY));
+        // 设置 单据编号
+        /*CodeRuleInfo codeRuleInfo = CodeRuleServiceHelper.getCodeRule(contractApplyCancelDyo.getDataEntityType().getName(), contractApplyCancelDyo, data.getString(String.format("%s_id", TransferApplyBillConstant.ORG_KEY)));
+        String number = CodeRuleServiceHelper.readNumber(codeRuleInfo, contractApplyCancelDyo);
+        contractApplyCancelDyo.set(TransferApplyBillConstant.NUMBER_KEY, number);*/
+        // 设置 审批状态
+        contractApplyCancelDyo.set(TransferApplyBillConstant.AUDIT_STATUS, RegBillStatusEnum.TEMPSTORAGE.getCode());// 暂存
+        // 设置 公司历史
+        contractApplyCancelDyo.set(TransferApplyBillConstant.SIGNEDCOMPANYHIS_KEY, data.get(TransferApplyBillConstant.BCOMPANY_KEY));
+        // 设置 行政组织历史F7
+        contractApplyCancelDyo.set(TransferApplyBillConstant.DEPARTMENTHIS_KEY, data.get(TransferApplyBillConstant.BB_PO_ADMINORG_KEY));
+        // 设置 岗位历史
+        contractApplyCancelDyo.set(TransferApplyBillConstant.POSTIONHIS_KEY, data.get(TransferApplyBillConstant.BB_PO_POSITION));
+        // 设置 国籍
+        contractApplyCancelDyo.set(TransferApplyBillConstant.NATION_KEY, data.get(String.join(".", TransferApplyBillConstant.BB_EM_TID, TransferApplyBillConstant.NATIONALITY_KEY)));
+        // 设置 常驻工作地
+        contractApplyCancelDyo.set(TransferApplyBillConstant.BASELOCATION_KEY, data.get(TransferApplyBillConstant.BB_PO_WORKPLACE_KEY));
+        // 设置 联系方式
+        contractApplyCancelDyo.set(TransferApplyBillConstant.EMPPHONE_KEY, cancelContract.getString(TransferApplyBillConstant.EMPPHONE_KEY));
+        // 设置 合同协议类型
+        contractApplyCancelDyo.set(TransferApplyBillConstant.PROTOCOLTYPE_KEY, "1");// 劳动合同
+        // 设置 签署业务类型
+        contractApplyCancelDyo.set(TransferApplyBillConstant.BUSINESSTYPE_KEY, BusinessTypeEnum.CANCEL.getCombKey());
+        // 设置 签署方式
+        contractApplyCancelDyo.set(TransferApplyBillConstant.SIGNWAY_KEY, cancelContract.get(TransferApplyBillConstant.SIGNWAY_KEY));
+        // 设置 合同开始日期
+        contractApplyCancelDyo.set(TransferApplyBillConstant.STARTDATE_KEY, cancelContract.get(TransferApplyBillConstant.STARTDATE_KEY));
+        // 设置 实际结束日期
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ENDDATE_KEY, cancelContract.get(TransferApplyBillConstant.ENDDATE_KEY));
+        // 设置 签订日期
+        //contractApplyCancelDyo.set(TransferApplyBillConstant.SIGNEDDATE_KEY, cancelContract.get(TransferApplyBillConstant.SIGNEDDATE_KEY));// 解除不能设置
+        // 设置 合同期限
+        contractApplyCancelDyo.set(TransferApplyBillConstant.PERIOD_KEY, cancelContract.get(TransferApplyBillConstant.PERIOD_KEY));
+        // 设置 实签单位
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ACTUALSIGNCOMPANY_KEY, cancelContract.get(TransferApplyBillConstant.ACTUALSIGNCOMPANY_KEY));
+        // 设置 实签单位历史
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ACTUALSIGNCOMPANYHIS_KEY, cancelContract.get(TransferApplyBillConstant.ACTUALSIGNCOMPANYHIS_KEY));
+        // 设置 合同解除日期
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CANCELDATE_KEY, data.get(TransferApplyBillConstant.B_EFFECTIVEDATE_KEY));
+        // 设置 合同编号
+        contractApplyCancelDyo.set(TransferApplyBillConstant.OLDCONTRACT_KEY, cancelContract);
+        // 设置 业务处理状态
+        //contractApplyCancelDyo.set(TransferApplyBillConstant.HANDLESTATUS_KEY);
+        // 设置 任职类型
+        contractApplyCancelDyo.set(TransferApplyBillConstant.POSTYPE, data.get(TransferApplyBillConstant.BB_PO_POSTYPE_KEY));
+        // 设置 实际签订日期
+        //contractApplyCancelDyo.set(TransferApplyBillConstant.ACTUALSIGNDATE_KEY);
+        // 设置 合同期限单位
+        //contractApplyCancelDyo.set(TransferApplyBillConstant.PERIODUNIT_KEY);
+        // 设置 单据状态
+        contractApplyCancelDyo.set(TransferApplyBillConstant.BILL_STATUS_KEY, RegBillStatusEnum.TEMPSTORAGE.getCode());
+        // 设置 职位
+        Long jobHis = getJobHis(data.getLong(String.join(".", TransferApplyBillConstant.BB_PO_JOB_KEY, TransferApplyBillConstant.ID_KEY)));
+        contractApplyCancelDyo.set(TransferApplyBillConstant.JOB_KEY, jobHis);
+        // 设置 公司
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CURCOMPANY_KEY, data.get(TransferApplyBillConstant.BCOMPANYBO_KEY));
+        // 设置 部门
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CURDEPT_KEY, data.get(TransferApplyBillConstant.BB_PO_ADMINORGBO_KEY));
+        // 设置 岗位
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CURPOSTION_KEY, data.get(TransferApplyBillConstant.BB_PO_POSITIONBO_KEY));
+        // 设置 职位
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CURJOB_KEY, data.get(TransferApplyBillConstant.BB_PO_JOB_KEY));
+        // 设置 员工(HR员工)
+        contractApplyCancelDyo.set(TransferApplyBillConstant.EMPLOYEE_KEY, data.get(TransferApplyBillConstant.BB_EM_TID));
+        // 设置 员工(组织分配)
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ASSIGNMENT, data.get(TransferApplyBillConstant.BB_A_TID_KEY));
+        // 设置 任职序号
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ORGRELSEQ_KEY, data.get(TransferApplyBillConstant.BB_PO_ORGRELSEQ_KEY));
+        // 设置 居住地址
+        contractApplyCancelDyo.set(TransferApplyBillConstant.RESIDENTIALADDRESS_KEY, cancelContract.getString(TransferApplyBillConstant.RESIDENTIALADDRESS_KEY));
+        // 设置 户籍地址
+        contractApplyCancelDyo.set(TransferApplyBillConstant.HOUSEHOLDREGISTER_KEY, cancelContract.getString(TransferApplyBillConstant.HOUSEHOLDREGISTER_KEY));
+
+        // 设置 续签次数(续签用)
+        contractApplyCancelDyo.set(TransferApplyBillConstant.RENEWCOUNT_KEY, getRenewCount(contractApplyCancelDyo));
+        // 设置 人事管理组织
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ERMANORG_KEY, data.get(TransferApplyBillConstant.ORG_KEY));
+        // 设置 管理部门
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ADMINORORG_KEY, data.get(TransferApplyBillConstant.BB_PO_ADMINORGBO_KEY));
+        // 设置 员工组
+        contractApplyCancelDyo.set(TransferApplyBillConstant.ERMANPERORG_KEY, data.get(TransferApplyBillConstant.BB_A_EMPGROUP_KEY));
+        // 设置 档案类型
+        setContractCategory(contractApplyCancelDyo);
+        // 设置 解除原因
+        DynamicObject contractReasonDy = contractReasonHelper.generateEmptyDynamicObject();
+        contractReasonDy.set(TransferApplyBillConstant.ID_KEY, 1040L);
+        contractApplyCancelDyo.set(TransferApplyBillConstant.CANCELREASONTYPE_KEY, contractReasonDy);// 其他
+
+        // 设置 创建人
+        contractApplyCancelDyo.set(GECEventConstant.CREATOR_KEY, UserServiceHelper.getCurrentUserId());
+
+        return contractApplyCancelDyo;
+    }
+
+    // from: kd.hr.hlcm.business.domian.repository.ContractSignApplyRepository.getCancelContractByErManFile
+    public DynamicObject getCancelContractByErManFile(DynamicObject dataEntity) {
+        QFilter protocolTypeFilter = new QFilter(TransferApplyBillConstant.PROTOCOLTYPE_KEY, QCP.equals, "1");// 劳动合同
+        QFilter personFilter = new QFilter(TransferApplyBillConstant.EMPLOYEE_KEY, QCP.equals, dataEntity.getLong(String.format(Locale.ROOT, "%s_id", TransferApplyBillConstant.BB_EM_TID)));
+        QFilter posTypeFilter = new QFilter(TransferApplyBillConstant.POSTYPE, QCP.equals, dataEntity.getLong(String.format(Locale.ROOT, "%s_id", TransferApplyBillConstant.BB_PO_POSTYPE_KEY)));
+        QFilter contractStatusFilter = new QFilter(TransferApplyBillConstant.CONTRACTSTATUS_KEY, QCP.equals, "1");// 生效中
+        QFilter isCurFilter = new QFilter(TransferApplyBillConstant.IS_CURRENT_VERSION, QCP.equals, "1");
+        String selectProperties = QueryFieldBuilder.create().add(TransferApplyBillConstant.STARTDATE_KEY)
+                .add(TransferApplyBillConstant.PLANENDDATE_KEY)
+                .add(TransferApplyBillConstant.NUMBER_KEY)
+                .add(TransferApplyBillConstant.SUGGESTSIGNCOMPANY_KEY)
+                .add(TransferApplyBillConstant.ACTUALSIGNCOMPANY_KEY)
+                .add(TransferApplyBillConstant.CONTRACTSTATUS_KEY)
+                .add(TransferApplyBillConstant.NAME_KEY)
+                .add(TransferApplyBillConstant.CARDTYPE_KEY)
+                .add(TransferApplyBillConstant.CARDNUMBER_KEY)
+                .add(TransferApplyBillConstant.HOUSEHOLDREGISTER_KEY)
+                .add(TransferApplyBillConstant.RESIDENTIALADDRESS_KEY)
+                .add(TransferApplyBillConstant.EMPPHONE_KEY)
+                .add(TransferApplyBillConstant.ACTUALSIGNCOMPANYHIS_KEY)
+                .add(TransferApplyBillConstant.PERIODTYPE_KEY)
+                .add(TransferApplyBillConstant.PERIODUNIT_KEY)
+                .add(TransferApplyBillConstant.PERIOD_KEY)
+                .buildSelect();
+        // 这里要查所有属性出来,否则用到没查出来的字段会报异常
+        DynamicObject[] contractDy = contractSourceHelper.loadDynamicObjectArray(new QFilter[]{protocolTypeFilter, personFilter, contractStatusFilter, posTypeFilter, isCurFilter});
+
+        return getNewestContract(contractDy).orElse(null);
+    }
+
+    // from: kd.hr.hlcm.business.domian.repository.ContractSignApplyRepository.getNewestContract
+    private Optional<DynamicObject> getNewestContract(DynamicObject[] contracts) {
+        Comparator<DynamicObject> multipleComparator = buildNewestComparator();
+        return Stream.of(contracts).max(multipleComparator);
+    }
+
+    // from: kd.hr.hlcm.business.domian.repository.ContractSignApplyRepository.buildNewestComparator
+    private Comparator<DynamicObject> buildNewestComparator() {
+        Comparator<DynamicObject> contractStatusComparator = Comparator.comparing((dy) -> dy.getString(TransferApplyBillConstant.CONTRACTSTATUS_KEY));
+        Comparator<DynamicObject> comparingStartDate = Comparator.comparing((dy) -> dy.getDate(TransferApplyBillConstant.STARTDATE_KEY));
+        Comparator<DynamicObject> comparingId = Comparator.comparingLong((dy) -> dy.getLong(TransferApplyBillConstant.ID_KEY));
+        Comparator<DynamicObject> multipleComparing = contractStatusComparator.thenComparing(comparingStartDate).thenComparing(comparingId);
+        return multipleComparing;
+    }
+
+    // from: kd.hr.hlcm.business.domian.repository.ContractSignApplyRepository.getRenewCount
+    public static int getRenewCount(DynamicObject signBill) {
+        DynamicObject oldContract = signBill.getDynamicObject(TransferApplyBillConstant.OLDCONTRACT_KEY);
+        String businessType = signBill.getString(TransferApplyBillConstant.BUSINESSTYPE_KEY);
+        if (Objects.isNull(oldContract)) {
+            log.warn("renew select oldContract is null,curBusinessType|{}", businessType);
+            return 0;
+        } else {
+            DynamicObject preContract = contractHelper.queryOne(TransferApplyBillConstant.RENEWCOUNT_KEY, new QFilter[]{new QFilter(TransferApplyBillConstant.ID_KEY, QCP.equals, oldContract.getPkValue())});
+            int preRenewCount = preContract.getInt(TransferApplyBillConstant.RENEWCOUNT_KEY);
+            log.info("preRenewCount|{},curBusinessType|{}", preRenewCount, businessType);
+            return HRStringUtils.equals(businessType, BusinessTypeEnum.RENEW.getCombKey()) ? preRenewCount + 1 : preRenewCount;
+        }
+    }
+
+    // from: kd.hr.hlcm.business.domian.utils.ContractSignUtils.setContractCategory
+    public static void setContractCategory(DynamicObject signBill) {
+        if (HRStringUtils.equals(signBill.getString(TransferApplyBillConstant.PROTOCOLTYPE_KEY), "1")) {
+            DynamicObject posType = signBill.getDynamicObject(TransferApplyBillConstant.POSTYPE);
+            if (!HRObjectUtils.isEmpty(posType)) {
+                Object posTypeId = posType.getPkValue();
+                if (Objects.equals(posTypeId, PostypeEnum.FULL.getCombKey())) {
+                    signBill.set(TransferApplyBillConstant.CONTRACTCATEGORY_KEY, ContractCategoryEnum.MAIN.getCombKey());
+                } else if (Objects.equals(posTypeId, PostypeEnum.EXPATRIATE.getCombKey())) {
+                    signBill.set(TransferApplyBillConstant.CONTRACTCATEGORY_KEY, ContractCategoryEnum.OUTER.getCombKey());
+                } else {
+                    log.warn("posTypeId|{} is not 1010 or 1040", posTypeId);
+                }
+
+            }
+        }
+    }
+
+    // from: kd.hr.hlcm.business.infrastructure.client.hbpm.impl.HbpmServiceImpl.getJobHis(java.lang.Long)
+    public Long getJobHis(Long jobId) {
+        Map<Long, Long> jobHisMap = getJobHis(Lists.newArrayList(jobId), new Date());
+        return Optional.ofNullable(jobHisMap.get(jobId)).orElse(0L);
+    }
+
+    // from: kd.hr.hlcm.business.infrastructure.client.hbpm.impl.HbpmServiceImpl.getJobHis(java.util.List<java.lang.Long>)
+    public Map<Long, Long> getJobHis(List<Long> jobIds, Date date) {
+        filterEmpty(jobIds);
+        Map<Long, Long> currIdHisIdMap = new HashMap<>(jobIds.size());
+        if (jobIds.isEmpty())
+            return currIdHisIdMap;
+        try {
+            HrApiResponse jobHisMap = HRMServiceHelper.invokeHRMPService("hbjm", "IHBJMJobService", "queryJobHisInfoByBoIdToMap", new Object[] { jobIds, date });
+            log.info("IHBJMJobService queryJobHisInfoByBoIdToMap param response|{}", jobIds, jobHisMap);
+            if (HRObjectUtils.isEmpty(jobHisMap))
+                return currIdHisIdMap;
+            List<Map<String, Object>> dataMap = (List<Map<String, Object>>)jobHisMap.getData();
+            if (CollectionUtils.isEmpty(dataMap))
+                return currIdHisIdMap;
+            for (Map<String, Object> map : dataMap) {
+                Object vid = map.get(TransferApplyBillConstant.ID_KEY);
+                Object id = map.get(TransferApplyBillConstant.BOID_KEY);
+                if (vid != null && id != null)
+                    currIdHisIdMap.put((Long)id, Long.valueOf(vid.toString()));
+            }
+            log.info("getJobHis result|{}", currIdHisIdMap);
+        } catch (Exception ex) {
+            log.error("HbpmServiceImpl.getJobHis======jobBoid error..", ex);
+            throw new KDException(ex, BosErrorCode.systemError, new Object[0]);
+        }
+        return currIdHisIdMap;
+    }
+
+    private void filterEmpty(List<Long> ids) {
+        log.info("before filter ids|{}", ids);
+        ids.removeIf((id) -> id == null || id == 0L);
+        log.info("after filter ids|{}", ids);
+    }
+}

+ 1 - 1
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/hr/service/impl/PositionBillServiceHelper.java

@@ -180,7 +180,7 @@ public class PositionBillServiceHelper {
         Long userId = RequestContext.get().getCurrUserId();
         String permItemId = PermissionStatus.View;// 查询权限
         String appId = iFormView.getFormShowParameter().getCheckRightAppId();
-        AuthorizedOrgResult permResult = HRMServiceHelper.invokeHRMPService("hrcs", "IHRCSBizDataPermissionService", "getUserAdminOrgsF7", new Object[]{userId, appId, PositionBillConstant.NCKD_POSITIONBILL_ENTITY, permItemId, PositionBillConstant.NCKD_ADMINORGBOID_KEY, Maps.newHashMapWithExpectedSize(0)});
+        AuthorizedOrgResult permResult = HRMServiceHelper.invokeHRMPService(PositionBillConstant.HRCS_APP, "IHRCSBizDataPermissionService", "getUserAdminOrgsF7", new Object[]{userId, appId, PositionBillConstant.NCKD_POSITIONBILL_ENTITY, permItemId, PositionBillConstant.NCKD_ADMINORGBOID_KEY, Maps.newHashMapWithExpectedSize(0)});
         return permResult;
     }