Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

wyc 6 zile în urmă
părinte
comite
964fb3b4b2
12 a modificat fișierele cu 739 adăugiri și 35 ștergeri
  1. 16 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordBizExtRegister.java
  2. 104 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordBizSaveHandler.java
  3. 58 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/datacomparison/DataComparisonPushService.java
  4. 4 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/common/constant/SitConstant.java
  5. 218 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/coordination/SinSurEmpChgCoordBatchEditPluginEx.java
  6. 4 1
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/datacomparison/DetailCompareBillEdit.java
  7. 27 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/opplugin/web/coordination/SinsurEmpConfirmOpEx.java
  8. 27 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/validate/web/SinsurEmpCoordBillValidator.java
  9. 14 21
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/business/annualincome/AnnualIncomeService.java
  10. 77 13
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/annualincome/SalAnnualIncomeBillEdit.java
  11. 6 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hpdi/business/coordination/api/SwcCoordBizExtRegister.java
  12. 184 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/init/plugin/form/PendingSalaryAdjListPlugin.java

+ 16 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordBizExtRegister.java

@@ -0,0 +1,16 @@
+package nckd.jxccl.sit.hcsi.business.coordination.api;
+
+import kd.hr.hbp.business.coordination.api.ext.CoordBizExtRegister;
+import kd.hr.hbp.business.coordination.model.CoordBizContext;
+
+/**
+ * Tyx 2025-10-28
+ * 社保档案注册器,注册在 薪资数据集成 -> 员工变动协作配置 -> 协作字段配置 -> 社保档案的bizextregister字段中
+ */
+public class SinsurCoordBizExtRegister implements CoordBizExtRegister {
+    @Override
+    public void registerHandler(CoordBizContext context) {
+        CoordBizExtRegister.super.registerHandler(context);
+        context.registerHandlers(CoordBizContext.CoordBizStage.AFTER_OPERATE, new SinsurCoordBizSaveHandler());
+    }
+}

+ 104 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordBizSaveHandler.java

@@ -0,0 +1,104 @@
+package nckd.jxccl.sit.hcsi.business.coordination.api;
+
+import com.kingdee.util.Uuid;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.exception.KDBizException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.hr.hbp.business.coordination.api.ext.CoordBizSaveHandler;
+import kd.hr.hbp.business.coordination.model.CoordBizContext;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import nckd.jxccl.sit.hcsi.business.importtaskguide.ImportTaskGuideImportService;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Tyx 2025-10-28
+ * 社保档案处理器,生成社保档案头之后,保存核定单分录的险种基数设置信息。
+ */
+public class SinsurCoordBizSaveHandler implements CoordBizSaveHandler {
+
+    private static final Log log = LogFactory.getLog(SinsurCoordBizSaveHandler.class);
+    private static HRBaseServiceHelper SIBASE_HELPER = new HRBaseServiceHelper("hcsi_sibase");
+    private static String SIBASE_ENTITY = "hcsi_sibase";
+    //字段对应的Map, k = 核定单分录字段标识, v = 社保档案险种基数设置字段标识
+    private static Map<String, String> fieldMap = new HashMap<String, String>();
+    static {
+        fieldMap.put("nckd_welfaretype","welfaretype");
+        fieldMap.put("nckd_insured","insured");
+        fieldMap.put("nckd_paybaseofemployee","paybaseofemployee");
+        fieldMap.put("nckd_paybaseofcompany","paybaseofcompany");
+        fieldMap.put("nckd_startdate","startdate");
+        fieldMap.put("nckd_enddate","enddate");
+        fieldMap.put("nckd_description","description");
+        fieldMap.put("nckd_sinsurdimension","nckd_sinsurdimension");
+    }
+
+    /**
+     * 实际处理方法
+     * @param map key = hcsi_sinsurfile, value = 社保档案Dyn
+     * @param map1 unknown
+     * @param dynamicObject 核定单Dyn
+     * @param coordBizContext 协作业务上下文
+     * @return
+     */
+    @Override
+    public Map<String, Object> handle(Map<String, DynamicObject> map, Map<String, Map<String, Object>> map1, DynamicObject dynamicObject, CoordBizContext coordBizContext) {
+        log.info(" -------- begin SinsurCoordBizSaveHandler handle --------");
+        // 返回的Map
+        Map<String, Object> returnMap = new HashMap<String, Object>();
+        DynamicObject sinsurFile = map.get("hcsi_sinsurfile");
+        if(!ObjectUtils.isEmpty(sinsurFile)) {
+            log.info("-------- 当前处理社保档案编号 = " + sinsurFile.getString("number"));
+            DynamicObjectCollection sibaseCols = new DynamicObjectCollection();
+            // 获取档案Id
+            Long fileId = sinsurFile.getLong("id");
+            // 获取核定单分录数据
+            DynamicObjectCollection entryCols = dynamicObject.getDynamicObjectCollection("nckd_entryentity");
+            for (DynamicObject entry : entryCols) {
+                // 新建数据包
+                DynamicObject dyn = BusinessDataServiceHelper.newDynamicObject(SIBASE_ENTITY);
+                // 设置字段,单独处理下档案,计薪人员,参保单位,其余字段从fieldMap从处理;
+                dyn.set("sinsurfile", sinsurFile);
+                dyn.set("employee", sinsurFile.getDynamicObject("employee"));
+                dyn.set("welfarepayer", sinsurFile.getDynamicObject("welfarepayer"));
+                dyn.set("id", Uuid.create());
+                Iterator it = fieldMap.keySet().iterator();
+                while(it.hasNext()) {
+                    String key = it.next().toString();
+                    dyn.set(fieldMap.get(key), entry.get(key));
+                }
+                sibaseCols.add(dyn);
+            }
+            OperationResult result = SaveServiceHelper.saveOperate(SIBASE_ENTITY, sibaseCols.stream().toArray(DynamicObject[]::new), OperateOption.create());
+            // 标品SinSurFileCoordServiceHelper.saveBizObject方法中,判断success写反了,这里暂时反着写,后续等标品调整
+            // TODO
+            if(result.isSuccess()) {
+                returnMap.put("success",false);
+            }
+            else {
+                throw new KDBizException("-------- 险种基数保存失败:" + result.getMessage());
+                //returnMap.put("success",true);
+                //returnMap.put("msg", result.getMessage());
+            }
+//            if(result.isSuccess()) {
+//                returnMap.put("success",true);
+//            }
+//            else {
+//                returnMap.put("success",false);
+//                returnMap.put("msg", result.getMessage());
+//            }
+            log.info("-------- bizSaveHandler result = " + result + " --------");
+        }
+        return returnMap;
+    }
+}

+ 58 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/datacomparison/DataComparisonPushService.java

@@ -0,0 +1,58 @@
+package nckd.jxccl.sit.hcsi.business.datacomparison;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 2025-11-19 Tyx
+ * 数据比对推送前端业务数据服务类
+ */
+public class DataComparisonPushService {
+
+    private static final Log logger = LogFactory.getLog(DataComparisonPushService.class);
+
+    public DataComparisonPushService() {
+
+    }
+
+    /**
+     * 实际执行推送数据
+     */
+    public void doPush() {
+
+    }
+
+    /**
+     * 构建参数
+     */
+    public void buildParam() {
+        Map map = new HashMap();
+        map.put("operate", "1");    //1-新增 2-更正
+        map.put("opsystem", "社保数据比对");
+
+        List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
+    }
+
+
+    /**
+     * 获取业务项目ID
+     * 取业务项目类别.编码 = JT004
+     */
+    public void getBizItemId() {
+        QFilter filter = new QFilter("bizitemcategory.number", QCP.equals, "JT004");
+        DynamicObject[] cols = SitConstant.BIZITEM_HELPER.loadDynamicObjectArray(new QFilter[]{filter});
+    }
+
+
+
+}

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

@@ -3,5 +3,9 @@ package nckd.jxccl.sit.hcsi.common.constant;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 
 public class SitConstant {
+    /*社保档案*/
     public static final HRBaseServiceHelper SINSURFILE_HELPER = new HRBaseServiceHelper("hcsi_sinsurfile");
+
+    /*业务项目*/
+    public static final HRBaseServiceHelper BIZITEM_HELPER = new HRBaseServiceHelper("hsbs_bizitem");
 }

+ 218 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/coordination/SinSurEmpChgCoordBatchEditPluginEx.java

