Просмотр исходного кода

发票详情更新定时任务

skyline 2 лет назад
Родитель
Сommit
11de7b0b62

+ 59 - 0
admin/src/main/java/com/kym/admin/jobs/InvoiceStatusJob.java

@@ -0,0 +1,59 @@
+package com.kym.admin.jobs;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.kym.entity.miniapp.ChargeOrder;
+import com.kym.entity.miniapp.Invoice;
+import com.kym.entity.wechat.InvoiceNotification;
+import com.kym.entity.wechat.InvoiceOrderDetail;
+import com.kym.service.admin.InvoiceDetailService;
+import com.kym.service.miniapp.ChargeOrderService;
+import com.kym.service.miniapp.InvoiceService;
+import com.kym.service.wechat.WxPayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author skyline
+ * @description 发票状态更新
+ */
+@Component
+@Slf4j
+public class InvoiceStatusJob {
+
+    private final InvoiceService invoiceService;
+
+    private final InvoiceDetailService invoiceDetailService;
+
+    private final ChargeOrderService chargeOrderService;
+
+    private final WxPayService wxPayService;
+
+
+    public InvoiceStatusJob(InvoiceService invoiceService, InvoiceDetailService invoiceDetailService, ChargeOrderService chargeOrderService, WxPayService wxPayService) {
+        this.invoiceService = invoiceService;
+        this.invoiceDetailService = invoiceDetailService;
+        this.chargeOrderService = chargeOrderService;
+        this.wxPayService = wxPayService;
+    }
+
+    // 每天18:00执行一次
+    @Scheduled(cron = "0 0 18 * * ?")
+    public void execute() {
+        // 所有开票中状态的发票
+        var invoiceList = invoiceService.lambdaQuery().eq(Invoice::getStatus, Invoice.STATUS_已开票).list();
+        invoiceList.forEach(invoice -> {
+            var fapiaoApplications = wxPayService.queryFapiao(invoice.getApplyId());
+            // 更新发票详情
+            invoiceDetailService.updateInvoiceDetail(invoice.getApplyId(), fapiaoApplications);
+            // 更新订单开票状态
+            if (InvoiceNotification.FapiaoStatus.ISSUED.name().equals(fapiaoApplications.getFapiao_information().get(0).getStatus())) {
+                var startChargeSeqs = invoice.getOrderDetails().stream().map(InvoiceOrderDetail::getStartChargeSeq).toList();
+                DynamicDataSourceContextHolder.push("db-miniapp");
+                chargeOrderService.lambdaUpdate().in(ChargeOrder::getStartChargeSeq, startChargeSeqs).set(ChargeOrder::getInvoiceStatus, ChargeOrder.INVOICE_STATUS_已开票).update();
+                DynamicDataSourceContextHolder.poll();
+            }
+        });
+    }
+
+}

+ 3 - 0
service/src/main/java/com/kym/service/admin/InvoiceDetailService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.kym.entity.admin.InvoiceDetail;
 import com.kym.entity.admin.queryParams.InvoiceDetailQueryParam;
 import com.kym.entity.common.PageBean;
+import com.kym.entity.wechat.FapiaoApplications;
 
 /**
  * <p>
@@ -20,4 +21,6 @@ public interface InvoiceDetailService extends IService<InvoiceDetail> {
 
 
     ExcelWriter exportInvoiceDetail(InvoiceDetailQueryParam params);
+
+    void updateInvoiceDetail(String applyId, FapiaoApplications fapiaoApplications);
 }

+ 35 - 0
service/src/main/java/com/kym/service/admin/impl/InvoiceDetailServiceImpl.java

@@ -1,9 +1,12 @@
 package com.kym.service.admin.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.github.pagehelper.PageHelper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.kym.common.utils.CommUtil;
@@ -12,6 +15,7 @@ import com.kym.entity.admin.queryParams.InvoiceDetailQueryParam;
 import com.kym.entity.common.PageBean;
 import com.kym.entity.miniapp.Invoice;
 import com.kym.entity.wechat.FapiaoApplications;
+import com.kym.entity.wechat.InvoiceNotification;
 import com.kym.mapper.admin.InvoiceDetailMapper;
 import com.kym.service.admin.InvoiceDetailService;
 import com.kym.service.miniapp.DataDictService;
@@ -109,4 +113,35 @@ public class InvoiceDetailServiceImpl extends MPJBaseServiceImpl<InvoiceDetailMa
         return writer;
 
     }
+
+    /**
+     * 更新发票详情(只处理已开票情景)
+     *
+     * @param applyId
+     * @param fapiaoApplications
+     */
+    @Override
+    @DS("db-admin")
+    @DSTransactional
+    public void updateInvoiceDetail(String applyId, FapiaoApplications fapiaoApplications) {
+        if (InvoiceNotification.FapiaoStatus.ISSUED.name().equals(fapiaoApplications.getFapiao_information().get(0).getStatus())) {
+            var invoiceDetail = new InvoiceDetail()
+                    .setApplyId(applyId)
+                    .setStatus(InvoiceNotification.FapiaoStatus.ISSUED.name())
+                    .setFapiaoTime(DateUtil.parse(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao().getFapiao_time(), "yyyy-MM-dd'T'HH:mm:ssXXX").toLocalDateTime())
+                    .setBlueFapiao(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao())
+                    .setRedFapiao(fapiaoApplications.getFapiao_information().get(0).getRed_fapiao())
+                    .setCardInformation(fapiaoApplications.getFapiao_information().get(0).getCard_information())
+                    .setTotalAmount(fapiaoApplications.getFapiao_information().get(0).getTotal_amount())
+                    .setTaxAmount(fapiaoApplications.getFapiao_information().get(0).getTax_amount())
+                    .setAmount(fapiaoApplications.getFapiao_information().get(0).getAmount())
+                    .setSellerInformation(fapiaoApplications.getFapiao_information().get(0).getSeller_information())
+                    .setBuyerInformation(fapiaoApplications.getFapiao_information().get(0).getBuyer_information())
+                    .setExtraInformation(fapiaoApplications.getFapiao_information().get(0).getExtra_information())
+                    .setItems(fapiaoApplications.getFapiao_information().get(0).getItems());
+            // 手动切换数据源
+            removeByMap(Map.of("apply_id", applyId));
+            save(invoiceDetail);
+        }
+    }
 }

