فهرست منبع

feat(swc): 增强社保数据比对推送功能和结果处理

Tyx 6 روز پیش
والد
کامیت
7e732070ba

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

@@ -2,16 +2,18 @@ package nckd.jxccl.sit.hcsi.business.datacomparison;
 
 
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.swc.hsas.mservice.BizDataService;
 import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 2025-11-19 Tyx
@@ -28,31 +30,127 @@ public class DataComparisonPushService {
     /**
      * 实际执行推送数据
      */
-    public void doPush() {
-
+    public Map doPush(List<DynamicObject> entryList, Date bsed) {
+        Map param = buildParam(entryList, bsed);
+        BizDataService bizDataService = new BizDataService();
+        Map response = bizDataService.synBizData(param);
+        logger.info("推送数据返回结果:" + response);
+        return response;
     }
 
     /**
-     * 构建参数
+     * 构建参数,数据比对中一行分录会生成两行业务数据
+     *
+     * @return
      */
-    public void buildParam() {
+    public Map buildParam(List<DynamicObject> entryList, Date bsed) {
         Map map = new HashMap();
         map.put("operate", "1");    //1-新增 2-更正
         map.put("opsystem", "社保数据比对");
 
         List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
+        Map<String,Long> bizItemMap = getBizItemId();
+
+        Map<Long, Long> empposorgMap = getEmpPosOrgRelIds(entryList, bsed);
+
+        for(DynamicObject entry : entryList) {
+            // 个人缴费金额
+            Map<String, Object> dataMapA = new HashMap();
+            // 个人补缴金额
+            Map<String, Object> dataMapB = new HashMap();
+            //获取险种编码
+            String welfaretypeNo = entry.getString("welfaretypeid.number");
+
+            //bizdatacode 前端业务数据识别码(唯一) 这里用分录ID+分隔符判断
+            dataMapA.put("bizdatacode", entry.getPkValue().toString() + SitConstant.SeparatorA);
+            dataMapB.put("bizdatacode", entry.getPkValue().toString() + SitConstant.SeparatorB);
+            //batchcode 批次号 直接用分录ID
+            dataMapA.put("batchcode", entry.getPkValue().toString());
+            dataMapB.put("batchcode", entry.getPkValue().toString());
+            //业务项目ID 业务项目上新增了一个字段【nckd_matchkey】 = 险种编码 + _A / _B, A : 个人缴费,B : 个人补缴
+            dataMapA.put("bizitemid", bizItemMap.get(welfaretypeNo + SitConstant.SeparatorA));
+            dataMapB.put("bizitemid", bizItemMap.get(welfaretypeNo + SitConstant.SeparatorB));
+            //employee
+            dataMapA.put("employeeid", entry.getLong("employee.id"));
+            dataMapB.put("employeeid", entry.getLong("employee.id"));
+            //value
+            BigDecimal valueA = entry.getBigDecimal("personsysvalue");
+            BigDecimal valueB = entry.getBigDecimal("personsysvaluea");
+            dataMapA.put("value", valueA);
+            dataMapB.put("value", valueB);
+            //empposorgrelid 计薪人员任职经历
+            Long empPosOrgRelId = empposorgMap.get(entry.getLong("employee.id"));
+            dataMapA.put("empposorgrelid", empPosOrgRelId);
+            dataMapB.put("empposorgrelid", empPosOrgRelId);
+            //datasources 数据来源 90 - 社保数据比对
+            dataMapA.put("datasources", "90");
+            dataMapB.put("datasources", "90");
+            //srcsystem 前端系统
+            dataMapA.put("srcsystem", "hpdi");
+            dataMapB.put("srcsystem", "hpdi");
+
+            //startdate
+            dataMapA.put("startdate", bsed);
+            dataMapB.put("startdate", bsed);
+
+            //currencyid
+            dataMapA.put("currencyid", "1");
+            dataMapB.put("currencyid", "1");
+
+            //备注 description
+            dataMapA.put("description", entry.getString("nckd_remark"));
+            dataMapB.put("description", entry.getString("nckd_remark"));
+
+            // 如果value = 0 则跳过这条数据
+            if(valueA.compareTo(BigDecimal.ZERO) > 0) {
+                data.add(dataMapA);
+            }
+            if(valueB.compareTo(BigDecimal.ZERO) > 0) {
+                data.add(dataMapB);
+            }
+         }
+        map.put("data", data);
+        return map;
     }
 
 
     /**
      * 获取业务项目ID
      * 取业务项目类别.编码 = JT004
+     * @return
      */
-    public void getBizItemId() {
+    public Map<String, Long> getBizItemId() {
         QFilter filter = new QFilter("bizitemcategory.number", QCP.equals, "JT004");
-        DynamicObject[] cols = SitConstant.BIZITEM_HELPER.loadDynamicObjectArray(new QFilter[]{filter});
+        String selectFields = "id,nckd_matchkey";
+        DynamicObjectCollection cols = SitConstant.BIZITEM_HELPER.queryOriginalCollection(selectFields, new QFilter[]{filter});
+        Map<String,Long> map = cols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getString("nckd_matchkey");
+        }, (dyx) -> {
+            return dyx.getLong("id");
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        return map;
     }
 
+    public Map<Long, Long> getEmpPosOrgRelIds(List<DynamicObject> list, Date date) {
+        Set employeeIds = list.stream().map(i -> i.getLong("employee.id")).collect(Collectors.toSet());
+        QFilter filter = new QFilter("employee.id", QCP.in, employeeIds);
+        filter.and("startdate", QCP.less_equals, date);
+        filter.and("enddate", QCP.large_equals, date);
+        filter.and("isprimary", QCP.equals, "1");
+        HRBaseServiceHelper helper = new HRBaseServiceHelper("hrpi_empposorgrel");
+        String selectFields = "id,employee.id";
+        DynamicObjectCollection cols = helper.queryOriginalCollection(selectFields, new QFilter[]{filter});
+        Map<Long, Long> map = cols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("employee.id");
+        }, (dyx) -> {
+            return dyx.getLong("id");
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        return map;
+    }
 
 
 }

+ 5 - 5
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/datacomparison/DataComparisonQueryService.java

@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
 public class DataComparisonQueryService {
     private static final Log logger = LogFactory.getLog(DataComparisonQueryService.class);
     private static final String SINSURTASK = "hcsi_sinsurtask";
-    String[] leftFields = new String[]{"welfarepayer", "welfaretypeid", "empnumber", "empname", "empidcard", "type", "personSysValue", "personSysValuea", "companySysValue", "companySysValuea"};
+    String[] leftFields = new String[]{"welfarepayer", "welfaretypeid", "empnumber", "empname", "empidcard", "employee", "type", "personSysValue", "personSysValuea", "companySysValue", "companySysValuea"};
     String[] rightFields =  new String[]{"personOutValue", "personOutValuea","companyOutValue", "companyOutValuea"};
     IDataModel model = null;
     IFormView view = null;
@@ -97,17 +97,17 @@ public class DataComparisonQueryService {
      * @return
      */
     public DataSet groupCalPersonDetail (DataSet calPersonDataSet) {
-        calPersonDataSet.groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","type"}).sum("value").sum("value1");
+        calPersonDataSet.groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","employee","type"}).sum("value").sum("value1");
         DataSet dataSet1 = calPersonDataSet.copy();
         DataSet dataSet2 = calPersonDataSet.copy();
 
         // 按照类型分组汇总
-        DataSet sumSet1 = dataSet1.filter("type = '1'").groupBy(new String[]{"welfarepayer", "welfaretypeid", "empnumber", "empname", "empidcard", "type"}).sum("value").sum("value1").finish();
-        DataSet sumSet2 = dataSet2.filter("type = '2'").groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","type"}).sum("value").sum("value1").finish();
+        DataSet sumSet1 = dataSet1.filter("type = '1'").groupBy(new String[]{"welfarepayer", "welfaretypeid", "empnumber", "empname", "empidcard", "employee", "type"}).sum("value").sum("value1").finish();
+        DataSet sumSet2 = dataSet2.filter("type = '2'").groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard", "employee", "type"}).sum("value").sum("value1").finish();
 
         // join
         JoinDataSet joinDataSet = sumSet1.join(sumSet2).on("welfarepayer", "welfarepayer").on("welfaretypeid", "welfaretypeid").on("empnumber", "empnumber").on("empname", "empname").on("empidcard", "empidcard");
-        DataSet dataSet = joinDataSet.select(new String[]{"welfarepayer", "welfaretypeid", "empnumber", "empname", "empidcard", "type", "value as personSysValue","value1 as personSysValuea"}, new String[]{"value as companySysValue","value1 as companySysValuea"}).finish();
+        DataSet dataSet = joinDataSet.select(new String[]{"welfarepayer", "welfaretypeid", "empnumber", "empname", "empidcard", "employee", "type", "value as personSysValue","value1 as personSysValuea"}, new String[]{"value as companySysValue","value1 as companySysValuea"}).finish();
 
         return dataSet;
     }

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

@@ -8,4 +8,7 @@ public class SitConstant {
 
     /*业务项目*/
     public static final HRBaseServiceHelper BIZITEM_HELPER = new HRBaseServiceHelper("hsbs_bizitem");
+
+    public static final String SeparatorA = "_A";
+    public static final String SeparatorB = "_B";
 }

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

@@ -18,11 +18,12 @@ 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 nckd.jxccl.sit.hcsi.common.constant.SitConstant;
+import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.EventObject;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Tyx 2025-10-31
@@ -73,8 +74,27 @@ public class DetailCompareBillEdit extends AbstractFormPlugin {
         EntryGrid entryGrid = this.getControl("nckd_entryentity");
         int[] selectRows = entryGrid.getSelectRows();
         if(selectRows.length == 0 ) {
+            args.setCancel(true);
             this.getView().showTipNotification("请先选中数据!");
         }
+
+        //判断下是否推送过
+        IDataModel model = this.getModel();
+        DynamicObjectCollection entryCols = model.getEntryEntity("nckd_entryentity");
+        List<Integer> pushedRows = new ArrayList();
+        for(int rowIndex : selectRows) {
+            String dataStatus = entryCols.get(rowIndex).getString("nckd_datastatus");
+            if("C".equals(dataStatus)) {
+                pushedRows.add(rowIndex+1);
+            }
+        }
+
+        if(pushedRows.size() > 0) {
+            args.setCancel(true);
+            this.getView().showTipNotification("第"+StringUtils.join(pushedRows, ",")+"行数据已推送,请重新选择!");
+        }
+
+
     }
 
     /**
@@ -85,6 +105,7 @@ public class DetailCompareBillEdit extends AbstractFormPlugin {
         EntryGrid entryGrid = this.getControl("nckd_entryentity");
         int[] selectRows = entryGrid.getSelectRows();
         if(selectRows.length == 0 ) {
+            args.setCancel(true);
             this.getView().showTipNotification("请先选中数据!");
         }
     }
@@ -139,9 +160,78 @@ public class DetailCompareBillEdit extends AbstractFormPlugin {
     private void doPush() {
         logger.info("推送数据到前端业务数据");
         DataComparisonPushService service = new DataComparisonPushService();
+        IDataModel model = this.getModel();
+        Date bsed = model.getDataEntity(true).getDate("nckd_period.startdate");
+        EntryGrid entryGrid = this.getControl("nckd_entryentity");
+        int[] selectRows = entryGrid.getSelectRows();
+        List<DynamicObject> list = new ArrayList<>();
+        for (int i : selectRows) {
+            list.add(model.getEntryEntity("nckd_entryentity").get(i));
+        }
+        // 业务数据返回参数
+        Map response = service.doPush(list, bsed);
 
+        // 处理返回结果
+        List<Map> result = (List<Map>) response.get("result");
+        handlePushResult(result, list);
+        this.getView().updateView("nckd_entryentity");
     }
 
+
+    /**
+     *
+     * @param result,推送业务数据返回的结果,bizdatacode = 分录ID + _A / _B
+     * @param entryList
+     */
+    private void handlePushResult (List<Map> result, List<DynamicObject> entryList) {
+        // 根据bizdatacode提取
+        Map map = result.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.get("bizdatacode").toString();
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+
+        for (DynamicObject entry : entryList) {
+            String entryId = entry.getPkValue().toString();
+            String keyA = entryId + SitConstant.SeparatorA;
+            String keyB = entryId + SitConstant.SeparatorB;
+
+            String errorMsgA = null,errorMsgB = null,statusA = "1",statusB = "1";
+
+            Map actualMapA = (Map) map.get(keyA);
+
+            if(!ObjectUtils.isEmpty(actualMapA)) {
+                statusA = actualMapA.get("status").toString();
+                if(!"1".equals(statusA)) {
+                    errorMsgA = actualMapA.get("errormsg").toString();
+                }
+            }
+
+            Map actualMapB = (Map) map.get(keyB);
+
+            if(!ObjectUtils.isEmpty(actualMapB)) {
+                statusB = actualMapA.get("status").toString();
+                if(!"1".equals(statusB)) {
+                    errorMsgB = actualMapB.get("errormsg").toString();
+                }
+            }
+
+            if("1".equals(statusA) && "1".equals(statusB)) {
+                entry.set("nckd_datastatus", "C");
+                entry.set("nckd_pushlog", null);
+            }
+            else {
+                String msg = StringUtils.defaultString(errorMsgA) + StringUtils.defaultString(errorMsgB);
+                entry.set("nckd_pushlog", msg);
+            }
+        }
+
+
+    }
+
+
     /**
      * 比对实际执行方法
      */

+ 1 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/utils/ReportUtils.java

@@ -24,7 +24,7 @@ public class ReportUtils {
     //参保单位,险种,工号,姓名,证件号,单位缴费金额 = 单位固定+单位缴费+单位补缴,个人缴费金额=个人固定+个人缴费+个人补缴
     //2025-11-17调整 单位缴费金额 = 单位固定+单位缴费,单位补缴金额 = 单位补缴,个人缴费金额=个人固定+个人缴费;个人补缴 = 个人补缴;
     private static String CALPERSON_FIELDS = "welfarepayer.id as welfarepayer,entryentity.insuranceitem.group.id as welfaretypeid,"
-            +"empnumberdb as empnumber,namedb as empname,percre.number as empidcard,"
+            +"empnumberdb as empnumber,namedb as empname,percre.number as empidcard,employee.id as employee,"
             +"case when entryentity.insuranceitem.insurancetypeattr.number in ('1006_S','1005_S','1009_S','1010_S') then entryentity.amountvalue else 0 end as value,"
             +"case when entryentity.insuranceitem.insurancetypeattr.number in ('1011_S','1012_S') then entryentity.amountvalue else 0 end as value1,"
             +"case when entryentity.insuranceitem.insurancetypeattr.number in ('1005_S','1009_S','1011_S') then '1'"