@@ -0,0 +1,218 @@
+package nckd.jxccl.sit.hcsi.formplugin.web.coordination;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.serialization.SerializationUtils;
+import kd.bos.db.DB;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.field.FieldEdit;
+import kd.bos.form.operate.AbstractOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.org.utils.DynamicObjectUtils;
+import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.plugin.Plugin;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Tyx 2025-10-27
+ * 变动核定单表单插件扩展【nckd_hpdi_empcoordbat_ext】
+ */
+public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin implements Plugin {
+
+    private static final HRBaseServiceHelper COORDBILL_HELPER = new HRBaseServiceHelper("hpdi_empcoordverifbill3");
+    private static final List<String> defaultQueryFields = (List) Stream.of("id", "employeev", "assignment", "coordruleparam").collect(Collectors.toList());
+    /**
+     * 在标品加载完数据之后,再获取一下核定单分录的数据展示出来
+     * @param e
+     */
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        List<String> queryFields = this.getQueryFields();
+        HRBaseServiceHelper helper = new HRBaseServiceHelper(this.getEntityNumber());
+        DynamicObject[] billCols = helper.load(String.join(",", queryFields), new QFilter[]{new QFilter("id", "in", this.getSelectIds())});
+        showEntryData(billCols);
+    }
+
+    private void showEntryData(DynamicObject[] billCols) {
+        Set<String> entryFields = this.getEntryFields();
+        // 根据ID提取出来
+        Map<Long, DynamicObject> billMap = (Map) Arrays.stream(billCols).collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("id");
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        DynamicObjectCollection entryCols = this.getModel().getEntryEntity("entryentity");
+        for(DynamicObject entry : entryCols) {
+            Long billId = entry.getLong("id");
+            DynamicObject bill = billMap.get(billId);
+            DynamicObjectCollection billEntryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+            DynamicObjectCollection subEntryCols = entry.getDynamicObjectCollection("nckd_subentryentity");
+            subEntryCols.clear();
+            for(DynamicObject billEntry : billEntryCols) {
+                DynamicObject subEntry = subEntryCols.addNew();
+                for(String field : entryFields) {
+                    subEntry.set(field, billEntry.get(field));
+                }
+            }
+        }
+        this.getView().updateView("nckd_subentryentity");
+    }
+
+
+
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        IDataModel model = this.getModel();
+        AbstractOperate op = (AbstractOperate)args.getSource();
+        String operateKey = op.getOperateKey();
+        // 批量设置前校验,查询当前选中的单据体的子单据体是否有数据
+        if(HRStringUtils.equals(operateKey, "batchsetting")){
+            int row = model.getEntryCurrentRowIndex("entryentity");
+            model.setEntryCurrentRowIndex("entryentity", row);
+            int rowCount = model.getEntryRowCount("nckd_subentryentity");
+            if(rowCount == 0) {
+                args.setCancel(true);
+                this.getView().showTipNotification("请先维护险种基数!");
+            }
+        }
+
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        AbstractOperate op = (AbstractOperate)afterDoOperationEventArgs.getSource();
+        String operateKey = op.getOperateKey();
+        if (afterDoOperationEventArgs.getOperationResult().isSuccess() && (HRStringUtils.equals(operateKey, "save") || HRStringUtils.equals(operateKey, "confirmeffect"))) {
+            doSaveSubEntry();
+        }
+        else if(HRStringUtils.equals(operateKey, "batchsetting")){
+            doBatchSetting();
+        }
+    }
+
+    /**
+     * 批量设置其余子分录的险种信息
+     */
+    public void doBatchSetting() {
+        IDataModel model = this.getModel();
+        DynamicObject bill = model.getDataEntity(true);
+        DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("entryentity");
+        // 当前选中行
+        int row = model.getEntryCurrentRowIndex("entryentity");
+        // 当前选中行的子单据体数据
+        DynamicObjectCollection subCols = entryCols.get(row).getDynamicObjectCollection("nckd_subentryentity");
+
+        for(int i = 0; i < entryCols.size(); i++) {
+            if(i == row)
+                continue;
+            // 获取本次要执行覆盖的子单据体
+            DynamicObjectCollection otherSubCols = entryCols.get(i).getDynamicObjectCollection("nckd_subentryentity");
+            // 清除数据
+            otherSubCols.clear();
+            // 从subCols copy 过来
+            for(DynamicObject subEntry : subCols) {
+                DynamicObject otherSubEntry = otherSubCols.addNew();
+                DynamicObjectUtils.copy(subEntry, otherSubEntry);
+            }
+        }
+        this.getView().updateView("nckd_subentryentity");
+    }
+
+    public void checkSubEntryData() {
+        IDataModel model = this.getModel();
+        DynamicObject dyn = model.getDataEntity(true);
+        DynamicObjectCollection entryCols = dyn.getDynamicObjectCollection("entryentity");
+    }
+
+    /**
+     * 执行保存,把当前页面的子单据体保存到核定单上;
+     */
+    public void doSaveSubEntry () {
+        DynamicObject bill = this.getModel().getDataEntity(true);
+        DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("entryentity");
+        DynamicObjectCollection saveCols = new DynamicObjectCollection();
+        Set<String> subEntryFields = getEntryFields();
+        for (DynamicObject entry : entryCols) {
+            // 获取到核定单ID
+            Long coordBillId = entry.getLong("id");
+            // 获取到核定单Dyn
+            DynamicObject coordBill = COORDBILL_HELPER.loadOne(coordBillId);
+            // 获取当前页面子单据体的信息
+            DynamicObjectCollection subEntryCols = entry.getDynamicObjectCollection("nckd_subentryentity");
+            // 保存核定单的分录
+            DynamicObjectCollection coordBillEntryCols = coordBill.getDynamicObjectCollection("nckd_entryentity");
+            // 清空核定单的分录
+            coordBillEntryCols.clear();
+            // 根据当前页面子单据体信息->核定单分录数据
+            for (DynamicObject subEntry : subEntryCols) {
+                DynamicObject billEntry = coordBillEntryCols.addNew();
+                for(String field : subEntryFields) {
+                    billEntry.set(field, subEntry.get(field));
+                }
+            }
+            saveCols.add(coordBill);
+        }
+        if(saveCols.size() > 0) {
+            COORDBILL_HELPER.save(saveCols);
+        }
+    }
+
+    /**
+     * 获取子单据体字段
+     * @return
+     */
+    public Set<String> getEntryFields() {
+        Set<String> subEntryFields = EntityMetadataCache.getDataEntityType("hpdi_empcoordbatchedit3").getAllEntities().get("nckd_subentryentity").getFields().keySet();
+        return subEntryFields;
+    }
+
+    /**
+     * 获取核定单ID
+     * @return
+     */
+    protected List<Long> getSelectIds() {
+        String selectIdStr = (String)this.getView().getFormShowParameter().getCustomParam("selectIds");
+        return (List<Long>) SerializationUtils.fromJsonStringToList(selectIdStr, Long.class);
+    }
+
+    /**
+     * 获取实体标识
+     * @return
+     */
+    protected String getEntityNumber() {
+        return (String)this.getView().getFormShowParameter().getCustomParam("entityNumber");
+    }
+
+    /**
+     * 构建查询字段
+     * @return
+     */
+    protected List<String> getQueryFields() {
+        EntryGrid entryGrid = (EntryGrid)this.getView().getControl("entryentity");
+        List<FieldEdit> entryFields = entryGrid.getFieldEdits();
+        Set<String> queryFields = (Set)entryFields.stream().map(FieldEdit::getFieldKey).collect(Collectors.toSet());
+        queryFields.remove("adminorg");
+        queryFields.remove("position");
+        queryFields.addAll(defaultQueryFields);
+        Set<String> fields = this.getEntryFields();
+        queryFields.addAll(fields.stream().map(field -> "nckd_entryentity." + field).collect(Collectors.toList()));
+        return new ArrayList(queryFields);
+    }
+
+}

