
package com.cweb.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cweb.config.SysConst;
import com.hai.common.Base64Util;
import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.common.pay.util.XmlUtil;
import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.security.SessionObject;
import com.hai.common.utils.*;
import com.hai.config.*;
import com.hai.dao.HighGasOrderPushMapper;
import com.hai.entity.*;
import com.hai.enum_type.MerchantStoreSourceType;
import com.hai.model.*;
import com.hai.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.bouncycastle.util.encoders.UrlBase64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.IdGenerator;
import org.springframework.web.bind.annotation.*;
import sun.nio.cs.StreamEncoder;

import javax.annotation.Resource;
import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.util.*;

/**
 * @Auther: 胡锐
 * @Description:
 * @Date: 2021/3/26 23:08
 */
@Controller
@RequestMapping(value = "/test")
@Api(value = "订单接口")
public class HighTestController {

    private static Logger log = LoggerFactory.getLogger(HighTestController.class);

    @Resource
    private HighMerchantService highMerchantService;

    @Resource
    private HighMerchantStoreService highMerchantStoreService;

    @Resource
    private HighGasOilPriceService highGasOilPriceService;

    @Resource
    private HighOrderService highOrderService;

    @Resource
    private HighProfitSharingRecordService highProfitSharingRecordService;

    @Resource
    private HighGasOilGunNoService gasOilGunNoService;

    @Resource
    private HighGasOrderPushMapper highGasOrderPushMapper;

    @Resource
    private HuiLianTongConfig huiLianTongConfig;

    @Resource
    private UnionPayConfig unionPayConfig;

    @Resource
    private UnionStagingPayConfig unionStagingPayConfig;

    @Resource
    private UnionUserConfig unionUserConfig;

    @Resource
    private OutRechargeOrderService outRechargeOrderService;

    @Resource
    private HighOilCardService oilCardService;

    @Resource
    private BaiduVoiceService baiduVoiceService;

    @Resource
    private MqttProviderConfig mqttProviderConfig;

    @Autowired
    private WebSocket webSocket;

    @Resource
    private ShellGroupService shellGroupService;

    @Resource
    private HighGasService gasService;

    @Resource
    private JinZhuJiaYouService jinZhuJiaYouService;

