Jelajahi Sumber

feat(swc): 新增年收入统计单校验及废弃功能

Tyx 17 jam lalu
induk
melakukan
86f8824b2e

+ 47 - 4
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/annualincome/AnnualIncomeCalculateService.java

@@ -11,6 +11,7 @@ import kd.bos.servicehelper.operation.SaveServiceHelper;
 import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -54,7 +55,31 @@ public class AnnualIncomeCalculateService {
         // 取业务数据提报中的数据
         Map<Long, Map<Long, String>> bizData = getBizData(bizItemMap);
         // 处理页面数据
-        return dealData(fileMap, employeeIds, incomeBillData, bizItemMap, bizData);
+        int successCount = dealData(fileMap, employeeIds, incomeBillData, bizItemMap, bizData);
+        // 更新年收入统计单状态
+        updateSalIncomeBillStatus(incomeBillData.keySet());
+
+        return successCount;
+    }
+
+    /**
+     * 更新年收入统计单状态
+     * @param employeeIds
+     */
+    private void updateSalIncomeBillStatus(Set<Long> employeeIds) {
+        QFilter filter = new QFilter("nckd_entryentity.nckd_employee.id", QCP.in, employeeIds);
+        filter.and("nckd_calyear", QCP.equals, year);
+        filter.and("nckd_entryentity.nckd_pushstatus", QCP.equals, "0");
+        DynamicObject[] billDyns = SitConstant.SALINCOMEBILL_HELPER.load(SitConstant.SALINCOMEBILL_SELECTFIELDS, new QFilter[]{filter});
+        for(DynamicObject bill : billDyns) {
+            DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+            for (DynamicObject entry : entryCols) {
+                if(employeeIds.contains(entry.getLong("nckd_employee.id"))) {
+                    entry.set("nckd_pushstatus", "1");
+                }
+            }
+        }
+        SitConstant.SALINCOMEBILL_HELPER.update(billDyns);
     }
 
     /**
@@ -83,12 +108,15 @@ public class AnnualIncomeCalculateService {
 
             BigDecimal amount1 = BigDecimal.ZERO;
             BigDecimal amount2 = BigDecimal.ZERO;
+            BigDecimal month1 = BigDecimal.ZERO;
+            BigDecimal month2 = BigDecimal.ZERO;
 
             Map incomeBillMap = incomeBillData.get(employeeId);
             if(!ObjectUtils.isEmpty(incomeBillMap)) {
                 dyn.set("nckd_sysmonth", incomeBillMap.get("totalMonth"));
                 dyn.set("nckd_sysyearamount", incomeBillMap.get("totalAmount"));
                 amount1 = (BigDecimal) incomeBillMap.get("totalAmount");
+                month1 = BigDecimal.valueOf((int) incomeBillMap.get("totalMonth"));
             }
             Map<Long, String> bizDataMap = bizData.get(employeeId);
             if(!ObjectUtils.isEmpty(bizDataMap)) {
@@ -98,6 +126,7 @@ public class AnnualIncomeCalculateService {
                         case "nckd_outmonth":
                             int month = Integer.parseInt(bizDataMap.get(bizItemId));
                             dyn.set(matchKey, month);
+                            month2 = new BigDecimal(month);
                             break;
                         case "nckd_outyearamount":
                             BigDecimal amount = new BigDecimal(bizDataMap.get(bizItemId));
@@ -107,8 +136,9 @@ public class AnnualIncomeCalculateService {
                     }
                 }
             }
-            // 申报年度社保缴费基数
-            dyn.set("nckd_totalamount", amount1.add(amount2));
+            // 申报年度社保缴费基数 = (江铜内年度收入 + 江铜外年度收入) / (江铜内发放月数 + 外单位发放月数)
+            BigDecimal totalAmount = calculateTotalAmount(amount1, amount2, month1, month2);
+            dyn.set("nckd_totalamount", totalAmount);
             billCols.add(dyn);
         }
         // 保存数据
@@ -118,6 +148,18 @@ public class AnnualIncomeCalculateService {
     }
 
 
+    public BigDecimal calculateTotalAmount (BigDecimal amount1,BigDecimal amount2, BigDecimal month1, BigDecimal month2) {
+        // 分子
+        BigDecimal numerator = amount1.add(amount2);
+        // 分母
+        BigDecimal denominator = month1.add(month2);
+        if (denominator.compareTo(BigDecimal.ZERO) == 0) {
+            // 分母为零,无法进行除法运算,返回 null 作为一种信号
+            return BigDecimal.ZERO;
+        }
+        return numerator.divide(denominator, 2, RoundingMode.HALF_UP);
+    }
+
     /**
      * 获取计薪人员ID
      * @return
@@ -143,13 +185,14 @@ public class AnnualIncomeCalculateService {
 
     /**
      * 获取薪酬模块-年收入统计中的数据
-     *
+     * 只取 推送状态 = 社保未拉取 的数据
      * @param employeeIds
      * @return
      */
     public Map<Long, Map> getSalIncomeBillData(Set<Long> employeeIds) {
         QFilter filter = new QFilter("nckd_entryentity.nckd_employee.id", QCP.in, employeeIds);
         filter.and("nckd_calyear", QCP.equals, year);
+        filter.and("nckd_entryentity.nckd_pushstatus", QCP.equals, "0");
         DynamicObjectCollection cols = SitConstant.SALINCOMEBILL_HELPER.queryOriginalCollection(SitConstant.SALINCOMEBILL_SELECTFIELDS, new QFilter[]{filter});
 
         //按照人员汇总

+ 1 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/common/constant/SitConstant.java

@@ -10,7 +10,7 @@ public class SitConstant {
     /*薪酬年收入统计单*/
     public static final HRBaseServiceHelper SALINCOMEBILL_HELPER = new HRBaseServiceHelper("nckd_salannualincomebill");
     /*查询字段*/
-    public static final String SALINCOMEBILL_SELECTFIELDS = "nckd_entryentity.nckd_employee,nckd_entryentity.nckd_month,nckd_entryentity.nckd_totalsalary";
+    public static final String SALINCOMEBILL_SELECTFIELDS = "nckd_entryentity.nckd_employee,nckd_entryentity.nckd_month,nckd_entryentity.nckd_totalsalary,nckd_entryentity.nckd_pushstatus";
     /*社保年收入统计单*/
     public static final HRBaseServiceHelper SITINCOMEBILL_HELPER = new HRBaseServiceHelper("nckd_sitannualincomebill");
     /*业务数据提报*/

+ 2 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/constants/SwcConstant.java

@@ -16,4 +16,6 @@ public class SwcConstant {
     public static final HRBaseServiceHelper CALTABLE_ENTITY = new HRBaseServiceHelper("hsas_caltable");
     /* 单位代发单 */
     public static final HRBaseServiceHelper AGENCYPAYBILL_ENTITY = new HRBaseServiceHelper("nckd_agencypaybill");
+    /* 年收入统计单 */
+    public static final HRBaseServiceHelper SALANNUALINCOMEBILL_ENTITY = new HRBaseServiceHelper("nckd_salannualincomebill");
 }

+ 25 - 4
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/business/annualincome/AnnualIncomeService.java

@@ -13,7 +13,6 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRQueryEntityHelper;
 import kd.sdk.swc.hsas.business.internal.spi.CalResultQueryService;
-import kd.swc.hsbp.common.constants.SWCBaseConstants;
 import nckd.jxccl.swc.constants.SwcConstant;
 
 import java.util.*;
@@ -69,9 +68,11 @@ public class AnnualIncomeService {
     private List<Long> queryCalPayRollTaskByPayRollGroup () {
         logger.info("开始查询核算任务数据,参数:{},{},{}", groupId, startDate, endDate);
         QFilter filter = new QFilter("payrollgroup.id", QCP.equals, groupId);
-        filter.and("payrolldate", QCP.large_equals, startDate);
-        filter.and("payrolldate", QCP.less_equals, endDate);
-        DynamicObject[] taskCols = queryCalPayRollTaskByPayRollGroup("id, payrolldate, payrollgroup", filter.toArray());
+        // 2025-11-25 Tyx
+        // 由payrolldate薪资所属年月 改为 paydate预计支付日期
+        filter.and("paydate", QCP.large_equals, startDate);
+        filter.and("paydate", QCP.less_equals, endDate);
+        DynamicObject[] taskCols = queryCalPayRollTaskByPayRollGroup("id, paydate, payrolldate, payrollgroup", filter.toArray());
         List<Long> taskIds = (List) Arrays.stream(taskCols).map((o) -> {
             return o.getLong("id");
         }).collect(Collectors.toList());
@@ -104,4 +105,24 @@ public class AnnualIncomeService {
         return calPersonCols;
     }
 
+    /**
+     * 查询年收入的人员ID,后续排除用
+     * @return
+     */
+    public List<Long> queryIncomeBillEmployeeId() {
+        QFilter filter = new QFilter("nckd_payrollgrp.id", QCP.equals, this.groupId);
+        filter.and("nckd_calyear", QCP.equals, startDate);
+        filter.and("nckd_entryentity.nckd_pushstatus", QCP.not_equals2 , "3");  // 不等于废弃
+        String selectFields = "nckd_entryentity.nckd_employee.id";
+        DynamicObjectCollection dyns = SwcConstant.SALANNUALINCOMEBILL_ENTITY.queryOriginalCollection(selectFields, filter.toArray());
+
+        return dyns.stream().map((o) -> {
+            return o.getLong("nckd_entryentity.nckd_employee.id");
+        }).collect(Collectors.toList());
+
+    }
+
+
+
+
 }

+ 40 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/agencybill/AgencyBillEdit.java

@@ -3,11 +3,13 @@ package nckd.jxccl.swc.hcdm.formplugin.agencybill;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.resource.ResManager;
+import kd.bos.dataentity.utils.ObjectUtils;
 import kd.bos.entity.datamodel.IDataModel;
 import kd.bos.entity.datamodel.ListSelectedRowCollection;
 import kd.bos.form.CloseCallBack;
 import kd.bos.form.ShowFormHelper;
 import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.events.ClosedCallBackEvent;
 import kd.bos.form.operate.FormOperate;
 import kd.bos.list.ListFilterParameter;
@@ -128,6 +130,42 @@ public class AgencyBillEdit extends SWCBaseFormPlugin implements Plugin {
     }
 
 
+
+
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate formOperate = (FormOperate)args.getSource();
+        String key = formOperate.getOperateKey();
+        switch (key) {
+            case "add_adjfile":
+                beforeAddAdjFileVerify(args);
+                break;
+        }
+    }
+
+    /**
+     * 添加代发人员前校验
+     * 必须选择完薪资核算组和组织
+     */
+    private void beforeAddAdjFileVerify(BeforeDoOperationEventArgs args) {
+        DynamicObject dyn = this.getModel().getDataEntity();
+        DynamicObject org = dyn.getDynamicObject("org");
+        DynamicObject parRollGroup = dyn.getDynamicObject("nckd_payrollgroup");
+
+        if(ObjectUtils.isEmpty(org)) {
+            args.setCancel(true);
+            this.getView().showTipNotification("请先选择组织!");
+        }
+
+        if(ObjectUtils.isEmpty(parRollGroup)) {
+            args.setCancel(true);
+            this.getView().showTipNotification("请先选择薪资核算组!");
+        }
+
+    }
+
     @Override
     public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
         super.afterDoOperation(afterDoOperationEventArgs);
@@ -151,7 +189,9 @@ public class AgencyBillEdit extends SWCBaseFormPlugin implements Plugin {
 
         Date effectiveDate = new Date();
         long orgId = this.getModel().getDataEntity().getLong("org.id");
+        long payRollGrpId = this.getModel().getDataEntity().getLong("nckd_payrollgroup.id");
         qFilters.add(new QFilter("org.id", QCP.equals, orgId));
+        qFilters.add(new QFilter("payrollgroup.id", QCP.equals, payRollGrpId));
         if (effectiveDate != null) {
             formShowParameter.setCustomParam("effectiveDate", SWCDateTimeUtils.format(effectiveDate, "yyyy-MM-dd"));
         }

+ 5 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/annualincome/SalAnnualIncomeBillEdit.java

@@ -108,10 +108,14 @@ public class SalAnnualIncomeBillEdit extends AbstractFormPlugin implements Plugi
         }));
         // 按照employeeId提取出来
         List<Map<String, Object>> finalResult = dealGroupData(unionMap);