+ 4 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/datacomparison/DetailCompareBillEdit.java

@@ -16,6 +16,7 @@ import kd.bos.form.operate.FormOperate;
 import kd.bos.form.plugin.AbstractFormPlugin;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
+import nckd.jxccl.sit.hcsi.business.datacomparison.DataComparisonPushService;
 import nckd.jxccl.sit.hcsi.business.datacomparison.DataComparisonQueryService;
 
 import java.math.BigDecimal;
@@ -136,7 +137,9 @@ public class DetailCompareBillEdit extends AbstractFormPlugin {
 
 
     private void doPush() {
-        logger.info("推送数据到算薪系统");
+        logger.info("推送数据到前端业务数据");
+        DataComparisonPushService service = new DataComparisonPushService();
+
     }
 
     /**

+ 27 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/opplugin/web/coordination/SinsurEmpConfirmOpEx.java

@@ -0,0 +1,27 @@
+package nckd.jxccl.sit.hcsi.opplugin.web.coordination;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.hr.hbp.opplugin.web.HRDataBaseOp;
+import nckd.jxccl.sit.hcsi.validate.web.SinsurEmpCoordBillValidator;
+
+/**
+ * Tyx 2025-10-28
+ * 社保核定单-确认生效扩展插件【nckd_hpdi_empcoordver_ext】
+ */
+public class SinsurEmpConfirmOpEx extends HRDataBaseOp {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new SinsurEmpCoordBillValidator());
+    }
+}

