package com.dxhy.erp.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dxhy.common.aspect.SysLog;
import com.dxhy.common.constant.CommonConstants;
import com.dxhy.common.constant.ConfigureConstant;
import com.dxhy.common.constant.DbConstant;
import com.dxhy.common.controller.AbstractController;
import com.dxhy.common.datasource.config.DynamicContextHolder;
import com.dxhy.common.enums.SNFplxEnum;
import com.dxhy.common.exception.BaseException;
import com.dxhy.common.util.InvoiceUtil;
import com.dxhy.common.utils.Base64Encoding;
import com.dxhy.common.utils.R;
import com.dxhy.erp.dao.*;
import com.dxhy.erp.entity.*;
import com.dxhy.erp.entity.sdny.*;
import com.dxhy.erp.model.InvoiceDetailInfo;
import com.dxhy.erp.service.*;
import com.dxhy.erp.utils.Base64;
import com.dxhy.erp.utils.HmacSHA1Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeoutException;

/**
 * 山东能源查验主流程控制器
 *
 * @author ariesy
 * @date 2023-03-15
 */
@SuppressWarnings({"AlibabaUndefineMagicConstant", "AlibabaMethodTooLong"})
@RestController
@RequestMapping("/sn")
@Slf4j
public class SDNYMainProcessController extends AbstractController {

    @Value("${sdny.environment}")
    private String environment;

    @Value("${sdny.isPresure}")
    private String isPresure;

    @Resource
    private GsClientMapper gsClientMapper;

    @Resource
    private InvoiceQueryService invoiceQueryService;

    @Resource
    private SNPushCheckRecordService snPushCheckRecordService;

    @Resource
    private SignSaveInvoiceInfoService signSaveInvoiceInfoService;

    @Resource
    private SignCheckRecordService signCheckRecordService;

    @Resource
    private TDxInvoiceReimburseService tDxInvoiceReimburseService;

    @Resource
    TdxSaleRecordInvoiceDao tdxSaleRecordInvoiceDao;

    @Resource
    private CustomsRecordDao customsRecordDao;

    @Resource
    private BaseTDxRecordInvoiceDao baseTDxRecordInvoiceDao;

    @Resource
    private BaseTDxRecordInvoiceDetailDao baseTDxRecordInvoiceDetailDao;

    @Resource
    private InvoiceDownDetaiSaleInsertDao invoiceDownDetaiSaleInsertDao;

    @Resource
    private RecordInvoiceDao recordInvoiceDao;

    @Resource
    private MixedSignatureDao mixedSignatureDao;

    @Resource
    private SysDeptDao sysDeptDao;

    @Resource
    private TdxPlatformCheckLogService platfromCheckLogService;

    @Resource
    private MryxInterfaceService mryxInterfaceService;

    @Resource
    private GatherService gatherService;

    @Resource
    private RequestRecordService requestRecordService;
    /**
     * 查验发票
     */
    @PostMapping("/singleInvoiceCheck")
    @ResponseBody
    @SysLog("发票查验")
    public ResponseEntity<String> singleInvoiceCheck(@RequestBody Map<String, String> pramsMap) throws Exception {
        log.info("传入的参数为:{}", pramsMap);
        String userid = "101833";
        String dbName = "business";
        JSONObject checkInvoiceResult = null;
        RequestRecord singleInvoiceCheckRecord = requestRecordService.getBaseRequestRecord(JSONObject.toJSONString(pramsMap),
                "/singleInvoiceCheck",pramsMap.get("invoiceCode"),pramsMap.get("invoiceNumber"), "singleInvoiceCheck");

        //挡板开关
        if ("1".equals(isPresure)) {
            String base64 = "ewoJImNvZGUiOiAxMDAwLAoJImRhdGEiOiB7CgkJImRyYXdlZU5hbWUiOiAiIiwKCQkiYnVzaW5lc3NVbml0IjogIiIsCgkJImxlbW9uTWFya2V0VGF4Tm8iOiAiOTEzNzAxMjVNQTNRQUtDMjhBIiwKCQkiYnJhbmRNb2RlbCI6ICLliKvlhYvniYxTR002NTIxVUJBMSIsCgkJInZlaGljbGVJZGVudGlmaWNhdGlvbk5vIjogIkxTR1VBODJMN01HMDgzODcwIiwKCQkiaWRjYXJkTm8iOiAiIiwKCQkic291cmNlIjogIiIsCgkJInRyYW5zcG9ydFJvdXRlIjogIiIsCgkJInRvdGFsVGF4IjogIiIsCgkJImJ1c2luZXNzVW5pdEFkZHJlc3MiOiAiIiwKCQkibGljZW5zZVBsYXRlIjogIuS6kUFFODVTNSIsCgkJInNlbGxlclVuaXRPckluZGl2aWR1YWwiOiAi5rWO5Y2X5YyX5p6B5pif5rG96L2m5pyN5Yqh5pyJ6ZmQ5YWs5Y+45LqR5Y2X5YiG5YWs5Y+4IiwKCQkiYWRtaW5pc3RyYXRpdmVEaXZpc2lvbk5vIjogIiIsCgkJImNhcnJpZXJOYW1lIjogIiIsCgkJInRheFJlY29yZHMiOiAiIiwKCQkic2FsZXNCYW5rIjogIiIsCgkJImxlbW9uTWFya2V0IjogIuWxseS4nOa2pumAmuS6jOaJi+i9puW4guWcuuacjeWKoeaciemZkOWFrOWPuCIsCgkJImludm9pY2VUeXBlIjogIjE1IiwKCQkibGltaXRQZW9wbGUiOiAiIiwKCQkibWFjaGluZU5vIjogIjU4OTkxNjQyNDc3MiIsCgkJInB1cmNoYXNlckFkZHJlc3NQaG9uZSI6ICIiLAoJCSJzdGF0ZSI6ICIwIiwKCQkiaW52b2ljZU5vIjogIjAwMzI3OTYyIiwKCQkidmVoaWNsZVR5cGUiOiAi5bCP5Z6L5pmu6YCa5a6i6L2mIiwKCQkiZW5naW5lTm8iOiAiIiwKCQkiaW5zcGVjdGlvbk51bSI6ICIiLAoJCSJtYWNoaW5lQ29kZSI6ICIiLAoJCSJidXNpbmVzc1VuaXRQaG9uZSI6ICIiLAoJCSJzZWxsZXJQaG9uZSI6ICIxNTkxMDA4NDM4NCIsCgkJInplcm9UYXhSYXRlU2lnbiI6ICIiLAoJCSJpbnZvaWNlQ29kZSI6ICIwMzcwMDIxMDA0MTciLAoJCSJjZXJ0aWZpY2F0ZU5vIjogIiIsCgkJInB1cmNoYXNlck5hbWUiOiAiIiwKCQkiY2hlY2tDb2RlIjogIiIsCgkJImJpbGxpbmdEYXRlIjogIjIwMjMtMDMtMTciLAoJCSJ0b3RhbEFtb3VudCI6ICIiLAoJCSJ2ZWhpY2xlTm8iOiAiTFNHVUE4Mkw3TUcwODM4NzAiLAoJCSJzYWxlc0FkZHJlc3NQaG9uZSI6ICIiLAoJCSJidXllclBob25lIjogIjE1Njg4ODg1MjA1IiwKCQkic2FsZXNOYW1lIjogIiIsCgkJInB1cmNoYXNlclRheE5vIjogIiIsCgkJInNlbGxlclVuaXRDb2RlT3JJZE5vIjogIjkxNTMwMTAyTUE3SzcyWVQ1QyIsCgkJImNhcnJpZXJUYXhObyI6ICIiLAoJCSJ0YXhBdXRob3JpdHlOYW1lIjogIiIsCgkJImluc3BlY3Rpb25MaXN0Tm8iOiAiIiwKCQkiYW1vdW50VGF4IjogIiIsCgkJIm9yaWdpblBsYWNlIjogIiIsCgkJImNlcnRpZmljYXRlIjogIiIsCgkJImJ1eWVySUROdW0iOiAiIiwKCQkicGF5bWVudFZvdWNoZXJObyI6ICIiLAoJCSJsZW1vbk1hcmtldEFkZHJlc3MiOiAi5bGx5Lic55yB5rWO5Y2X5biC5rWO5YyX5byA5Y+R5Yy65Lit5bCP5LyB5Lia5a215YyW5ZutIiwKCQkiZmFjdG9yeU1vZGVsIjogIuWIq+WFi+eJjFNHTTY1MjFVQkExIiwKCQkiYnV5ZXJVbml0T3JJbmRpdmlkdWFsIjogIua1juWNl+WMl+aegeaYn+axvei9puacjeWKoeaciemZkOWFrOWPuCIsCgkJImludm9pY2VOdW1iZXIiOiAiMDAzMjc5NjIiLAoJCSJ0b2xsU2lnbiI6ICIwNyIsCgkJInRheEJ1cmVhdUNvZGUiOiAiIiwKCQkidG9ubmFnZSI6ICIiLAoJCSJ0YXhBdXRob3JpdHlObyI6ICIiLAoJCSJjb21wYW55IjogIkJJR0IiLAoJCSJsZW1vbk1hcmtldFBob25lIjogIjEzODU0MTkzMDI1IiwKCQkicHVyY2hhc2VyQmFuayI6ICIiLAoJCSJhZG1pbmlzdHJhdGl2ZURpdmlzaW9uTmFtZSI6ICIiLAoJCSJwYXNzZW5nZXJzTGltaXRlZCI6ICIiLAoJCSJidXllclVuaXRPckluZGl2aWR1YWxBZGRyZXNzIjogIuWxseS4nOecgea1juWNl+W4guWkqeahpeWMuuWMl+WFs+WMl+i3rzblj7fmuZblhYnlsbHoibLlrrblm600LTMtMTAyIiwKCQkiaW52b2ljZUxpbmVMaXN0IjogW3sKCQkJInVuaXRQcmljZSI6ICIiLAoJCQkicm93Tm8iOiAiMSIsCgkJCSJhbW91bnQiOiAiIiwKCQkJInNwZWNpZmljYXRpb25Nb2RlbCI6ICIiLAoJCQkicXVhbnRpdHkiOiAiIiwKCQkJInRheCI6ICIiLAoJCQkidHlwZSI6ICIiLAoJCQkidW5pdCI6ICIiLAoJCQkibGljZW5zZVBsYXRlTnVtIjogIiIsCgkJCSJjdXJyZW50RGF0ZUVuZCI6ICIiLAoJCQkiY29tbW9kaXR5Q29kZSI6ICIiLAoJCQkiY3VycmVudERhdGVTdGFydCI6ICIiLAoJCQkiY29tbW9kaXR5TmFtZSI6ICIiCgkJfV0sCgkJImxlbW9uTWFya2V0QmFua0FuZEFjY291bnQiOiAi5Lit5Zu96ZO26KGM5rWO6Ziz5pSv6KGM6JCl5Lia6YOoMjMyNTQwNzQ2NjQ5IiwKCQkic2FsZXNUYXhObyI6ICIiLAoJCSJzZWxsZXJVbml0T3JJbmRpdmlkdWFsQWRkcmVzcyI6ICLkupHljZfnnIHmmIbmmI7luILkupTljY7ljLrpu5Hmnpfpk7rooZfpgZPlip7kuovlpITkurrmsJHopb/ot683MjDlj7dN5qCLTS0xMOWPtyIsCgkJImJ1c2luZXNzVW5pdEJhbmtBbmRBY2NvdW50IjogIiIsCgkJInZlaGljbGVBZG1pbk9mZmljZSI6ICLmtY7ljZfluIIiLAoJCSJhbW91bnRUYXhDTiI6ICIiLAoJCSJyZWdpc3RyYXRpb25ObyI6ICIzNzAwMzc1ODUzNTciLAoJCSJwcm9kdWN0UGxhY2UiOiAiIiwKCQkicmVtYXJrcyI6ICIiLAoJCSJ0YXhCdXJlYXVOYW1lIjogIiIKCX0sCgkibWVzc2FnZSI6ICJzdWNjZXNzIgp9";
            String result = Base64Encoding.decodeToString(base64);

            checkInvoiceResult = JSONObject.parseObject(result);

            R data = new R(1000, "default success");
            data.put("message", "success");
            data.put("data", checkInvoiceResult);

            try {
                DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                requestRecordService.saveSuccessfulRequestRecord(singleInvoiceCheckRecord, JSONObject.toJSONString(data));
            } catch (Exception e) {
                log.error("发票查验接口记录保存失败，errormsg:{}",e);

            }

            return ResponseEntity.ok(JSONObject.toJSONString(data));
        }

        InvoiceUtil iu = new InvoiceUtil(pramsMap.get("invoiceCode"));
        String fplxdm = iu.getFplxdm();
        if (fplxdm != null || "10107".equals(pramsMap.get("invoiceType")) || "10108".equals(pramsMap.get("invoiceType")) || pramsMap.get("invoiceCode").startsWith("50000")) {
            //查验类发票,执行查验操作后入库
            log.info("查验类发票,执行查验操作后入库");
            //权限校验
            if (StringUtils.isBlank(pramsMap.get("invoiceNumber"))) {

                try {
                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                    requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,JSONObject.toJSONString(R.error("发票号码不能为空！")), "发票号码不能为空！");
                } catch (Exception e) {
                    log.error("发票查验接口记录保存失败，errormsg:{}",e);
                }

                return ResponseEntity.ok(JSONObject.toJSONString(R.error("发票号码不能为空！")));
            }

            pramsMap.put("invoiceNo", pramsMap.get("invoiceNumber"));

            if (StringUtils.isNotBlank(pramsMap.get("billingDate"))) {
                String billingDate = pramsMap.get("billingDate").replaceAll("-", "");
                iu.setKprq(pramsMap.get("billingDate"));
                pramsMap.put("invoiceDate", billingDate);
                pramsMap.put("billingDate", billingDate);
            } else {

                try {
                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                    requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,
                            JSONObject.toJSONString(R.error("开票日期不能为空！")), "开票日期不能为空！");
                } catch (Exception e) {
                    log.error("发票查验接口记录保存失败，errormsg:{}",e);
                }

                return ResponseEntity.ok(JSONObject.toJSONString(R.error("开票日期不能为空！")));
            }

            if (StringUtils.isBlank(pramsMap.get("invoiceType"))) {

                try {
                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                    requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,
                            JSONObject.toJSONString(R.error("发票类型不能为空！")), "发票类型不能为空！");
                } catch (BaseException e) {
                    log.error("发票查验接口记录保存失败，errormsg:{}",e);
                }

                return ResponseEntity.ok(JSONObject.toJSONString(R.error("发票类型不能为空！")));
            }

            if (SNFplxEnum.ZP.getSnFplxDm().equals(pramsMap.get("invoiceType"))
                    || SNFplxEnum.JDC.getSnFplxDm().equals(pramsMap.get("invoiceType"))
                    || SNFplxEnum.DZZP.getSnFplxDm().equals(pramsMap.get("invoiceType"))
                    || SNFplxEnum.ESC.getSnFplxDm().equals(pramsMap.get("invoiceType"))
                    || SNFplxEnum.QDZP.getSnFplxDm().equals(pramsMap.get("invoiceType"))
                    || SNFplxEnum.QDPP.getSnFplxDm().equals(pramsMap.get("invoiceType"))) {
                if (StringUtils.isBlank(pramsMap.get("totalAmount"))) {

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,
                                JSONObject.toJSONString(R.error("金额不能为空！")), "金额不能为空！");
                    } catch (Exception e) {
                        log.error("发票查验接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(R.error("金额不能为空！")));
                }
            } else {
                if (StringUtils.isBlank(pramsMap.get("checkCode"))) {

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,
                                JSONObject.toJSONString(R.error("校验码不能为空！")), "校验码不能为空！");
                    } catch (Exception e) {
                        log.error("发票查验接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(R.error("校验码不能为空！")));
                }
            }

            if ("10107".equals(pramsMap.get("invoiceType")) || "10108".equals(pramsMap.get("invoiceType"))) {
                pramsMap.put("invoiceType", "21");
            }

            log.info("发票类型为:{}", pramsMap.get("invoiceType"));

            String uuid = (StringUtils.isBlank(pramsMap.get("invoiceCode")) ? "" : pramsMap.get("invoiceCode")) + pramsMap.get("invoiceNo");
            log.info("uuid={}", uuid);
            String notes = invoiceQueryService.checkingInvoiceInfo("business", uuid, getUserInfo());
            if (notes != null) {

                try {
                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                    requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,
                            JSONObject.toJSONString(R.error(notes)), notes);
                } catch (Exception e) {
                    log.error("发票查验接口记录保存失败，errormsg:{}",e);
                }

                return ResponseEntity.ok(JSONObject.toJSONString(R.error(notes)));
            }

            //非通行费类发票 先判断底账库中是否已存在
            if (!"32000".equals(pramsMap.get("invoiceType"))) {
                //查询底账库是否有对应发票，有则直接返回
                QueryWrapper<BaseTDxRecordInvoice> recordWrapper = new QueryWrapper<>();
                recordWrapper.eq("uuid", uuid);
                BaseTDxRecordInvoice checkInvoiceByUuid = baseTDxRecordInvoiceDao.selectOne(recordWrapper);
                if (checkInvoiceByUuid != null) {
                    log.info("进项票池已存在发票.直接返回票池信息");
                    R data = new R(1000, "default success");
                    String invoiceNo = checkInvoiceByUuid.getInvoiceNo();
                    QueryWrapper<BaseTDxRecordInvoiceDetail> detailWrapper = new QueryWrapper<>();
                    detailWrapper.eq("uuid", uuid);
                    DynamicContextHolder.push("business" + DbConstant.DETAIL_READ);
                    List<BaseTDxRecordInvoiceDetail> baseTDxRecordInvoiceDetail = baseTDxRecordInvoiceDetailDao.selectList(detailWrapper);
                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_READ);

                    if(baseTDxRecordInvoiceDetail == null || baseTDxRecordInvoiceDetail.size() == 0){
                        checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap,null);

                        List<String> activeCallRequest = new ArrayList<>();
                        activeCallRequest.add(JSONObject.toJSONString(pramsMap));
                        activeCallRequest.add(JSONObject.toJSONString(null));
                        singleInvoiceCheckRecord.setActiveCallRequestDetail(JSONObject.toJSONString(activeCallRequest));
                        singleInvoiceCheckRecord.setActiveCall("singleCheckInvoice");
                        singleInvoiceCheckRecord.setActiveCallResponse(JSONObject.toJSONString(checkInvoiceResult));

                        if (!checkInvoiceResult.containsKey("code")) {
                            if (!checkInvoiceResult.containsKey("cyjg")) {
                                //先删除原有主数据,再查验更新主数据和明细数据
                                int delete = baseTDxRecordInvoiceDao.delete(recordWrapper);
                                if(delete > 0) {
                                    checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber"));
                                    signSaveInvoiceInfoService.saveQueryInvoiceResult(checkInvoiceResult, userid, "1", dbName);

                                    DynamicContextHolder.push("business" + DbConstant.DETAIL_READ);
                                    baseTDxRecordInvoiceDetail = baseTDxRecordInvoiceDetailDao.selectList(detailWrapper);
                                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_READ);
                                }
                            }else if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
                                data = errorInfo(checkInvoiceResult, data);

                                try {
                                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                                    requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord, 0,JSONObject.toJSONString(data),
                                            (String) checkInvoiceResult.get("cyjgxx"));
                                } catch (Exception e) {
                                    log.error("发票查验接口记录保存失败，errormsg:{}",e);
                                }

                                return ResponseEntity.ok(JSONObject.toJSONString(data));

                            }
                        }
                    }
                    JSONObject checkInvoice = (JSONObject) JSONObject.toJSON(checkInvoiceByUuid);
                    JSONArray checkInvoiceDetail = (JSONArray) JSONObject.toJSON(baseTDxRecordInvoiceDetail);

                    convertToResult(checkInvoice, checkInvoiceDetail);

                    data.put("data", checkInvoice);
                    //查验结果保存
