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 map) throws KDException { List jz = new ArrayList<>();//减值数据 List ar_baddebtlossbill = new ArrayList<>();//坏账单列表 List dubilList = new ArrayList<>();//坏账单列表 List custList = new ArrayList<>();//坏账单列表 List infoList = new ArrayList<>();//计算成功的坏帐单列表 List ar_baddebtlossbill_customer = new ArrayList<>();//根据客户坏账单列表 List 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); filter.and("nckd_match_amt", QCP.equals, "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); dubilList.add(info.getString("nckd_textfield")); custList.add(info.getDynamicObject("asstact").getString("name")); } //查询减值准备数据(最新一批) QFilter jzfilter = new QFilter("nckd_dubil_id", QCP.in, dubilList); jzfilter.or("nckd_cust_name", QCP.in, custList); DynamicObject[] jzdynamicObjects = BusinessDataServiceHelper.load("nckd_impairment","nckd_dubil_id,nckd_cust_id,nckd_ecl_ratio", new QFilter[]{jzfilter}); jz = new ArrayList<>(Arrays.asList(jzdynamicObjects)); //下推坏账-根据借据号匹配 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 ar_baddebtlossbill, List jz, List infoList, List ar_baddebtlossbill_customer) { for (DynamicObject dynamicObject : ar_baddebtlossbill) { String dubil_id = dynamicObject.getString("nckd_textfield");//借据号 BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额 BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额 //查询借据号匹配的减值数据 List jzInfo = jz.stream().filter(item -> StringUtils.equals(item.getString("nckd_dubil_id"), dubil_id)).collect(Collectors.toList()); if (jzInfo.size() > 0) { //更新坏账单 BigDecimal ecl_ratio = jzInfo.get(0).getBigDecimal("nckd_ecl_ratio"); BigDecimal ecl_amount = unsettleamount.multiply(ecl_ratio); dynamicObject.set("nckd_textfield1", String.valueOf(ecl_ratio));//计提比例 dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额 dynamicObject.set("nckd_match_amt", true);//是否计算计提金额 dynamicObject.set("nckd_amountfield2", ecl_amount.subtract(nckd_amountfield1 != null ? nckd_amountfield1 : BigDecimal.ZERO));//扎差金额 infoList.add(dynamicObject); }else { //根据客户匹配 ar_baddebtlossbill_customer.add(dynamicObject); } } } public void MatchByCustom(List ar_baddebtlossbill_customer, List jz, List infoList, List ar_baddebtlossbill_five_level) { for (DynamicObject dynamicObject : ar_baddebtlossbill_customer) { BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额 String customer = dynamicObject.getDynamicObject("asstact").getString("number");//供应商编码 BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额 //查询客户匹配的减值数据 List jzInfo = jz.stream().filter(item -> StringUtils.equals(item.getString("nckd_cust_id"), customer)).collect(Collectors.toList()); if (jzInfo.size() > 0) { //更新坏账单 BigDecimal ecl_ratio = jzInfo.stream() .map(s -> { BigDecimal value = s.getBigDecimal("nckd_ecl_ratio"); return value != null ? value : BigDecimal.ZERO; // 处理 null }) .reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(jzInfo.size())); BigDecimal ecl_amount = unsettleamount.multiply(ecl_ratio); dynamicObject.set("nckd_textfield1", String.valueOf(ecl_ratio));//计提比例 dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额 dynamicObject.set("nckd_match_amt", true);//是否计算计提金额 dynamicObject.set("nckd_amountfield2", ecl_amount.subtract(nckd_amountfield1 != null ? nckd_amountfield1 : BigDecimal.ZERO));//扎差金额 infoList.add(dynamicObject); }else { //根据五级分类匹配 ar_baddebtlossbill_five_level.add(dynamicObject); } } } public void MatchByFiveLevel(List ar_baddebtlossbill_five_level, List infoList) { for (DynamicObject dynamicObject : ar_baddebtlossbill_five_level) { BigDecimal unsettleamount = dynamicObject.getBigDecimal("baddebtamt");//未结算金额 DynamicObject fiveLevel = dynamicObject.getDynamicObject("nckd_basedatafield");//五级分类 BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额 if (fiveLevel != null) { //更新坏账单 BigDecimal ecl_ratio = fiveLevel.getBigDecimal("nckd_ecl_ratio"); BigDecimal ecl_amount = unsettleamount.multiply(ecl_ratio); dynamicObject.set("nckd_textfield1", String.valueOf(ecl_ratio));//计提比例 dynamicObject.set("nckd_amountfield", ecl_amount);//计提金额 dynamicObject.set("nckd_match_amt", true);//是否计算计提金额 dynamicObject.set("nckd_amountfield2", ecl_amount.subtract(nckd_amountfield1 != null ? nckd_amountfield1 : BigDecimal.ZERO));//扎差金额 infoList.add(dynamicObject); } } } }