+ 27 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/validate/web/SinsurEmpCoordBillValidator.java

@@ -0,0 +1,27 @@
+package nckd.jxccl.sit.hcsi.validate.web;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.validate.AbstractValidator;
+
+/**
+ * Tyx 2025-10-29
+ * 社保核定单校验器,弱校验
+ * 当存在单据体未维护子单据体的情况弹窗提示
+ */
+public class SinsurEmpCoordBillValidator extends AbstractValidator {
+
+    @Override
+    public void validate() {
+        String key = this.getOperateKey();
+        for (ExtendedDataEntity dataEntity : dataEntities) {
+            // TODO 个别类型的核定单不校验
+            DynamicObject bill = dataEntity.getDataEntity();
+            DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+            if(entryCols.size() == 0) {
+                this.addWarningMessage(dataEntity, "未维护险种基数信息");
+            }
+        }
+    }
+}

+ 14 - 21
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/business/annualincome/AnnualIncomeService.java

@@ -1,12 +1,17 @@
 package nckd.jxccl.swc.hcdm.business.annualincome;
 
 
+import kd.bos.algo.DataSet;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.QueryEntityType;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
+import kd.bos.orm.ORM;
 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;
@@ -38,9 +43,10 @@ public class AnnualIncomeService {
      * @param calPersonIds
      * @param itemIds
      */
-    public void querySalaryDetail(List<Long> calPersonIds, List<Long> itemIds) {
+    public Map<Long, Map<Long, Object>> querySalaryDetail(List<Long> calPersonIds, List<Long> itemIds) {
         logger.info("开始查询薪资明细数据,参数:{},{}", calPersonIds, itemIds);
         Map<Long, Map<Long, Object>> map = CalResultQueryService.get().getSalaryResult(calPersonIds, itemIds);
+        return map;
     }
 
 
@@ -82,32 +88,19 @@ public class AnnualIncomeService {
     }
     /**
      * 根据核算任务ID获取核算人员
-     *
+     * 标品CalResultQueryService.get().getCalPersonInfos会报错,详见问题列表52项;
+     * 新增一个hsas_salarycalresultqueryex查询
+     * 这里改成先通过getCalPersonIds获取到核算人员ID,再获取相关信息
      * @param taskIds
      * @return
      */
     private DynamicObjectCollection queryCalPersonByCalPayRollTask (List<Long> taskIds) {
         logger.info("开始查询核算人员数据,参数:{}", taskIds);
-//        //QFilter filter = new QFilter("hsas_calpayrolltask.id", QCP.in, taskIds);
-//        QFilter filter = new QFilter("filenumber", QCP.equals, "999999");
-//        // 计薪人员,工号,证件号
-//        List<String> selectFields = new ArrayList<String>();
-//        //selectFields.add("employee.id");
-//        selectFields.add("filenumber");
-//        //selectFields.add("hsas_calpayrolltask.id");
-//        //selectFields.add("hsbs_percre.number");
-//        DynamicObjectCollection calPersonIds = CalResultQueryService.get().getCalPersonInfos(selectFields, filter.toArray(), null, 0, 1000);
-//        return calPersonIds;
-        
-        QFilter filter = new QFilter("empnumber", QCP.equals, "999999");
-        List<String> selectFields = new ArrayList<>(SWCBaseConstants.INITCAPACITY_ARRAYLIST);
-        selectFields.add("id");
-        selectFields.add("empnumber");
-        DynamicObjectCollection calPersonCols = CalResultQueryService.get().getCalPersonInfos(selectFields, new QFilter[]{filter}, "id", 0, 1000);
+        QFilter filter = new QFilter("hsas_calpayrolltask.id", QCP.in, taskIds);
+        QueryEntityType queryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityType("hsas_salarycalresultqueryex");
+        DataSet dataSet = HRQueryEntityHelper.getInstance().getQueryDataSet(queryEntityType, "id,hsbs_percre.number,hsbs_employee.id,hsbs_employee.empnumber,hsas_calpayrolltask.payrolldate", new QFilter[]{filter}, "id", false, 0, 1000);
+        DynamicObjectCollection calPersonCols = ORM.create().toPlainDynamicObjectCollection(dataSet);
         return calPersonCols;
-        
-        
-        
     }
 
 }

+ 77 - 13
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/annualincome/SalAnnualIncomeBillEdit.java

@@ -1,6 +1,5 @@
 package nckd.jxccl.swc.hcdm.formplugin.annualincome;
 
-import kd.ai.gai.flow.dt.D;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.utils.ObjectUtils;
@@ -10,19 +9,13 @@ import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.operate.FormOperate;
 import kd.bos.form.plugin.AbstractFormPlugin;
-import kd.bos.orm.query.QCP;
-import kd.bos.orm.query.QFilter;
-import kd.epm.eb.common.utils.CalendarHelper;
-import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.swc.hcdm.business.annualincome.AnnualIncomeService;
 import nckd.jxccl.swc.utils.SwcUtils;
 
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.EventObject;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Tyx 2025-11-05
@@ -87,15 +80,86 @@ public class SalAnnualIncomeBillEdit extends AbstractFormPlugin implements Plugi
         Date endDate = SwcUtils.getLastDayOfYear(calYear);
         // 声明service
         AnnualIncomeService service = new AnnualIncomeService(payRollGrp.getLong("id"), calYear, endDate);
-        // 获取核算人员信息
+        // 获取核算人员信息,一个核算人员一条记录
         DynamicObjectCollection calPersonDyns = service.queryCalPersonByPayRollGroup();
-//        List<Long> calPersonIds = service.queryCalPersonByPayRollGroup();
+        List<Long> calPersonIds = calPersonDyns.stream().map((o) -> {
+            return o.getLong("id");
+        }).collect(Collectors.toList());
         // 获取薪酬项目ID,这里固定为应发工资 JT_283
         List<String> itemNos = new ArrayList<String>();
         itemNos.add("JT_283");
         List<Long> itemIds = SwcUtils.getSalaryItemIdByNumber(itemNos);
-//        service.querySalaryDetail(calPersonIds, itemIds);
+        // 获取薪资明细数据 一个核算人员一条<k1,v1<k2,v2>>,k1=核算人员ID,k2=薪酬项目ID,v2=金额
+        Map<Long, Map<Long, Object>> salaryMap = service.querySalaryDetail(calPersonIds, itemIds);
+
+        // 把核算人员相关信息和薪资明细合并在一起
+        Map<Long, Map<String, Object>> unionMap = (Map) calPersonDyns.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("id");
+        }, (dyx) -> {
+            Map map = new HashMap();
+            map.put("employeeId", dyx.getLong("hsbs_employee.id"));
+            map.put("idCardNo", dyx.getLong("hsbs_percre.number"));
+            map.put("payRollDate", dyx.getDate("hsas_calpayrolltask.payrolldate"));
+            map.put("amount", salaryMap.get(dyx.getLong("id")).get(itemIds.get(0)));
+            return map;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        // 按照employeeId提取出来
+        List<Map<String, Object>> finalResult = dealGroupData(unionMap);
+
+
+        // 界面赋值
+        for (Map map : finalResult) {
+            int rowIndex = model.createNewEntryRow("nckd_entryentity");
+            model.setValue("nckd_employee", map.get("employeeId"), rowIndex);
+            model.setValue("nckd_idcardno", map.get("idCardNo"), rowIndex);
+            model.setValue("nckd_totalsalary", map.get("totalAmount"), rowIndex);
+            model.setValue("nckd_month", map.get("uniqueDateCount"), rowIndex);
+        }
+
     }
 
