| 
					
				 | 
			
			
				@@ -0,0 +1,124 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package fi.cas.task; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.druid.util.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.context.RequestContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.dataentity.entity.DynamicObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.exception.KDException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.orm.query.QCP; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.orm.query.QFilter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.schedule.executor.AbstractTask; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.servicehelper.BusinessDataServiceHelper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kd.bos.servicehelper.operation.SaveServiceHelper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.math.BigDecimal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//计算财务应付单到坏账计提单的减值数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class MatchBadDebtsTask extends AbstractTask { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DynamicObject> ar_baddebtlossbill = new ArrayList<>();//坏账单列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DynamicObject> infoList = new ArrayList<>();//计算成功的坏帐单列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DynamicObject> ar_baddebtlossbill_customer = new ArrayList<>();//根据客户坏账单列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DynamicObject> ar_baddebtlossbill_five_level = new ArrayList<>();//根据五级分类坏账单列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //获取当前日期和时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date currentDate = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 使用Calendar来获取前七天的日期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Calendar calendar = Calendar.getInstance(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calendar.setTime(currentDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calendar.add(Calendar.DAY_OF_MONTH, -7); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date sevenDaysAgo = calendar.getTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询“是否诉讼类费用”且业务日期再当前日期到啊七天前之间的坏账单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QFilter filter = new QFilter("nckd_checkboxfield", QCP.equals, "1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        filter.and("bizdate", QCP.large_than, sevenDaysAgo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        filter.and("bizdate", QCP.less_than, currentDate); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        filter.and("baddebtamt", QCP.large_than, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("ar_baddebtlossbill","id", new QFilter[] {filter}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int i = 0; i < dynamicObjects.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ar_baddebtlossbill.add(info); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询减值准备数据(最新一批) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<DynamicObject> jz = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject[] jzdynamicObjects = BusinessDataServiceHelper.load("nckd_impairment","id", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (int j = 0; j < jzdynamicObjects.length; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            DynamicObject info = BusinessDataServiceHelper.loadSingle(jzdynamicObjects[j].getPkValue(), jzdynamicObjects[j].getDynamicObjectType().getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            jz.add(info); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //下推坏账-根据借据号匹配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MatchByDubilId(ar_baddebtlossbill, jz, infoList, ar_baddebtlossbill_customer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //下推坏账-根据客户匹配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MatchByCustom(ar_baddebtlossbill_customer, jz, infoList, ar_baddebtlossbill_five_level); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //下推坏账-根据五级分类匹配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MatchByFiveLevel(ar_baddebtlossbill_five_level, infoList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //保存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DynamicObject[] array = infoList.toArray(new DynamicObject[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SaveServiceHelper.save(array); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void MatchByDubilId(List<DynamicObject> ar_baddebtlossbill, List<DynamicObject> jz, List<DynamicObject> infoList, List<DynamicObject> ar_baddebtlossbill_customer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (DynamicObject dynamicObject : ar_baddebtlossbill) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String dubil_id = dynamicObject.getString("nckd_textfield");//借据号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //查询借据号匹配的减值数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            DynamicObject jzInfo = jz.stream().filter(item -> item.getString("nckd_dubil_id").equals(dubil_id)).collect(Collectors.toList()).get(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (jzInfo != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //更新坏账单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                double ecl_ratio = jzInfo.getInt("nckd_ecl_ratio"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal ecl_amount = unsettleamount.multiply(BigDecimal.valueOf(ecl_ratio)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dynamicObject.set("nckd_basedatapropfield", ecl_ratio);//计提比例 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                infoList.add(dynamicObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //根据客户匹配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ar_baddebtlossbill_customer.add(dynamicObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void MatchByCustom(List<DynamicObject> ar_baddebtlossbill_customer, List<DynamicObject> jz, List<DynamicObject> infoList, List<DynamicObject> ar_baddebtlossbill_five_level) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (DynamicObject dynamicObject : ar_baddebtlossbill_customer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String customer = dynamicObject.getDynamicObject("asstact").getString("number");//供应商编码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //查询客户匹配的减值数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<DynamicObject> jzInfo = jz.stream().filter(item -> StringUtils.equals(item.getString("nckd_cust_id"), customer)).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!jzInfo.isEmpty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //更新坏账单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                double ecl_ratio = (double) jzInfo.stream().mapToInt(s -> s.getInt("nckd_ecl_ratio")).sum() / jzInfo.size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal ecl_amount = unsettleamount.multiply(BigDecimal.valueOf(ecl_ratio)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dynamicObject.set("nckd_basedatapropfield", ecl_ratio);//计提比例 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                infoList.add(dynamicObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //根据五级分类匹配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ar_baddebtlossbill_five_level.add(dynamicObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void MatchByFiveLevel(List<DynamicObject> ar_baddebtlossbill_five_level, List<DynamicObject> infoList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (DynamicObject dynamicObject : ar_baddebtlossbill_five_level) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            DynamicObject fiveLevel = dynamicObject.getDynamicObject("nckd_basedatafield");//五级分类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (fiveLevel != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //更新坏账单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                double ecl_ratio = fiveLevel.getInt("nckd_ecl_ratio"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal ecl_amount = unsettleamount.multiply(BigDecimal.valueOf(ecl_ratio)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dynamicObject.set("nckd_basedatapropfield", ecl_ratio);//计提比例 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                infoList.add(dynamicObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |