Преглед изворни кода

feat(hr): 新增离职申请相关功能模块

- 新增离职申请单常量类 QuitApplyConstant,定义相关业务常量
- 新增离职申请表单插件 QuitApplyFormPlugin,处理离职日期变更逻辑
- 新增离职申请列表插件 QuitApplyListPlugin,过滤退休与离职数据
- 新增离职协作基础列表插件 QuitCoopBaseListPlugin,区分退休与离职协作数据
- 新增退休申请列表插件 RetireApplyBaseBillListPlugin,支持退休申请跳转
- 移除 build.gradle 中重复的 odc 模块依赖配置
- 更新 settings.gradle 移除 odc 模块引用
- 更新项目打包配置移除 odc 相关 jar 包包含
- 为组织复制与调整插件添加实体注解标识
jtd пре 6 дана
родитељ
комит
e0b932e680
19 измењених фајлова са 321 додато и 14 уклоњено
  1. 0 1
      build.gradle
  2. 1 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/plugin/form/orgbatch/AdminOrgCopyDialogFormPlugin.java
  3. 1 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/plugin/form/orgbatch/OrgBatchChgBillListPlugin.java
  4. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/business/.gitkeep
  5. 22 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/common/AppflgConstant.java
  6. 81 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/common/quitapply/QuitApplyConstant.java
  7. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/mservice/.gitkeep
  8. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/.gitkeep
  9. 106 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitApplyFormPlugin.java
  10. 36 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitApplyListPlugin.java
  11. 35 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitCoopBaseListPlugin.java
  12. 39 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/RetireApplyBaseBillListPlugin.java
  13. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/operate/.gitkeep
  14. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/other/.gitkeep
  15. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/report/.gitkeep
  16. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/workflow/.gitkeep
  17. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/webapi/.gitkeep
  18. 0 8
      code/nckd-cosmic-debug/build.gradle
  19. 0 5
      settings.gradle

+ 0 - 1
build.gradle