+    public List<Map<String, Object>> dealGroupData (Map<Long, Map<String, Object>> unionMap) {
+        Map<String, Map<String, Object>> result = new HashMap<>();
+        Iterator<Long> it = unionMap.keySet().iterator();
+        while(it.hasNext()) {
+            Map<String, Object> record = unionMap.get(it.next());
+            String key = record.get("employeeId") + "_" + record.get("idCardNo");
+
+            if (!result.containsKey(key)) {
+                Map<String, Object> summary = new HashMap<>();
+                summary.put("employeeId", record.get("employeeId"));
+                summary.put("idCardNo", record.get("idCardNo"));
+                summary.put("totalAmount", new BigDecimal("0"));
+                summary.put("uniqueDates", new HashSet<String>());
+                result.put(key, summary);
+            }
 
+            Map<String, Object> summary = result.get(key);
+            // 累加金额
+            BigDecimal currentAmount = (BigDecimal) summary.get("totalAmount");
+            summary.put("totalAmount", currentAmount.add((BigDecimal) record.get("amount")));
+
+            // 添加日期到集合中(自动去重)
+            @SuppressWarnings("unchecked")
+            Set<Date> uniqueDates = (Set<Date>) summary.get("uniqueDates");
+            uniqueDates.add((Date) record.get("payRollDate"));
+        }
+
+        // 转换结果格式,将Set的大小作为日期计数
+        List<Map<String, Object>> finalResult = new ArrayList<>();
+        for (Map<String, Object> summary : result.values()) {
+            Map<String, Object> finalRecord = new HashMap<>();
+            finalRecord.put("employeeId", summary.get("employeeId"));
+            finalRecord.put("idCardNo", summary.get("idCardNo"));
+            finalRecord.put("totalAmount", summary.get("totalAmount"));
+            @SuppressWarnings("unchecked")
+            Set<Date> uniqueDates = (Set<Date>) summary.get("uniqueDates");
+            finalRecord.put("uniqueDateCount", uniqueDates.size());
+            finalResult.add(finalRecord);
+        }
+
+        return finalResult;
+    }
 }

