|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|