+ 5 - 39
service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -9,6 +9,8 @@ import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.URLUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.kym.common.config.WxFapiaoConfig;
 import com.kym.common.config.WxPayConfig;
 import com.kym.common.constant.ResponseEnum;
@@ -874,7 +876,7 @@ public class WxPayServiceImpl implements WxPayService {
      * @return
      */
     @Override
-    @Transactional
+    @DSTransactional
     public void wxInvoiceNotify(Object[] notifyRes) {
         try {
             InvoiceNotification invoiceNotification = ((NotificationParser) notifyRes[1]).parse((RequestParam) notifyRes[0], InvoiceNotification.class);
@@ -898,23 +900,7 @@ public class WxPayServiceImpl implements WxPayService {
                  * 5.发票状态是否作废或者红冲
                  */
                 var fapiaoApplications = queryFapiao(invoice.getApplyId());
-                var invoiceDetail = new InvoiceDetail()
-                        .setApplyId(invoice.getApplyId())
-                        .setStatus(InvoiceNotification.FapiaoStatus.ISSUED.name())
-                        .setFapiaoTime(DateUtil.parse(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao().getFapiao_time(), "yyyy-MM-dd'T'HH:mm:ssXXX").toLocalDateTime())
-                        .setBlueFapiao(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao())
-                        .setRedFapiao(fapiaoApplications.getFapiao_information().get(0).getRed_fapiao())
-                        .setCardInformation(fapiaoApplications.getFapiao_information().get(0).getCard_information())
-                        .setTotalAmount(fapiaoApplications.getFapiao_information().get(0).getTotal_amount())
-                        .setTaxAmount(fapiaoApplications.getFapiao_information().get(0).getTax_amount())
-                        .setAmount(fapiaoApplications.getFapiao_information().get(0).getAmount())
-                        .setSellerInformation(fapiaoApplications.getFapiao_information().get(0).getSeller_information())
-                        .setBuyerInformation(fapiaoApplications.getFapiao_information().get(0).getBuyer_information())
-                        .setExtraInformation(fapiaoApplications.getFapiao_information().get(0).getExtra_information())
-                        .setItems(fapiaoApplications.getFapiao_information().get(0).getItems());
-                invoiceDetailService.removeByMap(Map.of("apply_id", invoice.getApplyId()));
-                invoiceDetailService.save(invoiceDetail);
-
+                invoiceDetailService.updateInvoiceDetail(invoice.getApplyId(), fapiaoApplications);
             } else {
                 LOGGER.error("微信开具发票失败:{}", invoiceNotification);
             }
@@ -925,6 +911,7 @@ public class WxPayServiceImpl implements WxPayService {
         }
     }
 
+
     /**
      * 接收电子发票相关回调通知
      *
@@ -994,27 +981,6 @@ public class WxPayServiceImpl implements WxPayService {
         headers.addHeader("Accept", "application/json");
         headers.addHeader("Content-Type", "application/json");
         var res = wxHttpClient.get(headers, fapiaoConfig.getQueryFapiao().formatted(applyId), FapiaoApplications.class);
-
-
-        var fapiaoApplications = res.getServiceResponse();
-        var invoiceDetail = new InvoiceDetail()
-                .setApplyId(applyId)
-                .setStatus(InvoiceNotification.FapiaoStatus.ISSUED.name())
-                .setFapiaoTime(DateUtil.parse(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao().getFapiao_time(), "yyyy-MM-dd'T'HH:mm:ssXXX").toLocalDateTime())
-                .setBlueFapiao(fapiaoApplications.getFapiao_information().get(0).getBlue_fapiao())
-                .setRedFapiao(fapiaoApplications.getFapiao_information().get(0).getRed_fapiao())
-                .setCardInformation(fapiaoApplications.getFapiao_information().get(0).getCard_information())
-                .setTotalAmount(fapiaoApplications.getFapiao_information().get(0).getTotal_amount())
-                .setTaxAmount(fapiaoApplications.getFapiao_information().get(0).getTax_amount())
-                .setAmount(fapiaoApplications.getFapiao_information().get(0).getAmount())
-                .setSellerInformation(fapiaoApplications.getFapiao_information().get(0).getSeller_information())
-                .setBuyerInformation(fapiaoApplications.getFapiao_information().get(0).getBuyer_information())
-                .setExtraInformation(fapiaoApplications.getFapiao_information().get(0).getExtra_information())
-                .setItems(fapiaoApplications.getFapiao_information().get(0).getItems());
-        invoiceDetailService.removeByMap(Map.of("apply_id", applyId));
-        invoiceDetailService.save(invoiceDetail);
-
-
         return res.getServiceResponse();
     }