开票异步回调接口;

定时任务接口;
beta
kk 2 years ago
parent cc98960c7e
commit f7ac586fb3
  1. 108
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/InvoiceBack.java
  2. 63
      jianshui-invoice/src/main/java/com/jianshui/invoice/mapper/InvoiceBackMapper.java
  3. 114
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiZhongQiServiceImpl.java
  4. 144
      jianshui-invoice/src/main/java/com/jianshui/invoice/task/InvoiceBackTask.java
  5. 87
      jianshui-invoice/src/main/java/com/jianshui/invoice/task/QueryBackZhongQiTask.java
  6. 82
      jianshui-invoice/src/main/resources/mapper/invoice/InvoiceBackMapper.xml
  7. 34
      jianshui-platform/src/main/resources/mapper/InvoiceBackDao.xml

@ -0,0 +1,108 @@
package com.jianshui.invoice.domain;
import com.jianshui.common.annotation.Excel;
import com.jianshui.common.core.domain.BaseEntity;
import net.logstash.logback.encoder.org.apache.commons.lang3.builder.ToStringBuilder;
import net.logstash.logback.encoder.org.apache.commons.lang3.builder.ToStringStyle;
/**
* 开票接口回调对象 invoice_back
*
* @author jianshui
* @date 2023-10-26
*/
public class InvoiceBack extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private String id;
/** 系统订单号 */
@Excel(name = "系统订单号")
private String systemOrderno;
/** 回调状态0未回调 1回调成功 2回调失败 3回调多次失败,不再回调 */
@Excel(name = "回调状态0未回调 1回调成功 2回调失败 3回调多次失败,不再回调")
private String status;
/** 回调地址 */
@Excel(name = "回调地址")
private String backUrl;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private String identity;
/** 回调信息 */
@Excel(name = "回调信息")
private String backMsg;
public void setId(String id)
{
this.id = id;
}
public String getId()
{
return id;
}
public void setSystemOrderno(String systemOrderno)
{
this.systemOrderno = systemOrderno;
}
public String getSystemOrderno()
{
return systemOrderno;
}
public void setStatus(String status)
{
this.status = status;
}
public String getStatus()
{
return status;
}
public void setBackUrl(String backUrl)
{
this.backUrl = backUrl;
}
public String getBackUrl()
{
return backUrl;
}
public void setIdentity(String identity)
{
this.identity = identity;
}
public String getIdentity()
{
return identity;
}
public void setBackMsg(String backMsg)
{
this.backMsg = backMsg;
}
public String getBackMsg()
{
return backMsg;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("systemOrderno", getSystemOrderno())
.append("status", getStatus())
.append("backUrl", getBackUrl())
.append("identity", getIdentity())
.append("createTime", getCreateTime())
.append("backMsg", getBackMsg())
.toString();
}
}

