批量开票接口异步任务

beta
kk 2 years ago
parent 91f1e90404
commit 0dcf0c325f
  1. 210
      jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java
  2. 9
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/InvoiceBack.java
  3. 1
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceRequestService.java
  4. 218
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/AisinoInvoiceRequestAdapterImpl.java
  5. 5
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/Nuonuo2InvoiceRequestAdapterImpl.java
  6. 30
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiZhongQiServiceImpl.java
  7. 267
      jianshui-invoice/src/main/java/com/jianshui/invoice/task/AddInvoiceBatchTask.java
  8. 1
      jianshui-invoice/src/main/java/com/jianshui/invoice/task/InvoiceBackTask.java
  9. 7
      jianshui-invoice/src/main/resources/mapper/invoice/InvoiceBackMapper.xml

@ -25,6 +25,7 @@ import com.jianshui.invoice.domain.ele.EleOuterMessage;
import com.jianshui.invoice.domain.ele.FindRedInfoDTO;
import com.jianshui.invoice.domain.ele.HZSQDMessage;
import com.jianshui.invoice.mapper.InvoiceBackMapper;
import com.jianshui.invoice.task.AddInvoiceBatchTask;
import com.jianshui.invoice.task.InvoiceBackTask;
import com.jianshui.invoice.utils.elephant.ElephantUtils;
import com.jianshui.platform.dto.InvoiceAdd.BillInfoPDTO;
@ -47,14 +48,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.List;
import java.util.TimerTask;
import java.util.*;
/**
* @Description
@ -1828,195 +1829,32 @@ public class InvoiceController {
@ApiImplicitParam(name = "identity", value = "身份认证", dataType = "java.lang.Void", example = "1130", required = true),
@ApiImplicitParam(name = "order", value = "请求体", dataType = "java.lang.Void", required = true)})
@PostMapping({"/api/invoice/v1/addInvoiceBatch", "/api/invoice/v1/addInvoiceBatch/{identity}", "/invoice/addInvoiceBatch"})
public void addInvoiceBatch(HttpServletRequest request, String identity) throws Exception {
public AjaxResult addInvoiceBatch(HttpServletRequest request, String identity) throws Exception {
// 异步任务
// 1-前置条件判断
// InvoiceBack invoiceBack = new InvoiceBack();
// invoiceBack.setUpdateTime(new Date());
// invoiceBack.setCreateTime(new Date());
// invoiceBack.setId(IdUtil.randomUUID());
// invoiceBack.setSystemOrderno(IdUtil.randomUUID());
// invoiceBack.setStatus("1");
// invoiceBack.setIdentity(identity);
// invoiceBack.setBackMsg("");
// invoiceBack.setBackUrl("");
// 1-1 identity校验
if (StringUtils.isEmpty(identity)) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("身份认证参数为空!");
log.info("[重汽批量开票接口]身份认证参数为空!");
return;
}
// 1-2 企业信息校验
Companyservice companyservice = null;
try {
companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity);
} catch (Exception e) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("企业信息不存在!");
log.info("[重汽批量开票接口]获取企业信息异常!identity={},e={}", identity, e);
return;
}
if (companyservice == null) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("企业信息不存在!");
log.info("[重汽批量开票接口]企业信息不存在!identity={}", identity);
return;
}
// 1-3 获得入口报文适配器
JSONObject decryptResult = null;
try {
String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid());
IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey);
decryptResult = invoiceRequestService.decrypt(request, companyservice, "addBatch");
} catch (Exception e) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("请求解密失败!");
log.info("[重汽批量开票接口]请求解密失败!identity={},e={}", identity, e);
return;
}
// 2-报文处理
cn.hutool.json.JSONObject billJson = null;
try {
billJson = JSONUtil.parseObj(decryptResult);
} catch (Exception e) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("未匹配到发票报文!");
log.info("[重汽批量开票接口]报文格式化异常!identity={},e={}", identity, e);
return;
log.info("[重汽批量开票接口]{},请求开票接口!", identity);
// 前置处理
// 获取请求内容
Map<String, String[]> map = request.getParameterMap();
Set<String> key = map.keySet();
Iterator<String> iterator = key.iterator();
JSONObject rawJson = new JSONObject();
while (iterator.hasNext()) {
String k = iterator.next();
rawJson.put(k, map.get(k)[0]);
}
if (billJson.get("billInfo") == null) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("未匹配到发票报文!");
log.info("[重汽批量开票接口]未匹配到发票报文!identity={}", identity);
return;
}
JSONArray billJsonArray = null;
try {
billJsonArray = JSONUtil.parseArray(billJson.get("billInfo"));
} catch (Exception e) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("发票报文为空!");
log.info("[重汽批量开票接口]发票报文获取异常!identity={},e={}", identity, e);
return;
}
if (billJsonArray.size() == 0) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("发票报文为空!");
log.info("[重汽批量开票接口]发票报文为空!identity={}", identity);
return;
}
// 3-报文递交开票
for (Object billInfoObj : billJsonArray) {
// 1-前置条件判断
InvoiceBack invoiceBack = new InvoiceBack();
invoiceBack.setUpdateTime(new Date());
invoiceBack.setCreateTime(new Date());
invoiceBack.setId(IdUtil.randomUUID());
invoiceBack.setSystemOrderno(IdUtil.randomUUID());
invoiceBack.setStatus("1");
invoiceBack.setIdentity(identity);
invoiceBack.setBackMsg("");
invoiceBack.setBackUrl("");
BillInfo billInfo = BeanUtil.copyProperties(billInfoObj, BillInfo.class);
if (billInfo == null) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("报文格式错误!");
log.info("[重汽批量开票接口]报文格式错误!identity={}", identity);
continue;
}
billInfo.setSource("2");
// 4-获得请求实例,并且进行扣费
IInvoiceApiService invoiceService = null;
try {
String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid());
serviceManageService.companyConsume("invoice", companyservice.getCompanyid());
billInfo.setServiceSupplierKey(serviceKey);
invoiceService = invoiceServiceFactory.getService(serviceKey);
} catch (Exception e) {
// invoiceBack.setResultCode("9999");
// invoiceBack.setResultMsg("扣费失败!");
log.info("[重汽批量开票接口]扣费失败!identity={},e={}", identity, e);
continue;
}
// 5-开票
try {
HXResponse resultHx = invoiceService.addInvoice(billInfo, companyservice);
log.info("[重汽批量开票接口]开票identity={},返回结果result={}", identity, resultHx);
if (!resultHx.isSuccess()) {
QueryWrapper<InvoiceBack> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("system_orderno", billInfo.getOutTradeOrderno());
InvoiceBack invoiceBackTemp = invoiceBackMapper.selectOne(queryWrapper);
if (invoiceBackTemp != null) {
invoiceBackTemp.setResultCode("9999");
invoiceBackTemp.setResultMsg(resultHx.getMessage());
invoiceBackTemp.setStatus("0");
invoiceBackTemp.setUpdateTime(new Date());
invoiceBackMapper.updateInvoiceBack(invoiceBackTemp);
invoiceService.callBackAisino(invoiceBackTemp,"", Long.valueOf(identity));
} else {
invoiceBack.setResultCode("9999");
invoiceBack.setResultMsg(resultHx.getMessage());
invoiceBack.setSystemOrderno(billInfo.getOutTradeOrderno());
invoiceBack.setStatus("0");
invoiceBack.setCreateTime(new Date());
invoiceBackMapper.insertInvoiceBack(invoiceBack);
invoiceService.callBackAisino(invoiceBack,"", Long.valueOf(identity));
}
log.info("[重汽批量开票接口]提交开票异常,开票失败!identity={},msg={}", identity, resultHx.getMessage());
continue;
}
} catch (Exception e) {
QueryWrapper<InvoiceBack> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("system_orderno", billInfo.getOutTradeOrderno());
InvoiceBack invoiceBackTemp = invoiceBackMapper.selectOne(queryWrapper);
if (invoiceBackTemp != null) {
invoiceBackTemp.setResultCode("9999");
invoiceBackTemp.setResultMsg("开票失败!");
invoiceBackTemp.setStatus("0");
invoiceBackTemp.setUpdateTime(new Date());
invoiceBackMapper.updateInvoiceBack(invoiceBackTemp);
invoiceService.callBackAisino(invoiceBackTemp,"", Long.valueOf(identity));
} else {
invoiceBack.setResultCode("9999");
invoiceBack.setResultMsg("开票失败!");
invoiceBack.setSystemOrderno(billInfo.getOutTradeOrderno());
invoiceBack.setStatus("0");
invoiceBack.setCreateTime(new Date());
invoiceBackMapper.insertInvoiceBack(invoiceBack);
invoiceService.callBackAisino(invoiceBack,"", Long.valueOf(identity));
}
log.info("[重汽批量开票接口]提交开票异常,开票失败!identity={},e={}", identity, e);
continue;
}
if (StringUtils.isEmpty(rawJson)) {
log.info("[重汽批量开票接口]未获取到请求参数!identity={},e={}", identity);
return AjaxResult.error("未获取到请求参数!");
}
String order = rawJson.getString("order");
// 异步任务
AsyncManager.me().execute(new AddInvoiceBatchTask(iCompanyserviceService, serviceManageService
, invoiceRequestFactory, invoiceServiceFactory, invoiceBackMapper, identity, order));
log.info("[重汽批量开票接口]{},执行完成!", identity);
return AjaxResult.success("数据接受成功!");
}

@ -54,7 +54,16 @@ public class InvoiceBack
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/** 调用次数*/
private Integer num;
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public Date getUpdateTime() {
return updateTime;

@ -21,6 +21,7 @@ public interface IInvoiceRequestService {
* @return
*/
public JSONObject decrypt(HttpServletRequest request, Companyservice companyservice, String serviceKey);
public JSONObject decryptZq(String identity,String order, Companyservice companyservice, String serviceKey);
/**
* 根据用户传入的请求方式返回我们系统对应的请求方式

@ -312,6 +312,224 @@ public class AisinoInvoiceRequestAdapterImpl implements IInvoiceRequestService {
return json;
}
@Override
public JSONObject decryptZq(String identity,String order, Companyservice companyservice, String serviceKey) {
log.info("【航信转invoice请求适配器】客户请求报文原始数据:{},销方id:{},serviceKey:{},identity={}", order, companyservice.getCompanyid(), serviceKey,identity);
// 开始解析报文
if (order == null || "".equals(order.trim())) {
throw new JianshuiParamErrorException(ErrorCode.ERROR_PARAMS, companyservice, "invoice");
}
String JKey = companyservice.getSecret(); // 解密用的secret
if (StringUtils.isEmpty(JKey)) {
throw new JianshuiParamErrorException(ErrorCode.IDENTITY_NOT_SET, companyservice, "invoice");
}
// 平台解密
try {
// TODO: 2023/9/20
order = AisinoInvoiceDecryptUtil.decrypt(order, JKey);
} catch (Exception e) {
e.printStackTrace();
throw new JianshuiParamErrorException(ErrorCode.DECRYPT_ERROR, companyservice, "invoice");
}
log.info("销项报文:identity=" + identity + ",order=" + order);
// 报文内容体
JSONObject json = new JSONObject();
try {
// 根据用户封装参数进行区别处理
JSONObject orderJson = JSONObject.parseObject(order);
String myIdentity = orderJson.getString("identity");
if (myIdentity != null) {
// order里面有identity的情况,取出来order
JSONObject tempJson = new JSONObject();
tempJson = orderJson.getJSONObject("order");
if (tempJson != null) {
orderJson = tempJson;
}
}
json = orderJson;
// 红字查询
if (StringUtils.equals(serviceKey,"find_redinfo")){
return json;
}
// 如果是开票或者查询
if (StringUtils.equals(serviceKey, "add") || StringUtils.equals(serviceKey, "query")) {
// 开始把航信报文转成billInfo
HxBillInfoDTO hxBillInfo = json.toJavaObject(HxBillInfoDTO.class);
BillInfo billInfo = new BillInfo();
BeanUtils.copyProperties(hxBillInfo, billInfo);
if(StringUtils.isNotEmpty(hxBillInfo.getEmail())){
billInfo.setBuyerEmail(hxBillInfo.getEmail());
}
if (StringUtils.isEmpty(billInfo.getBuyerBank()) && StringUtils.isNotEmpty(billInfo.getBuyerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getBuyerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getBuyerAccount();
billInfo.setBuyerAccount(bankNo);
billInfo.setBuyerBank(raw.replace(bankNo, ""));
}
}
// 处理detail
List<HxBillDetailDTO> hxBillDetailList = hxBillInfo.getDetail();
List<BillDetail> detailList = new ArrayList<>();
if (hxBillDetailList != null && hxBillDetailList.size() > 0) {
for (HxBillDetailDTO detial : hxBillDetailList) {
BillDetail temp = new BillDetail();
BeanUtils.copyProperties(detial, temp);
detailList.add(temp);
}
billInfo.setBillDetailList(detailList);
}
if (StringUtils.isEmpty(billInfo.getBuyerBank()) && StringUtils.isNotEmpty(billInfo.getBuyerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getBuyerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getBuyerAccount();
billInfo.setBuyerAccount(bankNo);
billInfo.setBuyerBank(raw.replace(bankNo, ""));
}
}
// 处理销方信息
if (StringUtils.isEmpty(billInfo.getSellerBank()) && StringUtils.isNotEmpty(billInfo.getSellerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getSellerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getSellerAccount();
billInfo.setSellerAccount(bankNo);
billInfo.setSellerBank(raw.replace(bankNo, ""));
}
}
json = (JSONObject) JSONObject.toJSON(billInfo);
}
if (StringUtils.equals(serviceKey, "addBatch") ) {
JSONArray billInfoList = JSONUtil.parseArray(json.get("billInfo"));
JSONArray billInfoResult = new JSONArray();
for (Object billInfoTemp : billInfoList) {
// 开始把航信报文转成billInfo
JSONObject orderJsonTemp = JSONObject.parseObject(String.valueOf(billInfoTemp));
HxBillInfoDTO hxBillInfo = orderJsonTemp.toJavaObject(HxBillInfoDTO.class);
BillInfo billInfo = new BillInfo();
BeanUtils.copyProperties(hxBillInfo, billInfo);
if(StringUtils.isNotEmpty(hxBillInfo.getEmail())){
billInfo.setBuyerEmail(hxBillInfo.getEmail());
}
if (StringUtils.isEmpty(billInfo.getBuyerBank()) && StringUtils.isNotEmpty(billInfo.getBuyerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getBuyerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getBuyerAccount();
billInfo.setBuyerAccount(bankNo);
billInfo.setBuyerBank(raw.replace(bankNo, ""));
}
}
// 处理detail
List<HxBillDetailDTO> hxBillDetailList = hxBillInfo.getDetail();
List<BillDetail> detailList = new ArrayList<>();
if (hxBillDetailList != null && hxBillDetailList.size() > 0) {
for (HxBillDetailDTO detial : hxBillDetailList) {
BillDetail temp = new BillDetail();
BeanUtils.copyProperties(detial, temp);
detailList.add(temp);
}
billInfo.setBillDetailList(detailList);
}
if (StringUtils.isEmpty(billInfo.getBuyerBank()) && StringUtils.isNotEmpty(billInfo.getBuyerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getBuyerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getBuyerAccount();
billInfo.setBuyerAccount(bankNo);
billInfo.setBuyerBank(raw.replace(bankNo, ""));
}
}
// 处理销方信息
if (StringUtils.isEmpty(billInfo.getSellerBank()) && StringUtils.isNotEmpty(billInfo.getSellerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getSellerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getSellerAccount();
billInfo.setSellerAccount(bankNo);
billInfo.setSellerBank(raw.replace(bankNo, ""));
}
}
json = (JSONObject) JSONObject.toJSON(billInfo);
billInfoResult.add(json);
}
// 清除数据,重新组装
json.clear();
json.put("billInfo",billInfoResult);
}
// 如果是redinfo
if (StringUtils.equals(serviceKey, "add_redinfo")) {
// 开始把航信报文转成billInfo
HxRedInfoDTO hxBillInfo = json.toJavaObject(HxRedInfoDTO.class);
Redinfo billInfo = new Redinfo();
BeanUtils.copyProperties(hxBillInfo, billInfo);
// 处理detail
List<HxRedInfoDetailsDTO> hxBillDetailList = hxBillInfo.getRedinfodetailList();
List<Redinfodetail> detailList = new ArrayList<>();
if(CollectionUtil.isNotEmpty(hxBillDetailList)){
for (int i = 0; i < hxBillDetailList.size(); i++) {
HxRedInfoDetailsDTO detial = hxBillDetailList.get(i);
Redinfodetail temp = new Redinfodetail();
BeanUtils.copyProperties(detial, temp);
temp.setIndex(i);
detailList.add(temp);
}
billInfo.setRedinfodetailList(detailList);
}
json = (JSONObject) JSONObject.toJSON(billInfo);
}
// 如果是发票作废
if (StringUtils.equals(serviceKey, "deprecate")) {
return json;
}
// 如果是红字信息表下载
if (StringUtils.equals(serviceKey, "download_redinfo")) {
DownloadRedInfoDTO downloadRedInfoDTO = json.toJavaObject(DownloadRedInfoDTO.class);
json = (JSONObject) JSONObject.toJSON(downloadRedInfoDTO);
return json;
}
// 如果是发票打印
if (StringUtils.equals(serviceKey, "batch_print")) {
// JSONArray detail = json.getJSONArray("dyfpxx");
// for (int i = 0; i < detail.size(); i++) {
// JSONObject temp = (JSONObject) detail.get(i);
// String fplxdm = ElephantUtils.transElephantType(temp.getString("fpzldm"), 1);
// temp.put("fpzldm", fplxdm);
// detail.set(i, temp);
// }
return json;
}
} catch (JianshuiParamErrorException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
throw new JianshuiParamErrorException(ErrorCode.DECRYPT_ERROR, companyservice, "invoice");
}
return json;
}
@Override
public String covertMethodName(String method) {
return null;

@ -184,6 +184,11 @@ public class Nuonuo2InvoiceRequestAdapterImpl implements IInvoiceRequestService
return result;
}
@Override
public JSONObject decryptZq(String identity, String order, Companyservice companyservice, String serviceKey) {
return null;
}
/**
* 转换报文类型
*

@ -100,9 +100,9 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
@Override
public HXResponse addInvoice(BillInfo billInfo, Companyservice companyservice) throws IllegalAccessException, InstantiationException {
// TODO: 2023/11/6 错误先抛出到这里,后面整理到controller统一管理
return new HXResponse("单票接口已关闭!请调用批量接口!");
// 1.订单唯一校验。新增历史订单部分(删除)。
/* // 1.订单唯一校验。新增历史订单部分(删除)。
// 订单号唯一校验 start
String outNO = billInfo.getOutTradeOrderno() != null ? billInfo.getOutTradeOrderno() : "";
if (StrUtil.isEmpty(outNO)) {
@ -178,12 +178,12 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
// 销方地址电话
// 2022/12/21 中举说浪潮的地址和电话都放到 sellerAddress字段里了
/*String sellerAddress = billInfo.getSellerAddress();
*//*String sellerAddress = billInfo.getSellerAddress();
String sellerTelephone = billInfo.getSellerTelephone();
if (StrUtil.isEmpty(sellerAddress) || StrUtil.isEmpty(sellerTelephone)) {
return new HXResponse("销方地址电话不存在!");
}
aisinoConsoleInvoiceAddDTO.setSellerAddressTel(sellerAddress + sellerTelephone);*/
aisinoConsoleInvoiceAddDTO.setSellerAddressTel(sellerAddress + sellerTelephone);*//*
String sellerAddress = billInfo.getSellerAddress();
if (StrUtil.isEmpty(sellerAddress)) {
return new HXResponse("销方地址电话不存在!");
@ -404,21 +404,19 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
queryInvoiceBack = invoiceBackList.get(0);
}
// 异步回调,失败的交给定时任务
// 回调,失败的交给定时任务
InvoiceBack finalQueryInvoiceBack = queryInvoiceBack;
AsyncManager.me().execute(new TimerTask() {
try {
callBackAisino(finalQueryInvoiceBack, callBackUrl, invoice.getId());
} catch (Exception e) {
log.info("【重汽批量开票】发票回调失败!invoiceId={}", invoice.getId());
}
*//*AsyncManager.me().execute(new TimerTask() {
@Override
public void run() {
try {
// Long c = Long.valueOf(RandomUtil.randomInt(1, 2));
// Thread.sleep(c * 1000);
callBackAisino(finalQueryInvoiceBack, callBackUrl, invoice.getId());
} catch (Exception e) {
log.info("【重汽批量开票】发票回调失败!invoiceId={}", invoice.getId());
}
}
});
}
});*//*
}
HXResponse response = new HXResponse("0000", "同步成功");
@ -426,7 +424,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
return response;
} else {
return new HXResponse(retmsg);
}
}*/
}
/**

@ -0,0 +1,267 @@
package com.jianshui.invoice.task;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.core.redis.RedisCache;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.spring.SpringUtils;
import com.jianshui.framework.manager.AsyncManager;
import com.jianshui.invoice.domain.BillInfo;
import com.jianshui.invoice.domain.Invoice;
import com.jianshui.invoice.domain.InvoiceBack;
import com.jianshui.invoice.domain.dto.HXResponse;
import com.jianshui.invoice.domain.dto.QueryBillInfoDTO;
import com.jianshui.invoice.factory.IInvoiceRequestFactory;
import com.jianshui.invoice.factory.IInvoiceResponseFactory;
import com.jianshui.invoice.factory.IInvoiceServiceFactory;
import com.jianshui.invoice.mapper.InvoiceBackMapper;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.invoice.service.IInvoiceApiService;
import com.jianshui.invoice.service.IInvoiceRequestService;
import com.jianshui.queue.utils.RedisQueueUtil;
import com.jianshui.system.service.ICompanyserviceService;
import com.jianshui.system.service.IServiceManageService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.TimerTask;
/**
* @Description 批量开票任务
**/
@Slf4j
public class AddInvoiceBatchTask extends TimerTask {
// private BillInfo finalBillInfo;
// private Companyservice companyservice;
// private IInvoiceApiService invoiceApiService;
//
private ICompanyserviceService iCompanyserviceService;
//
private IServiceManageService serviceManageService;
//
private IInvoiceRequestFactory invoiceRequestFactory;
//
private IInvoiceServiceFactory invoiceServiceFactory;
//
private InvoiceBackMapper invoiceBackMapper;
private String identity;
private String order;
public AddInvoiceBatchTask(ICompanyserviceService iCompanyserviceService, IServiceManageService serviceManageService
, IInvoiceRequestFactory invoiceRequestFactory,IInvoiceServiceFactory invoiceServiceFactory,InvoiceBackMapper invoiceBackMapper,String identity,String order) {
this.iCompanyserviceService = iCompanyserviceService;
this.serviceManageService = serviceManageService;
this.invoiceRequestFactory = invoiceRequestFactory;
this.invoiceServiceFactory = invoiceServiceFactory;
this.invoiceBackMapper = invoiceBackMapper;
this.identity = identity;
this.order = order;
}
@SneakyThrows
@Override
public void run() {
// 异步处理
// 1-1 identity校验
if (StringUtils.isEmpty(identity)) {
log.info("[重汽批量开票接口]身份认证参数为空!");
return;
}
// 1-2 企业信息校验
Companyservice companyservice = null;
try {
companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity);
} catch (Exception e) {
log.info("[重汽批量开票接口]获取企业信息异常!identity={},e={}", identity, e);
return;
}
if (companyservice == null) {
log.info("[重汽批量开票接口]企业信息不存在!identity={}", identity);
return;
}
// 1-3 获得入口报文适配器
JSONObject decryptResult = null;
try {
String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid());
IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey);
decryptResult = invoiceRequestService.decryptZq(order,identity, companyservice, "addBatch");
} catch (Exception e) {
log.info("[重汽批量开票接口]请求解密失败!identity={},e={}", identity, e);
return;
}
// 2-报文处理
cn.hutool.json.JSONObject billJson = null;
try {
billJson = JSONUtil.parseObj(decryptResult);
} catch (Exception e) {
log.info("[重汽批量开票接口]报文格式化异常!identity={},e={}", identity, e);
return;
}
if (billJson.get("billInfo") == null) {
log.info("[重汽批量开票接口]未匹配到发票报文!identity={}", identity);
return;
}
JSONArray billJsonArray = null;
try {
billJsonArray = JSONUtil.parseArray(billJson.get("billInfo"));
} catch (Exception e) {
log.info("[重汽批量开票接口]发票报文获取异常!identity={},e={}", identity, e);
return;
}
if (billJsonArray.size() == 0) {
log.info("[重汽批量开票接口]发票报文为空!identity={}", identity);
return;
}
// 3-报文递交开票
for (Object billInfoObj : billJsonArray) {
// 1-前置条件判断
InvoiceBack invoiceBack = new InvoiceBack();
invoiceBack.setUpdateTime(new Date());
invoiceBack.setCreateTime(new Date());
invoiceBack.setId(IdUtil.randomUUID());
invoiceBack.setSystemOrderno(IdUtil.randomUUID());
invoiceBack.setStatus("1");
invoiceBack.setIdentity(identity);
invoiceBack.setBackMsg("");
invoiceBack.setBackUrl("");
BillInfo billInfo = BeanUtil.copyProperties(billInfoObj, BillInfo.class);
if (billInfo == null) {
log.info("[重汽批量开票接口]报文格式错误!identity={}", identity);
continue;
}
billInfo.setSource("2");
// 4-获得请求实例,并且进行扣费
IInvoiceApiService invoiceService = null;
try {
String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid());
serviceManageService.companyConsume("invoice", companyservice.getCompanyid());
billInfo.setServiceSupplierKey(serviceKey);
invoiceService = invoiceServiceFactory.getService(serviceKey);
} catch (Exception e) {
//invoiceBack.setResultCode("9999");
//invoiceBack.setResultMsg("扣费失败!");
log.info("[重汽批量开票接口]扣费失败!identity={},e={}", identity, e);
continue;
}
// 5-开票
try {
HXResponse resultHx = invoiceService.addInvoice(billInfo, companyservice);
log.info("[重汽批量开票接口]开票identity={},返回结果result={}", identity, resultHx);
if (!resultHx.isSuccess()) {
QueryWrapper<InvoiceBack> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("system_orderno", billInfo.getOutTradeOrderno());
InvoiceBack invoiceBackTemp = invoiceBackMapper.selectOne(queryWrapper);
if (invoiceBackTemp != null) {
invoiceBackTemp.setResultCode("9999");
invoiceBackTemp.setResultMsg(resultHx.getMessage());
invoiceBackTemp.setStatus("0");
invoiceBackTemp.setUpdateTime(new Date());
invoiceBackMapper.updateInvoiceBack(invoiceBackTemp);
invoiceService.callBackAisino(invoiceBackTemp, "", Long.valueOf(identity));
} else {
invoiceBack.setResultCode("9999");
invoiceBack.setResultMsg(resultHx.getMessage());
invoiceBack.setSystemOrderno(billInfo.getOutTradeOrderno());
invoiceBack.setStatus("0");
invoiceBack.setCreateTime(new Date());
invoiceBackMapper.insertInvoiceBack(invoiceBack);
invoiceService.callBackAisino(invoiceBack, "", Long.valueOf(identity));
}
log.info("[重汽批量开票接口]提交开票异常,开票失败!identity={},msg={}", identity, resultHx.getMessage());
continue;
}
} catch (Exception e) {
QueryWrapper<InvoiceBack> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("system_orderno", billInfo.getOutTradeOrderno());
InvoiceBack invoiceBackTemp = invoiceBackMapper.selectOne(queryWrapper);
if (invoiceBackTemp != null) {
invoiceBackTemp.setResultCode("9999");
invoiceBackTemp.setResultMsg("开票失败!");
invoiceBackTemp.setStatus("0");
invoiceBackTemp.setUpdateTime(new Date());
invoiceBackMapper.updateInvoiceBack(invoiceBackTemp);
invoiceService.callBackAisino(invoiceBackTemp, "", Long.valueOf(identity));
} else {
invoiceBack.setResultCode("9999");
invoiceBack.setResultMsg("开票失败!");
invoiceBack.setSystemOrderno(billInfo.getOutTradeOrderno());
invoiceBack.setStatus("0");
invoiceBack.setCreateTime(new Date());
invoiceBackMapper.insertInvoiceBack(invoiceBack);
invoiceService.callBackAisino(invoiceBack, "", Long.valueOf(identity));
}
log.info("[重汽批量开票接口]提交开票异常,开票失败!identity={},e={}", identity, e);
continue;
}
}
/*RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
InvoiceMapper invoiceMapper = SpringUtils.getBean(InvoiceMapper.class);
Thread.sleep(10 * 1000); // 睡眠10秒再去查询
log.info("【定时任务】【发票查询】开始查询发票:{}", JSONObject.toJSONString(this.finalBillInfo));
QueryBillInfoDTO queryBillInfoDTO = new QueryBillInfoDTO();
queryBillInfoDTO.setFpqqlsh(this.finalBillInfo.getSystemOrderno());
invoiceApiService.queryInvoice(queryBillInfoDTO, this.companyservice);
// 获取发票
Invoice invoice = invoiceMapper.selectBySystemOrderNo(this.companyservice.getCompanyid(), this.finalBillInfo.getSystemOrderno());
if (invoice == null || StringUtils.equalsAny(Integer.toString(invoice.getState()), "0", "20")) {
// 查询下失败队列,是否有次数
String keys = "invoice_query_times_" + this.companyservice.getCompanyid() + "_" + this.finalBillInfo.getSystemOrderno();
Integer queryTimes = redisCache.getCacheObject(keys);
// 查询重试次数超过20次,就不查了
if (queryTimes != null && queryTimes > 20) {
log.error("【定时任务】【发票查询】发票信息始终不存在,不再进行查询:{}", JSONObject.toJSONString(this.finalBillInfo));
redisCache.deleteObject(keys);
return;
}
if (queryTimes == null) {
queryTimes = 0;
}
queryTimes += 1;
redisCache.setCacheObject(keys, queryTimes);
// log.error("【定时任务】【发票查询】发票信息不存在或还在开票中,再次进入查询:{}", JSONObject.toJSONString(this.finalBillInfo));
// AsyncManager.me().execute(new AddInvoiceBatchTask(this.finalBillInfo, companyservice, this.invoiceApiService));
}
// RedisQueueUtil.build().setData(invoice).onQueue("invoice_add_callback_consumer").retry(0).dispatch();*/
}
}