    @RequestMapping(value = "/spPrint", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "发送打印机消息")
    public ResponseData spPrint(@RequestParam(name = "orderNo", required = true) String orderNo, HttpServletRequest request) {
        try {

            HighOrder highOrder = highOrderService.getOrderByOrderNo(orderNo);
            for (HighChildOrder highChildOrder : highOrder.getHighChildOrderList()) {
                HighMerchantStoreModel store = highMerchantStoreService.getMerchantStoreById(highChildOrder.getGoodsId());
                new Thread(() -> {
                    try {
                        SpPrinterConfig sp = new SpPrinterConfig();
                        sp.print(store.getDeviceSn(),
                                SpPrinterTemplate.oilCashierStubTemp(
                                        highChildOrder.getGoodsName(),
                                        highOrder.getOrderNo(),
                                        DateUtil.date2String(highOrder.getPayTime(), "yyyy-MM-dd HH:mm:ss"),
                                        "嗨森逛",
                                        highChildOrder.getGasGunNo(),
                                        highChildOrder.getGasOilNo(),
                                        highChildOrder.getGasOilLiters().toString(),
                                        highOrder.getTotalPrice().toString(),
                                        new HashMap<>(),
                                        false
                                ), 1);

                        Thread.sleep(6000);

                        sp.print(store.getDeviceSn(),
                                SpPrinterTemplate.oilClientStubTemp(
                                        highChildOrder.getGoodsName(),
                                        highOrder.getOrderNo(),
                                        DateUtil.date2String(highOrder.getPayTime(), "yyyy-MM-dd HH:mm:ss"),
                                        "嗨森逛",
                                        highChildOrder.getGasGunNo(),
                                        highChildOrder.getGasOilNo(),
                                        highChildOrder.getGasOilLiters().toString(),
                                        highOrder.getTotalPrice().toString(),
                                        new HashMap<>(),
                                        false
                                ), 1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).start();
            }

            return ResponseMsgUtil.success("发送成功");

        } catch (Exception e) {
            log.error("HighUserCardController --> getHuiLianTongCardInfo() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/queryGasInfoByGasId", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "根据油站 id 拉取最新的油站数据")
    public ResponseData queryGasInfoByGasId(@RequestParam(name = "gasId", required = true) String gasId, HttpServletRequest request) {
        try {
            return ResponseMsgUtil.success(TuanYouConfig.queryGasInfoByGasId(gasId));

        } catch (Exception e) {
            log.error("HighUserCardController --> getHuiLianTongCardInfo() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/initTYMerchantStore", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "初始化加油站")
    public ResponseData initTYMerchantStore(@RequestParam(name = "merchantId", required = true) Long merchantId) throws Exception {

        HighMerchantModel merchant = highMerchantService.getMerchantById(merchantId);
        if (merchant == null) {
            throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到商户");
        }
        JSONObject jsonObjectP = TuanYouConfig.queryGasInfoListByPage(1, 1000);
        JSONObject resultObjectP = jsonObjectP.getObject("result", JSONObject.class);

        for (int i = 1; i <= resultObjectP.getInteger("totalPageNum").intValue(); i++) {
            JSONObject jsonObject = TuanYouConfig.queryGasInfoListByPage(i, 1000);
            JSONObject resultObject = jsonObject.getObject("result", JSONObject.class);
            JSONArray jsonArray = resultObject.getJSONArray("gasInfoList");
            HighMerchantStore highMerchantStore;
            HighGasOilPrice highGasOilPrice;
            for (Object gasObject : jsonArray) {
                JSONObject object = JSONObject.parseObject(JSONObject.toJSONString(gasObject));
                HighMerchantStoreModel store = highMerchantStoreService.getMerchantStoreByKey(object.getString("gasId"));
                if (store != null) {
                    store.setType(1);
                    store.setMerchantId(merchant.getId());
                    store.setCompanyId(merchant.getCompanyId());
                    store.setStoreKey(object.getString("gasId"));
                    store.setStoreName(object.getString("gasName"));
                    store.setStoreLogo(object.getString("gasLogoSmall"));
                    store.setRegionId(object.getLong("provinceCode"));
                    store.setRegionName(object.getString("provinceName"));
                    store.setAddress(object.getString("gasAddress"));
                    store.setLongitude(object.getString("gasAddressLongitude"));
                    store.setLatitude(object.getString("gasAddressLatitude"));
                    store.setStatus(object.getInteger("gasStatus"));
                    store.setOperatorId(0L);
                    store.setOperatorName("系统创建");
                    store.setUpdateTime(new Date());
                    store.setExt1(object.getString("gasSourceId"));
                    highMerchantStoreService.updateMerchantStoreDetail(store);

                    JSONArray oilPriceList = object.getJSONArray("oilPriceList");
                    for (Object oilPrice : oilPriceList) {
                        JSONObject oilPriceObject = JSONObject.parseObject(JSONObject.toJSONString(oilPrice));
                        // 查询门店油号
                        highGasOilPrice = highGasOilPriceService.getGasOilPriceByStoreAndOilNo(store.getId(), oilPriceObject.getInteger("oilNo"));
                        if (highGasOilPrice == null) {
                            highGasOilPrice = new HighGasOilPrice();
                            highGasOilPrice.setMerchantStoreId(store.getId());
                            highGasOilPrice.setOilNo(oilPriceObject.getInteger("oilNo"));
                            highGasOilPrice.setOilNoName(oilPriceObject.getString("oilNoName"));
                            highGasOilPrice.setPriceVip(oilPriceObject.getBigDecimal("priceVip"));
                            highGasOilPrice.setPriceGun(oilPriceObject.getBigDecimal("priceGun"));
                            highGasOilPrice.setPriceOfficial(oilPriceObject.getBigDecimal("priceOfficial"));
                            highGasOilPrice.setOilType(oilPriceObject.getInteger("oilType"));
                            highGasOilPrice.setOilTypeName(oilPriceObject.getString("oilTypeName"));
                        } else {
                            highGasOilPrice.setMerchantStoreId(store.getId());
                            highGasOilPrice.setOilNo(oilPriceObject.getInteger("oilNo"));
                            highGasOilPrice.setOilNoName(oilPriceObject.getString("oilNoName"));
                            highGasOilPrice.setPriceVip(oilPriceObject.getBigDecimal("priceVip"));
                            highGasOilPrice.setPriceGun(oilPriceObject.getBigDecimal("priceGun"));
                            highGasOilPrice.setPriceOfficial(oilPriceObject.getBigDecimal("priceOfficial"));
                            highGasOilPrice.setOilType(oilPriceObject.getInteger("oilType"));
                            highGasOilPrice.setOilTypeName(oilPriceObject.getString("oilTypeName"));
                        }
                        highGasOilPriceService.editGasOilPrice(highGasOilPrice);
                    }
                } else {
                    highMerchantStore = new HighMerchantStore();
                    highMerchantStore.setType(1);
                    highMerchantStore.setMerchantId(merchant.getId());
                    highMerchantStore.setCompanyId(merchant.getCompanyId());
                    highMerchantStore.setStoreKey(object.getString("gasId"));
                    highMerchantStore.setStoreName(object.getString("gasName"));
                    highMerchantStore.setStoreLogo(object.getString("gasLogoSmall"));
                    highMerchantStore.setRegionId(object.getLong("provinceCode"));
                    highMerchantStore.setRegionName(object.getString("provinceName"));
                    highMerchantStore.setAddress(object.getString("gasAddress"));
                    highMerchantStore.setLongitude(object.getString("gasAddressLongitude"));
                    highMerchantStore.setLatitude(object.getString("gasAddressLatitude"));
                    highMerchantStore.setStatus(1);
                    highMerchantStore.setOperatorId(0L);
                    highMerchantStore.setOperatorName("系统创建");
                    highMerchantStore.setCreateTime(new Date());
                    highMerchantStore.setUpdateTime(new Date());
                    highMerchantStore.setExt1(object.getString("gasSourceId"));
                    HighMerchantStoreModel merchantStoreModel = new HighMerchantStoreModel();
                    BeanUtils.copyProperties(highMerchantStore, merchantStoreModel);
                    highMerchantStoreService.insertMerchantStore(merchantStoreModel);

                    JSONArray oilPriceList = object.getJSONArray("oilPriceList");
                    for (Object oilPrice : oilPriceList) {
                        JSONObject oilPriceObject = JSONObject.parseObject(JSONObject.toJSONString(oilPrice));
                        highGasOilPrice = new HighGasOilPrice();
                        highGasOilPrice.setMerchantStoreId(merchantStoreModel.getId());
                        highGasOilPrice.setOilNo(oilPriceObject.getInteger("oilNo"));
                        highGasOilPrice.setOilNoName(oilPriceObject.getString("oilNoName"));
                        highGasOilPrice.setPriceVip(oilPriceObject.getBigDecimal("priceVip"));
                        highGasOilPrice.setPriceGun(oilPriceObject.getBigDecimal("priceGun"));
                        highGasOilPrice.setPriceOfficial(oilPriceObject.getBigDecimal("priceOfficial"));
                        highGasOilPrice.setOilType(oilPriceObject.getInteger("oilType"));
                        highGasOilPrice.setOilTypeName(oilPriceObject.getString("oilTypeName"));
                        highGasOilPriceService.editGasOilPrice(highGasOilPrice);
                    }
                }
            }
        }
        return ResponseMsgUtil.success("初始化完成");
    }

    @RequestMapping(value = "/detectTYMerchantStore", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "检测加油站")
    public ResponseData detectTYMerchantStore(@RequestParam(name = "merchantId", required = true) Long merchantId) throws Exception {

        HighMerchantModel merchant = highMerchantService.getMerchantById(merchantId);
        if (merchant == null) {
            throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到商户");
        }

        Map<String, Object> param = new HashMap<>();
        param.put("merchantId", merchant.getId());
        List<HighMerchantStore> stores = highMerchantStoreService.getMerchantStoreList(param);

        for (HighMerchantStore store : stores) {
            JSONObject jsonObject = TuanYouConfig.queryGasInfoByGasId(store.getStoreKey());
            if (jsonObject != null && jsonObject.getString("code").equals("200")) {
                JSONObject result = jsonObject.getJSONObject("result");
                store.setStatus(result.getInteger("gasStatus"));
            } else {
                store.setStatus(0);
            }
            highMerchantStoreService.updateMerchantStoreDetail(store);
        }
        return ResponseMsgUtil.success("初始化完成");
    }

    /*   @RequestMapping(value = "/pushTuanYouOrder", method = RequestMethod.GET)
       @ResponseBody
       @ApiOperation(value = "推送团油订单")
       public ResponseData pushTuanYouOrder(@RequestParam(name = "orderNo", required = true) String orderNo) {
           try {
               HighOrder order = highOrderService.getOrderByOrderNo(orderNo);
               for (HighChildOrder highChildOrder : order.getHighChildOrderList()) {
                   HighMerchantStoreModel store = highMerchantStoreService.getMerchantStoreById(highChildOrder.getGoodsId());
                   // 推送团油订单
                   Map<String, Object> paramMap = new HashMap<>();
                   paramMap.put("gasId", store.getStoreKey());
                   paramMap.put("oilNo", highChildOrder.getGasOilNo());
                   paramMap.put("gunNo", highChildOrder.getGasGunNo());
                   BigDecimal priceGun = highChildOrder.getGasPriceGun();
                   BigDecimal priceVip = highChildOrder.getGasPriceVip();
                   paramMap.put("priceGun", priceGun);  // 枪单价
                   paramMap.put("priceVip", priceVip);  // 优惠价
                   paramMap.put("driverPhone", order.getMemPhone());
                   // paramMap.put("driverPhone", "17726395120");
                   paramMap.put("thirdSerialNo", order.getOrderNo());
                   paramMap.put("refuelingAmount", highChildOrder.getTotalPrice());

                   // 油品类型 1:汽油:2:柴油;3:天然气
                   if (highChildOrder.getGasOilType() == 1) {
                       paramMap.put("accountNo", CommonSysConst.getSysConfig().getTuanYouGasolineAccount());
                   } else if (highChildOrder.getGasOilType() == 2) {
                       paramMap.put("accountNo", CommonSysConst.getSysConfig().getTuanYouDieselAccount());
                   }
                   JSONObject orderPushObject = TuanYouConfig.refuelingOrderPush(paramMap);
                   // 推送团油订单记录
                   HighGasOrderPush highGasOrderPush = new HighGasOrderPush();
                   highGasOrderPush.setCreateTime(new Date());
                   highGasOrderPush.setCode(orderPushObject.getString("code"));
                   highGasOrderPush.setRequestContent(JSONObject.toJSONString(paramMap));
                   highGasOrderPush.setReturnContent(orderPushObject.toJSONString());
                   highGasOrderPushMapper.insert(highGasOrderPush);

                   if (orderPushObject != null && orderPushObject.getString("code").equals("200")) {
                       highChildOrder.setGasOrderNo(orderPushObject.getJSONObject("result").getString("orderNo"));
                   }
                   highOrderService.updateOrder(order);
               }
               return ResponseMsgUtil.success(order);
           } catch (Exception e) {
               log.error("HighOrderController --> getOrderById() error!", e);
               return ResponseMsgUtil.exception(e);
           }
       }
   */
    @RequestMapping(value = "/queryCompanyAccountInfo2JD", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询团油余额")
    public ResponseData queryCompanyAccountInfo2JD() {
        try {

            return ResponseMsgUtil.success(TuanYouConfig.queryCompanyAccountInfo2JD());
        } catch (Exception e) {
            log.error("HighOrderController --> queryCompanyAccountInfo2JD() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/queryCompanyPriceDetail", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询团油余额")
    public ResponseData queryCompanyPriceDetail() {
        try {

            return ResponseMsgUtil.success(TuanYouConfig.queryCompanyPriceDetail("LW000115995", "92"));
        } catch (Exception e) {
            log.error("HighOrderController --> queryCompanyAccountInfo2JD() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/starbucksOrdersPay", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "星巴克支付")
    public ResponseData starbucksOrdersPay(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {
            return ResponseMsgUtil.success(QianZhuConfig.starbucksOrdersPay(orderNo));
        } catch (Exception e) {
            log.error("HighOrderController --> getBackendToken() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/payKfcOrder", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "肯德基支付")
    public ResponseData payKfcOrder(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {
            return ResponseMsgUtil.success(QianZhuConfig.payKfcOrder(orderNo));
        } catch (Exception e) {
            log.error("HighOrderController --> getBackendToken() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/wxSplitAccount", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "微信分账")
    public ResponseData wxSplitAccount() {
        try {
            HighOrder orderNo = highOrderService.getOrderByOrderNo("HF2021101812025050304");
            wxProfitsharing(orderNo.getOrderNo(), orderNo.getPaySerialNo(), orderNo.getPayRealPrice());
            return ResponseMsgUtil.success("分账成功");
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/queryStaging", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "分期查询")
    public ResponseData queryStaging(@RequestParam(name = "oriOrgTrace", required = true) String oriOrgTrace, HttpServletRequest request) {
        try {
            String orgTrace = CommonSysConst.getSysConfig().getUnionStagingPayOrgId().substring(0, 4)
                    + CommonSysConst.getSysConfig().getUnionStagingPayOrgId().substring(CommonSysConst.getSysConfig().getUnionStagingPayOrgId().length() - 4, CommonSysConst.getSysConfig().getUnionStagingPayOrgId().length())
                    + DateUtil.format(new Date(), DateUtil.YMDHMS)
                    + IDGenerator.nextId(6);
            return ResponseMsgUtil.success(UnionStagingPayConfig.queryStaging(orgTrace, oriOrgTrace, "", new Date(), request));

        } catch (Exception e) {
            log.error("HighOrderController --> unionStagingPay() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }
/*
    @RequestMapping(value = "/orderToRefund", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "退款")
    public ResponseData orderToRefund(HttpServletRequest request) {
        try {
            OrderRefundModel orderRefundModel = WxOrderConfig.orderToRefund("4200001301202202035413938093", new BigDecimal("30.80"), new BigDecimal("16.90"));

            return ResponseMsgUtil.success(orderRefundModel);

        } catch (Exception e) {
            log.error("HighOrderController --> orderToRefund() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }*/

    @RequestMapping(value = "/query", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "订单查询")
    public ResponseData query(@RequestParam(name = "oriOrgTrace", required = true) String oriOrgTrace, HttpServletRequest request) {
        try {
            String orgTrace = CommonSysConst.getSysConfig().getUnionStagingPayOrgId().substring(0, 4)
                    + CommonSysConst.getSysConfig().getUnionStagingPayOrgId().substring(CommonSysConst.getSysConfig().getUnionStagingPayOrgId().length() - 4, CommonSysConst.getSysConfig().getUnionStagingPayOrgId().length())
                    + DateUtil.format(new Date(), DateUtil.YMDHMS)
                    + IDGenerator.nextId(6);
            return ResponseMsgUtil.success(UnionStagingPayConfig.query(orgTrace, oriOrgTrace, "", new Date(), request));

        } catch (Exception e) {
            log.error("HighOrderController --> unionStagingPay() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    public void wxProfitsharing(String transaction_id, String out_order_no, BigDecimal amount) {
        try {
            Map<String, String> param = new LinkedHashMap<>();
            param.put("appid", "wx637bd6f7314daa46");
            param.put("mch_id", "1289663601");
            param.put("sub_mch_id", "1609882817"); // 个体户黎杨珍
            param.put("transaction_id", transaction_id);
            param.put("out_order_no", out_order_no);
            param.put("nonce_str", WxUtils.makeNonStr());

            // 分账金额
            BigDecimal porofitSharingAmount = amount;

            List<Map<String, Object>> receiversList = new ArrayList<>();
            Map<String, Object> receiversMap = new LinkedHashMap<>();
            receiversMap.put("type", "MERCHANT_ID");
            receiversMap.put("account", "1603942866");
            receiversMap.put("amount", porofitSharingAmount.multiply(new BigDecimal("100")).intValue());
            receiversMap.put("description", "分给商户【惠昕石化】");
            receiversList.add(receiversMap);
            param.put("receivers", JSONObject.toJSONString(receiversList));
            String signStr = WxUtils.generateSignature(param, "Skufk5oi85wDFGl888i6wsRSTkdd5df5", WXPayConstants.SignType.HMACSHA256);
            param.put("sign", signStr);
            String resultXmL = this.doRefundRequest(param.get("mch_id"), null, WxUtils.mapToXml(param));

            // 请求分账返回的结果
            ResultProfitSharing resultProfitSharing = XmlUtil.getObjectFromXML(resultXmL, ResultProfitSharing.class);

            if (!resultProfitSharing.getResult_code().equals("FAIL")) {
                HighProfitSharingRecord sharingRecord = new HighProfitSharingRecord();
                sharingRecord.setOutOrderNo(resultProfitSharing.getOut_order_no());
                sharingRecord.setTransactionId(resultProfitSharing.getTransaction_id());
                sharingRecord.setOrderId(resultProfitSharing.getOrder_id());
                sharingRecord.setStatus(resultProfitSharing.getResult_code());
                sharingRecord.setPrice(amount);
                sharingRecord.setCreateTime(new Date());
                sharingRecord.setContent(resultXmL);
                highProfitSharingRecordService.insert(sharingRecord);
            }

        } catch (Exception e) {
            log.error("CmsContentController --> getCorporateAdvertising() error!", e);
        }
    }

    public CloseableHttpClient readCertificate(String mchId) throws Exception {
        /**
         * 注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的
         */
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        //P12文件目录 证书路径，这里需要你自己修改，linux下还是windows下的根路径
        FileInputStream instream = new FileInputStream("/home/project/wx_cert/1289663601_apiclient_cert.p12");
        // FileInputStream instream = new FileInputStream("G:\\hurui-project/hai-parent/hai-service/src/main/java/privatekey/1289663601_apiclient_cert.p12");
        try {
            keyStore.load(instream, "1289663601".toCharArray());//这里写密码..默认是你的MCHID
        } finally {
            instream.close();
        }
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1289663601".toCharArray()).build();//这里也是写密码的
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
        // Allow TLSv1 protocol only
        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    }

    public String doRefundRequest(String mchId, String url, String data) throws Exception {

        //小程序退款需要调用双向证书的认证
        CloseableHttpClient httpClient = readCertificate(mchId);
        try {
            HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/profitsharing"); // 设置响应头信息
            httpost.addHeader("Connection", "keep-alive");
            httpost.addHeader("Accept", "*/*");
            httpost.addHeader("Content-Type", "text/xml");
            httpost.addHeader("Host", "api.mch.weixin.qq.com");
            httpost.addHeader("X-Requested-With", "XMLHttpRequest");
            httpost.addHeader("Cache-Control", "max-age=0");
            httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
            httpost.setEntity(new StringEntity(data, "UTF-8"));
            CloseableHttpResponse response = httpClient.execute(httpost);
            try {
                HttpEntity entity = response.getEntity();
                String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
                EntityUtils.consume(entity);
                return jsonStr;
            } finally {
                response.close();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            httpClient.close();
        }
    }

    @RequestMapping(value = "/websocket", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "websocket")
    public ResponseData websocket(@RequestParam(name = "orderNo", required = true) String orderNo
    ) {
        try {

            HighOrder order = highOrderService.getOrderByOrderNo(orderNo);
            if (order.getHighChildOrderList().get(0).getGoodsType().equals(3)) {
                Map<String, Object> pushMsg = new HashMap<>();
                pushMsg.put("userId", order.getHighChildOrderList().get(0).getGoodsId());

                Map<String, Object> msgContent = new HashMap<>();
                msgContent.put("order", highOrderService.getGasOrderDetail(order.getOrderNo()));
                msgContent.put("voice", baiduVoiceService.text2audio(order.getHighChildOrderList().get(0).getGoodsName() + "加油站，收款：" + order.getTotalPrice()));
                pushMsg.put("message", JSONObject.toJSONString(msgContent));
                HttpsUtils.doPost("http://127.0.0.1:9901/msg/test/websocket", pushMsg, new HashMap<>());
            }

            return ResponseMsgUtil.success("null");

        } catch (Exception e) {
            log.error("HighOrderController --> unionStagingPay() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }


    @RequestMapping(value = "/gasStationQueryDetail", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "gasStationQueryDetail")
    public ResponseData gasStationQueryDetail() {
        try {

            return ResponseMsgUtil.success(shellGroupService.gasStationQueryDetail("0001"));

        } catch (Exception e) {
            log.error("HighOrderController --> gasStationQueryDetail() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/gasPageQueryAllStation", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "gasPageQueryAllStation")
    public ResponseData gasPageQueryAllStation() {
        try {

            gasService.getJiaHaoYouAllStation();

            return ResponseMsgUtil.success(null);

        } catch (Exception e) {
            log.error("HighOrderController --> gasPageQueryAllStation() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/gasSyncPayment", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "gasSyncPayment")
    public ResponseData gasSyncPayment() {
        try {
            HighOrder order = highOrderService.getOrderByOrderNo("HF2022071114274054900");
            for (HighChildOrder childOrder : order.getHighChildOrderList()) {
                HighMerchantStoreModel store = highMerchantStoreService.getMerchantStoreById(childOrder.getGoodsId());

                // 推送壳牌
                JSONObject syncPayment = shellGroupService.gasSyncPayment(order.getOrderNo(),
                        // store.getStoreKey(),
                        "0001",
                        new Date(),
                        order.getTotalPrice(),
                        "92",
                        "1",
                        order.getPayRealPrice(),
                        childOrder.getGasDiscount()
                );
            }

            return ResponseMsgUtil.success(null);

        } catch (Exception e) {
            log.error("HighOrderController --> gasPageQueryAllStation() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/gasSyncRefund", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "gasSyncRefund")
    public ResponseData gasSyncRefund() {
        try {

            shellGroupService.gasSyncRefund(new Date(1659511289000L), "1659511289357");

            return ResponseMsgUtil.success(null);

        } catch (Exception e) {
            log.error("HighOrderController --> gasSyncRefund() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/getJzStationListPage", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "getJzStationListPage")
    public ResponseData getJzStationListPage() {
        try {

            gasService.getJinZhuAllStation();

            return ResponseMsgUtil.success(null);

        } catch (Exception e) {
            log.error("HighOrderController --> gasSyncRefund() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "test")
    public ResponseData test() {
        try {
            JSONObject data = HuiLianTongUnionCardConfig.resolveResponse("Gbkl57c3fECXJRiCSOspjsb3bIyyFrE4TyMKKGsSAMzeXLElQQU00GoYZSYkJYg1G2Xlic2QvOd3\\nhJC7bc6qAg+9aoZr3IJi");
            return ResponseMsgUtil.success(data);

        } catch (Exception e) {
            log.error("HighOrderController --> gasSyncRefund() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "UTF-8");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    /**
     * 获取打印内容，适用于云打印机
     *
     * @param printText   打印文本
     * @param pageCount   打印联数
     * @param encodingStr 编码方式，默认UTF-8
     * @return
     */
    public byte[] getPrinterBytes(final byte[] printText,
                                  final int pageCount, String encodingStr) {
        try {

            byte[] array = new byte[printText.length + 9];
            array[0] = 30;
            array[1] = 16;
            array[2] = (byte) pageCount;//打印份数
            int num = array.length - 5;
            array[3] = (byte) (num >> 8);
//array[4] = (byte)((uint)num & 0xFFu);
            array[4] = (byte) (num & 0xFF);

            for (int i = 0; i < printText.length; i++) {
                array[i + 5] = printText[i];
            }

            array[array.length - 4] = 27;
            array[array.length - 3] = 99;
            byte[] crc16CodeArray = getCRC(printText);
            array[array.length - 2] = crc16CodeArray[0];
            array[array.length - 1] = crc16CodeArray[1];

            return array;

     /*       if(encodingStr.equals("")){
                encodingStr="UTF-8";
            }
            byte[] msgByte = printText;
            // 消息数组
            final byte[] dataByte = new byte[msgByte.length + 9];
            dataByte[0] = 0x1E;
            dataByte[1] = 0x10;
            dataByte[2] = (byte) pageCount;// 打印多联
            // 有效数据长度
            final int len = dataByte.length - 5;
            dataByte[3] = (byte) (len >> 8);
            dataByte[4] = (byte) (len & 0xff);
            // 数据内容
            System.arraycopy(msgByte, 0, dataByte, 5, msgByte.length);
            // 标识字节
            dataByte[dataByte.length - 4] = 0x1b;
            dataByte[dataByte.length - 3] = 0x63;
            // 打印内容CRC校验
            final byte[] dtCRC = getCRC(msgByte);
            dataByte[dataByte.length - 2] = (byte) (dtCRC[0]);
            dataByte[dataByte.length - 1] = (byte) (dtCRC[1]);
            msgByte = dataByte;
            return msgByte;*/
        } catch (Exception ex) {
            System.out.println(ex.getStackTrace());
        }
        return null;
    }

    /**
     * 获取打印内容，适用于云打印机
     *
     * @param printText   打印文本
     * @param pageCount   打印联数
     * @param encodingStr 编码方式，默认UTF-8
     * @return
     */
    public byte[] getPrinterBytes(final String printText,
                                  final int pageCount, String encodingStr) {
        try {
            if (encodingStr.equals("")) {
                encodingStr = "UTF-8";
            }
            byte[] msgByte = printText.getBytes(encodingStr);
            // 消息数组
            final byte[] dataByte = new byte[msgByte.length + 9];
            dataByte[0] = 0x1E;
            dataByte[1] = 0x10;
            dataByte[2] = (byte) pageCount;// 打印多联
            // 有效数据长度
            final int len = dataByte.length - 5;
            dataByte[3] = (byte) (len >> 8);
            dataByte[4] = (byte) (len & 0xff);
            // 数据内容
            System.arraycopy(msgByte, 0, dataByte, 5, msgByte.length);
            // 标识字节
            dataByte[dataByte.length - 4] = 0x1b;
            dataByte[dataByte.length - 3] = 0x63;
            // 打印内容CRC校验
            final byte[] dtCRC = getCRC(msgByte);
            dataByte[dataByte.length - 2] = (byte) (dtCRC[0]);
            dataByte[dataByte.length - 1] = (byte) (dtCRC[1]);
            msgByte = dataByte;
            return msgByte;
        } catch (Exception ex) {
            System.out.println(ex.getStackTrace());
        }
        return null;
    }

    private static int[] CRC16Table = {0x0000, 0x1189, 0x2312, 0x329b, 0x4624,
            0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c,
            0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5,
            0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed,
            0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726,
            0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e,
            0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7,
            0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef,
            0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420,
            0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868,
            0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1,
            0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9,
            0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522,
            0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a,
            0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3,
            0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb,
            0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c,
            0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64,
            0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad,
            0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5,
            0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e,
            0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66,
            0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af,
            0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7,
            0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028,
            0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60,
            0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9,
            0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1,
            0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a,
            0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62,
            0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab,
            0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3,
            0x2c6a, 0x1ef1, 0x0f78};

    private static byte[] getCRC(byte[] bytes) {
        int crc = 0xFFFF; // 初始值
        for (byte b : bytes) {
            crc = (crc >> 8) ^ CRC16Table[(crc ^ b) & 0xff];
        }
        byte[] b = new byte[2];
        b[0] = (byte) ((crc >> 8) ^ 0xff);
        b[1] = (byte) ((crc & 0xff) ^ 0xff);
        return b;
    }

    private static final char[] HEXES = {'0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
     * byte数组 转换成 16进制小写字符串
     */
    private String bytes2Hex(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        StringBuilder hex = new StringBuilder();
        for (byte b : bytes) {
            hex.append(HEXES[(b >> 4) & 0x0F]);
            hex.append(HEXES[b & 0x0F]);
        }
        return hex.toString();
    }


    @RequestMapping(value = "/insertV2", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "支付")
    public ResponseData insertV2() {
        try {

            String orderNo = "HF2022080818504922206";
            JSONObject object = QianZhuConfig.insertV2("PLM100024", orderNo, "15585850137");
            object.put("orderNo", orderNo);
            return ResponseMsgUtil.success(object);
        } catch (Exception e) {
            log.error("HighOrderController --> getBackendToken() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/QueryV2", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询订单号")
    public ResponseData QueryV2(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {

            HighOrder order = highOrderService.getOrderByOrderNo(orderNo);

            JSONObject orderObject = QianZhuConfig.QueryV2(orderNo);

            if (orderObject != null && orderObject.getLong("Code") == 999) {
                // 订单失败  // 订单状态 1:订单正在处理中 2;订单成功:	3 订单失败
                if (orderObject.getJSONObject("Data").getInteger("OrderState") == 3) {
                    // 订单失败
                    if (order.getOrderStatus() == 2) {
                        highOrderService.thirdOrderToRefund(order.getId());
                    } else {
                        highOrderService.thirdCancelOrder(order.getId());
                    }
                }
                // 订单状态 1:订单正在处理中 2;订单成功:	3 订单失败
                if (orderObject.getJSONObject("Data").getInteger("OrderState") == 2) {
                    for (HighChildOrder childOrder : order.getHighChildOrderList()) {
                        childOrder.setChildOrdeStatus(3);
                    }
                    order.setOrderStatus(3);
                    order.setFinishTime(new Date());
                    highOrderService.updateOrder(order);
                }
            }

            return ResponseMsgUtil.success(QianZhuConfig.QueryV2(orderNo));

        } catch (Exception e) {
            log.error("HighOrderController --> unionStagingPay() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/getKfcOrderByOrderNo", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询肯德基订单")
    public ResponseData getKfcOrderByOrderNo(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {
            return ResponseMsgUtil.success(QianZhuConfig.getKfcOrderByOrderNo(orderNo));

        } catch (Exception e) {
            log.error("HighOrderController -> addOrder() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/starbucksOrderByOrderNo", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询星巴克订单")
    public ResponseData starbucksOrderByOrderNo(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {
            return ResponseMsgUtil.success(QianZhuConfig.starbucksOrderByOrderNo(orderNo));

        } catch (Exception e) {
            log.error("HighOrderController -> addOrder() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/thirdOrderToRefund", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "第三方退款")
    public ResponseData thirdOrderToRefund(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {

            HighOrder order = highOrderService.getOrderByOrderNo(orderNo);
            highOrderService.thirdOrderToRefund(order.getId());
            return ResponseMsgUtil.success("");

        } catch (Exception e) {
            log.error("HighOrderController -> addOrder() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/rechargeOrderByCy", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "城宇话费充值   ")
    public ResponseData rechargeOrderByCy() {
        try {

            JSONObject object = new JSONObject();

            object.put("mobile" , "18090580471");
            object.put("productId" , 172);
            object.put("agentOrderId" , "RCG" + DateUtil.date2String(new Date(), "yyyyMMddHHmmss") + IDGenerator.nextId(5));


            return ResponseMsgUtil.success(RechargeConfig.rechargeOrderByCy(object));

        } catch (Exception e) {
            log.error("HighOrderController -> addOrder() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }


    @RequestMapping(value = "/queryRechargeByCy", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "城宇查询订单")
    public ResponseData queryRechargeByCy(@RequestParam(name = "orderNo", required = true) String orderNo) {
        try {

            JSONObject object = new JSONObject();
            object.put("orderNo" , orderNo);
            return ResponseMsgUtil.success(RechargeConfig.queryRechargeByCy(object));

        } catch (Exception e) {
            log.error("HighOrderController -> addOrder() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }


    @RequestMapping(value = "/postIp", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "请求ip地址")
    public ResponseData postIp(HttpServletRequest request) {
        try {

            request.getHeader("regionId");
            if (request.getHeader("regionId") != null && request.getHeader("regionId").length() != 0) {
                System.out.println("111");
            }
            return ResponseMsgUtil.success(HttpsUtils.doPost("https://hsgcs.dctpay.com/brest/openApi/test"));

        } catch (Exception e) {
            log.error("HighOrderController -> addOrder() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

}