@ -0,0 +1,63 @@
package com.jianshui.invoice.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jianshui.invoice.domain.InvoiceBack;
/**
* 开票接口回调Mapper接口
*
* @author jianshui
* @date 2023-10-26
*/
public interface InvoiceBackMapper extends BaseMapper<InvoiceBack>
{
/**
* 查询开票接口回调
*
* @param id 开票接口回调主键
* @return 开票接口回调
*/
public InvoiceBack selectInvoiceBackById(String id);
/**
* 查询开票接口回调列表
*
* @param invoiceBack 开票接口回调
* @return 开票接口回调集合
*/
public List<InvoiceBack> selectInvoiceBackList(InvoiceBack invoiceBack);
/**
* 新增开票接口回调
*
* @param invoiceBack 开票接口回调
* @return 结果
*/
public int insertInvoiceBack(InvoiceBack invoiceBack);
/**
* 修改开票接口回调
*
* @param invoiceBack 开票接口回调
* @return 结果
*/
public int updateInvoiceBack(InvoiceBack invoiceBack);
/**
* 删除开票接口回调
*
* @param id 开票接口回调主键
* @return 结果
*/
public int deleteInvoiceBackById(String id);
/**
* 批量删除开票接口回调
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteInvoiceBackByIds(String[] ids);
}

@ -4,7 +4,6 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSON; import cn.hutool.json.JSON;
@ -31,13 +30,8 @@ import com.jianshui.invoice.domain.dto.api.aisino.console.vehicle.TaxEquipmentIn
import com.jianshui.invoice.domain.dto.api.aisino.console.vehicle.VehicleInvoiceExpBo; import com.jianshui.invoice.domain.dto.api.aisino.console.vehicle.VehicleInvoiceExpBo;
import com.jianshui.invoice.domain.ele.EleNewMessage; import com.jianshui.invoice.domain.ele.EleNewMessage;
import com.jianshui.invoice.domain.vo.api.aisino.console.AisinoConsoleInvoiceAddVO; import com.jianshui.invoice.domain.vo.api.aisino.console.AisinoConsoleInvoiceAddVO;
import com.jianshui.invoice.mapper.BillInfoMapper; import com.jianshui.invoice.mapper.*;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.invoice.mapper.RedinfoMapper;
import com.jianshui.invoice.mapper.SkDyjMapper;
import com.jianshui.invoice.service.IInvoiceApiService; import com.jianshui.invoice.service.IInvoiceApiService;
import com.jianshui.invoice.task.QueryBackZhongQiTask;
import com.jianshui.invoice.task.QueryInvoiceTask;
import com.jianshui.invoice.utils.BillInfoUtils; import com.jianshui.invoice.utils.BillInfoUtils;
import com.jianshui.invoice.utils.aisino.console.AisinoConsoleUtil; import com.jianshui.invoice.utils.aisino.console.AisinoConsoleUtil;
import com.jianshui.system.domain.CompanyserviceProp; import com.jianshui.system.domain.CompanyserviceProp;
@ -79,6 +73,8 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
@Autowired @Autowired
private RedinfoMapper redinfoMapper; private RedinfoMapper redinfoMapper;
@Autowired
private InvoiceBackMapper invoiceBackMapper;
/** /**
@ -337,16 +333,35 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
// TODO: 2023/9/26 增加主动回调方式,可配置 // TODO: 2023/9/26 增加主动回调方式,可配置
// TODO: 2023/10/25 回调改成异步的,执行20次,直到获取到结果 // TODO: 2023/10/25 回调改成异步的,执行10次,直到获取到结果
ICompanyservicePropService companyserviceProp = SpringUtils.getBean(ICompanyservicePropService.class); ICompanyservicePropService companyserviceProp = SpringUtils.getBean(ICompanyservicePropService.class);
CompanyserviceProp secretIdProp = companyserviceProp.selectPropByKey(companyservice.getCompanyid(), "aisino_callback_url"); CompanyserviceProp secretIdProp = companyserviceProp.selectPropByKey(companyservice.getCompanyid(), "aisino_callback_url");
if (BeanUtil.isNotEmpty(secretIdProp) && secretIdProp.getValue() != null && !"".equals(secretIdProp.getValue())) { if (BeanUtil.isNotEmpty(secretIdProp) && secretIdProp.getValue() != null && !"".equals(secretIdProp.getValue())) {
String callBackUrl = secretIdProp.getValue(); String callBackUrl = secretIdProp.getValue();
// 异步回调 InvoiceBack queryInvoiceBack = new InvoiceBack();
AsyncManager.me().execute(new QueryBackZhongQiTask(callBackUrl,invoice.getId())); queryInvoiceBack.setSystemOrderno(billInfo.getSystemOrderno());
// callBackAisino(callBackUrl, invoice.getId()); List<InvoiceBack> invoiceBackList = invoiceBackMapper.selectInvoiceBackList(queryInvoiceBack);
if (CollectionUtils.isEmpty(invoiceBackList)) {
queryInvoiceBack.setIdentity(companyservice.getIdentity());
queryInvoiceBack.setBackUrl(callBackUrl);
queryInvoiceBack.setStatus("0");
queryInvoiceBack.setCreateTime(new Date());
queryInvoiceBack.setSystemOrderno(billInfo.getSystemOrderno());
queryInvoiceBack.setBackMsg("");
} else {
queryInvoiceBack = invoiceBackList.get(0);
}
// 异步回调,失败的交给定时任务
InvoiceBack finalQueryInvoiceBack = queryInvoiceBack;
AsyncManager.me().execute(new TimerTask() {
@Override
public void run() {
callBackAisino(finalQueryInvoiceBack,callBackUrl, invoice.getId());
}
});
} }
@ -365,7 +380,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
* @param callBackUrl * @param callBackUrl
* @param id * @param id
*/ */
private void callBackAisino(String callBackUrl, Long id) { private void callBackAisino(InvoiceBack invoiceBack,String callBackUrl, Long id) {
if (id == null) { if (id == null) {
log.info("【控制台】发票回调,id为空"); log.info("【控制台】发票回调,id为空");
@ -379,12 +394,35 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
} }
try { try {
log.info("【控制台】发票回调接口,发送数据开始,id={}", id); log.info("【控制台】发票回调接口,发送数据开始,id={}", id);
String result = HttpUtil.post(callBackUrl, JSONUtil.toJsonStr(invoice)); String result = HttpUtil.post(callBackUrl, JSONUtil.toJsonStr(invoice));
log.info("【控制台】发票回调接口,发送数据结束,id={},接口返回信息={}", id, result);
log.info("【控制台】发票回调接口,发送数据结束,id={},接口返回信息={}", id, JSONUtil.toJsonStr(invoice)); cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(result);
if(jsonObject != null){
String status = jsonObject.get("status") != null ? jsonObject.get("status").toString():"";
String message = jsonObject.get("message")!= null ? jsonObject.get("message").toString():"";
if("0000".equals(status)){
invoiceBack.setStatus("1");
invoiceBack.setBackMsg("发票信息未查询到");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}else if("9999".equals(status)){
invoiceBack.setStatus("3");
invoiceBack.setBackMsg(message);
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}else {
invoiceBack.setStatus("2");
invoiceBack.setBackMsg(status+message);
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}
}
} catch (Exception e) { } catch (Exception e) {
log.info("【控制台】发票回调接口,发送数据异常,id={}", id); log.info("【控制台】发票回调接口,发送数据异常,id={}", id);
invoiceBack.setStatus("2");
invoiceBack.setBackMsg("发送数据异常!");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -747,7 +785,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
//发起请求 //发起请求
AjaxResult ajaxResult = null; AjaxResult ajaxResult = null;
try { try {
ajaxResult = AisinoConsoleUtil.sendRequestXML(AisinoConsoleConstants.RED_UPLOAD,"129", param, companyservice); ajaxResult = AisinoConsoleUtil.sendRequestXML(AisinoConsoleConstants.RED_UPLOAD, "129", param, companyservice);
} catch (Exception e) { } catch (Exception e) {
log.error("【销项发票】【总部控制台接口】【发票作废】发票请求异常,请求报文{},销方信息{}", "", JSONObject.toJSONString(companyservice)); log.error("【销项发票】【总部控制台接口】【发票作废】发票请求异常,请求报文{},销方信息{}", "", JSONObject.toJSONString(companyservice));
e.printStackTrace(); e.printStackTrace();
@ -793,7 +831,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
List<CompanyserviceDetail> companyserviceDetailList = companyservice.getCompanyserviceDetailList(); List<CompanyserviceDetail> companyserviceDetailList = companyservice.getCompanyserviceDetailList();
if(CollectionUtils.isEmpty(companyserviceDetailList) || StrUtil.isEmpty(companyserviceDetailList.get(0).getGoldenTaxDiskNo())){ if (CollectionUtils.isEmpty(companyserviceDetailList) || StrUtil.isEmpty(companyserviceDetailList.get(0).getGoldenTaxDiskNo())) {
throw new JianshuiServiceException("金税盘编号未配置,请联系管理员!"); throw new JianshuiServiceException("金税盘编号未配置,请联系管理员!");
} }
String goldenTaxDiskNo = companyserviceDetailList.get(0).getGoldenTaxDiskNo(); String goldenTaxDiskNo = companyserviceDetailList.get(0).getGoldenTaxDiskNo();
@ -850,7 +888,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
//发起请求 //发起请求
AjaxResult ajaxResult = null; AjaxResult ajaxResult = null;
try { try {
ajaxResult = AisinoConsoleUtil.sendRequestXML(AisinoConsoleConstants.RED_DOWLOAD, "0201",param, companyservice); ajaxResult = AisinoConsoleUtil.sendRequestXML(AisinoConsoleConstants.RED_DOWLOAD, "0201", param, companyservice);
} catch (Exception e) { } catch (Exception e) {
log.error("【销项发票】【总部控制台接口】【发票作废】发票请求异常,请求报文{},销方信息{}", "", JSONObject.toJSONString(companyservice)); log.error("【销项发票】【总部控制台接口】【发票作废】发票请求异常,请求报文{},销方信息{}", "", JSONObject.toJSONString(companyservice));
e.printStackTrace(); e.printStackTrace();
@ -1031,12 +1069,12 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
* "KSRQ":"", * "KSRQ":"",
* "StrGuid":"" * "StrGuid":""
* } * }
*/ */
// 发起请求 // 发起请求
AjaxResult ajaxResult = null; AjaxResult ajaxResult = null;
JSON json = JSONUtil.parse(decryptResult); JSON json = JSONUtil.parse(decryptResult);
try { try {
ajaxResult = AisinoConsoleUtil.sendRequest(AisinoConsoleConstants.VEHIC, json, companyservice); ajaxResult = AisinoConsoleUtil.sendRequest(AisinoConsoleConstants.VEHIC, json, companyservice);
} catch (Exception e) { } catch (Exception e) {
@ -1055,20 +1093,20 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
String retcode = resultJSON.get("retcode") != null ? resultJSON.get("retcode").toString() : ""; String retcode = resultJSON.get("retcode") != null ? resultJSON.get("retcode").toString() : "";
String retmsg = resultJSON.get("retmsg") != null ? resultJSON.get("retmsg").toString() : ""; String retmsg = resultJSON.get("retmsg") != null ? resultJSON.get("retmsg").toString() : "";
if("0".equals(retcode)){ if ("0".equals(retcode)) {
// TODO: 2023/10/25 机动车加密数据导出推送 // TODO: 2023/10/25 机动车加密数据导出推送
/** /**
* 推送逻辑 * 推送逻辑
* 调用加密接口调用成功后推送推送中间状态断了停止推送 * 调用加密接口调用成功后推送推送中间状态断了停止推送
* 否则获取到推送结果之后停止推送 * 否则获取到推送结果之后停止推送
* 需要个手动重推的操作 * 需要个手动重推的操作
*/ */
ICompanyservicePropService companyserviceProp = SpringUtils.getBean(ICompanyservicePropService.class); ICompanyservicePropService companyserviceProp = SpringUtils.getBean(ICompanyservicePropService.class);
CompanyserviceProp secretIdProp = companyserviceProp.selectPropByKey(companyservice.getCompanyid(), "aisino_nginx_url"); CompanyserviceProp secretIdProp = companyserviceProp.selectPropByKey(companyservice.getCompanyid(), "aisino_nginx_url");
if(secretIdProp == null || StrUtil.isEmpty(secretIdProp.getValue())){ if (secretIdProp == null || StrUtil.isEmpty(secretIdProp.getValue())) {
log.info("【销项发票】【总部控制台发票-机动车加密】推送nginx地址未配置!aisino_nginx_url"); log.info("【销项发票】【总部控制台发票-机动车加密】推送nginx地址未配置!aisino_nginx_url");
return new HXResponse("推送中间件地址未配置!"); return new HXResponse("推送中间件地址未配置!");
} }
@ -1076,7 +1114,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
String downloadUrl = secretIdProp.getValue(); String downloadUrl = secretIdProp.getValue();
cn.hutool.json.JSONObject queryDto = JSONUtil.parseObj(json); cn.hutool.json.JSONObject queryDto = JSONUtil.parseObj(json);
if(queryDto == null){ if (queryDto == null) {
log.info("【销项发票】【总部控制台发票-机动车加密】查询条件未获取到!"); log.info("【销项发票】【总部控制台发票-机动车加密】查询条件未获取到!");
return new HXResponse("查询条件未获取到!"); return new HXResponse("查询条件未获取到!");
} }
@ -1085,12 +1123,12 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
try { try {
indexPage = HttpUtil.get(downloadUrl); indexPage = HttpUtil.get(downloadUrl);
} catch (Exception e) { } catch (Exception e) {
log.info("【销项发票】【总部控制台发票-机动车加密】{}",e); log.info("【销项发票】【总部控制台发票-机动车加密】{}", e);
return new HXResponse("中间件读取失败!"); return new HXResponse("中间件读取失败!");
} }
String startDate = queryDto.get("KSRQ") != null ? queryDto.get("KSRQ").toString().replace("-",".") : ""; String startDate = queryDto.get("KSRQ") != null ? queryDto.get("KSRQ").toString().replace("-", ".") : "";
String endDate = queryDto.get("JSRQ") != null ? queryDto.get("JSRQ").toString().replace("-",".") : ""; String endDate = queryDto.get("JSRQ") != null ? queryDto.get("JSRQ").toString().replace("-", ".") : "";
// 构建要匹配的日期范围字符串 // 构建要匹配的日期范围字符串
String dateRange = startDate + "-" + endDate; String dateRange = startDate + "-" + endDate;
@ -1104,7 +1142,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
// 遍历<a>标签,提取href属性内容 // 遍历<a>标签,提取href属性内容
for (Element aTag : aTags) { for (Element aTag : aTags) {
href = aTag.attr("href"); href = aTag.attr("href");
log.info("读取到的机动车加密文件名为"+href); log.info("读取到的机动车加密文件名为" + href);
continue; continue;
} }
@ -1119,10 +1157,10 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
paramMap.put("zdr", companyservice.getCompanyid()); paramMap.put("zdr", companyservice.getCompanyid());
CompanyserviceProp pushUrl = companyserviceProp.selectPropByKey(companyservice.getCompanyid(), "aisino_upload_url"); CompanyserviceProp pushUrl = companyserviceProp.selectPropByKey(companyservice.getCompanyid(), "aisino_upload_url");
if(pushUrl == null || StrUtil.isEmpty(pushUrl.getValue())){ if (pushUrl == null || StrUtil.isEmpty(pushUrl.getValue())) {
return new HXResponse("重汽推送机动车地址未设置!"); return new HXResponse("重汽推送机动车地址未设置!");
} }
String result = HttpUtil.post(pushUrl.getValue(),paramMap); String result = HttpUtil.post(pushUrl.getValue(), paramMap);
cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(result); cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(result);
@ -1130,23 +1168,14 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
String retMsg = jsonObject.get("retMsg") != null ? jsonObject.get("retMsg").toString() : ""; String retMsg = jsonObject.get("retMsg") != null ? jsonObject.get("retMsg").toString() : "";
// 重汽返回接口信息 // 重汽返回接口信息
return new HXResponse(retCode,retMsg); return new HXResponse(retCode, retMsg);
}else { } else {
return new HXResponse("9999","导出失败、发票不存在!"); return new HXResponse("9999", "导出失败、发票不存在!");
} }
} }
@Override @Override
public AjaxResult syncStockInfo(Companyservice companyservice) { public AjaxResult syncStockInfo(Companyservice companyservice) {
return null; return null;
@ -1293,8 +1322,6 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
} }
/** /**
* 机动车加密接口走的大象重汽用控制台 * 机动车加密接口走的大象重汽用控制台
*//* *//*
@ -1429,6 +1456,7 @@ public class AisinoConsoleInvoiceApiZhongQiServiceImpl implements IInvoiceApiSer
/** /**
* 调用基础服务获取税控设备 * 调用基础服务获取税控设备
*
* @param nsrsbh * @param nsrsbh
* @param entId * @param entId
* @return * @return

@ -0,0 +1,144 @@
package com.jianshui.invoice.task;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.spring.SpringUtils;
import com.jianshui.invoice.domain.Invoice;
import com.jianshui.invoice.domain.InvoiceBack;
import com.jianshui.invoice.domain.Redinfo;
import com.jianshui.invoice.mapper.InvoiceBackMapper;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.system.domain.CompanyserviceProp;
import com.jianshui.system.service.ICompanyservicePropService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 定时任务-发票推送
*
* @author 简税平台
*/
@Component("invoiceBackTask")
@Slf4j
public class InvoiceBackTask
{
@Autowired
private InvoiceBackMapper invoiceBackMapper;
@Autowired
private InvoiceMapper invoiceMapper;
public void bkParams(String params)
{
// 默认10次
int j = params == null ? 10: Integer.parseInt(params) ;
log.info("[重汽回调定时任务开始执行]---{}次",params);
QueryWrapper<InvoiceBack> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", "0").eq("status","2");
List<InvoiceBack> invoiceBackList = invoiceBackMapper.selectList(queryWrapper);
for (InvoiceBack invoiceBack : invoiceBackList) {
int i = 0;
while (i < j){
String id = invoiceBack.getSystemOrderno();
String identity = invoiceBack.getIdentity();
ICompanyservicePropService companyserviceProp = SpringUtils.getBean(ICompanyservicePropService.class);
CompanyserviceProp secretIdProp = companyserviceProp.selectPropByKey(Long.valueOf(identity), "aisino_callback_url");
if(secretIdProp == null || secretIdProp.getValue()==null || "".equals(secretIdProp.getValue())){
log.info("【控制台】发票回调,未配置回调地址{}"+identity);
invoiceBack.setStatus("3");
invoiceBack.setBackMsg("未配置回调地址");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
break;
}
String callBackUrl = secretIdProp.getValue();
log.info("【控制台】发票回调,回调地址{}",callBackUrl);
if (id == null) {
log.info("【控制台】发票回调,id为空");
invoiceBack.setStatus("3");
invoiceBack.setBackMsg("id为空");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
break;
}
Invoice invoice = invoiceMapper.selectBySystemOrderNo(null,id);
if (invoice == null) {
log.info("【控制台】发票信息未查询到,id={}", id);
invoiceBack.setStatus("3");
invoiceBack.setBackMsg("发票信息未查询到");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
break;
}
try {
log.info("【控制台】发票回调接口,发送数据开始,id={}", id);
String result = HttpUtil.post(callBackUrl, JSONUtil.toJsonStr(invoice));
log.info("【控制台】发票回调接口,发送数据结束,id={},接口返回信息={}", id, result);
JSONObject jsonObject = JSONUtil.parseObj(result);
if(jsonObject != null){
String status = jsonObject.get("status") != null ? jsonObject.get("status").toString():"";
String message = jsonObject.get("message")!= null ? jsonObject.get("message").toString():"";
if("0000".equals(status)){
invoiceBack.setStatus("1");
invoiceBack.setBackMsg("发票信息未查询到");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}else if("9999".equals(status)){
invoiceBack.setStatus("3");
invoiceBack.setBackMsg(message);
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}else {
invoiceBack.setStatus("3");
invoiceBack.setBackMsg(status+message);
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}
break;
}
} catch (Exception e) {
log.info("【控制台】发票回调接口,发送数据异常,id={}", id);
invoiceBack.setStatus("2");
invoiceBack.setBackMsg("发送数据异常");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}
i++;
}
// 一直没结果
if(i == j){
invoiceBack.setStatus("3");
invoiceBack.setBackMsg("调用次数上限一直失败!");
invoiceBackMapper.updateInvoiceBack(invoiceBack);
}
}
log.info("[重汽回调定时任务执行结束]---");
}
}

@ -1,87 +0,0 @@
package com.jianshui.invoice.task;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
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.dto.QueryBillInfoDTO;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.invoice.service.IInvoiceApiService;
import com.jianshui.queue.utils.RedisQueueUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.util.TimerTask;
/**
* @Description 重汽开票回调
**/
@Slf4j
public class QueryBackZhongQiTask extends TimerTask {
private String callBackUrl;
private Long id;
public QueryBackZhongQiTask(String callBackUrl, Long id) {
this.callBackUrl = callBackUrl;
this.id = id;
}
@SneakyThrows
@Override
public void run() {
RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
InvoiceMapper invoiceMapper = SpringUtils.getBean(InvoiceMapper.class);
Invoice invoice = invoiceMapper.selectInvoiceById(id);
if (invoice == null) {
log.info("【控制台】发票信息未查询到,id={}", id);
return;
}
try {
log.info("【控制台】发票回调接口,发送数据开始,id={}", id);
String result = HttpUtil.post(callBackUrl, JSONUtil.toJsonStr(invoice));
log.info("【控制台】发票回调接口,发送数据结束,id={},接口返回信息={}", id, JSONUtil.toJsonStr(invoice));
} catch (Exception e) {
log.info("【控制台】发票回调接口,发送数据异常,id={}", id);
return;
}
// TODO: 2023/10/25 回调队列看一下怎么处理
/* 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 QueryBackZhongQiTask(this.finalBillInfo, companyservice, this.invoiceApiService));
}
RedisQueueUtil.build().setData(invoice).onQueue("invoice_add_callback_consumer").retry(0).dispatch();*/
}
}

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jianshui.invoice.mapper.InvoiceBackMapper">
<resultMap type="com.jianshui.invoice.domain.InvoiceBack" id="InvoiceBackResult">
<result property="id" column="id" />
<result property="systemOrderno" column="system_orderno" />
<result property="status" column="status" />
<result property="backUrl" column="back_url" />
<result property="identity" column="identity" />
<result property="createTime" column="create_time" />
<result property="backMsg" column="back_msg" />
</resultMap>
<sql id="selectInvoiceBackVo">
select id, system_orderno, status, back_url, identity, create_time, back_msg from invoice_back
</sql>
<select id="selectInvoiceBackList" parameterType="com.jianshui.invoice.domain.InvoiceBack" resultMap="InvoiceBackResult">
<include refid="selectInvoiceBackVo"/>
<where>
<if test="systemOrderno != null and systemOrderno != ''"> and system_orderno = #{systemOrderno}</if>
<if test="status != null and status != ''"> and status = #{status}</if>
<if test="backUrl != null and backUrl != ''"> and back_url = #{backUrl}</if>
<if test="identity != null and identity != ''"> and identity = #{identity}</if>
<if test="backMsg != null and backMsg != ''"> and back_msg = #{backMsg}</if>
</where>
</select>
<select id="selectInvoiceBackById" parameterType="String" resultMap="InvoiceBackResult">
<include refid="selectInvoiceBackVo"/>
where id = #{id}
</select>
<insert id="insertInvoiceBack" parameterType="com.jianshui.invoice.domain.InvoiceBack">
insert into invoice_back
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="systemOrderno != null">system_orderno,</if>
<if test="status != null">status,</if>
<if test="backUrl != null">back_url,</if>
<if test="identity != null">identity,</if>
<if test="createTime != null">create_time,</if>
<if test="backMsg != null">back_msg,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="systemOrderno != null">#{systemOrderno},</if>
<if test="status != null">#{status},</if>
<if test="backUrl != null">#{backUrl},</if>
<if test="identity != null">#{identity},</if>
<if test="createTime != null">#{createTime},</if>
<if test="backMsg != null">#{backMsg},</if>
</trim>
</insert>
<update id="updateInvoiceBack" parameterType="com.jianshui.invoice.domain.InvoiceBack">
update invoice_back
<trim prefix="SET" suffixOverrides=",">
<if test="systemOrderno != null">system_orderno = #{systemOrderno},</if>
<if test="status != null">status = #{status},</if>
<if test="backUrl != null">back_url = #{backUrl},</if>
<if test="identity != null">identity = #{identity},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="backMsg != null">back_msg = #{backMsg},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteInvoiceBackById" parameterType="String">
delete from invoice_back where id = #{id}
</delete>
<delete id="deleteInvoiceBackByIds" parameterType="String">
delete from invoice_back where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=".dao.InvoiceBackDao">
<resultMap type=".entity.InvoiceBack" id="InvoiceBackMap">
<result property="id" column="id" jdbcType="VARCHAR"/>
<result property="systemOrderno" column="system_orderno" jdbcType="VARCHAR"/>
<result property="status" column="status" jdbcType="VARCHAR"/>
<result property="backUrl" column="back_url" jdbcType="VARCHAR"/>
<result property="identity" column="identity" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="backMsg" column="back_msg" jdbcType="VARCHAR"/>
</resultMap>
<!-- 批量插入 -->
<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
insert into jianshui_dev.invoice_back(system_ordernostatusback_urlidentitycreate_timeback_msg)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.systemOrderno}#{entity.status}#{entity.backUrl}#{entity.identity}#{entity.createTime}#{entity.backMsg})
</foreach>
</insert>
<!-- 批量插入或按主键更新 -->
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
insert into jianshui_dev.invoice_back(system_ordernostatusback_urlidentitycreate_timeback_msg)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.systemOrderno}#{entity.status}#{entity.backUrl}#{entity.identity}#{entity.createTime}#{entity.backMsg})
</foreach>
on duplicate key update
system_orderno = values(system_orderno) status = values(status) back_url = values(back_url) identity = values(identity) create_time = values(create_time) back_msg = values(back_msg) </insert>
</mapper>
Loading…
Cancel
Save