-
+        // 排除人员ID
+        List<Long> excludeEmployeeId = service.queryIncomeBillEmployeeId();
 
         // 界面赋值
         for (Map map : finalResult) {
+            if(excludeEmployeeId.contains(map.get("employeeId"))) {
+                continue;
+            }
             int rowIndex = model.createNewEntryRow("nckd_entryentity");
             model.setValue("nckd_employee", map.get("employeeId"), rowIndex);
             model.setValue("nckd_idcardno", map.get("idCardNo"), rowIndex);

+ 68 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/annualincome/SalAnnualIncomeBillList.java

@@ -0,0 +1,68 @@
+package nckd.jxccl.swc.hcdm.formplugin.annualincome;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.IFormView;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.list.IListView;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QFilter;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.swc.constants.SwcConstant;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Tyx 2025-11-25
+ * 年收入证明统计单列表插件 【nckd_salinnualincomebill】
+ */
+public class SalAnnualIncomeBillList extends AbstractListPlugin implements Plugin {
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        String key = afterDoOperationEventArgs.getOperateKey();
+        switch (key) {
+            case "donothing_discard":
+                doDiscardByRow();
+                break;
+        }
+    }
+
+    /**
+     * 按行废弃
+     */
+    private void doDiscardByRow() {
+        IFormView view = this.getView();
+        IListView listview = (IListView) this.getView();
+        ListSelectedRowCollection selectedRows = listview.getSelectedRows();
+        Object[] entryIds = selectedRows.getEntryPrimaryKeyValues();
+
+        List<Long> entryIdsList = Arrays.stream(entryIds).map(obj -> {
+            return (Long) obj;
+        }).collect(Collectors.toList());
+
+        QFilter filter = new QFilter("nckd_entryentity.id", "in", entryIdsList);
+        DynamicObject[] billDyns = SwcConstant.SALANNUALINCOMEBILL_ENTITY.load("nckd_entryentity.nckd_pushstatus", filter.toArray());
+        for(DynamicObject bill : billDyns) {
+            DynamicObjectCollection entryDyns = bill.getDynamicObjectCollection("nckd_entryentity");
+            for(DynamicObject entry : entryDyns) {
+                if(entryIdsList.contains(entry.getLong("id"))) {
+                    entry.set("nckd_pushstatus", "3");
+                }
+            }
+        }
+        SwcConstant.AGENCYPAYBILL_ENTITY.update(billDyns);
+        view.showSuccessNotification("废弃成功!");
+        view.invokeOperation("refresh");
+    }
+}