| 
					
				 | 
			
			
				@@ -0,0 +1,151 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package nckd.jxccl.sit.hcsi.business.datacomparison; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.algo.DataSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.algo.JoinDataSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.dataentity.entity.DynamicObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.dataentity.entity.DynamicObjectCollection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.entity.datamodel.IDataModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.form.IFormView; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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 nckd.jxccl.sit.hcsi.utils.ReportUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Tyx 2025-10-31 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 数据比对服务类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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", "companySysValue"}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    String[] rightFields =  new String[]{"personOutValue", "companyOutValue"}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    IDataModel model = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    IFormView view = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DataComparisonQueryService(IDataModel model,IFormView view) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.model = model; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this.view = view; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 查询执行实际方法 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DataSet doQuery() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.info("Tyx begin DataComparisonQueryService.doQuery"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 查询任务ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Long> taskIds = queryTask(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 根据计算任务Id+险种获取到计算结果明细数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet calPersonDataSet = queryCalPersonDetail(taskIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 按照个人和单位分组汇总 type = 1为个人,type = 2为单位,这里仅为系统内数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet groupDataSet = groupCalPersonDetail(calPersonDataSet); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 再关联外部数据导入 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet outsidePersonDetail = queryOutsidePersonDetail(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 按照个人和单位分组汇总 type = 1为个人,type = 2为单位,这里仅为系统外数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet groupDataSetOut = groupCalPersonDetailOut(outsidePersonDetail); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 再join 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet finalDataSet = joinFinallyDataSet(groupDataSet, groupDataSetOut); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return finalDataSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 查询导入任务ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private List<Long> queryTask() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 社保期间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject period = (DynamicObject)this.model.getValue("nckd_period"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 参保单位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject welfarepayer = (DynamicObject)this.model.getValue("nckd_welfarepayer"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QFilter taskFilter = new QFilter("sinsurperiod.id", QCP.equals, period.getPkValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        taskFilter.and("welfarepayer.id", QCP.equals, welfarepayer.getPkValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 查找社保计算任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObjectCollection taskCols = queryDynamicObjectCollection(taskFilter, SINSURTASK, "id"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 获取所有计算任务Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Long> taskIds = taskCols.stream().map(obj -> obj.getLong("id")).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return taskIds; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DynamicObjectCollection queryDynamicObjectCollection(QFilter filter, String entityName, String selectFields) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        HRBaseServiceHelper helper = new HRBaseServiceHelper(entityName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObjectCollection cols = helper.queryOriginalCollection(selectFields, new QFilter[]{filter}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return cols; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取人员计算详情数据-系统内数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param taskIds 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DataSet queryCalPersonDetail(List<Long> taskIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObjectCollection welfareTypeCols = (DynamicObjectCollection)model.getValue("nckd_welfaretype"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Long> welfareTypeIds = welfareTypeCols.stream().map(obj -> obj.getDynamicObject("fbasedataid").getLong("id")).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ReportUtils.queryCalPersonDetail(welfareTypeIds, taskIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 分组汇总人员明细 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param calPersonDataSet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DataSet groupCalPersonDetail (DataSet calPersonDataSet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calPersonDataSet.groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","type"}).sum("value"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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").finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet sumSet2 = dataSet2.filter("type = '2'").groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","type"}).sum("value").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"}, new String[]{"value as companySysValue"}).finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return dataSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取人员计算详情数据-系统外数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private DataSet queryOutsidePersonDetail() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 社保期间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject period = (DynamicObject)this.model.getValue("nckd_period"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 参保单位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject welfarepayer = (DynamicObject)this.model.getValue("nckd_welfarepayer"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObjectCollection welfareTypeCols = (DynamicObjectCollection)model.getValue("nckd_welfaretype"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ReportUtils.queryOutsidePersonDetail(period, welfarepayer, welfareTypeCols); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DataSet groupCalPersonDetailOut (DataSet calPersonDataSet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calPersonDataSet.groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","type"}).sum("value"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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").finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet sumSet2 = dataSet2.filter("type = '2'").groupBy(new String[]{"welfarepayer","welfaretypeid","empnumber","empname","empidcard","type"}).sum("value").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 personOutValue"}, new String[]{"value as companyOutValue"}).finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return dataSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public DataSet joinFinallyDataSet (DataSet groupDataSet, DataSet groupDataSetOut) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DataSet finalDataSet = groupDataSet.join(groupDataSetOut).on("welfarepayer", "welfarepayer").on("welfaretypeid", "welfaretypeid"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                on("empnumber", "empnumber").on("empname", "empname"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                on("empidcard", "empidcard").select(leftFields, rightFields).finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return finalDataSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |