Эх сурвалжийг харах

坏帐单后台任务提交,固定资产逻辑优化

wanwei 7 сар өмнө
parent
commit
d7a6dc8756

+ 124 - 0
src/main/java/fi/cas/task/MatchBadDebtsTask.java

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

+ 16 - 37
src/main/java/fi/er/opplugin/FinapbillBeforeF7SelectSample.java

@@ -5,6 +5,7 @@ import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.field.MulBasedataEdit;
 import kd.bos.form.field.RefBillEdit;
 import kd.bos.form.field.events.BeforeF7SelectEvent;
 import kd.bos.form.field.events.BeforeF7SelectListener;
@@ -28,6 +29,8 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
         //监听单据字段
         super.registerListener(e);
         RefBillEdit bill = this.getView().getControl(nckd_apfinapbill);
+        MulBasedataEdit mEdit = this.getView().getControl("nckd_real_card");
+        mEdit.addBeforeF7SelectListener(this);
         bill.addBeforeF7SelectListener(this);
     }
     @Override
@@ -57,6 +60,12 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
                 ListShowParameter showParameter = (ListShowParameter)arg0.getFormShowParameter();
                 showParameter.getListFilterParameter().setFilter(qFilter);
             }
+        } else if (StringUtils.equals(fieldKey, "nckd_real_card")) {
+            DynamicObject assetorg = (DynamicObject) this.getModel().getValue("assetorg");//资产组织
+            QFilter qFilter = new QFilter("nckd_orgfield.id", QCP.equals, assetorg.getLong("id"));
+            // 表过滤条件
+            ListShowParameter showParameter = (ListShowParameter)arg0.getFormShowParameter();
+            showParameter.getListFilterParameter().setFilter(qFilter);
         }
     }
 
@@ -150,41 +159,7 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
                 //刷新冲预付借款分录
                 this.getView().updateView("nckd_ap_finapbill_detail");
             }