@@ -147,7 +147,6 @@ subprojects {
       description '生成hr zip包'
       from outputdir
       include 'nckd-jxccl-hr*.jar'
-      include 'nckd-jxccl-odc*.jar'
       include 'nckd-jxccl-opmc*.jar'
       destinationDirectory = file(zip)
       archiveFileName = "nckd-hr.zip"

+ 1 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/plugin/form/orgbatch/AdminOrgCopyDialogFormPlugin.java

@@ -11,6 +11,7 @@ import java.util.EventObject;
 
 /**
  * 组织复制弹窗表单插件
+ * @entity: nckd_adminorgcopydialog
  * @author: jtd
  * @date: 2025-09-26 16:35
  */

+ 1 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/plugin/form/orgbatch/OrgBatchChgBillListPlugin.java

@@ -15,6 +15,7 @@ import nckd.jxccl.hr.homs.common.orgbatch.OrgBatchConstant;
 
 /**
  * 组织调整申请界面插件
+ * @entity: nckd_homs_orgbatchchg_ext
  * @author: jtd
  * @date: 2025-09-26 15:16
  */

+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/business/.gitkeep


+ 22 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/common/AppflgConstant.java

@@ -0,0 +1,22 @@
+/**
+ * This is a kingdee cosmic template project that is automatically generated by the Kingdee cosmic development assistant plugin. 
+ * If there are any issues during the use process, you can provide feedback to the kingdee developer community website.
+ * Website: https://developer.kingdee.com/developer?productLineId=29
+ * Author: liebin.zheng
+ * Generate Date: 2025-05-26 16:28:10
+ */
+package nckd.jxccl.hr.htm.common;
+
+/**
+ * hr云init应用-通用常量类<br>
+ * 代码中不能存在硬编码敏感信息,如账号、密码、http外链、ftp外链、邮箱等。<br>
+ * 标识或缓存的常量,需以"KEY_"、"FID_"、"ENTRY_"或"SUBENTRY_"作为变量的前缀。<br>
+ *
+ * @author nckd
+ * @date 2025-05-26 16:28:10
+ */
+public class AppflgConstant {
+	
+	public static final String KEY_APP_NAME = "hr-init";
+
+}

+ 81 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/common/quitapply/QuitApplyConstant.java

@@ -0,0 +1,81 @@
+package nckd.jxccl.hr.htm.common.quitapply;
+
+import nckd.jxccl.base.common.constant.FormConstant;
+
+/**
+ * 退出申请单常量
+ * @author: jtd
+ * @date: 2025/11/18 17:44
+ */
+public class QuitApplyConstant extends FormConstant {
+
+    /** 退休变动操作编码 */
+    public static final String RETIRE_AFFACTION_NUMBER = "101200_S";
+
+    /** 离职申请单标识 */
+    public static final String HTM_QUITAPPLYBASEBILL_ENTITY = "htm_quitapplybasebill";
+
+    /** 离职办理单 */
+    public static final String HTM_QUITHANDLE_ENTITY = "htm_quithandle";
+
+    /** 退休申请单标识 */
+    public static final String NCKD_RETIREAPPLYBASEBILL_ENTITYID = "nckd_retireapplybasebill";
+
+    /** 变动操作 */
+    public static final String AFFACTION_KEY = "affaction";
+
+    /** 新增待办申请 */
+    public static final String RETIRE_APPLE_OP = "retire_apple";
+
+    /** 退休申请单标识 */
+    public static final String NCKD_RETIREAPPLY_ENTITY = "nckd_retireapply";
+
+    /** 退休办理单标识 */
+    public static final String NCKD_RETIREHANDLER_ENTITY = "nckd_retirehandler";
+
+    /** 离职协作处理页面标识 */
+    public static final String HTM_COOPHANDLE_ENTITY = "htm_coophandle";
+
+    /** 离职协作管理页面标识 */
+    public static final String HTM_COOPMANAGE_ENTITY = "htm_coopmanage";
+
+    /** 退休协作处理页面标识 */
+    public static final String NCKD_RETIRE_COOPHANDLE_ENTITY = "nckd_retire_coophandle";
+
+    /** 退休协作管理页面标识 */
+    public static final String NCKD_RETIRE_COOPMANAGE_ENTITY = "nckd_retire_coopmanage";
+
+    /** 离职申请单 */
+    public static final String QUITAPPLY_KEY = "quitapply";
+
+    /** 离职日期 */
+    public static final String CONTRACTENDDATE_KEY = "contractenddate";
+
+    /** 离职人员 */
+    public static final String BB_EM_TID_KEY = "bb_em_tid";
+
+    /** 应休未休剩余年假 */
+    public static final String NCKD_UNUSEDANNUALLEAVE_KEY = "nckd_unusedannualleave";
+
+    /** 可用时长 */
+    public static final String USABLEVALUE_KEY = "usablevalue";
+
+    /** 是否还在培养协议期内 */
+    public static final String NCKD_TRAINING_AGMT_STAT_KEY = "nckd_training_agmt_stat";
+
+    /** 其他附属协议记录 */
+    public static final String HLCM_CONTRACTFILEOTHER_ENTITY = "hlcm_contractfileother";
+
+    /** 合同类型 */
+    public static final String CONTRACTTYPE_KEY = "contracttype";
+
+    /** 合同开始日期 */
+    public static final String STARTDATE_KEY = "startdate";
+
+    /** 合同计划结束日期 */
+    public static final String PLANENDDATE_KEY = "planenddate";
+
+    /** 合同状态 */
+    public static final String CONTRACTSTATUS_KEY = "contractstatus";
+
+}

+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/mservice/.gitkeep


+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/.gitkeep


+ 106 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitApplyFormPlugin.java

@@ -0,0 +1,106 @@
+package nckd.jxccl.hr.htm.plugin.form.quitapply;
+
+import kd.bos.common.enums.EnableEnum;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.sdk.wtc.wtp.business.attfile.AttFileVersion;
+import kd.sdk.wtc.wtp.business.helper.WTPServiceHelper;
+import kd.sdk.wtc.wtp.business.quota.QuotaQueryParam;
+import nckd.jxccl.hr.htm.common.quitapply.QuitApplyConstant;
+
+import java.time.ZoneId;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 离职申请单表单插件
+ * @entity: nckd_htm_quitapply_ext
+ * @author: jtd
+ * @date: 2025/11/18 22:53
+ */
+public class QuitApplyFormPlugin extends AbstractFormPlugin {
+
+    /** 培养协议合同类型编码 */
+    private static final String CONTRACTTYPE_NUMBER = "JT01";
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+
+        String propertyName = e.getProperty().getName();
+        Object newValue = e.getChangeSet()[0].getNewValue();
+        if (QuitApplyConstant.CONTRACTENDDATE_KEY.equals(propertyName)) {
+            DynamicObject quitPersonDy = (DynamicObject) getModel().getValue(QuitApplyConstant.BB_EM_TID_KEY);
+            Date contractEndDate = (Date) newValue;
+            if (quitPersonDy == null || contractEndDate == null) {
+                getModel().setValue(QuitApplyConstant.NCKD_UNUSEDANNUALLEAVE_KEY, 0);
+                return;
+            }
+            Long employeeId = quitPersonDy.getLong(QuitApplyConstant.ID_KEY);
+            setUnUsedAnnualLeave(employeeId, contractEndDate);
+            setTrainingAgmtStat(employeeId, contractEndDate);
+        }
+    }
+
+    /**
+     * 设置应休未休剩余年假
+     * @param employeeId 离职人员
+     * @param contractEndDate 离职日期
+     */
+    private void setUnUsedAnnualLeave(Long employeeId, Date contractEndDate) {
+        // 获取人员考勤档案
+        AttFileVersion attFile = WTPServiceHelper.getAttFile(contractEndDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), employeeId);
+        if (attFile == null) {
+            getView().showTipNotification("未获取到应休未休剩余年假,请检查离职人员是否存在离职时间内有效的考勤档案");
+            return;
+        }
+
+        // 查询应休未休剩余年假
+        QuotaQueryParam quotaQueryParam = new QuotaQueryParam();
+        // 考勤档案
+        quotaQueryParam.setAttFileBoId(attFile.getBoId());
+        // 休假类型
+        quotaQueryParam.setQuotaTypeIdList(Collections.singletonList(1427605179489846272L));
+        // 仅使用范围过滤
+        quotaQueryParam.setRangQueryType(0);
+        // 开始时间
+        quotaQueryParam.setStartDate(contractEndDate);
+        // 结束时间
+        quotaQueryParam.setEndDate(contractEndDate);
+        List<DynamicObject> quotaList = WTPServiceHelper.queryQuota(quotaQueryParam);
+        if (quotaList != null && !quotaList.isEmpty()) {
+            DynamicObject quotaDy = quotaList.get(0);
+            getModel().setValue(QuitApplyConstant.NCKD_UNUSEDANNUALLEAVE_KEY, quotaDy.getBigDecimal(QuitApplyConstant.USABLEVALUE_KEY));
+        } else {
+            getModel().setValue(QuitApplyConstant.NCKD_UNUSEDANNUALLEAVE_KEY, 0);
+        }
+    }
+
+    /**
+     * 设置是否还在培养协议期内
+     * @param employeeId
+     * @param contractEndDate
+     */
+    private void setTrainingAgmtStat(Long employeeId, Date contractEndDate) {
+        // 过滤员工
+        QFilter qFilter = new QFilter(String.format("%s.id", QuitApplyConstant.EMPLOYEE_KEY), QCP.equals, employeeId);
+        // 过滤合同类型
+        qFilter.and(new QFilter(String.format("%s.number", QuitApplyConstant.CONTRACTTYPE_KEY), QCP.equals, CONTRACTTYPE_NUMBER));
+        // 过滤日期
+        qFilter.and(new QFilter(QuitApplyConstant.STARTDATE_KEY, QCP.less_equals, contractEndDate));
+        qFilter.and(new QFilter(QuitApplyConstant.PLANENDDATE_KEY, QCP.large_equals, contractEndDate));
+        // 过滤状态
+        qFilter.and(new QFilter(QuitApplyConstant.CONTRACTSTATUS_KEY, QCP.equals, EnableEnum.YES.getCode()));
+        boolean exists = QueryServiceHelper.exists(QuitApplyConstant.HLCM_CONTRACTFILEOTHER_ENTITY, new QFilter[]{qFilter});
+        if (exists) {
+            getModel().setValue(QuitApplyConstant.NCKD_TRAINING_AGMT_STAT_KEY, Boolean.TRUE);
+        } else {
+            getModel().setValue(QuitApplyConstant.NCKD_TRAINING_AGMT_STAT_KEY, Boolean.FALSE);
+        }
+    }
+}

