Browse Source

feat(swc): 新增薪资核算组选择与更新功能

- 在 AgencyBillEdit 中新增员工主任职信息查询逻辑
- 在 AgencyBillList 中实现薪资核算组的选择与批量更新功能
- 修改 IncomeBatchAddnewEdit 支持表头薪资核算组多选
- 新增 SalAnnualIncomeUpdatePlugin 插件处理年度收入确认更新
- 优化 SWCHelper 工具类,增加查询员工主任职方法
- 调整 SwcUtils 中薪资核算组ID获取逻辑以支持多选结构
Tyx 3 days ago
parent
commit
4236affc53

+ 18 - 4
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/SWCHelper.java

@@ -12,10 +12,7 @@ import kd.bos.servicehelper.QueryServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import nckd.jxccl.base.common.constant.FormConstant;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -194,6 +191,23 @@ public class SWCHelper {
         return employeesFiles;
     }
 
+
+    /**
+     * 根据employeeId查询主任职
+     *
+     * @param employeeId
+     * @return
+     */
+    public static DynamicObject[] queryEmpPosOrgRelDyns (List<Long> employeeId) {
+        QFilter filter = new QFilter("iscurrentdata", QCP.equals, "1"); // 启用
+        filter.and(new QFilter("employee.id", QCP.in, employeeId));
+
+        String selectFields1 = "employee.id,adminorg.id,adminorg.belongcompany.id";
+        DynamicObject[] empposorgreDyns = BusinessDataServiceHelper.load("hrpi_empposorgrel", selectFields1, filter.toArray());
+
+        return empposorgreDyns;
+    }
+
     /**
      * 判断集合是否为空
      * @param list

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

@@ -20,6 +20,7 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.swc.helper.SWCHelper;
 import nckd.jxccl.swc.constants.SwcConstant;
 
 import java.time.LocalDate;
@@ -105,11 +106,22 @@ public class AgencyBillEdit extends AbstractFormPlugin implements Plugin {
             return key2;
         }));
 
+        // 获取到人员主任职
+        List<Long> employeeId = Arrays.stream(calPersonDyns).map(dyx -> dyx.getLong("employee.id")).collect(Collectors.toList());
+        DynamicObject[] empposorgrelDyns = SWCHelper.queryEmpPosOrgRelDyns(employeeId);
+        Map<Long, DynamicObject> empposorgrelMap = Arrays.stream(empposorgrelDyns).collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("employee.id");
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
 
         for (Object calPerson : calPersonIds) {
             DynamicObject row = entryCols.addNew();
             Long calPersonId = Long.valueOf(calPerson.toString());
             row.set("nckd_employee", calPersonMap.get(calPersonId).getDynamicObject("employee"));
+            row.set("nckd_eorg", empposorgrelMap.get(row.getLong("nckd_employee.id")).getDynamicObject("adminorg.belongcompany"));
             row.set("nckd_adminorg", calPersonMap.get(calPersonId).getDynamicObject("empposorgrelsndet.adminorg"));
             row.set("nckd_payrollgrp", model.getValue("nckd_payrollgroup"));
             row.set("nckd_belongdate", date);

+ 62 - 4
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/agencybill/AgencyBillList.java

@@ -4,15 +4,13 @@ import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.utils.StringUtils;
 import kd.bos.entity.datamodel.ListSelectedRowCollection;
-import kd.bos.form.CloseCallBack;
-import kd.bos.form.FormShowParameter;
-import kd.bos.form.IFormView;
-import kd.bos.form.ShowType;
+import kd.bos.form.*;
 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.IListView;
+import kd.bos.list.ListShowParameter;
 import kd.bos.list.plugin.AbstractListPlugin;
 import kd.bos.orm.query.QFilter;
 import nckd.jxccl.swc.constants.SwcConstant;
@@ -37,8 +35,41 @@ public class AgencyBillList extends AbstractListPlugin {
         if (StringUtils.equals(opKey, "donothing_batchupdate")) {
             this.openBatchUpdateWindow(args);
         }
+        else if (StringUtils.equals(opKey, "donothing_selectorg")) {
+            this.doSelectOrg(args);
+        }
+    }
+
+    public void doSelectOrg (BeforeDoOperationEventArgs args) {
+        //创建弹出列表界面对象,ListShowParameter 表示弹出页面为列表界面
+        ListShowParameter listShowParameter = new ListShowParameter();
+        //设置F7列表表单模板
+        listShowParameter.setFormId("hbp_hislistf7");
+        //设置BillFormId为基础资料的标识
+        listShowParameter.setBillFormId("hsas_payrollgrp");
+        //设置弹出页面标题
+        listShowParameter.setCaption("薪资核算组选择界面");
+        //设置弹出页面的打开方式
+        listShowParameter.getOpenStyle().setShowType(ShowType.Modal);
+        //设置打开页面的大小
+        StyleCss inlineStyleCss = new StyleCss();
+        inlineStyleCss.setHeight("580");
+        inlineStyleCss.setWidth("960");
+        listShowParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
+        //LookUp必须为true,该界面才是可选界面
+        listShowParameter.setLookUp(true);
+        //是否只显示审核的数据
+        listShowParameter.setShowApproved(true);
+        //是否只显示只启用的数据
+        listShowParameter.setShowUsed(true);
+        //设置子页面关闭回调参数,回调标识为XXX setControlKey用来设置f7选择的数据返回给哪个字段
+        CloseCallBack closeCallBack = new CloseCallBack(this, "selectorg");
+        listShowParameter.setCloseCallBack(closeCallBack);
+        //弹出F7选择界面
+        this.getView().showForm(listShowParameter);
     }
 
+
     /**
      *
      * @param args
@@ -91,6 +122,33 @@ public class AgencyBillList extends AbstractListPlugin {
             }
             view.invokeOperation("refresh");
         }
+        else if ("selectorg".equals(actionId)) {
+            ListSelectedRowCollection listSelectedRowCollection = (ListSelectedRowCollection) closedCallBackEvent.getReturnData();
+
+            if (listSelectedRowCollection.size() > 0) {
+                Object payRollGrpId = listSelectedRowCollection.get(0).getPrimaryKeyValue();
+                // 当前单据界面选择的数据
+                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.AGENCYPAYBILL_ENTITY.load("id, nckd_entryentity.nckd_payrollgrp", new QFilter[]{filter});
+                // 批量更新
+                for(DynamicObject bill : billDyns) {
+                    DynamicObjectCollection entryDyns = bill.getDynamicObjectCollection("nckd_entryentity");
+                    for(DynamicObject entry : entryDyns) {
+                        if(entryIdsList.contains(entry.getLong("id"))) {
+                            entry.set("nckd_payrollgrp", payRollGrpId);
+                        }
+                    }
+                }
+                SwcConstant.AGENCYPAYBILL_ENTITY.update(billDyns);
+            }
+            view.invokeOperation("refresh");
+        }
     }
 
 

+ 9 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/annualincome/IncomeBatchAddnewEdit.java

@@ -65,12 +65,20 @@ public class IncomeBatchAddnewEdit extends AbstractFormPlugin implements Plugin
         DynamicObjectCollection billCols = new DynamicObjectCollection();
         for(Long groupId : keySet) {
             DynamicObject bill = SwcConstant.SALANNUALINCOMEBILL_ENTITY.generateEmptyDynamicObject();
-            bill.set("nckd_payrollgrp", groupId);
+            // 2025-12-12 表头薪资核算组改为了多选
+            DynamicObjectCollection mulpayRollGrp = bill.getDynamicObjectCollection("nckd_mulpayrollgrp");
+            DynamicObject payRollGrp = new DynamicObject(mulpayRollGrp.getDynamicObjectType());
+            payRollGrp.set("fbasedataid", groupId);
+            mulpayRollGrp.add(payRollGrp);
+            bill.set("nckd_mulpayrollgrp", mulpayRollGrp);
+
             bill.set("nckd_calyear", startDate);
             bill.set("billstatus", "A");
             DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
             for(DynamicObject obj : groupMap.get(groupId)) {
                 DynamicObject entry = entryCols.addNew();
+
+                entry.set("nckd_payrollgrp", obj.getLong("groupId"));
                 entry.set("nckd_employee", obj.getLong("employeeId"));
                 entry.set("nckd_idcardno", obj.getString("idCardNo"));
                 entry.set("nckd_month", obj.getInt("monthCount"));

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

@@ -96,6 +96,11 @@ public class SalAnnualIncomeBillList extends AbstractListPlugin implements Plugi
             case "donothing_discard":
                 doDiscardByRow();
                 break;
+            case "donothing_update":
+                if(afterDoOperationEventArgs.getOperationResult().isSuccess()) {
+                    this.getView().showSuccessNotification("更新成功!");
+                    this.getView().invokeOperation("refresh");
+                }
         }
     }
 

+ 100 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/opplugin/annualincome/SalAnnualIncomeUpdatePlugin.java

@@ -0,0 +1,100 @@
+package nckd.jxccl.swc.hcdm.opplugin.annualincome;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.swc.hcdm.business.annualincome.AnnualIncomeService;
+import nckd.jxccl.swc.utils.SwcUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Tyx 2025-12-12
+ * 本单位发薪收入确认更新插件
+ */
+public class SalAnnualIncomeUpdatePlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+        DynamicObject[] bills = e.getDataEntities();
+        for(DynamicObject bill : bills) {
+            // 获取薪资核算组
+            DynamicObjectCollection groupDyns = bill.getDynamicObjectCollection("nckd_mulpayrollgrp");
+            List<Long> groupIds = groupDyns.stream().map(group -> group.getLong("fbasedataid.id")).collect(Collectors.toList());
+
+            Date startDate = bill.getDate("nckd_calyear");
+            // 获取年度最后一天
+            Date endDate = SwcUtils.getLastDayOfYear(startDate);
+            AnnualIncomeService service = new AnnualIncomeService(groupIds, startDate, endDate);
+            DynamicObjectCollection resultCols = service.querySalaryDetailBySql();
+            doDealData(bill, resultCols);
+        }
+        SaveServiceHelper.save(bills);
+    }
+
+    private void doDealData(DynamicObject bill, DynamicObjectCollection resultCols) {
+        // 根据groupId + '_' +  emloyeeId提取
+        Map<String, DynamicObject> resultMap = resultCols.stream()
+                .collect(Collectors.toMap(
+                        obj -> obj.getLong("groupId") + "_" + obj.getLong("employeeId"), // 构造唯一键
+                        obj -> obj  // 保留原始对象
+                ));
+        Set<String> keySet = resultMap.keySet();
+        DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+        for (DynamicObject entry : entryCols) {
+            // 如果当前分录推送状态不为【社保未拉取】则继续
+            if(!entry.getString("nckd_pushstatus").equals("0")) {
+                continue;
+            }
+            // 当前分录的emplyeeId + groupId
+            Long groupId = entry.getLong("nckd_payrollgrp.id");
+            Long employeeId = entry.getLong("nckd_employee.id");
+            String key = groupId + "_" + employeeId;
+
+            // 根据唯一键获取,如果不存在则新增一行记录
+            if(keySet.contains(key)) {
+                doUpdateEntry(entry,resultMap.get(key));
+            }
+            else {
+                doAddnewEntry(entryCols.addNew(), resultMap.get(key));
+            }
+        }
+    }
+
+    /**
+     * 更新分录数据
+     * 更新字段:证件号,月份,年度工资收入
+     * @param entry
+     * @param result
+     */
+    private void doUpdateEntry(DynamicObject entry, DynamicObject result) {
+        entry.set("nckd_idcardno", result.getString("idCardNo"));
+        entry.set("nckd_month", result.getInt("monthCount"));
+        entry.set("nckd_totalsalary", result.getBigDecimal("amount"));
+    }
+
+    private void doAddnewEntry(DynamicObject entry, DynamicObject result) {
+        entry.set("nckd_payrollgrp", result.getLong("groupId"));
+        entry.set("nckd_employee", result.getLong("employeeId"));
+        entry.set("nckd_idcardno", result.getString("idCardNo"));
+        entry.set("nckd_month", result.getInt("monthCount"));
+        entry.set("nckd_totalsalary", result.getBigDecimal("amount"));
+        entry.set("nckd_pushstatus", "0");
+
+    }
+}

+ 4 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/utils/SwcUtils.java

@@ -102,8 +102,10 @@ public class SwcUtils {
     public static List<Long> getExcludePayRollGroupIds(Date startDate) {
         List<Long> excludeGroupIds = new ArrayList<Long>();
         QFilter filter = new QFilter("nckd_calyear", QCP.equals, startDate);
-        DynamicObjectCollection cols = SwcConstant.SALANNUALINCOMEBILL_ENTITY.queryOriginalCollection("nckd_entryentity.nckd_payrollgrp.id", filter.toArray());
-        excludeGroupIds.addAll(cols.stream().map(obj -> obj.getLong("nckd_entryentity.nckd_payrollgrp.id")).collect(Collectors.toList()));
+        DynamicObject[] cols = SwcConstant.SALANNUALINCOMEBILL_ENTITY.load("nckd_mulpayrollgrp", filter.toArray());
+        for(DynamicObject col : cols) {
+            excludeGroupIds.addAll(col.getDynamicObjectCollection("nckd_mulpayrollgrp").stream().map(obj -> obj.getLong("fbasedataid.id")).collect(Collectors.toList()));
+        }
         return excludeGroupIds;
     }