@ -39,6 +39,7 @@ public class InvoiceBackTask
public void bkParams(String params)
{
// TODO: 2023/11/9 回调次数处理
// 默认10次
int j = params == null ? 10: Integer.parseInt(params) ;

@ -15,10 +15,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="resultMsg" column="result_msg" />
<result property="resultCode" column="result_code" />
<result property="updateTime" column="update_time" />
<result property="num" column="num" />
</resultMap>
<sql id="selectInvoiceBackVo">
select id, system_orderno, status, back_url, identity, create_time, back_msg,result_msg,result_code,update_time from invoice_back
select id, system_orderno, status, back_url, identity, create_time, back_msg,result_msg,result_code,update_time,num from invoice_back
</sql>
<select id="selectInvoiceBackList" parameterType="com.jianshui.invoice.domain.InvoiceBack" resultMap="InvoiceBackResult">
@ -32,6 +33,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="resultMsg != null and resultMsg != ''"> and result_msg = #{resultMsg}</if>
<if test="resultCode != null and resultCode != ''"> and result_code = #{resultCode}</if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime}</if>
<if test="num != null and num != ''"> and num = #{num}</if>
</where>
</select>
@ -53,6 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="resultMsg != null">result_msg,</if>
<if test="resultCode != null">result_code,</if>
<if test="updateTime != null">update_time,</if>
<if test="num != null">num,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
@ -65,6 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="resultMsg != null">#{resultMsg},</if>
<if test="resultCode != null">#{resultCode},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="num != null">#{num},</if>
</trim>
</insert>
@ -80,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="resultMsg != null">result_msg = #{resultMsg},</if>
<if test="resultCode != null">result_code = #{resultCode},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="num != null">num = #{num},</if>
</trim>
where id = #{id}
</update>

Loading…
Cancel
Save