+ 36 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitApplyListPlugin.java

@@ -0,0 +1,36 @@
+package nckd.jxccl.hr.htm.plugin.form.quitapply;
+
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.mvc.list.ListView;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import nckd.jxccl.hr.htm.common.quitapply.QuitApplyConstant;
+
+/**
+ * 离职申请列表插件
+ * @entity: nckd_htm_quitapplybb_ext
+ * @author: jtd
+ * @date: 2025/11/18 15:40
+ */
+public class QuitApplyListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+
+        // 获取表单标识
+        String billFormId = ((ListView) getView()).getBillFormId();
+
+        // 离职申请列表和离职办理列表过滤掉退休数据
+        if (QuitApplyConstant.HTM_QUITAPPLYBASEBILL_ENTITY.equals(billFormId) || QuitApplyConstant.HTM_QUITHANDLE_ENTITY.equals(billFormId)) {
+            e.addCustomQFilter(new QFilter(String.format("%s.number", QuitApplyConstant.AFFACTION_KEY), QCP.not_equals, QuitApplyConstant.RETIRE_AFFACTION_NUMBER));
+        }
+
+        // 退休申请列表和退休办理列表过滤掉离职数据
+        if (QuitApplyConstant.NCKD_RETIREAPPLYBASEBILL_ENTITYID.equals(billFormId) || QuitApplyConstant.NCKD_RETIREHANDLER_ENTITY.equals(billFormId)) {
+            e.addCustomQFilter(new QFilter(String.format("%s.number", QuitApplyConstant.AFFACTION_KEY), QCP.equals, QuitApplyConstant.RETIRE_AFFACTION_NUMBER));
+        }
+    }
+
+}