+ 6 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hpdi/business/coordination/api/SwcCoordBizExtRegister.java

@@ -1,5 +1,6 @@
 package nckd.jxccl.swc.hpdi.business.coordination.api;
 
+import kd.hr.hbp.business.coordination.api.ext.CoordBizBeforeGenerateHandler;
 import kd.hr.hbp.business.coordination.api.ext.CoordBizExtRegister;
 import kd.hr.hbp.business.coordination.model.CoordBizContext;
 
@@ -14,4 +15,9 @@ public class SwcCoordBizExtRegister implements CoordBizExtRegister {
         CoordBizExtRegister.super.registerHandler(context);
         context.registerHandlers(CoordBizContext.CoordBizStage.END_OPERATE, new SwcCoordBizSaveHandler());
     }
+
+    @Override
+    public CoordBizBeforeGenerateHandler beforeGenerateHandler() {
+        return kd.hr.hbp.business.coordination.api.ext.CoordBizBeforeGenerateHandler.Default.DEFAULT;
+    }
 }

+ 184 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/init/plugin/form/PendingSalaryAdjListPlugin.java

@@ -0,0 +1,184 @@
+package nckd.jxccl.swc.init.plugin.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.param.CustomParam;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+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.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.parameter.SystemParamServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 员工待定调薪清单
+ * @author turborao
+ * @date 2025/11/19 11:35
+ */
+public class PendingSalaryAdjListPlugin extends AbstractListPlugin implements Plugin {
+
+    /**
+     * 员工待定调薪清单
+     */
+    private static final String entityName = "nckd_pendingsalaryadj";
+    /**
+     * 入职单
+     */
+    private static final String onhasonbrdEntityName = "hom_personhasonbrd";
+    /**
+     * 调动单
+     */
+    private static final String transferEntityName = "hdm_transferapply";
+
+    private static int days = 5;
+
+    private static Log logger = LogFactory.getLog(PendingSalaryAdjListPlugin.class);
+
+    private DynamicObjectCollection salaryTypeDyns = null;
+    @Override
+    public void initialize() {
+        super.initialize();
+        /**
+         * 获取 公共自定义参数  PENDSALARYADJ_DAYS
+         */
+        CustomParam customParam = new CustomParam();
+        customParam.getSearchKeySet().add("PENDSALARYADJ_DAYS");
+        Map<String, String> cusTomMap = SystemParamServiceHelper.loadCustomParameterFromCache(customParam);
+        String pendsalaryadjDays  = cusTomMap.get("PENDSALARYADJ_DAYS");
+        days = Integer.parseInt(pendsalaryadjDays);
+
+        ArrayList<String> salaryTypeList = new ArrayList<>();
+        salaryTypeList.add("tiaozhengtiaoxin");  //岗位调整调薪
+        salaryTypeList.add("100009");  //入职定薪新
+        QFilter qFilter11 = new QFilter("number", QCP.in, salaryTypeList);
+        salaryTypeDyns = QueryServiceHelper.query("hsbs_salaryadjustrsn","id,number,name",new QFilter[]{qFilter11},"number");
+
+        //加载入职单与调动单的数据
+        getAdjustBillData();
+    }
+
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+
+        FormOperate formOperate = (FormOperate)args.getSource();
+        String key = formOperate.getOperateKey();
+        switch (key) {
+            case "refresh":
+                //加载入职单与调动单的数据
+                getAdjustBillData();
+                break;
+
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        FormOperate formOperate = (FormOperate)args.getSource();
+        String key = formOperate.getOperateKey();
+        switch (key) {
+            case "apply_adj":
+                break;
+            case "flag_adj":
+                break;
+            case "flag_ignore":
+                break;
+            case "cleanflag":
+                break;
+        }
+    }
+
+    /**
+     * 获取入职单与调动单的数据
+     */
+    public void getAdjustBillData() {
+
+        LocalDate currentDate = LocalDate.now();
+        // Subtract 5 days
+        LocalDate daysAgo = currentDate.minusDays(days);
+
+        ArrayList<DynamicObject> billDynList = new ArrayList<>();
+
+        /**
+         * 查询入职单
+         */
+        String selectField2 = "id,billno,b_effectivedate,ba_em_tid,ba_em_empnumber,ba_em_name,ba_po_position.id,ba_po_adminorg,ba_po_job.id,ajoblevel.id,ba_po_job.jobseq.id";
+        QFilter qFilter1 = new QFilter("enrollstatus", QCP.equals, "3"); // 入职状态 = 已入职
+        QFilter qFilter2 = new QFilter("billstatus", QCP.equals, "C"); // 单据状态 = 已审核
+        QFilter qFilter3 = new QFilter("b_effectivedate", QCP.large_equals, daysAgo);
+
+        DynamicObjectCollection onhasonbrdDyns = QueryServiceHelper.query(onhasonbrdEntityName, selectField2,new QFilter[]{qFilter1,qFilter2,qFilter3});
+
+        Map<Long, DynamicObject> onhasonbrdMap = (Map)onhasonbrdDyns.stream().collect(Collectors.toMap((obj) -> {
+            return obj.getLong("id");
+        }, (obj) -> {
+            return obj;
+        }, (k1, k2) -> {
+            return k1;
+        }));
+
+        //入职  将Map转换为List
+        List<Long> onhasonbrdIDs = onhasonbrdMap.keySet().stream().collect(Collectors.toList());
+
+        QFilter qFilter22 = new QFilter("nckd_billid", QCP.in, onhasonbrdIDs);
+        List<Object> listIDs = QueryServiceHelper.queryPrimaryKeys(entityName,new QFilter[]{qFilter22}, null, Integer.MAX_VALUE);
+        DynamicObject billDyn =  BusinessDataServiceHelper.newDynamicObject(entityName);
+        DynamicObject[] billDyns = BusinessDataServiceHelper.load(listIDs.toArray(),billDyn.getDynamicObjectType());
+
+        int onhasonbrdCount = 0;
+        Map<Long, DynamicObject> billMap =
+                Arrays.stream(billDyns)
+                        .collect(Collectors.toMap(
+                                detail -> detail.getLong("nckd_billid"),
+                                detail -> detail, // 整个 DynamicObject 作为 value
+                                (existing, replacement) -> existing // 保留前面的值
+                        ));
+
+        for(DynamicObject onhasonbrdDyn: onhasonbrdDyns){
+            DynamicObject billDyn1 = billMap.get(onhasonbrdDyn.getLong("id"));
+            if(billDyn1 != null) continue;
+            DynamicObject dyn = BusinessDataServiceHelper.newDynamicObject(entityName);
+            dyn.set("billno", onhasonbrdDyn.getString("billno"));
+            dyn.set("nckd_billid", onhasonbrdDyn.getLong("id"));
+            dyn.set("nckd_billtype", "入职单");
+            dyn.set("billstatus", "A");  ///待处理
+            dyn.set("nckd_employeefield", onhasonbrdDyn.getLong("ba_em_tid"));
+            dyn.set("nckd_changedate", onhasonbrdDyn.getDate("b_effectivedate"));
+            dyn.set("nckd_salaryadjus", salaryTypeDyns.get(0).getLong("id"));  //定调薪类型
+            dyn.set("nckd_newhradminorg", onhasonbrdDyn.getLong("ba_po_adminorg"));  //部门
+            dyn.set("nckd_newposition", onhasonbrdDyn.getLong("ba_po_position.id"));  //岗位
+            dyn.set("nckd_newjoblevel", onhasonbrdDyn.getLong("ajoblevel.id"));  //职级
+            dyn.set("nckd_newjobseqhr", onhasonbrdDyn.getLong("ba_po_job.jobseq.id"));  //职位序列
+            onhasonbrdCount++;
+            billDynList.add(dyn);
+        }
+
+        int length = 0;
+        if(billDynList.size() != 0) {
+            //保存
+            Object[] update = SaveServiceHelper.save(billDynList.toArray(new DynamicObject[0]));
+            length = update.length;
+            this.getView().showSuccessNotification("成功导入,"+length+"条数据,其中入职单"+onhasonbrdCount+"条,",3000); // 成功类型
+        }
+
+    }
+}