diff --git a/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java b/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java index 8ff6f72..a6e68c1 100644 --- a/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java +++ b/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java @@ -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 map = request.getParameterMap(); + Set key = map.keySet(); + Iterator 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 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 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("数据接受成功!"); } diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/domain/InvoiceBack.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/domain/InvoiceBack.java index 7ccce4a..b6006d9 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/domain/InvoiceBack.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/domain/InvoiceBack.java @@ -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; diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceRequestService.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceRequestService.java index f8940f9..eb7d71d 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceRequestService.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceRequestService.java @@ -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); /** * 根据用户传入的请求方式,返回我们系统对应的请求方式 diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/AisinoInvoiceRequestAdapterImpl.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/AisinoInvoiceRequestAdapterImpl.java index 904368a..c1405d8 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/AisinoInvoiceRequestAdapterImpl.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/AisinoInvoiceRequestAdapterImpl.java @@ -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 hxBillDetailList = hxBillInfo.getDetail(); + List 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 hxBillDetailList = hxBillInfo.getDetail(); + List 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 hxBillDetailList = hxBillInfo.getRedinfodetailList(); + List 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; diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/Nuonuo2InvoiceRequestAdapterImpl.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/Nuonuo2InvoiceRequestAdapterImpl.java index 39d8f25..c14f5d9 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/Nuonuo2InvoiceRequestAdapterImpl.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/Nuonuo2InvoiceRequestAdapterImpl.java @@ -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; + } + /** * 转换报文类型 * diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiZhongQiServiceImpl.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiZhongQiServiceImpl.java index 4830ddb..1ff3a73 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiZhongQiServiceImpl.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiZhongQiServiceImpl.java @@ -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); - } + }*/ } /** diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/task/AddInvoiceBatchTask.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/task/AddInvoiceBatchTask.java new file mode 100644 index 0000000..06ebadf --- /dev/null +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/task/AddInvoiceBatchTask.java @@ -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 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 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();*/ + + + + + } +} diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/task/InvoiceBackTask.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/task/InvoiceBackTask.java index 6340960..2d553f7 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/task/InvoiceBackTask.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/task/InvoiceBackTask.java @@ -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) ; diff --git a/jianshui-invoice/src/main/resources/mapper/invoice/InvoiceBackMapper.xml b/jianshui-invoice/src/main/resources/mapper/invoice/InvoiceBackMapper.xml index 7463c11..e0014cc 100644 --- a/jianshui-invoice/src/main/resources/mapper/invoice/InvoiceBackMapper.xml +++ b/jianshui-invoice/src/main/resources/mapper/invoice/InvoiceBackMapper.xml @@ -15,10 +15,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - 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 @@ -53,6 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" result_msg, result_code, update_time, + num, #{id}, @@ -65,6 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{resultMsg}, #{resultCode}, #{updateTime}, + #{num}, @@ -80,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" result_msg = #{resultMsg}, result_code = #{resultCode}, update_time = #{updateTime}, + num = #{num}, where id = #{id}