+ 35 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitCoopBaseListPlugin.java

@@ -0,0 +1,35 @@
+package nckd.jxccl.hr.htm.plugin.form.quitapply;
+
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.mvc.list.ListView;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import nckd.jxccl.hr.htm.common.quitapply.QuitApplyConstant;
+
+/**
+ * 离职协作基础页面列表插件
+ * @entity: nckd_htm_coopbase_ext
+ * @author: jtd
+ * @date: 2025/11/18 21:44
+ */
+public class QuitCoopBaseListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+
+        // 获取表单标识
+        String billFormId = ((ListView) getView()).getBillFormId();
+
+        // 离职协作处理页面列表和离职协作管理页面列表过滤掉退休数据
+        if (QuitApplyConstant.HTM_COOPHANDLE_ENTITY.equals(billFormId) || QuitApplyConstant.HTM_COOPMANAGE_ENTITY.equals(billFormId)) {
+            e.addCustomQFilter(new QFilter(String.format("%s.%s.number", QuitApplyConstant.QUITAPPLY_KEY, QuitApplyConstant.AFFACTION_KEY), QCP.not_equals, QuitApplyConstant.RETIRE_AFFACTION_NUMBER));
+        }
+
+        // 退休协作处理页面列表和退休协作管理页面列表过滤掉离职数据
+        if (QuitApplyConstant.NCKD_RETIRE_COOPHANDLE_ENTITY.equals(billFormId) || QuitApplyConstant.NCKD_RETIRE_COOPMANAGE_ENTITY.equals(billFormId)) {
+            e.addCustomQFilter(new QFilter(String.format("%s.%s.number", QuitApplyConstant.QUITAPPLY_KEY, QuitApplyConstant.AFFACTION_KEY), QCP.equals, QuitApplyConstant.RETIRE_AFFACTION_NUMBER));
+        }
+    }
+}

+ 39 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/RetireApplyBaseBillListPlugin.java

@@ -0,0 +1,39 @@
+package nckd.jxccl.hr.htm.plugin.form.quitapply;
+
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.HyperLinkClickArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.hr.htm.formplugin.common.QuitPageUtils;
+import nckd.jxccl.hr.htm.common.quitapply.QuitApplyConstant;
+
+/**
+ * 退休申请列表插件
+ * @entity: nckd_retireapplybasebill
+ * @author: jtd
+ * @date: 2025/11/18 19:40
+ */
+public class RetireApplyBaseBillListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+
+        if (afterDoOperationEventArgs.getOperationResult() != null && afterDoOperationEventArgs.getOperationResult().isSuccess()) {
+            // 新增退休待办申请
+            if (StringUtils.equals(QuitApplyConstant.RETIRE_APPLE_OP,afterDoOperationEventArgs.getOperateKey())) {
+                QuitPageUtils.showNewAddPage(this.getView(), QuitApplyConstant.NCKD_RETIREAPPLY_ENTITY, "新增代退休申请");
+            }
+        }
+    }
+
+    @Override
+    public void billListHyperLinkClick(HyperLinkClickArgs args) {
+        super.billListHyperLinkClick(args);
+
+        // 自定义超链接点击事情处理
+        args.setCancel(Boolean.TRUE);
+        // 打开退休申请表单
+        QuitPageUtils.showPage(getView(), QuitApplyConstant.NCKD_RETIREAPPLY_ENTITY, getFocusRowPkId(), "", null);
+    }
+}

+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/operate/.gitkeep


+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/other/.gitkeep


+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/report/.gitkeep


+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/workflow/.gitkeep


+ 0 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/webapi/.gitkeep


+ 0 - 8
code/nckd-cosmic-debug/build.gradle

@@ -28,18 +28,10 @@ dependencies {
 	implementation project(':nckd-jxccl-opmc')
 
 
-	// 引入odc云模块
-	implementation project(':nckd-jxccl-odc')
-
-
 	// 引入wtc云模块
 	implementation project(':nckd-jxccl-wtc')
 
 
-	// 引入odc云模块
-	implementation project(':nckd-jxccl-odc')
-
-
 	// 引入hrmp云模块
 	implementation project(':nckd-jxccl-hrmp')
 

+ 0 - 5
settings.gradle

@@ -20,8 +20,6 @@ include(
 
 		':nckd-jxccl-opmc',
 
-		':nckd-jxccl-odc',
-
 		':nckd-jxccl-hrmp',
 
         ':nckd-jxccl-wtc',
@@ -46,9 +44,6 @@ project(':nckd-jxccl-rpt').projectDir = new File('code/rpt/nckd-jxccl-rpt')
 // -------------- 引入opmc云模块 --------------
 project(':nckd-jxccl-opmc').projectDir = new File('code/opmc/nckd-jxccl-opmc')
 
-// -------------- 引入odc云模块 --------------
-project(':nckd-jxccl-odc').projectDir = new File('code/odc/nckd-jxccl-odc')
-
 // -------------- 引入wtc云模块 --------------
 project(':nckd-jxccl-wtc').projectDir = new File('code/wtc/nckd-jxccl-wtc')