-        }//资产组织变更
-        else if (StringUtils.equals("assetorg", fieldKey)) {
-            ChangeData changeData = e.getChangeSet()[0];
-            DynamicObject dynamicObject = (DynamicObject) changeData.getNewValue();
-            Long id = dynamicObject.getLong("id");
-            //查询组织
-            QFilter filter = new QFilter("id", QCP.equals,id);
-            DynamicObject[] orgDynamicObjects = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {filter});
-            DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(orgDynamicObjects[0].getPkValue(), orgDynamicObjects[0].getDynamicObjectType().getName());
-            //获取资产信息分录
-            DynamicObjectCollection assetentry = this.getModel().getEntryEntity("assetentry");
-            for (int i = 0; i < assetentry.size(); i++) {
-                //给分录核算组织,使用部门赋值
-                this.getModel().setValue("nckd_orgfield1", orgInfo, i);
-                this.getModel().setValue("asset_costdept", orgInfo, i);
-            }
-            //刷新资产信息分录
-            this.getView().updateView("assetentry");
-        } //资产信息分录-核算组织变更
-        else if (StringUtils.equals("nckd_orgfield1", fieldKey)) {
-            ChangeData changeData = e.getChangeSet()[0];
-            DynamicObject dynamicObject = (DynamicObject) changeData.getNewValue();
-            Long id = dynamicObject.getLong("id");
-            //查询组织
-            QFilter filter = new QFilter("id", QCP.equals,id);
-            DynamicObject[] orgDynamicObjects = BusinessDataServiceHelper.load("bos_org","id",new QFilter[] {filter});
-            DynamicObject orgInfo = BusinessDataServiceHelper.loadSingle(orgDynamicObjects[0].getPkValue(), orgDynamicObjects[0].getDynamicObjectType().getName());
-            //获取资产信息分录
-            DynamicObjectCollection assetentry = this.getModel().getEntryEntity("assetentry");
-            //给分录核算组织,使用部门赋值
-            this.getModel().setValue("nckd_orgfield1", orgInfo, e.getChangeSet()[0].getRowIndex());
-            this.getModel().setValue("asset_costdept", orgInfo, e.getChangeSet()[0].getRowIndex());
-            //刷新资产信息分录
-            this.getView().updateView("assetentry");
-        } else if (StringUtils.equals("expenseamount", fieldKey) || StringUtils.equals("nckd_amountfield3", fieldKey)) {
+        }else if (StringUtils.equals("expenseamount", fieldKey) || StringUtils.equals("nckd_amountfield3", fieldKey)) {
             String reimbursetype = (String) this.getModel().getValue("reimbursetype");
             if("asset".equals(reimbursetype)) {
                 if (this.getModel().getEntryEntity("assetentry").size() == 0) {
@@ -278,13 +253,17 @@ public class FinapbillBeforeF7SelectSample extends AbstractFormPlugin implements
         String reimbursetype = (String) this.getModel().getValue("reimbursetype");
         int rowIndex = this.getModel().createNewEntryRow("assetentry");
         if("asset".equals(reimbursetype)){
-            //获取费用明细分录
-            DynamicObjectCollection assetentry = this.getModel().getEntryEntity("expenseentryentity");
             //查询费用明细
             QFilter filter = new QFilter("name", QCP.equals,"资产报账");
             DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("er_expenseitemedit","id",new QFilter[] {filter});
             DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType().getName());
             this.getModel().setValue("expenseitem", info, 0);
+
+            //给资产信息分录,核算组织,使用部门赋值
+            DynamicObject assetorg = (DynamicObject) this.getModel().getValue("assetorg");//资产组织
+            DynamicObject costdept = (DynamicObject) this.getModel().getValue("costdept");//费用承担部门
+            this.getModel().setValue("nckd_orgfield1", assetorg.getLong("id"), 0);//核算组织
+            this.getModel().setValue("asset_costdept", costdept.getLong("id"), 0);//使用部门
         }
     }
 

+ 47 - 1
src/main/java/fi/fa/opplugin/RealCardBillOpPlugin.java

@@ -22,7 +22,7 @@ public class RealCardBillOpPlugin extends AbstractOperationServicePlugIn {
                 //审批通过后,如果是报销单下推的单据,则回写e卡片清单
                 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
                 String srcbillentityname = info.getString("srcbillentityname");
-                Long bxId = info.getLong("nckd_bz_id");
+                long bxId = info.getLong("nckd_bz_id");
                 String number = info.getString("number");//资产编码
                 String name = info.getString("assetname");//资产名称
                 DynamicObject org = info.getDynamicObject("assetunit");//资产组织
@@ -40,9 +40,32 @@ public class RealCardBillOpPlugin extends AbstractOperationServicePlugIn {
                             SaveServiceHelper.save(new DynamicObject[]{cardInfo});
                         }
                     }
+
+                    //反写合同台账单
+                    if (bxId != 0) {
+                        //查询报销单
+                        QFilter bxFilter = new QFilter("id", QCP.equals,bxId);
+                        DynamicObject[] bxDynamicObjects = BusinessDataServiceHelper.load("er_publicreimbursebill","id",new QFilter[] {bxFilter});
+                        for (int j = 0; j < bxDynamicObjects.length; j++) {
+                            DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[i].getPkValue(), bxDynamicObjects[i].getDynamicObjectType().getName());
+                            String nckd_sourcebillid = bxInfo.getString("nckd_sourcebillid");
+                            if (!StringUtils.isEmpty(nckd_sourcebillid)) {
+                                Long contractbillId = Long.parseLong(nckd_sourcebillid);
+                                //查询合同台账单
+                                QFilter htFilter = new QFilter("id", QCP.equals,contractbillId);
+                                DynamicObject[] htDynamicObjects = BusinessDataServiceHelper.load("er_contractbill","id",new QFilter[] {htFilter});
+                                for (int k = 0; k < htDynamicObjects.length; k++) {
+                                    DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[i].getPkValue(), htDynamicObjects[i].getDynamicObjectType().getName());
+                                    htInfo.set("nckd_real_card", info.getString("billno"));
+                                    SaveServiceHelper.save(new DynamicObject[]{htInfo});
+                                }
+                            }
+                        }
+                    }
                 }
             }else if(StringUtils.equals(e.getOperationKey(),"unaudit")) {
                 DynamicObject info = BusinessDataServiceHelper.loadSingle(dynamicObjects[i].getPkValue(), dynamicObjects[i].getDynamicObjectType().getName());
+                long bxId = info.getLong("nckd_bz_id");
                 String srcbillentityname = info.getString("srcbillentityname");
                 if (!"fa_assetsplitbill".equals(srcbillentityname)) {
                     //反审核,e管家实物卡片清单三个字段置为空
@@ -59,6 +82,29 @@ public class RealCardBillOpPlugin extends AbstractOperationServicePlugIn {
                         cardInfo.set("nckd_card_real_name", null);
                         SaveServiceHelper.save(new DynamicObject[]{cardInfo});
                     }
+
+                    //反写合同台账
+                    if (bxId != 0) {
+                        //查询报销单
+                        QFilter bxFilter = new QFilter("id", QCP.equals,bxId);
+                        DynamicObject[] bxDynamicObjects = BusinessDataServiceHelper.load("er_publicreimbursebill","id",new QFilter[] {bxFilter});
+                        for (int j = 0; j < bxDynamicObjects.length; j++) {
+                            DynamicObject bxInfo = BusinessDataServiceHelper.loadSingle(bxDynamicObjects[i].getPkValue(), bxDynamicObjects[i].getDynamicObjectType().getName());
+                            String nckd_sourcebillid = bxInfo.getString("nckd_sourcebillid");
+                            if (!StringUtils.isEmpty(nckd_sourcebillid)) {
+                                Long contractbillId = Long.parseLong(nckd_sourcebillid);
+                                //查询合同台账单
+                                QFilter htFilter = new QFilter("id", QCP.equals,contractbillId);
+                                DynamicObject[] htDynamicObjects = BusinessDataServiceHelper.load("er_contractbill","id",new QFilter[] {htFilter});
+                                for (int k = 0; k < htDynamicObjects.length; k++) {
+                                    DynamicObject htInfo = BusinessDataServiceHelper.loadSingle(htDynamicObjects[i].getPkValue(), htDynamicObjects[i].getDynamicObjectType().getName());
+                                    htInfo.set("nckd_real_card", null);
+                                    SaveServiceHelper.save(new DynamicObject[]{htInfo});
+                                }
+                            }
+
+                        }
+                    }
                 }
             }
         }

