// package com.jianshui.income.consumer;
//
// import com.alibaba.fastjson.JSONArray;
// import com.alibaba.fastjson.JSONObject;
// import com.jianshui.common.core.domain.AjaxResult;
// import com.jianshui.common.core.domain.entity.Companyservice;
// import com.jianshui.common.utils.DateUtils;
// import com.jianshui.common.utils.http.HttpUtils;
// import com.jianshui.common.utils.spring.SpringUtils;
// import com.jianshui.income.domain.dto.*;
// import com.jianshui.income.domain.entity.IncomeSrm;
// import com.jianshui.income.mapper.IncomeSrmMapper;
// import com.jianshui.income.service.IIncomeService;
// import com.jianshui.queue.consumer.RedisQueueConsumer;
// import com.jianshui.queue.dto.RedisQueueMessage;
//
// import com.jianshui.queue.utils.RedisQueueUtil;
// import org.apache.commons.lang3.StringUtils;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.core.env.Environment;
// import org.springframework.stereotype.Component;
//
// import java.util.*;
//
// /**
//  * @Description 重汽SRM RedisQueue消费回调
//  * @Author 巩权林
//  * @Date 2021-12-21 16:47
//  **/
// @Component(value = "income_srm_consumer")
// public class IncomeSRMConsumer implements RedisQueueConsumer {
//
//     @Autowired
//     private IncomeSrmMapper srmMapper;
//
//     @Autowired
//     private IIncomeService incomeService;
//
//     protected final Logger log = LoggerFactory.getLogger(IncomeSRMConsumer.class);
//
//     @Override
//     public String getQueueName() {
//         return "income_srm_consumer";
//     }
//
//     @Override
//     public void consume(RedisQueueMessage redisQueueMessage) {
//         Object data = redisQueueMessage.getData();
//         if (!StringUtils.equals(data.getClass().getName(), "com.alibaba.fastjson.JSONObject")) {
//             log.error("【发票查验】【SRM消费者】消息类型非JSONObject，异常。原始数据{}", JSONObject.toJSONString(data));
//             return;
//         }
//
//         IncomeQueueDTO incomeQueueDTO = null;
//         try {
//             incomeQueueDTO = ((JSONObject) data).toJavaObject(IncomeQueueDTO.class);
//         } catch (Exception e) {
//             log.error("【发票查验】【SRM消费者】转换IncomeQueueDTO失败。原始数据{}，错误原因{}", JSONObject.toJSONString(data), e.getMessage());
//             e.printStackTrace();
//             return;
//         }
//
//         if (incomeQueueDTO == null) {
//             log.error("【发票查验】【SRM消费者】IncomeQueueDTO为NULL，异常。原始数据{}", JSONObject.toJSONString(data));
//             return;
//         }
//
//         // 处理消息
//         Object result = incomeQueueDTO.getAisinoResult();
//         AisinoIncomeBatchDTO aisinoIncomeBatchDTO = incomeQueueDTO.getAisinoIncomeBatchDTO();
//
//         // 如果是还没获取到结果
//         if (result == null) {
//             // 获取一下company service，调用一下发票查验结果
//             Companyservice companyservice = incomeQueueDTO.getCompanyservice();
//             if (companyservice == null) {
//                 log.error("【发票查验】【SRM消费者】Companyservice，无法进行查验。原始数据{}", JSONObject.toJSONString(data));
//                 return;
//             }
//             String pch = incomeQueueDTO.getPch();
//             if (StringUtils.isEmpty(pch)) {
//                 log.error("【发票查验】【SRM消费者】批次号为空，无法进行查验。原始数据{}", JSONObject.toJSONString(data));
//                 return;
//             }
//
//             // 发起查验，等待查验结果返回进行回调
//             AjaxResult myResult = incomeService.CheckInvoiceBatchResult(pch, companyservice);
//             int code = myResult.getCode();
//             // 如果状态码是1010，说明未查验完成
//             if (code == 1010) {
//                 log.info("【发票查验】【SRM消费者】未查验完成，重新投入队列");
//                 String queueName = "income_srm_consumer";
//                 // 投入到队列进行查询，重试3次
//                 for (int i = 10; i > 0; i--) {
//                     AjaxResult queueResult = RedisQueueUtil.build().setData(incomeQueueDTO).onQueue(queueName).retry(3).dispatch();
//                     if (queueResult.isSuccess()) {
//                         break;
//                     }
//                     log.info("【发票查验】【SRM消费者】未查验完成，重新投入队列失败，重试");
//                 }
//                 return;
//             }
//
//             if (code == 500) {
//                 log.info("【发票查验】【SRM消费者】查验结果获取失败，信息：{}", JSONObject.toJSONString(myResult));
//                 return;
//             }
//
//             log.info("【发票查验】【SRM消费者】查验消费完成");
//         }
//
//         // result 不为空，说明已经有回调结果，进行SRM回调
//         if (result != null) {
//             // 查找一下对应的srm记录
//             Companyservice companyservice = incomeQueueDTO.getCompanyservice();
//             if (companyservice == null) {
//                 log.error("【发票查验】【SRM消费者】Companyservice，无法进行查验。原始数据{}", JSONObject.toJSONString(data));
//                 return;
//             }
//             String pch = incomeQueueDTO.getPch();
//             if (StringUtils.isEmpty(pch)) {
//                 log.error("【发票查验】【SRM消费者】批次号为空，无法进行查验。原始数据{}", JSONObject.toJSONString(data));
//                 return;
//             }
//             IncomeSrm query = new IncomeSrm();
//             query.setPch(pch);
//             query.setCompanyid(companyservice.getCompanyid());
//             IncomeSrm incomeSrm = srmMapper.selectByPchAndCompanyId(query);
//             if (incomeSrm == null) {
//                 log.error("【发票查验】【SRM消费者】无法查到对应的SRM记录。SRM批次号{}，companyId{}", pch, companyservice.getCompanyid());
//                 return;
//             }
//
//             // 获取一下MessageHeader
//             String request = incomeSrm.getRequest();
//             if (StringUtils.isEmpty(request)) {
//                 log.error("【发票查验】【SRM消费者】SRM入参请求为空，无法继续回调。SRM批次号{}，companyId{}", pch, companyservice.getCompanyid());
//                 return;
//             }
//             JSONObject requestJson = JSONObject.parseObject(request);
//
//             // 配置返回的Header
//             JSONObject requestHeader = requestJson.getJSONObject("MessageHeader");
//             SRMMessageHeader srmMessageHeader = new SRMMessageHeader();
//             srmMessageHeader.setInterface_ID(requestHeader.getString("Interface_ID"));
//             srmMessageHeader.setUUID(requestHeader.getString("UUID"));
//             srmMessageHeader.setMessageId("");
//             srmMessageHeader.setSender(requestHeader.getString("Receiver"));
//             srmMessageHeader.setReceiver(requestHeader.getString("Sender"));
//             Date now = DateUtils.getNowDate();
//             srmMessageHeader.setSendDate(DateUtils.parseDateToStr("yyyy-MM-dd", now));
//             srmMessageHeader.setSendTime(DateUtils.parseDateToStr("HH:mm:ss", now));
//
//             // 配置返回的请求体
//             List<SRMResponses> srmResponsesList = new ArrayList<SRMResponses>();
//
//             // 批量处理list
//             JSONArray invoiceList = ((JSONObject) result).getJSONArray("invoiceInfo");
//             for (Object raw : invoiceList) {
//                 JSONObject rawBody = (JSONObject) raw;
//                 SRMResponses temp = new SRMResponses();
//                 // 批次号
//                 String mpch = pch;
//                 temp.setPch(mpch);
//                 // 查验结果
//                 String cyjg = rawBody.getString("cyjg");
//                 temp.setCyjg(cyjg);
//                 // 查验结果信息
//                 String cyjgxx = rawBody.getString("cyjgxx");
//                 temp.setCyjgxx(cyjgxx);
//                 // 发票种类
//                 String fpzl = rawBody.getString("fpzl");
//                 temp.setFpzl(fpzl);
//                 // 发票代码
//                 String fpdm = rawBody.getString("fpdm");
//                 temp.setFpdm(fpdm);
//                 // 发票号码
//                 String fphm = rawBody.getString("fphm");
//                 temp.setFphm(fphm);
//                 // 开票日期
//                 String kprq = rawBody.getString("kprq");
//                 temp.setKprq(kprq);
//                 // 发票金额
//                 String fpje = rawBody.getString("fpje");
//                 temp.setFpje(fpje);
//                 // 发票税额
//                 String fpse = rawBody.getString("fpse");
//                 temp.setFpse(fpse);
//                 // 价税合计
//                 String jshj = rawBody.getString("jshj");
//                 temp.setJshj(jshj);
//                 // 校验码
//                 String jym = rawBody.getString("jym");
//                 temp.setJym(jym);
//                 // 作废标志
//                 String zfbz = rawBody.getString("zfbz");
//                 temp.setZfbz(zfbz);
//                 srmResponsesList.add(temp);
//             }
//
//             SRMIncomeResultDTO srmIncomeResultDTO = new SRMIncomeResultDTO();
//             srmIncomeResultDTO.setMessageHeader(srmMessageHeader);
//             srmIncomeResultDTO.setResponses(srmResponsesList);
//
//             // 获取回调地址
//             String callbackUrl = companyservice.getRebackurl();
//             Environment environment = SpringUtils.getBean(Environment.class);
//             String username = environment.getProperty("srm.username");
//             String pwd = environment.getProperty("srm.pwd");
//             String basicAuthHeader = HttpUtils.getBasicAuthHeader(username, pwd);
//             Map<String, String> header = new HashMap<>();
//             header.put("Authorization", basicAuthHeader);
//             header.put("Content-Type", "text/plain; charset=UTF-8");
//             log.info("【发票查验】【srm消费者】发送请求，地址:{}，body:{}，请求头:{}", callbackUrl, JSONObject.toJSONString(srmIncomeResultDTO), JSONObject.toJSONString(header));
//             String callbackResult = HttpUtils.sendJsonPost(callbackUrl, srmIncomeResultDTO, header);
//             log.info("【发票查验】【srm消费者】SRM端返回数据：{}", callbackResult);
//         }
//     }
//
//     @Override
//     public void error(RedisQueueMessage redisQueueMessage) {
//
//     }
// }
