123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- 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> jz = new ArrayList<>();//减值数据
- List<DynamicObject> ar_baddebtlossbill = new ArrayList<>();//坏账单列表
- List<String> dubilList = new ArrayList<>();//坏账单列表
- List<String> custList = 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);
- 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<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");//未结算金额
- BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额
- //查询借据号匹配的减值数据
- List<DynamicObject> 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<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");//供应商编码
- BigDecimal nckd_amountfield1 = dynamicObject.getBigDecimal("nckd_amountfield1");//上月计提金额
- //查询客户匹配的减值数据
- List<DynamicObject> 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<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");//五级分类
- 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);
- }
- }
- }
- }
|