+ 29 - 1
src/main/java/fi/fa/opplugin/RealCardF7OpPlugin.java

@@ -5,11 +5,20 @@ import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.field.MulBasedataEdit;
+import kd.bos.form.field.RefBillEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
 import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.ListShowParameter;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 
+import java.util.EventObject;
+
 //实物卡片关联e管家实物卡片清单插件
-public class RealCardF7OpPlugin extends AbstractFormPlugin {
+public class RealCardF7OpPlugin extends AbstractFormPlugin implements BeforeF7SelectListener {
     @Override
     public void propertyChanged(PropertyChangedArgs e) {
         String fieldKey = e.getProperty().getName();
@@ -25,4 +34,23 @@ public class RealCardF7OpPlugin extends AbstractFormPlugin {
             this.getView().updateView("nckd_realcard_list");
         }
     }
+
+    @Override
+    public void registerListener(EventObject e) {
+        //监听单据字段
+        super.registerListener(e);
+        MulBasedataEdit mEdit = this.getView().getControl("nckd_real_card");
+        mEdit.addBeforeF7SelectListener(this);
+    }
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent arg0) {
+        String fieldKey = arg0.getProperty().getName();
+        if (StringUtils.equals(fieldKey, "nckd_real_card")) {
+            DynamicObject assetunit = (DynamicObject) this.getModel().getValue("assetunit");//资产组织
+            QFilter qFilter = new QFilter("nckd_orgfield.id", QCP.equals, assetunit.getLong("id"));
+            // 表过滤条件
+            ListShowParameter showParameter = (ListShowParameter)arg0.getFormShowParameter();
+            showParameter.getListFilterParameter().setFilter(qFilter);
+        }
+    }
 }