|
|
@@ -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,9 +127,13 @@ 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");
|
|
|
- //测试用例
|
|
|
+ //国内/国外
|
|
|
+ Object international = resultMap.get("international");
|
|
|
+ //测试用例
|
|
|
// Object invoicefromcity = resultMap.get("cityName");
|
|
|
// Object invoiceno = resultMap.get("subAccCheckBatchNo");
|
|
|
// Object departtime = resultMap.get("startTime");
|
|
|
@@ -134,8 +155,25 @@ public class MonthlySettlementBillTask extends AbstractTask {
|
|
|
filters
|
|
|
);
|
|
|
dynamicBillObj.set("settlemain", conflictBills);
|
|
|
+ String s = null;
|
|
|
+ switch (operationtype.toString()){
|
|
|
+ case "01001":
|
|
|
+ case "01002":
|
|
|
+ case "01003":
|
|
|
+ if ("1".equals(international.toString())){
|
|
|
+ s = "2";
|
|
|
+ }else {
|
|
|
+ s = "4";
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "1":
|
|
|
+ case "2":
|
|
|
+ case "3":
|
|
|
+ s = "6";
|
|
|
+ break;
|
|
|
+ }
|
|
|
//服务类型
|
|
|
- dynamicBillObj.set("operationtype", operationtype);
|
|
|
+ dynamicBillObj.set("operationtype", s);
|
|
|
//单据状态
|
|
|
dynamicBillObj.set("billstatusname", "4");
|
|
|
//币种
|
|
|
@@ -195,53 +233,116 @@ public class MonthlySettlementBillTask extends AbstractTask {
|
|
|
dynamicBillObj.set("formid", "er_traincheckingbill");
|
|
|
break;
|
|
|
}
|
|
|
+ //调用发票查询接口
|
|
|
+ List<Map<String, Object>> resultInvoiceLists = getInvoiceResult(checkingbillno,rebookingTime);
|
|
|
//单据体
|
|
|
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+"未查询到发票数据");
|
|
|
+ ids.add(dynamicBillObj);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ 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 +386,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 获取同步开始时间
|
|
|
*/
|