//                saveCheckLog(pramsMap, checkInvoice);

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        if (checkInvoiceResult != null) {
                            if (checkInvoiceResult.containsKey("code")) {
                                requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord, 0,JSONObject.toJSONString(data),
                                        (String) checkInvoiceResult.get("message"));
                            }
                        } else {
                            requestRecordService.saveSuccessfulRequestRecord(singleInvoiceCheckRecord,JSONObject.toJSONString(data));
                        }
                    } catch (Exception e) {
                        log.error("发票查验接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(data));
                } else {
                    TdxSaleRecordInvoice tdxSaleRecordInvoice = tdxSaleRecordInvoiceDao.selectByUuid(uuid);
                    log.info("tdxSaleRecordInvoice={}", tdxSaleRecordInvoice);
                    if (tdxSaleRecordInvoice != null) {
                        log.info("销项票池已存在发票.直接返回票池信息");
                        R data = new R(1000, "default success");

                        String invoiceNo = tdxSaleRecordInvoice.getInvoiceNo();
                        QueryWrapper<RecordInvoiceSaleDetailModel> saleDetailWrapper = new QueryWrapper<>();
                        saleDetailWrapper.eq("invoice_no", invoiceNo);
                        DynamicContextHolder.push(DbConstant.DETAIL_READ);
                        List<RecordInvoiceSaleDetailModel> recordInvoiceSaleDetailModel = invoiceDownDetaiSaleInsertDao.selectList(saleDetailWrapper);

                        DynamicContextHolder.push(DbConstant.BUSINESS_READ);

                        JSONObject checkInvoice = (JSONObject) JSONObject.toJSON(tdxSaleRecordInvoice);
                        JSONArray saleDetail = (JSONArray) JSONObject.toJSON(recordInvoiceSaleDetailModel);
                        convertToResult(checkInvoice, saleDetail);

                        data.put("data", checkInvoice);
                        //查验结果保存
//                    saveCheckLog(pramsMap,checkInvoice);

                        try {
                            DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                            requestRecordService.saveSuccessfulRequestRecord(singleInvoiceCheckRecord, JSONObject.toJSONString(data));
                        } catch (Exception e) {
                            log.error("发票查验接口记录保存失败，errormsg:{}",e);
                        }

                        return ResponseEntity.ok(JSONObject.toJSONString(data));
                    }
                }
            }

            try {
            checkInvoiceResult = snPushCheckRecordService.singleCheckInvoice(pramsMap,"1");

            List<String> activeCallRequest = new ArrayList<>();
            activeCallRequest.add(JSONObject.toJSONString(pramsMap));
            activeCallRequest.add(JSONObject.toJSONString("1"));
            singleInvoiceCheckRecord.setActiveCallRequestDetail(JSONObject.toJSONString(activeCallRequest));
            singleInvoiceCheckRecord.setActiveCall("singleCheckInvoice");
            singleInvoiceCheckRecord.setActiveCallResponse(JSONObject.toJSONString(checkInvoiceResult));

            log.info("查验结果为:{}", checkInvoiceResult);
            } catch (Exception e) {
                e.printStackTrace();
                log.error("查验失败，errormsg:{}",e.getMessage());

                try {
                    DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                    requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,1,JSONObject.toJSONString(R.error("查验失败，"+e.getMessage())),
                            "查验失败,异常信息:{}"+JSONObject.toJSONString(e.getMessage()));
                } catch (Exception exception) {
                    log.error("发票查验接口记录保存失败，errormsg:{}",e);
                }

                return ResponseEntity.ok(JSONObject.toJSONString(R.error("查验失败，"+e.getMessage())));
            }

            if (!checkInvoiceResult.containsKey("code")) {

                if (checkInvoiceResult.containsKey("cyjg") && !"0001".equals(checkInvoiceResult.getString("cyjg"))) {
                    R data = new R();
                    data = errorInfo(checkInvoiceResult, data);

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord, 0,JSONObject.toJSONString(data),
                                (String) checkInvoiceResult.get("cyjgxx"));
                    } catch (Exception e) {
                        log.error("发票查验接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(data));

                }

                R data = new R(1000, "default success");
                data.put("message", "success");

                if (!checkInvoiceResult.containsKey("cyjg")) {

                    checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber"));
                    log.info("返回给影像系统的结果为:{}", checkInvoiceResult);
                    signSaveInvoiceInfoService.saveQueryInvoiceResult(checkInvoiceResult, userid, "1", dbName);

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveSuccessfulRequestRecord(singleInvoiceCheckRecord,JSONObject.toJSONString(data));
                    } catch (Exception e) {
                        log.error("发票查验接口记录保存失败，errormsg:{}",e);
                    }
                }

                Object o = checkInvoiceResult.get("invoiceLineList");
                JSONArray jsonArray = JSONObject.parseArray(JSONObject.toJSONString(o));
                for (Object object : jsonArray) {
                    Map map = JSONObject.parseObject(JSONObject.toJSONString(object), Map.class);
                    String taxRate = (String) map.get("taxRate");
                    if ("0".equals(taxRate) || "*".equals(taxRate) || "**".equals(taxRate) || "***".equals(taxRate) || "不征税".equals(taxRate) || "免税".equals(taxRate)) {
                        map.put("taxRate","0.00");
                    }
                }
                data.put("data", checkInvoiceResult);

                return ResponseEntity.ok(JSONObject.toJSONString(data));
            }
        } else {
            //其他类发票，直接入库
            R data = new R(1000, "default success");
            if(!checkInvoiceResult.isEmpty()) {
                log.info("其他类发票，不做查验,直接入库");
                DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                data.put("message", "success");

                checkInvoiceResult.put("invoiceNo", checkInvoiceResult.getString("invoiceNumber"));
                checkInvoiceResult.put("message", "入库成功");
                log.info("返回给影像系统的结果为:{}", checkInvoiceResult);

                data.put("data", checkInvoiceResult);
            }else{
                data.put("message", "error 其他类发票不支持查验");
            }

            try {
                DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                requestRecordService.saveSuccessfulRequestRecord(singleInvoiceCheckRecord,JSONObject.toJSONString(data));
            } catch (Exception e) {
                log.error("发票查验接口记录保存失败，errormsg:{}",e);
            }

            return ResponseEntity.ok(JSONObject.toJSONString(data));

        }

        try {
            DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
            requestRecordService.saveFailedRequestRecord(singleInvoiceCheckRecord,0,JSONObject.toJSONString(R.error().put("data", checkInvoiceResult)),
                    "未知异常，请联系管理员");
        } catch (Exception e) {
            log.error("发票查验接口记录保存失败，errormsg:{}",e);
        }

        return ResponseEntity.ok(JSONObject.toJSONString(R.error().put("data", checkInvoiceResult)));
    }

    @Async
    void saveCheckLog(Map<String, String> pramsMap, JSONObject checkInvoice) {
        TdxPlatformCheckLog checkLog = new TdxPlatformCheckLog();
        checkLog.setCreateDate(new Date());
        checkLog.setInvoiceNo(pramsMap.get("invoiceNo"));
        checkLog.setInvoiceCode(pramsMap.get("invoiceCode"));
        checkLog.setCheckType("1");
        //将参数转化为json字符串
        String params = JSONObject.toJSONString(pramsMap);
        //将json字符串转化为base64格式
        String paramsEncode = Base64.encode(params.getBytes());
        checkLog.setRequesPrams(paramsEncode);

        String returnResult = checkInvoice.toJSONString();
        String returnResultEncode = Base64.encode(returnResult.getBytes());
        checkLog.setReturnResult(returnResultEncode);
        //结果入库
        platfromCheckLogService.save(checkLog);
    }

    private R errorInfo(JSONObject checkInvoiceResult, R data) {
        if ("0002".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1002, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("0005".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1003, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("0006".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1004, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("0009".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1005, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1004".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1006, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1005".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1007, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1006".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1008, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1008".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1009, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1009".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1010, checkInvoiceResult.getString("cyjgxx"));
        }


        if ("1010".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1011, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1014".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1012, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1015".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1013, checkInvoiceResult.getString("cyjgxx"));
        }

        if ("1020".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1014, checkInvoiceResult.getString("cyjgxx"));
        }
        if ("1021".equals(checkInvoiceResult.getString("cyjg"))) {
            data = new R(1015, checkInvoiceResult.getString("cyjgxx"));
        }
        return data;
    }

    private void convertToResult(JSONObject checkInvoice, JSONArray detailArray) throws ParseException {
        checkInvoice.put("totalTax", checkInvoice.getString("taxAmount"));
        checkInvoice.put("amountTax", checkInvoice.getString("totalAmount"));
        checkInvoice.put("totalAmount", checkInvoice.getString("invoiceAmount"));
        //添加非空判断
        String invoiceCode = null;
        if (checkInvoice.get("invoiceCode") != null) {
            invoiceCode = checkInvoice.get("invoiceCode").toString();
        }
        String invoiceType = checkInvoice.get("invoiceType").toString();
        if ("22".equals(invoiceType)) {
            invoiceType = "33";
        }
        if ("21".equals(invoiceType)) {
            invoiceType = "31";
        }

        checkInvoice.put("invoiceType", invoiceType);
        checkInvoice.put("administrativeDivisionNo", "");
        checkInvoice.put("administrativeDivisionName", "");

        if ("31".equals(invoiceType) || "32".equals(invoiceType) || "185".equals(invoiceType) || "186".equals(invoiceType)) {
            checkInvoice.put("invoiceCode", "");
            checkInvoice.put("invoiceNumber", invoiceCode == null ? checkInvoice.get("invoiceNo").toString() : invoiceCode + checkInvoice.get("invoiceNo").toString());
        } else {
            checkInvoice.put("invoiceCode", invoiceCode);
            checkInvoice.put("invoiceNumber", checkInvoice.get("invoiceNo").toString());
        }
        String uuid = "";
        if (invoiceCode != null && StringUtils.isNoneBlank(invoiceCode)) {
            uuid = invoiceCode + checkInvoice.get("invoiceNo").toString();
            checkInvoice.put("uuid", uuid);
        } else {
            uuid = checkInvoice.get("invoiceNo").toString();
            checkInvoice.put("uuid", uuid);
        }


        String kprq = checkInvoice.get("invoiceDate").toString();
        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
        Date date = sdf.parse(kprq);
        String formatStr = new SimpleDateFormat("yyyy-MM-dd").format(date);
        log.info("开票日期为:{} ", formatStr);

        checkInvoice.put("billingDate", formatStr);
        checkInvoice.put("purchaserName", checkInvoice.get("gfName"));
        checkInvoice.put("purchaserTaxNo", checkInvoice.get("gfTaxNo"));
        checkInvoice.put("purchaserBank", checkInvoice.get("gfBankAndNo"));
        checkInvoice.put("purchaserAddressPhone", checkInvoice.get("gfAddressAndPhone"));
        checkInvoice.put("salesName", checkInvoice.get("xfName"));
        checkInvoice.put("salesTaxNo", checkInvoice.get("xfTaxNo"));
        checkInvoice.put("salesAddressPhone", checkInvoice.get("gfAddressAndPhone"));
        checkInvoice.put("salesBank", checkInvoice.get("gfBankAndNo"));
        checkInvoice.put("checkCode", checkInvoice.get("checkCode"));
        checkInvoice.put("state", "0");
        checkInvoice.put("tollSign", "07");
        String taxRate = "";

        List<Map<String, String>> returnDetailList = new ArrayList<>();
        JSONArray detailList = detailArray;

        for (int i = 0; i < detailList.size(); i++) {
            String taxRateDetail = "";
            JSONObject detail = (JSONObject) detailList.get(i);
            if(StringUtils.isNotEmpty(detail.getString("goodsName")) && (detail.getString("goodsName").equals("（详见销货清单）") || detail.getString("goodsName").equals("(详见销货清单)"))){
                continue;
            }
            Map<String, String> snDetailMap = new HashMap<String, String>();
            snDetailMap.put("rowNo", i + 1 + "");
            snDetailMap.put("commodityCode", detail.getString("goodsNum"));
            snDetailMap.put("commodityName", detail.getString("goodsName"));
            snDetailMap.put("specificationModel", detail.getString("model"));
            snDetailMap.put("unit", detail.getString("unit"));
            String quantity = detail.getString("num");
            snDetailMap.put("quantity", quantity);

            String unitPrice = detail.getString("unitPrice");
            snDetailMap.put("unitPrice", unitPrice);

            if ("11".equals(invoiceType)) {
                snDetailMap.put("tax", "0");

                //如果是卷票计算合计金额
                String hjje = null;
                if (detail.getString("detailAmount") != null && detail.getString("taxAmount") != null) {
                    BigDecimal je = new BigDecimal(detail.getString("detailAmount"));
                    if (detail.getString("taxAmount") != null) {
                        hjje = je.add(new BigDecimal(detail.getString("taxAmount"))).toPlainString();
                    } else {
                        hjje = je.toPlainString();
                    }
                }

                if (StringUtils.isNotBlank(hjje))
                    snDetailMap.put("amount", hjje);

            } else {
                snDetailMap.put("tax", "***".equals(detail.getString("taxAmount")) ? "0.00" : detail.getString("taxAmount"));
                snDetailMap.put("amount", detail.getString("detailAmount"));
            }

            if ("免税".equals(detail.getString("taxRate")) || "不征税".equals(detail.getString("taxRate")) || "***".equals(detail.getString("taxRate"))) {
                taxRateDetail = "0";
                snDetailMap.put("taxRate", taxRateDetail);
            } else {
                if (detail.get("taxRate") != null && StringUtils.isNoneBlank(detail.get("taxRate").toString())) {
                    try {
                        taxRateDetail = detail.get("taxRate").toString();
                        if (!"0".equals(taxRateDetail)) {
                            if (StringUtils.isNoneBlank(taxRateDetail)) {
                                if (taxRateDetail.contains("%")) {
                                    taxRateDetail = taxRateDetail.replace("%","");
                                }
                                BigDecimal tax = new BigDecimal(taxRateDetail);
                                BigDecimal tax1 = tax.divide(new BigDecimal("100"));
                                if (tax.compareTo(new BigDecimal("0.99")) < 1) {
                                    taxRateDetail = tax.toPlainString();
                                }else {
                                    taxRateDetail = tax1.toPlainString();
                                }
                            }
                        }
                    }catch (Exception e){
                        log.error("报错的原因为:{}",e);
                        taxRateDetail = "0.00";
                    }

                    if ("11".equals(invoiceType)) {
                        taxRateDetail = "0.000";
                    }
                    log.info("明细-发票税率为:{}", taxRateDetail);
                    snDetailMap.put("taxRate", taxRateDetail);
                }
            }

            log.info("明细-tax={}", detail.get("taxAmount"));
            snDetailMap.put("currentDateEnd", detail.getString("txrqz"));
            snDetailMap.put("currentDateStart", detail.getString("txrqq"));
            snDetailMap.put("licensePlateNum", detail.getString("cph"));
            snDetailMap.put("type", detail.getString("lx"));

            returnDetailList.add(snDetailMap);
        }

        checkInvoice.put("invoiceLineList", returnDetailList);
    }

    /**
     * 查验发票
     */
    @PostMapping("/syncInvoiceInfo")
    @ResponseBody
    @SysLog("同步发票信息")
    public ResponseEntity<String> syncInvoiceInfo(@RequestBody SNRequestObject snRequestObject) {

        log.info("影像系统同步数据:{}", JSONObject.toJSONString(snRequestObject));

        List<String> invoiceCodes = new ArrayList<>();
        List<String> invoiceNos = new ArrayList<>();
        RequestRecord record=null;
        if (snRequestObject.getInvoiceInfoList()!=null && snRequestObject.getInvoiceInfoList().size()>0) {
            snRequestObject.getInvoiceInfoList().stream().forEach(invoiceInfo->{
                invoiceCodes.add(invoiceInfo.getInvoiceCode());
                invoiceNos.add(invoiceInfo.getInvoiceNumber());
            });
            log.info("影像系统同步数据的发票号码为:{}", JSONObject.toJSONString(invoiceNos));
            log.info("影像系统同步数据的发票代码为:{}", JSONObject.toJSONString(invoiceCodes));
            if (invoiceCodes.size()>0) {
                record = requestRecordService.getBaseRequestRecord(JSONObject.toJSONString(snRequestObject),
                        "/syncInvoiceInfo",
                        JSONObject.toJSONString(invoiceCodes),
                        JSONObject.toJSONString(invoiceNos),
                        "syncInvoiceInfo");
            } else {
                record = requestRecordService.getBaseRequestRecord(JSONObject.toJSONString(snRequestObject),
                        "/syncInvoiceInfo",
                        JSONObject.toJSONString(invoiceNos),
                        "syncInvoiceInfo");
            }
        } else {
            record = requestRecordService.getBaseRequestRecord(JSONObject.toJSONString(snRequestObject),
                    "/syncInvoiceInfo",
                    "syncInvoiceInfo");
        }


        record.setImageId(snRequestObject.getImageId());

        String dbName = "business";
        // 入参统一在入口处理
        String orgCode = snRequestObject.getCompCode();
        DynamicContextHolder.push(DbConstant.BASICS_READ);
        SysDeptEntity orgByCompCode = sysDeptDao.getOrgByCompCode(orgCode);
        log.info("查询的组织信息为:{}", JSONObject.toJSONString(orgByCompCode));
        String company = "";
        String taxno = "";
        String taxname = "";
        if (orgByCompCode != null) {
            company = orgByCompCode.getCompany();
            taxno = orgByCompCode.getTaxno();
            taxname = orgByCompCode.getTaxname();
        }

        String result = "";

        try {

            List<SNInvoice> invoiceInfoList = snRequestObject.getInvoiceInfoList();

            String imageId = snRequestObject.getImageId();
            String compCode = snRequestObject.getCompCode();

            TDxInvoiceReimburse reimburse = new TDxInvoiceReimburse();
            reimburse.setImageId(imageId);
            reimburse.setCompCode(compCode);
            reimburse.setGfName(taxname);

            SNSAPObject object = new SNSAPObject();
            object.setSYSID("FPXT");
            object.setIFYWID("FI845");
            object.setBSKEY(UUID.randomUUID().toString().replace("-", ""));
            object.setSAPKEY("");
            object.setZORG(compCode);
            object.setZFILED1("");
            object.setZFILED2("");
            object.setZFILED3("");
            object.setZFILED4("");

            DynamicContextHolder.push(DbConstant.BASICS_READ);
            List<GsClient> gsClients = gsClientMapper.selectByGsdm(orgCode);
            if (gsClients != null && gsClients.size() > 0) {
                object.setZFILED5(gsClients.get(0).getClient());
            } else {
                object.setZFILED5(environment);
            }

            List<SAPInvoiceInfo> sapInvoiceInfos = new ArrayList<>();
            if (invoiceInfoList != null && invoiceInfoList.size() > 0) {
                for (SNInvoice invoice : invoiceInfoList) {
                    String fplxdm = "";
                    String snFplx = "";

                    result = snPushCheckRecordService.updateInvoicePoll(company, taxno, reimburse, invoice, fplxdm, imageId, compCode);

                    //价税分离判断
                    if (!"ok".equals(result) && !"0000".equals(result)) {
                        R data = new R(1000, "default success");
                        data.put("data", result);

                        try {
                            DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                            requestRecordService.saveFailedRequestRecord(record,0,  JSONObject.toJSONString(R.error(result)), result);
                        } catch (Exception e) {
                            log.error("发票同步接口记录保存失败，errormsg:{}",e);
                        }

                        return ResponseEntity.ok(JSONObject.toJSONString(R.error(result)));
                    }
                    SAPInvoiceInfo info = convertToSapOnject(invoice, imageId, compCode);
                    sapInvoiceInfos.add(info);
                }
                object.setZDATA(JSONObject.toJSONString(sapInvoiceInfos));

                //推送到SAP
                log.info("推送山能数据:{}", JSONObject.toJSONString(object));
                JSONObject request = new JSONObject();
                request.put("IS_INPUT", object);

                try {
                    List<String> requestList = new ArrayList<>();
                    requestList.add(request.toJSONString());
                    record.setActiveCallRequestDetail(JSONObject.toJSONString(requestList));
                    record.setActiveCall("pushCheckResultToSAP");
                    //将信息推送到影像系统
                    result = snPushCheckRecordService.pushCheckResultToSAP(request.toJSONString());

                    record.setActiveCallResponse(JSONObject.toJSONString(result));

                    R data = new R(1000, "default success");
                    data.put("data", result);

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveSuccessfulRequestRecord(record, JSONObject.toJSONString(data));
                    } catch (Exception e) {
                        log.error("发票同步接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(data));
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("", e);

//                    requestRecordService.saveRecord(pushCheckResultToSAPRecord,1, 1, JSONObject.toJSONString(R.error(CommonConstants.MSG_ERR_PUSH_SDNY)), 1);
                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveFailedRequestRecord(record,1, JSONObject.toJSONString(R.error(CommonConstants.MSG_ERR_PUSH_SDNY)),
                                "推送sap失败，失败原因："+"{"+JSONObject.toJSONString(e)+"}");
                    } catch (Exception exception) {
                        log.error("发票同步接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(R.error(CommonConstants.MSG_ERR_PUSH_SDNY)));
                }
            } else {
                DynamicContextHolder.push(dbName + DbConstant.BUSINESS_WRITE);
                //删除对应的影像号
                QueryWrapper<BaseTDxRecordInvoice> recordWrapper = new QueryWrapper<>();
                recordWrapper.eq("image_id", imageId);
//                BaseTDxRecordInvoice baseTDxRecordInvoice = baseTDxRecordInvoiceDao.selectOne(recordWrapper);
                List<BaseTDxRecordInvoice> baseTDxRecordInvoices = baseTDxRecordInvoiceDao.selectList(recordWrapper);
//                if(baseTDxRecordInvoice != null){
                if (baseTDxRecordInvoices != null && baseTDxRecordInvoices.size() > 0) {
                    log.info("TDxRecordInvoice表中匹配到数据");
                    BaseTDxRecordInvoice recordInvoice = new BaseTDxRecordInvoice();
                    recordInvoice.setImageId("");
                    recordInvoice.setCompCode("");
                    baseTDxRecordInvoiceDao.update(recordInvoice, recordWrapper);

                    R data = new R(1000, "default success");
                    data.put("data", "");

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveSuccessfulRequestRecord(record, JSONObject.toJSONString(data));
                    } catch (Exception e) {
                        log.error("发票同步接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(data));
                } else {
                    //删除对应的影像号
                    QueryWrapper<TDxInvoiceReimburse> reimburseWrapper = new QueryWrapper<>();
                    reimburseWrapper.eq("image_id", imageId);

//                    TDxInvoiceReimburse reimburse1 = mixedSignatureDao.selectOne(reimburseWrapper);
                    List<TDxInvoiceReimburse> tDxInvoiceReimburses = mixedSignatureDao.selectList(reimburseWrapper);
                    if (tDxInvoiceReimburses != null && tDxInvoiceReimburses.size() > 0) {
                        log.info("TDxInvoiceReimburse表中匹配到数据");
                        TDxInvoiceReimburse tDxInvoiceReimburse = new TDxInvoiceReimburse();
                        tDxInvoiceReimburse.setImageId("");
                        tDxInvoiceReimburse.setCompCode("");
                        mixedSignatureDao.update(tDxInvoiceReimburse, reimburseWrapper);
                    }
                    R data = new R(1000, "default success");
                    data.put("data", "");

                    try {
                        DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                        requestRecordService.saveSuccessfulRequestRecord(record, JSONObject.toJSONString(data));
                    } catch (Exception e) {
                        log.error("发票同步接口记录保存失败，errormsg:{}",e);
                    }

                    return ResponseEntity.ok(JSONObject.toJSONString(data));

                }
            }
        } catch (TimeoutException exception) {
            log.error("同步SAP失败,报错信息为:{}", exception);
            exception.printStackTrace();

            try {
                DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                requestRecordService.saveFailedRequestRecord(record,1,  JSONObject.toJSONString(R.error(CommonConstants.CONNECT_TIMEOUT)),
                        "同步SAP失败,报错信息为:"+"{"+JSONObject.toJSONString(exception)+"}");
            } catch (Exception e) {
                log.error("发票同步接口记录保存失败，errormsg:{}",e);
            }

            return ResponseEntity.ok(JSONObject.toJSONString(R.error(CommonConstants.CONNECT_TIMEOUT)));
        } catch(NullPointerException exception){
            log.error("同步SAP失败,报错信息为:{}", exception);
            exception.printStackTrace();

            try {
                DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                requestRecordService.saveFailedRequestRecord(record,1,  JSONObject.toJSONString(R.error(CommonConstants.NULL_POINTER_TIMEOUT)),
                        "同步SAP失败,报错信息为:"+"{"+JSONObject.toJSONString(exception)+"}");
            } catch (Exception e) {
                log.error("发票同步接口记录保存失败，errormsg:{}",e);
            }

            return ResponseEntity.ok(JSONObject.toJSONString(R.error(CommonConstants.NULL_POINTER_TIMEOUT)));
        } catch(Exception exception){
            log.error("同步SAP失败,报错信息为:{}", exception);
            exception.printStackTrace();

            try {
                DynamicContextHolder.push("business" + DbConstant.BUSINESS_WRITE);
                requestRecordService.saveFailedRequestRecord(record,1,  JSONObject.toJSONString(R.error(CommonConstants.MSG_ERR_DEFAULT)),
                        "同步SAP失败,报错信息为:"+"{"+JSONObject.toJSONString(exception)+"}");
            } catch (Exception e) {
                log.error("发票同步接口记录保存失败，errormsg:{}",e);
            }

            return ResponseEntity.ok(JSONObject.toJSONString(R.error(CommonConstants.MSG_ERR_DEFAULT)));
        }

    }


    /**
     * 查验发票
     */
    @PostMapping("/sn/signature")
    @ResponseBody
    @SysLog("获取接口签名值")
    public String signature(HttpServletRequest request, @RequestBody Map<String, String> paramMap) {
        String ip = paramMap.get("ip");
        String apiCode = paramMap.get("apiCode");
        String secretId = paramMap.get("secretId");
        String secretKey = paramMap.get("secretKey");
        String content = paramMap.get("content");
        String dataExchangeId = paramMap.get("dataExchangeId");

        TreeMap<String, String> sortMap = new TreeMap<>();
        sortMap.put("SecretId", secretId);
        sortMap.put("dataExchangeId", dataExchangeId);
        sortMap.put("encryptCode", "0");
        sortMap.put("zipCode", "0");
        sortMap.put("content", content);

        String reqUrl = request.getRequestURL().toString();
        if (reqUrl.contains(ConfigureConstant.STRING_WH)) {
            reqUrl = reqUrl.substring(ConfigureConstant.INT_0, reqUrl.indexOf(ConfigureConstant.STRING_WH));
        }
        //获取鉴权URL
        String signUrl = getAuthUrl(reqUrl, request.getMethod());
        String signature = HmacSHA1Util.genSign(signUrl, sortMap, secretKey);
        return signature;
    }

    private static String getAuthUrl(String reqUrl, String method) {
        if (reqUrl.split(ConfigureConstant.STRING_COLON).length > ConfigureConstant.INT_2) {
            String one = reqUrl.split(ConfigureConstant.STRING_COLON)[1];
            String two = reqUrl.split(ConfigureConstant.STRING_COLON)[2];
            //支持带端口数据的返回
            if (two.indexOf(ConfigureConstant.STRING_SLASH_LINE) > 0) {
                reqUrl = one.replaceAll("//", "") + ConfigureConstant.STRING_COLON + two;
            } else {
                reqUrl = one.replaceAll("//", "") + two.substring(two.indexOf(ConfigureConstant.STRING_SLASH_LINE));
            }
        } else if (reqUrl.split(ConfigureConstant.STRING_COLON).length == ConfigureConstant.INT_2) {
            String one = reqUrl.split(ConfigureConstant.STRING_COLON)[1];
            reqUrl = one.contains("//") ? one.replaceAll("//", "") : reqUrl;
        }
        return method + reqUrl + "?";
    }

    private SAPInvoiceInfo convertToSapOnject(SNInvoice snInvoice, String imageId, String compCode) {

        //转换时间格式
        Date date = new Date();
        SimpleDateFormat formatterTime = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat formatterDate = new SimpleDateFormat("yyyyMMddHHmmss");

        String timeString = formatterTime.format(date);
        String dateString = formatterDate.format(date);

        SAPInvoiceInfo info = new SAPInvoiceInfo();

        String snFplx = convertToSapType(snInvoice.getInvoiceType());
        info.setZBAZT("0");
        info.setZXFSH(snInvoice.getSalesTaxNo());
        info.setZFPSZD(snInvoice.getPlace());
        info.setZSPMC(snInvoice.getDraweeName());
        info.setZSPSBH(snInvoice.getDraweeTaxNo());
        info.setZCYJG(snInvoice.getCheckResultMessage());
        info.setZJKZM(snInvoice.getImportCertificateNo());
        info.setZDJZH(snInvoice.getCertificateNo());
        info.setZGFMC(snInvoice.getPurchaserName());
        info.setSORT(snInvoice.getSort());
        //机打代码
        info.setZJDDM(snInvoice.getMachineCode());
        if (snInvoice.getTotalAmount() != null) {
            BigDecimal total = new BigDecimal(snInvoice.getTotalAmount());
//            BigDecimal tax = new BigDecimal(snInvoice.getTotalTax());
//            BigDecimal subtract = total.subtract(tax);
            info.setZJK(total.toString());
        } else {
            info.setZJK("0.00");
        }
        info.setZSCSJ("000000");
        info.setZYSHW(snInvoice.getCargoInformation());
        info.setZFPLX(snFplx);
        info.setZQYD(snInvoice.getTransportRoute());
        info.setZCCRXM(snInvoice.getRiderName());
        if (snInvoice.getBillingDate() != null) {
            String billingDate = snInvoice.getBillingDate();
            String replace = billingDate.replace("-", "");
            info.setZKPRQ(replace);
        }

        info.setZSE(snInvoice.getTotalTax());
        info.setZTXBZ(snInvoice.getTollSign());
//        info.setZSKPH(snInvoice.getMachineCode());
        info.setZGFZH(snInvoice.getPurchaserBank());
        info.setZBZ(snInvoice.getRemarks());


        List<SNInvoiceDetail> invoiceLineList = snInvoice.getInvoiceLineList();
        List<SAPInvoiceDetail> sapInvoiceDetailList = new ArrayList<>();
        //查询明细
        String uuid = snInvoice.getInvoiceCode() + snInvoice.getInvoiceNumber();
        if (StringUtils.isBlank(snInvoice.getInvoiceCode())) {
            uuid = snInvoice.getInvoiceNumber();
        }
        DynamicContextHolder.push("business" + DbConstant.DETAIL_READ);
        List<InvoiceDetailInfo> detailInfo = mryxInterfaceService.getDetailInfo(uuid);

        if (invoiceLineList != null && invoiceLineList.size() > 0) {
            for (SNInvoiceDetail snInvoiceDetail : invoiceLineList) {
                SAPInvoiceDetail sapInvoiceDetail = new SAPInvoiceDetail();

                //设置id
                sapInvoiceDetail.setZHID(UUID.randomUUID().toString().replace("-", ""));
//            sapInvoiceDetail.setZZWDJ("");

                sapInvoiceDetail.setIMG_ID(imageId);
                sapInvoiceDetail.setZCPH(snInvoiceDetail.getLicensePlateNum());
//            sapInvoiceDetail.setZCJSJ();
//            sapInvoiceDetail.setZCJRQ();
                sapInvoiceDetail.setFPYXBH(snInvoice.getFileId());
                sapInvoiceDetail.setZCFZ(snInvoice.getStationGetOn());
                sapInvoiceDetail.setZTXZ(snInvoiceDetail.getCurrentDateEnd());
                sapInvoiceDetail.setZTXQ(snInvoiceDetail.getCurrentDateStart());

                if (snInvoiceDetail.getAmount() != null)
                    sapInvoiceDetail.setZJK(snInvoiceDetail.getAmount());
                    sapInvoiceDetail.setZHH(snInvoiceDetail.getRowNo());
                //将类似于0.03数据格式转化为3.00
                if (snInvoiceDetail.getTaxRate() != null && snInvoiceDetail.getTaxRate() != "") {
                    String taxRate = snInvoiceDetail.getTaxRate();
                    sapInvoiceDetail.setZTAX(taxRate);
                    if (taxRate.contains("%")){
                        taxRate = taxRate.replace("%","");
                    }
                    if ("0".equals(taxRate) || "*".equals(taxRate) || "**".equals(taxRate) || "***".equals(taxRate) || "不征税".equals(taxRate) || "免税".equals(taxRate)) {
                        sapInvoiceDetail.setZTAX("0.00");
                        sapInvoiceDetail.setZSM(getZSM(sapInvoiceDetail.getZTAX()));
                    } else {
                        //传给SAP税率为整数
                        BigDecimal tax = new BigDecimal(taxRate);
                        sapInvoiceDetail.setZSM(getZSM(tax.toString()));
                        BigDecimal tax1 = tax.multiply(new BigDecimal("100"));
                        sapInvoiceDetail.setZTAX(tax1.toString());
                        if (tax1.compareTo(new BigDecimal("99")) > 0) {
                            sapInvoiceDetail.setZTAX(taxRate);
                        }else {
                            DecimalFormat decimalFormat = new DecimalFormat("#.00");
                            String formattedDecimal = decimalFormat.format(tax1);
                            sapInvoiceDetail.setZTAX(formattedDecimal);
                        }
                    }
                }
//                if (invoiceLineList.size() == 1 && snInvoice.getTaxRate() == null) {
//                    info.setZTAX(sapInvoiceDetail.getZTAX());
//                }
//            sapInvoiceDetail.setZHBH("");
                sapInvoiceDetail.setZDJ(snInvoiceDetail.getUnitPrice());
//            sapInvoiceDetail.setZHID("");
                sapInvoiceDetail.setZDDZ(snInvoice.getStationGetOff());
                sapInvoiceDetail.setZHWMC(snInvoiceDetail.getCommodityName());
                sapInvoiceDetail.setZCYR(info.getZCYRMC());
                sapInvoiceDetail.setZDW(snInvoiceDetail.getUnit());
                sapInvoiceDetail.setZGSJBM(snInvoiceDetail.getCommodityCode());
                if (StringUtils.isNotBlank(snInvoiceDetail.getTax())) {

                    sapInvoiceDetail.setZSE(snInvoiceDetail.getTax());
                } else {
                    if (detailInfo != null && !detailInfo.isEmpty()) {
                        for (InvoiceDetailInfo invoiceDetailInfo : detailInfo) {
                            if (StringUtils.isNotBlank(invoiceDetailInfo.getDetailNo()) && invoiceDetailInfo.getDetailNo().equals(snInvoiceDetail.getRowNo())) {
                                sapInvoiceDetail.setZSE(invoiceDetailInfo.getTaxAmount());
                            }
                        }
                    }
                }
                sapInvoiceDetail.setZSL(snInvoiceDetail.getQuantity());

//                String zsmTax = snInvoiceDetail.getTaxRate();
//                if (zsmTax != null && zsmTax != "" && zsmTax.length() > 4) {
//                    zsmTax = zsmTax.substring(0, 4);
//                }
//                if (zsmTax != null && zsmTax.contains("%") && !zsmTax.contains(".")) {
//                    zsmTax = (new BigDecimal(zsmTax.replace("%", ""))).divide(new BigDecimal("100")).toString();
//                }
////                sapInvoiceDetail.setZSM(getZSM(snInvoiceDetail.getTaxRate()));
//                sapInvoiceDetail.setZSM(getZSM(zsmTax));
                sapInvoiceDetail.setZGGXH(snInvoiceDetail.getSpecificationModel());
                if (snInvoice.getInvoiceCode() != null) {
                    sapInvoiceDetail.setZTID(snInvoice.getInvoiceCode() + snInvoice.getInvoiceNumber() + snFplx);
                } else {
                    sapInvoiceDetail.setZTID(snInvoice.getInvoiceNumber() + snFplx);
                }
                sapInvoiceDetailList.add(sapInvoiceDetail);
            }
        }

        info.setIT_ITEM(sapInvoiceDetailList);

        //获取税率
        String taxRate = snInvoice.getTaxRate();
        if (taxRate != null && !taxRate.contains("%")) {
            BigDecimal bigDecimal = new BigDecimal(taxRate);
            BigDecimal multiply = bigDecimal.multiply(new BigDecimal("100"));
            info.setZTAX(multiply.toPlainString());
            info.setZSM(getZSM(taxRate));
        }
        if (taxRate != null && taxRate.contains("%")) {
            String replace = taxRate.replace("%", "");
            BigDecimal bigDecimal = new BigDecimal(replace);
            BigDecimal divide = bigDecimal.divide(new BigDecimal(100));
//            taxRate = divide.toString();
//            info.setZTAX(bigDecimal.multiply(new BigDecimal("0.01")).toString());
            info.setZTAX(replace + ".00");
            info.setZSM(getZSM(divide.toString()));
        }
        if (taxRate != null && taxRate.contains(".") && !taxRate.contains("%")) {

            BigDecimal tax = new BigDecimal(taxRate);
            info.setZSM(getZSM(tax.toPlainString()));
            BigDecimal tax1 = tax.multiply(new BigDecimal("100"));
            info.setZTAX(tax1.setScale(2,RoundingMode.FLOOR).toPlainString());

        }
        if (taxRate != null && "0".equals(taxRate)) {
            info.setZTAX("0.00");
            info.setZSM(getZSM(info.getZTAX()));
        }
        if (invoiceLineList == null || invoiceLineList.size() == 0) {
            if (info.getZTAX() == null || info.getZTAX() == "") {
                info.setZTAX("0.00");
                info.setZSM(getZSM(info.getZTAX()));
            }
        }

        info.setZFPDM(snInvoice.getInvoiceCode());
        info.setZCD(snInvoice.getOriginPlace());
        info.setZSCCZ(snInvoice.getStationGetOn());
        info.setZCC(snInvoice.getTrainNumber());
        info.setZFPHM(snInvoice.getInvoiceNumber());
        info.setZBXF(snInvoice.getInsurance());
        info.setZRYFJ(snInvoice.getFuelSurcharge());
        info.setZCLSB(snInvoice.getVehicleNo());
        info.setZKPSJ("000000");
        info.setZXCSJ("000000");
        info.setZXFMC(snInvoice.getSalesName());
        info.setZCYRSBH(snInvoice.getCarrierName());

        info.setIMG_ID(imageId);
        info.setZCPH(snInvoice.getLicensePlate());
        info.setZLSLBZ(snInvoice.getZeroTaxRateSign());
        info.setFPYXBH(snInvoice.getFileId());
        //转换日期
        info.setZCJSJ(dateString);
        info.setZFPZT(snInvoice.getState());
        if (snInvoice.getState() == null) {
            info.setZFPZT("0");
        } else {
            info.setZFPZT(snInvoice.getState());
        }
//        info.setZESCSC("");
        info.setZFDJM(snInvoice.getEngineNo());
        info.setZGXR("");

        //认证相关
        String zrzjg = getZRZJG(snInvoice.getInvoiceCode(), snInvoice.getInvoiceNumber(), info.getZFPLX());
        info.setZRZJG(zrzjg);
        info.setZRZSSQ("");
//        info.setZRZMS("");
//        info.setZRZRQ("");

        info.setZLC(snInvoice.getMileage());
        info.setZHGZH(snInvoice.getCertificateNo());
        info.setZXFDH(snInvoice.getSalesAddressPhone());

//        info.setZESCSH("");
        info.setZGSDM(compCode);
        info.setZGFSH(snInvoice.getPurchaserTaxNo());
        info.setZXCRS(snInvoice.getPassengersLimited());
        info.setZWSPZ(snInvoice.getPaymentVoucherNo());
        info.setZCCDW(snInvoice.getTonnage());
        info.setZSWJG(snInvoice.getTaxAuthorityName());
//        info.setZYWDJ("");
        info.setZXCCZ(snInvoice.getStationGetOff());
        info.setZCCRZH(snInvoice.getIdcardNo());
        info.setZCPXH(snInvoice.getBrandModel());
        info.setZMHFZJJ(snInvoice.getCaacDevelopmentFund());

        if (!"nullnull".equals(snInvoice.getPurchaserAddressPhone())) {
            info.setZGFDH(snInvoice.getPurchaserAddressPhone());
//            info.setZGFDH("");
        }
        info.setZXFZH(snInvoice.getSalesBank());
        info.setZJYM(snInvoice.getCheckCode());
        info.setZSJDH(snInvoice.getInspectionListNo());
//        info.setZYGC("");
        info.setZJSHJ(snInvoice.getAmountTax());
        if (snInvoice.getAmountTax() == null && ("17".equals(info.getZFPLX()) || "18".equals(info.getZFPLX()))) {
            info.setZJSHJ(snInvoice.getTotalAmount());

        }
        info.setZCYRMC(snInvoice.getCarrierName());
        info.setZJGDM(snInvoice.getTaxAuthorityNo());
        //时间转换
        info.setZGXSJ(dateString);
        info.setZPJZT("1");
        info.setZZWLX(snInvoice.getSeat());
        info.setZPJLY(snInvoice.getSource());
        if (snInvoice.getSource() == null) {
            info.setZPJLY("1");
        }

        if ("01".equals(snInvoice.getInvoiceType()) || "02".equals(snInvoice.getInvoiceType()) || "03".equals(snInvoice.getInvoiceType()) || "04".equals(snInvoice.getInvoiceType())
                || "08".equals(snInvoice.getInvoiceType()) || "10".equals(snInvoice.getInvoiceType()) || "11".equals(snInvoice.getInvoiceType()) || "14".equals(snInvoice.getInvoiceType())
                || "15".equals(snInvoice.getInvoiceType()) || "31".equals(snInvoice.getInvoiceType()) || "32".equals(snInvoice.getInvoiceType())) {
            //可查验发票,
            log.info("发票类型为:{}",snInvoice.getInvoiceType());
            //0608 区块链发票 并且 checkStatus = 3 的时候 提交sap状态为3（刘振和谈楚才提出需求）
            if("10".equals(snInvoice.getInvoiceType()) && "3".equals(snInvoice.getCheckStatus())){
                log.info("区块链发票 传输状态checkStatus = 3");
                info.setZCYZT("3");
            }else {
                info.setZCYZT("1");
            }
        } else {
            //不可查验发票
            info.setZCYZT("3");
        }
//        info.setZCYZT(snInvoice.getCheckStaus());
//        if (snInvoice.getCheckStaus() == null) {
//            info.setZCYZT("1");
//        }
        info.setZCJR("opentext");
        info.setZGXR("opentext");
        info.setZQM("opentext");
        if (snInvoice.getCheckDate() != null) {
            String checkDate = snInvoice.getCheckDate().replace("-", "");
            info.setZCYRQ(checkDate);
        }
        if (snInvoice.getInvoiceCode() != null) {
            info.setZTID(snInvoice.getInvoiceCode() + snInvoice.getInvoiceNumber() + snFplx);
        } else {
            info.setZTID(snInvoice.getInvoiceNumber() + snFplx);
        }
        return info;
    }

    private String convertToSapType(String invoiceType) {

        switch (invoiceType) {

            case "01":// 增值税专用发票
                invoiceType = "10";
                break;
            case "04":
                invoiceType = "11";
                break;
            case "10":
                invoiceType = "12";
                break;
            case "11":
                invoiceType = "13";
                break;
            case "03":
                invoiceType = "14";
                break;
            case "15":
                invoiceType = "15";
                break;
            case "95":
                invoiceType = "16";
                break;
            case "97":
                invoiceType = "17";
                break;
            case "91":
                invoiceType = "18";
                break;
            case "92":
                invoiceType = "19";
                break;
            case "89":
                invoiceType = "20";
                break;
            case "90":
                invoiceType = "21";
                break;
            case "101":
                invoiceType = "22";
                break;
            case "14":
                invoiceType = "24";
                break;
            case "08":
                invoiceType = "25";
                break;
            case "31":
                invoiceType = "26";
                break;
            case "32":
                invoiceType = "27";
                break;
            case "88":
                invoiceType = "28";
                break;
            default:
                invoiceType = "";
                break;

        }
        return invoiceType;

    }

    private String getZSM(String taxRate) {

        String sm = "";

        switch (taxRate) {
            // 发票采集
            case "0":
                sm = "J0";
                break;
            case "0.00":
                sm = "J0";
                break;
            case "0.000":
                sm = "J0";
                break;
            case "免税":
                sm = "J0";
                break;
            case "不征税":
                sm = "J0";
                break;
            case "0.16":
                sm = "J1";
                break;
            case "0.13":
                sm = "J2";
                break;
            case "0.10":
                sm = "J3";
                break;
            case "0.09":
                sm = "J4";
                break;
            case "0.06":
                sm = "J5";
                break;
            case "0.05":
                sm = "J6";
                break;
            case "0.03":
                sm = "J7";
                break;
            case "0.02":
                sm = "J8";
                break;
            case "0.01":
                sm = "J9";
                break;
            case "0.17":
                sm = "JC";
                break;
            case "16":
                sm = "J1";
                break;
            case "13":
                sm = "J2";
                break;
            case "10":
                sm = "J3";
                break;
            case "9":
                sm = "J4";
                break;
            case "6":
                sm = "J5";
                break;
            case "5":
                sm = "J6";
                break;
            case "3":
                sm = "J7";
                break;
            case "2":
                sm = "J8";
                break;
            case "1.5":
                sm = "JA";
                break;
            case "0.015":
                sm = "JA";
                break;
            case "1":
                sm = "J9";
                break;
            case "17":
                sm = "JC";
                break;
            default:
                sm = "";
                break;

        }
        return sm;
    }

    private String getZRZJG(String invoiceCode, String invoiceNo, String FPLX) {
        String ZCYJG = "";
        String uuid = invoiceCode + invoiceNo;
        DynamicContextHolder.push(DbConstant.BUSINESS_READ);

        //可价税分离票种
        //10：增值税专用发票
        //12：增值税电子普通发票
        //13：增值税普通发票(卷票)
        //14：机动车销售统一发票
        //15：二手车销售统一发票
        //24：增值税电子普通发票(通行费)
        //25：增值税电子专用发票
        //26：电子发票（增值税专用发票）
        //27：电子发票（普通发票）
        //22：过路费发票
        //11：增值税普通发票
        //16：定额发票
        //17：机打发票
        //18：出租车发票
        if ("10".equals(FPLX) || "12".equals(FPLX) || "13".equals(FPLX) || "14".equals(FPLX) || "15".equals(FPLX)
                || "24".equals(FPLX) || "25".equals(FPLX) || "26".equals(FPLX) || "27".equals(FPLX) || "22".equals(FPLX)
                || "11".equals(FPLX) || "16".equals(FPLX) || "17".equals(FPLX) || "18".equals(FPLX)) {
            QueryWrapper<TDxInvoiceReimburse> wrapper = new QueryWrapper();
            wrapper.eq("uuid", uuid);
            TDxInvoiceReimburse one = tDxInvoiceReimburseService.getOne(wrapper);
            if (one != null) {
                ZCYJG = one.getRzhYesorno();
            }


        } else {
            //19：火车票
            //20：客运汽车
            //21：航空运输电子客票行程单
            //28：船票
            //如果是可查验类型，直接更新数据库
            if ("19".equals(FPLX) || "20".equals(FPLX) || "21".equals(FPLX) || "28".equals(FPLX)) {
                //其他票种
                QueryWrapper<RecordInvoice> wrapper = new QueryWrapper();
                wrapper.eq("uuid", uuid);
                RecordInvoice recordInvoice = recordInvoiceDao.selectOne(wrapper);
                if (recordInvoice != null) {
                    ZCYJG = recordInvoice.getRzhYesorno();
                }

            } else {
                //海关缴款书
                QueryWrapper<TdxCustomsRecord> wrapper = new QueryWrapper();
                wrapper.eq("uuid", uuid);
                TdxCustomsRecord tdxCustomsRecord = customsRecordDao.selectOne(wrapper);
                if (tdxCustomsRecord != null) {
                    ZCYJG = tdxCustomsRecord.getRzhYesorno();
                }
            }

        }
        return ZCYJG;
    }

    public static void main(String[] args) {
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        String formattedDecimal = decimalFormat.format(new BigDecimal("15"));
        BigDecimal bigDecimal = new BigDecimal("0.13");
        boolean b = bigDecimal.compareTo(new BigDecimal("0.99")) < 1;
        System.out.println();
    }

}
