Browse Source

fix:月结账单调度计划批量拉取月结账单

xiaopeng 5 days ago
parent
commit
c5702c3796
1 changed files with 162 additions and 42 deletions
  1. 162 42
      nckd-fi/src/main/java/nckd/fi/er/task/MonthlySettlementBillTask.java

+ 162 - 42
nckd-fi/src/main/java/nckd/fi/er/task/MonthlySettlementBillTask.java

@@ -1,5 +1,6 @@
 package nckd.fi.er.task;
 
+import com.alibaba.dubbo.common.utils.CollectionUtils;
 import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
@@ -19,6 +20,8 @@ import nckd.base.common.utils.DateUtil;
 import nckd.base.common.utils.ParamUtils;
 import nckd.base.common.utils.TripSyncUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.jetbrains.annotations.NotNull;
+
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -51,6 +54,19 @@ public class MonthlySettlementBillTask extends AbstractTask {
         }
     }
 
+    private Date parseStringToDateWithSdfMonth(String dateStr) {
+        if (ObjectUtils.isEmpty(dateStr)) {
+            return null;
+        }
+        // 每次新建SimpleDateFormat,避免线程安全问题
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        try {
+            return sdf.parse(dateStr);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
     @Override
     public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
         log.info("月结账单同步调度计划开始执行");
@@ -59,6 +75,7 @@ public class MonthlySettlementBillTask extends AbstractTask {
             log.info("月结账单查询接口 暂无数据-----");
             return ;
         }
+        List<DynamicObject> ids = new ArrayList<>();
         for (Map<String, Object> resultMap : resultLists) {
             //供应商名称-供应商编号
             Object service = resultMap.get("supplierNo");
@@ -110,6 +127,8 @@ public class MonthlySettlementBillTask extends AbstractTask {
             Object innerdownloadurl = resultMap.get("violationCause");
             //出发时间
             Object departtime = resultMap.get("takeOffTime");
+            //业务发生时间
+            Object rebookingTime = resultMap.get("rebookingtime");
             //航班号/车次号-机票航班号/车票车次
             Object number = resultMap.get("flight")==null ? resultMap.get("ticketInfoID") : resultMap.get("flight");
            //测试用例
@@ -118,6 +137,9 @@ public class MonthlySettlementBillTask extends AbstractTask {
 //            Object departtime = resultMap.get("startTime");
 //            Object number = resultMap.get("tmcSettlementid");
 
+            //调用发票查询接口
+            List<Map<String, Object>> resultInvoiceLists = getInvoiceResult(checkingbillno,rebookingTime);
+
             DynamicObject dynamicBillObj = BusinessDataServiceHelper.newDynamicObject("er_checkingbill");
             //供应商名称
             dynamicBillObj.set("server", service);
@@ -197,51 +219,111 @@ public class MonthlySettlementBillTask extends AbstractTask {
             }
             //单据体
             DynamicObjectCollection entryEntity = dynamicBillObj.getDynamicObjectCollection("invoiceentry");
-            //单据体新增一行
-            DynamicObject entry =entryEntity.addNew();
-            //单据体字段赋值
-            //发票类型
-            entry.set("invoicetype",invoicetype);
-            //发票代码
-            entry.set("invoicecode", invoicecode);
-            //发票号码
-            entry.set("invoiceno", invoiceno);
-            //行程单/火车票
-            entry.set("flightitineraryandtrain",flightitineraryandtrain.equals("0100") || flightitineraryandtrain.equals("0200"));
-            //价税合计
-            entry.set("totalamount", totalamount);
-            //税额
-            entry.set("taxamount_invoice", taxamount_invoice);
-            //结算单号
-            entry.set("checkingbillno", checkingbillno);
-            //旅客
-            entry.set("passengername", passengername);
-            //出发地
-            entry.set("invoicefromcity", invoicefromcity);
-            //目的地
-            entry.set("invoicetocity", invoicetocity);
-            //收票公司
-            entry.set("buyerorgname", buyerorgname);
-            //开票公司
-            entry.set("makeoutcompname", makeoutcompname);
-            //下载地址
-            entry.set("downloadurl", downloadurl);
-            //电子客票号
-            entry.set("ticketno", ticketno);
-            //订单类型
-            entry.set("orderstatus",orderstatus);
-            //测试
+            if (CollectionUtils.isEmpty(resultInvoiceLists)){
+                log.info("结算单号:"+checkingbillno+"未查询到发票数据");
+                break;
+            }
+            for (Map<String, Object> resultInvoiceList : resultInvoiceLists){
+                //单据体新增一行
+                DynamicObject entry =entryEntity.addNew();
+                //单据体字段赋值
+                String invoice = getInvoiceType(resultInvoiceList);
+                entry.set("invoicetype",invoice);
+                //发票代码
+                entry.set("invoicecode", resultInvoiceList.get("invoiceCode"));
+                //发票号码
+                entry.set("invoiceno", resultInvoiceList.get("invoiceNumber"));
+                //行程单/火车票
+                entry.set("flightitineraryandtrain",flightitineraryandtrain.equals("0100") || flightitineraryandtrain.equals("0200"));
+                //价税合计
+                entry.set("totalamount", resultInvoiceList.get("invoiceAmount"));
+                //税额
+                entry.set("taxamount_invoice", resultInvoiceList.get("invoiceTax"));
+                //结算单号
+                entry.set("checkingbillno", checkingbillno);
+                //旅客
+                entry.set("passengername", passengername);
+                //出发地
+                entry.set("invoicefromcity", invoicefromcity);
+                //目的地
+                entry.set("invoicetocity", invoicetocity);
+                //收票公司
+                entry.set("buyerorgname", buyerorgname);
+                //开票公司
+                entry.set("makeoutcompname", makeoutcompname);
+                //下载地址
+                entry.set("downloadurl", resultInvoiceList.get("invoiceUrl"));
+                //电子客票号
+                entry.set("ticketno", ticketno);
+                //订单类型
+                entry.set("orderstatus",orderstatus);
+                //测试
 //            entry.set("orderstatus","O");
-            //内部下载地址
-            entry.set("innerdownloadurl", innerdownloadurl);
-            //出发时间
-            entry.set("departtime", departtime);
-            //航班号/车次号
-            entry.set("number", number);
-            //保存
-            SaveServiceHelper.save(new DynamicObject[]{dynamicBillObj});
+                //内部下载地址
+                entry.set("innerdownloadurl", resultInvoiceList.get("invoiceUrl"));
+                //出发时间
+                entry.set("departtime", departtime);
+                //航班号/车次号
+                entry.set("number", number);
+                //保存
+                ids.add(dynamicBillObj);
+            }
         }
+        SaveServiceHelper.save(ids.toArray(new DynamicObject[0]));
     }
+
+    private static @NotNull String getInvoiceType(Map<String, Object> resultInvoiceList) {
+        //发票类型
+        String invoice= "";
+        if (ObjectUtils.isNotEmpty(resultInvoiceList.get("invoiceType"))){
+            switch (resultInvoiceList.get("invoiceType").toString()){
+                case "air_ticket":
+                case "air_e_ticket":
+                    //行程单
+                    invoice = "4";
+                    break;
+                case "e_vat_invoice":
+                    //全电发票(普票)
+                    invoice = "9";
+                    break;
+                case "e_vats_invoice":
+                    //全电发票(专票)
+                    invoice = "8";
+                    break;
+                case "quota_invoice":
+                    //定额发票
+                    invoice = "6";
+                    break;
+                case "train_ticket":
+                case "train_ticket_refund":
+                    //火车票/退票
+                    invoice = "5";
+                    break;
+                case "vat_invoice":
+                    //增值税普通发票
+                    invoice = "2";
+                    break;
+                case "vate_invoice ":
+                    //增值税电子普通发票
+                    invoice = "1";
+                    break;
+                case "vats_invoice":
+                    //增值税专用发票
+                    invoice = "3";
+                    break;
+                case "railway_e_ticket":
+                case "railway_e_ticket_re":
+                    //铁路电子客票
+                    //铁路电子客票退票
+                    invoice = "29";
+                    break;
+                default:
+                    invoice = "999";
+            };
+        }
+        return invoice;
+    }
+
     /**
      * @return 获取月结账单列表
      */
@@ -285,6 +367,44 @@ public class MonthlySettlementBillTask extends AbstractTask {
         return dataList;
     }
 
+    /**
+     * @return 获取发票明细
+     */
+    private List<Map<String, Object>> getInvoiceResult(Object checkingBillNo,Object rebookingTime) {
+        List<Map<String, Object>> dataList = new ArrayList<>();
+        if (Objects.isNull(rebookingTime) || Objects.isNull(checkingBillNo)) {
+            return dataList;
+        }
+        for (int i = 0; i < totalPage; i++) {
+            //创建接口业务数据参数
+            Map<String, Object> data = new HashMap<>();
+            //当前页
+            data.put("current", i + 1);
+            //每页条数,最多500条
+            data.put("size", size);
+            //结算单号
+            data.put("settlementNo", checkingBillNo.toString());
+            //账期
+            data.put("paymentDays", parseStringToDateWithSdfMonth(rebookingTime.toString()));
+            //企业编号
+            data.put("enterpriseNo","JXWL");
+            Map<String, Object> resp = TripSyncUtils.pushApiCallResult("FCSET_OUTAPI_GetInvoice", Boolean.TRUE, data);
+            //报错终止同步,等待下次计划执行
+            if ((Boolean) resp.get("fail")) {
+                throw new KDBizException(resp.get("message").toString());
+            }
+            Map<String, Object> result = (Map<String, Object>) resp.get("result");
+            List<Map<String, Object>> resultDataList = (List<Map<String, Object>>) result.getOrDefault("invoices", Collections.emptyList());
+            dataList.addAll(resultDataList);
+
+            //当前查询数量小于分页数量时结束循环
+            if (resultDataList.size() < size) {
+                break;
+            }
+        }
+        return dataList;
+    }
+
     /**
      * @return 获取同步开始时间
      */