package org.jeecg.ctop.finance.settlement.service.serviceImpl;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.com.ctop.common.module.entity.UserAllocation;
import cn.com.ctop.common.module.mapper.MailLogMapper;
import cn.com.ctop.common.module.mapper.SysLogMapper;
import cn.com.ctop.common.module.mapper.SysRoleMapper;
import cn.com.ctop.common.module.mapper.SysUserMapper;
import cn.com.ctop.common.module.mapper.UserAllocationMapper;
import cn.com.ctop.common.module.utils.CorpWexinUtils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.entity.SysUser;
import org.jeecg.common.util.DateUtils;
import org.jeecg.ctop.finance.policy.entity.CwjsCompanySubject;
import org.jeecg.ctop.finance.policy.entity.CwjsPolicyApprovalLog;
import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
import org.jeecg.ctop.finance.policy.entity.CwjsPolicyProduct;
import org.jeecg.ctop.finance.policy.mapper.CwjsCompanySubjectMapper;
import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyApprovalLogMapper;
import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyInfoMapper;
import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyProductMapper;
import org.jeecg.ctop.finance.policy.service.ICreateSheetService;
import org.jeecg.ctop.finance.policy.service.impl.CwjsSaleAssistantInfoServiceImpl;
import org.jeecg.ctop.finance.policy.utils.Check;
import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSlettementReport;
import org.jeecg.ctop.finance.settlement.entity.vo.PolicyImportVo;
import org.jeecg.ctop.finance.settlement.entity.vo.ProfitReportBytedanceVo;
import org.jeecg.ctop.finance.settlement.entity.vo.ProfitReportKuaiShouVo;
import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportBytedanceVo;
import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportKuaiShouVo;
import org.jeecg.ctop.finance.settlement.mapper.CwjsProfitMapper;
import org.jeecg.ctop.finance.settlement.mapper.ReportSettlementMapper;
import org.jeecg.ctop.finance.settlement.service.IReportSettlementService;
import org.jeecg.ctop.finance.utils.SettlementUtil;
import org.jeecg.ctop.finance.utils.createExcelByTemplate;
import org.jeecg.modules.ctop.service.IMaterialReportOverViewService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;


@Slf4j
@Service
public class ReportSettlementServiceImpl implements IReportSettlementService {
    @Resource
    private ReportSettlementMapper reportSettlementMapper;
    @Resource
    private CorpWexinUtils corpWexinUtils;
    @Resource
    private MailLogMapper mailLogMapper;
    @Resource
    private CwjsProfitMapper cwjsProfitMapper;
    @Resource
    private UserAllocationMapper userAllocationMapper;
    @Resource
    private SysRoleMapper roleMapper;
    @Autowired
    private IMaterialReportOverViewService materialReportOverViewService;
    @Resource
    private SysLogMapper sysLogMapper;

    @Autowired
    private CwjsSaleAssistantInfoServiceImpl cwjsSaleAssistantInfoService;

    @Autowired
    private ICreateSheetService createSheetService;


    @Override
    public List<SettlementReportBytedanceVo> getAccountTransactionDayBytedance() {
        return reportSettlementMapper.getAccountTransactionDayBytedance(null);
    }

    @Override
    public Result settlementReportBytedance(SettlementFileParamsVo paramsVo, HttpServletResponse response, SysUser user) {
        try {
            //第一步创建workbook
            HSSFWorkbook wb = new HSSFWorkbook();

            //设置样式
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER);//水平居中

            //设置字体
            HSSFFont font = wb.createFont();
            font.setFontName("黑体");
            font.setFontHeightInPoints((short) 12);//设置字体大小
            style.setFont(font);

            HSSFDataFormat format = wb.createDataFormat();
            style.setDataFormat(format.getFormat("@"));


            //查询 账户id
            List<String> accountIdList = this.getAccountId(paramsVo, user);

            if (Check.isNull(accountIdList)) {
                return Result.errorMsg("该广告主和产品下无法查询到绑定的账户信息");
            }

            int num = 0;


            //设置第一个sheet页 汇总页
            createSheetService.createBytedance(wb, style, accountIdList, paramsVo.getStartTime(), paramsVo.getEndTime());


            for (int k = 0; k < accountIdList.size(); k++) {
                String accountId = accountIdList.get(k);
                paramsVo.setAccountId(accountId);

                //获取账户 日流水数据  根据账户id 和 年月 查询数据
                List<SettlementReportBytedanceVo> settlementList = reportSettlementMapper.getAccountTransactionDayBytedance(paramsVo);
                if (Check.isNull(settlementList)) {
                    num++;
                    continue;
                }

                //2：创建sheet 设置sheet名称
                HSSFSheet sheet = wb.createSheet(accountId);

                //画图的顶级管理器，一个sheet只能获取一个 (插入图片时 使用)
                HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

                //3：添加 第一行单元格
                HSSFRow row0 = sheet.createRow(0);
                HSSFCell cell0 = row0.createCell(0);
                //设置 第一行 表头
                cell0.setCellValue(paramsVo.getStartTime() + "~" + paramsVo.getEndTime() + "-头条结算单");
                CellRangeAddress region = new CellRangeAddress(0, 0, 0, 10);
                sheet.addMergedRegion(region);//合并行
                cell0.setCellStyle(style);

                //4：添加表头2行
                HSSFRow row = sheet.createRow(1);

                //5：创建第2行的单元格
                HSSFCell cell = row.createCell(0);     //第一个单元格
                cell.setCellValue("日期");         //设定值
                cell.setCellStyle(style);          //内容居中

                cell = row.createCell(1);
                cell.setCellValue("账户名称");
                cell.setCellStyle(style);

                cell = row.createCell(2);
                cell.setCellValue("账户ID");
                cell.setCellStyle(style);

                cell = row.createCell(3);
                cell.setCellValue("所属代理商名称");
                cell.setCellStyle(style);

                cell = row.createCell(4);
                cell.setCellValue("所属代理商ID");
                cell.setCellStyle(style);

                cell = row.createCell(5);
                cell.setCellValue("账户总支出(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(6);
                cell.setCellValue("账户现金支出(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(7);
                cell.setCellValue("账户赠款支出(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(8);
                cell.setCellValue("账户总存入(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(9);
                cell.setCellValue("账户总转入(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(10);
                cell.setCellValue("账户总转出(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(11);
                cell.setCellValue("账户日终结余(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(12);
                cell.setCellValue("冻结(¥)");
                cell.setCellStyle(style);

                cell = row.createCell(13);
                cell.setCellValue("激活");
                cell.setCellStyle(style);

                for (int i = 0; i < settlementList.size(); i++) {
                    SettlementReportBytedanceVo vo = settlementList.get(i);
                    //创建行 （表头占0-1行 所以 从 2开始）
                    row = sheet.createRow(i + 2);
                    sheet.autoSizeColumn(0, true);
                    sheet.autoSizeColumn(i + 1, true);
                    //创建单元格并且添加数据
                    row.createCell(0).setCellValue(vo.getDate());
                    row.createCell(1).setCellValue(vo.getAccountName());
                    row.createCell(2).setCellValue(vo.getAdvertiserId());
                    row.createCell(3).setCellValue(vo.getAgentName());
                    row.createCell(4).setCellValue(vo.getAgentId());
                    row.createCell(5).setCellValue(vo.getCost());
                    row.createCell(6).setCellValue(vo.getCashCost());
                    row.createCell(7).setCellValue(vo.getRewardCost());
                    row.createCell(8).setCellValue(vo.getIncome());
                    row.createCell(9).setCellValue(vo.getTransferIn());
                    row.createCell(10).setCellValue(vo.getTransferOut());
                    row.createCell(11).setCellValue(vo.getBalance());
                    row.createCell(12).setCellValue(vo.getFrozen());
                    row.createCell(13).setCellValue(vo.getActive());
                }

                //查询 图片 url
                List<String> imageUrlList = reportSettlementMapper.getAccountImagesBytedance(accountId, paramsVo.getEndTime());

                if (!Check.isNull(imageUrlList)) {
                    for (int j = 0; j < imageUrlList.size(); j++) {
                        //先把读进来的图片放到一个ByteArrayOutputStream中，以便产生ByteArray
                        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                        String imagePath = imageUrlList.get(j);
                        //通过图片网络地址 获取输入流
                       /* InputStream is = createExcelByTemplate.getInputStreamByUrl(imagePath);
                        BufferedImage bufferImg = ImageIO.read(is);
*/
                        URL url = new URL(imagePath);
                        Image imageTookittitle = Toolkit.getDefaultToolkit().createImage(url);
                        BufferedImage bufferImg = createExcelByTemplate.toBufferedImage(imageTookittitle);
                        ImageIO.write(bufferImg, imagePath.substring(imagePath.lastIndexOf(".") + 1), byteArrayOut);
                        int startIndex = settlementList.size() + 6;
                        int hight = (int) Math.round(bufferImg.getHeight() / 28.35 / (sheet.getDefaultRowHeightInPoints() / 28.35));
                        int width = (int) Math.round(bufferImg.getWidth() / (96 / 2.54) / ((sheet.getColumnWidthInPixels(settlementList.size()) / (96 / 2.54))));
                        //anchor主要用于设置图片的属性
                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255, (short) 0, startIndex + (5 * j) + hight * j, (short) width, startIndex + (5 * j) + hight * (j + 1));
                        //HSSFClientAnchor anchor2 = new HSSFClientAnchor(0, 0, 255, 255, (short) 5, settlementList.size() + 40, (short) 10, 40 * 2);
                        anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
                        //插入图片
                        patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
                    }
                }

            }

            if (accountIdList.size() == num) {
                return Result.errorMsg("暂无账户流水数据");
            }

            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(paramsVo.getStartTime() + "~" + paramsVo.getEndTime() + "-头条结算单.xlsx", "UTF-8"));
            OutputStream output = response.getOutputStream();
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
            wb.write(bufferedOutPut);
            bufferedOutPut.flush();
            bufferedOutPut.close();
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
            return Result.errorMsg(e.getMessage());
        }
        return null;
    }

    /**
     * @param paramsVo
     * @param user
     * @return
     */
    @Override
    public List<String> getAccountId(SettlementFileParamsVo paramsVo, SysUser user) {
        String uploadYears = paramsVo.getUploadYears();
        String startTime = paramsVo.getStartTime();
        //1:区分媒体（头条:1 快手:2）
        Integer mediaId = paramsVo.getMediaId();
        String roleCode = roleMapper.getRoleCodeByUserId(user.getId());
        Set<String> sales = new HashSet<>();
        List<String> userIds = new ArrayList<>();
        List<UserAllocation> allocations;
        if ("admin".equals(roleCode) || "finance".equals(roleCode)) {
            //查询所有可用的账户
            sales = null;
        } else {
            //查询 销售及助理 关联对应的人员
            userIds = cwjsSaleAssistantInfoService.getCwSaleAndAssistantListStr(user.getId());
            if (Check.isNull(userIds)) {
                userIds.add(user.getId());
            }
            sales.addAll(new HashSet<>(userIds));
        }
        //查询财务模块中已上传的账户
        List<String> settlementAccountList = reportSettlementMapper.getAccountIdBytedance(sales, String.valueOf(mediaId), paramsVo.getAdvertiserId(), paramsVo.getProductId(), paramsVo.getProjectId());
        //查询已绑定账户
        allocations = userAllocationMapper.getAccountInfoBySalesId(sales, String.valueOf(mediaId), paramsVo.getAdvertiserId(), paramsVo.getProductId(), paramsVo.getProjectId());
        return mergeAccountId(settlementAccountList, allocations, uploadYears, startTime);
    }

    //账户处理
    private List<String> mergeAccountId(List<String> settlementAccountList, List<UserAllocation> allocations, String downloadYear, String startTime) {
        List<String> salesAccount = new ArrayList<>();
        // 账户状态 0 启动 1 禁用
        for (UserAllocation allocation : allocations) {
            if (allocation.getAccountStatus() == 0) {
                salesAccount.add(allocation.getAccountId() + "");
            }
            if (allocation.getAccountStatus() == 1) {
                //被关停的账户
                Long updateDateNum = Long.parseLong(DateUtils.formatDate(allocation.getUpdateTime(), "yyyyMM"));
                if (!Check.isNull(downloadYear)) {
                    downloadYear = downloadYear.replace("-", "");
                    Long downloadYearNum = Long.parseLong(downloadYear);
                    if (updateDateNum >= downloadYearNum) {
                        salesAccount.add(allocation.getAccountId() + "");
                    }
                } else if (!Check.isNull(startTime)) {
                    try {
                        Long startTimeNum = Long.parseLong(DateUtils.formatDate(startTime, "yyyyMM"));
                        if (updateDateNum >= startTimeNum) {
                            salesAccount.add(allocation.getAccountId() + "");
                        }
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                }
            }
        }
        //去重
        settlementAccountList.removeAll(salesAccount);
        settlementAccountList.addAll(salesAccount);
        return settlementAccountList;
    }


    @Resource
    private IntranetSettlementServiceImpl intranetSettlementService;

    @Override
    public Result settlementReportKuaiShou(SettlementFileParamsVo paramsVo, HttpServletResponse response, SysUser user) {
        try {
            //第一步创建workbook
            HSSFWorkbook wb = new HSSFWorkbook();

            //设置样式
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER);//水平居中

            //设置字体
            HSSFFont font = wb.createFont();
            font.setFontName("黑体");
            font.setFontHeightInPoints((short) 12);//设置字体大小
            style.setFont(font);

            //查询 需要导出的数据的账户id
            List<String> accountIdList = this.getAccountId(paramsVo, user);


            if (Check.isNull(accountIdList)) {
                return Result.errorMsg("该广告主和产品下无法查询到绑定的快手账户信息");
            }
            //设置第一个sheet 汇总页-快手
            createSheetService.createKuaiShou(wb, style, accountIdList, paramsVo.getStartTime(), paramsVo.getEndTime());
            int num = 0;
            for (int k = 0; k < accountIdList.size(); k++) {
                String accountId = accountIdList.get(k);
                paramsVo.setAccountId(accountId);

                // List<SettlementReportKuaiShouVo> settlementList = reportSettlementMapper.getTransactionDayKuaiShouAgentAndAccount(paramsVo);
                List<SettlementReportKuaiShouVo> settlementList = intranetSettlementService.getTransactionDayKuaiShouAgentAndAccountIntranet(paramsVo);
                if (Check.isNull(settlementList)) {
                    num++;
                    continue;
                }

                //2：创建sheet 设置sheet名称
                HSSFSheet sheet = wb.createSheet(accountId);

                //画图的顶级管理器，一个sheet只能获取一个 (插入图片时 使用)
                HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

                //3：添加 第一行单元格
                HSSFRow row0 = sheet.createRow(0);
                HSSFCell cell0 = row0.createCell(0);
                //设置 第一行 表头
                cell0.setCellValue(paramsVo.getStartTime() + "~" + paramsVo.getEndTime() + "-快手结算单");
                CellRangeAddress region = new CellRangeAddress(0, 0, 0, 10);
                sheet.addMergedRegion(region);//合并行
                cell0.setCellStyle(style);

                //4：添加表头2行
                HSSFRow row = sheet.createRow(1);

                //5：创建第2行的单元格
                HSSFCell cell = row.createCell(0);     //第一个单元格
                cell.setCellValue("日期");         //设定值
                cell.setCellStyle(style);          //内容居中

                cell = row.createCell(1);
                cell.setCellValue("账户快手ID");
                cell.setCellStyle(style);

                cell = row.createCell(2);
                cell.setCellValue("广告主账户ID");
                cell.setCellStyle(style);

                cell = row.createCell(3);
                cell.setCellValue("日总花费");
                cell.setCellStyle(style);

                cell = row.createCell(4);
                cell.setCellValue("财务流水");
                cell.setCellStyle(style);

                cell = row.createCell(5);
                cell.setCellValue("充值花费");
                cell.setCellStyle(style);

                cell = row.createCell(6);
                cell.setCellValue("框返花费");
                cell.setCellStyle(style);

                cell = row.createCell(7);
                cell.setCellValue("激励花费");
                cell.setCellStyle(style);

                cell = row.createCell(8);
                cell.setCellValue("充值转入");
                cell.setCellStyle(style);

                cell = row.createCell(9);
                cell.setCellValue("框返转入");
                cell.setCellStyle(style);

                cell = row.createCell(10);
                cell.setCellValue("激励转入");
                cell.setCellStyle(style);

                cell = row.createCell(11);
                cell.setCellValue("总转入");
                cell.setCellStyle(style);

                cell = row.createCell(12);
                cell.setCellValue("转出");
                cell.setCellStyle(style);

                cell = row.createCell(13);
                cell.setCellValue("日终结余");
                cell.setCellStyle(style);

                cell = row.createCell(14);
                cell.setCellValue("激活");
                cell.setCellStyle(style);


                for (int i = 0; i < settlementList.size(); i++) {
                    SettlementReportKuaiShouVo vo = settlementList.get(i);
                    //创建行 （表头占0-1行 所以 从 2开始）
                    row = sheet.createRow(i + 2);
                    sheet.autoSizeColumn(0, true);
                    sheet.autoSizeColumn(i + 1, true);
                    //创建单元格并且添加数据
                    row.createCell(0).setCellValue(vo.getDate());
                    row.createCell(1).setCellValue(vo.getKsId());
                    row.createCell(2).setCellValue(vo.getAccountId());
                    row.createCell(3).setCellValue(vo.getDailyCharge());
                    row.createCell(4).setCellValue(vo.getFlowDailyCharge());
                    row.createCell(5).setCellValue(vo.getRealCharged());
                    row.createCell(6).setCellValue(vo.getContractRebateRealCharged());
                    row.createCell(7).setCellValue(vo.getDirectRebateRealCharged());
                    row.createCell(8).setCellValue(vo.getRealRecharged());
                    row.createCell(9).setCellValue(vo.getContractRebateRealRecharged());
                    row.createCell(10).setCellValue(vo.getDirectRebateRealRecharged());
                    row.createCell(11).setCellValue(vo.getDailyTransferIn());
                    row.createCell(12).setCellValue(vo.getDailyTransferOut());
                    row.createCell(13).setCellValue(vo.getBalance());
                    row.createCell(14).setCellValue(vo.getActivation());
                }


                //查询 图片 url
                List<String> imageUrlList = reportSettlementMapper.getAccountImagesBytedance(accountId, paramsVo.getEndTime());

                if (!Check.isNull(imageUrlList)) {
                    for (int j = 0; j < imageUrlList.size(); j++) {
                        //先把读进来的图片放到一个ByteArrayOutputStream中，以便产生ByteArray
                        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
                        String imagePath = imageUrlList.get(j);
                        //通过图片网络地址 获取输入流
                       /* InputStream is = createExcelByTemplate.getInputStreamByUrl(imagePath);
                        BufferedImage bufferImg = ImageIO.read(is);
                        */
                        URL url = new URL(imagePath);
                        Image imageTookittitle = Toolkit.getDefaultToolkit().createImage(url);
                        BufferedImage bufferImg = createExcelByTemplate.toBufferedImage(imageTookittitle);
                        ImageIO.write(bufferImg, imagePath.substring(imagePath.lastIndexOf(".") + 1), byteArrayOut);
                        //anchor主要用于设置图片的属性
                        int startIndex = settlementList.size() + 7;
                        int hight = (int) Math.round(bufferImg.getHeight() / 28.35 / (sheet.getDefaultRowHeightInPoints() / 28.35));
                        int width = (int) Math.round(bufferImg.getWidth() / (96 / 2.54) / ((sheet.getColumnWidthInPixels(settlementList.size()) / (96 / 2.54))));
                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255, (short) 0, startIndex + (5 * j) + hight * j, (short) width, startIndex + (5 * j) + hight * (j + 1));

                        //HSSFClientAnchor anchor2 = new HSSFClientAnchor(0, 0, 255, 255, (short) 5, settlementList.size() + 40, (short) 10, 40 * 2);
                        anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
                        //插入图片
                        patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
                    }
                }

            }

            if (accountIdList.size() == num) {
                return Result.errorMsg("暂无数据");
            }

            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(paramsVo.getStartTime() + "~" + paramsVo.getEndTime() + "-快手结算单.xlsx", "UTF-8"));
            OutputStream output = response.getOutputStream();
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
            wb.write(bufferedOutPut);
            bufferedOutPut.flush();
            bufferedOutPut.close();
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
            return Result.errorMsg(e.getMessage());
        }
        return null;
    }

    /**
     * @param paramsVo
     * @param response
     * @description: 财务结算 利润表导出 头条
     * @return: org.jeecg.common.api.vo.Result
     * @author: zianY
     */
    @Override
    public Result porfitReportBytedance(SettlementFileParamsVo paramsVo, HttpServletResponse response) {
        try {
            //查询 头条利润表 时间段内 所有 账户
            List<Map<String, Object>> list = reportSettlementMapper.getProfitBytedanceAccount(paramsVo.getStartTime(), paramsVo.getEndTime());
            if (Check.isNull(list)) {
                return Result.errorMsg("暂无数据");
            }
            List<ProfitReportBytedanceVo> resultList = new ArrayList<>(list.size());
            for (Map<String, Object> mapList : list) {

                //查看账户数据
                Map<String, Object> map = reportSettlementMapper.getProfitBytedanceAccountCost(mapList.get("accountId").toString(), paramsVo.getStartTime(), paramsVo.getEndTime());

                ProfitReportBytedanceVo voSource = new ProfitReportBytedanceVo();
                voSource.setAccountId(map.get("accountId") + "");

                voSource.setAdvertiserName(!Check.isNull(map.get("advertiserName")) ? map.getOrDefault("advertiserName", "") + "" : "");//广告主名称
                //产品名称
                voSource.setProductName(!Check.isNull(map.get("productName")) ? map.getOrDefault("productName", "") + "" : "");


                //查询销售
                Map<String, Object> slaeMap = reportSettlementMapper.getProfitReportSale(map.get("accountId") + "");
                voSource.setSaleName(Check.isNull(slaeMap) ? "" : slaeMap.getOrDefault("saleName", "") + "");//销售
                //查询运营
                Map<String, Object> operateMap = reportSettlementMapper.getProfitReportOperateAndArea(map.get("accountId") + "");
                if (!Check.isNull(operateMap)) {
                    voSource.setOperateName(operateMap.getOrDefault("operateName", "") + "");//运营
                    voSource.setOperateArea(operateMap.getOrDefault("operateArea", "") + "");//运营所属区域
                }
                //政策所有时间点
                List<String> policyDaysList = new ArrayList<>();
                if (!Check.isNull(map.get("productName"))) {
                    //查询 头条利润表  返点类型和比列
                    List<Map<String, Object>> rateMap = reportSettlementMapper.getProfitBytedance(map.get("advertiserName") + "", map.get("productName") + "", slaeMap.get("saleId") + "", "1", paramsVo.getStartTime(), paramsVo.getEndTime());
                    List listPolicyTIme = new ArrayList();
                    for (Map<String, Object> rate : rateMap) {
                        listPolicyTIme.add(rate.get("policyStartDate"));
                        listPolicyTIme.add(rate.get("policyEndDate"));
                    }
                    //政策时间 去重 排序
                    List<Object> times = SettlementUtil.sortlistTest(listPolicyTIme);
                    // 使用政策的时间段 拼接 开始 和 截至 时间
                    List<Map<String, String>> arrayList = new ArrayList<>();
                    for (int i = 0; i < times.size(); i++) {
                        HashMap<String, String> mapTime = new HashMap<>();
                        mapTime.put("startDate", times.get(i).toString());
                        mapTime.put("endDate", times.size() < 2 ? times.get(i).toString() : times.get(i + 1).toString());
                        i += 1;
                        arrayList.add(mapTime);
                    }


                    for (Map<String, String> stringMap : arrayList) {
                        ProfitReportBytedanceVo vo = new ProfitReportBytedanceVo();
                        //使用政策 返点类型和比例
                        Map<String, Object> policyRateMap = reportSettlementMapper.getProfitRebate(map.get("advertiserName") + "", map.get("productName") + "", slaeMap.get("saleId") + "", "1", stringMap.get("startDate"), stringMap.get("endDate"));
                        if (!Check.isNull(policyRateMap)) {
                            if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 0) {
                                vo.setRebateType("返现");//返点类型
                            } else if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 1) {
                                vo.setRebateType("返货");
                            } else if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 2) {
                                vo.setRebateType("返现+返货");
                            } else if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 3) {
                                vo.setRebateType("服务费");
                            }
                            vo.setRebateRate(policyRateMap.getOrDefault("rebateRate", "") + "%");//返点比列
                        } else {
                            vo.setRebateType("");
                        }
                        // 时间段内 账户流水 信息
                        List<Map<String, Object>> listAccount = reportSettlementMapper.getProfitBytedanceCost(map.get("accountId") + "", stringMap.get("startDate"), stringMap.get("endDate"));
                        listAccount.removeAll(Collections.singleton(null));
                        vo.setCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cost", "") + "");//总消耗
                        vo.setCost(String.format("%.3f", new Double(vo.getCost())));
                        vo.setCashCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cashCost", "") + "");//现金消耗
                        vo.setCashCost(String.format("%.3f", new Double(vo.getCashCost())));
                        vo.setRewardCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("rewardCost", "") + "");//赠款消耗
                        vo.setRewardCost(String.format("%.3f", new Double(vo.getRewardCost())));
                        BeanUtils.copyProperties(voSource, vo, SettlementUtil.getNullPropertyNames(voSource));
                        vo.setTime(stringMap.get("startDate") + "----" + stringMap.get("endDate"));
                        resultList.add(vo);
                        policyDaysList.addAll(SettlementUtil.getAllDatesOfTwoTimes(stringMap.get("startDate"), stringMap.get("endDate")));
                    }

                }

                //不使用政策 的时间段
                // 获取两个日期之间 所有的 时间 年-月-日
                List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes(paramsVo.getStartTime(), paramsVo.getEndTime());
                // 时间差集（所有时间段 - 使用政策的时间段）
                List<String> reduceList = betweenDaysList.stream().filter(item -> !policyDaysList.contains(item)).collect(Collectors.toList());
                //差集拼接  开始 和 结束时间
                List<Map<String, String>> stringList = SettlementUtil.getTime(reduceList);
                for (Map<String, String> stringMap : stringList) {
                    ProfitReportBytedanceVo vo = new ProfitReportBytedanceVo();
                    // 不使用 政策 则 返点为空
                    //政策 返点类型和比例
                    /* Map<String,Object>  policyRateMap = reportSettlementMapper.getProfitRebate(map.get("productName")+"",stringMap.get("startDate"),stringMap.get("endDate"));
                     */
                    vo.setRebateType("");//返点类型
                    vo.setRebateRate("");//返点比列
                    //账户流水 信息
                    List<Map<String, Object>> listAccount = reportSettlementMapper.getProfitBytedanceCost(map.get("accountId") + "", stringMap.get("startDate"), stringMap.get("endDate"));
                    listAccount.removeAll(Collections.singleton(null));
                    vo.setCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cost", "") + "");//总消耗
                    vo.setCost(String.format("%.3f", new Double(vo.getCost())));
                    vo.setCashCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cashCost", "") + "");//现金消耗
                    vo.setCashCost(String.format("%.3f", new Double(vo.getCashCost())));
                    vo.setRewardCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("rewardCost", "") + "");//赠款消耗
                    vo.setRewardCost(String.format("%.3f", new Double(vo.getRewardCost())));
                    BeanUtils.copyProperties(voSource, vo, SettlementUtil.getNullPropertyNames(voSource));
                    vo.setTime((!Check.isNull(vo.getRebateType()) ? stringMap.get("startDate") + "----" + stringMap.get("endDate") : ""));
                    resultList.add(vo);
                }
            }
            Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("头条利润单", "头条利润单"), ProfitReportBytedanceVo.class, resultList);
            try {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("头条利润单.xlsx", "UTF-8"));
                workbook.write(response.getOutputStream());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        } catch (Exception e) {
            e.printStackTrace();
            return Result.errorMsg(e.getMessage());
        }
        return null;
    }

    /**
     * @param paramsVo
     * @param response
     * @description: 财务结算 利润表导出 快手
     * @return: org.jeecg.common.api.vo.Result
     * @author: zianY
     */
    @Override
    public Result porfitReportKuaiShou(SettlementFileParamsVo paramsVo, HttpServletResponse response) {

        try {
            //查询 快手利润表  时间段内的 所有账户
            List<Map<String, Object>> list = reportSettlementMapper.getProfitKuaiShouAgentAccount(paramsVo.getStartTime(), paramsVo.getEndTime());
            if (Check.isNull(list)) {
                return Result.errorMsg("暂无数据");
            }
            List<ProfitReportKuaiShouVo> resultList = new ArrayList<>(list.size());
            for (Map<String, Object> mapList : list) {

                //查询账户数据信息
                Map<String, Object> map = reportSettlementMapper.getProfitKuaiShouAccountCost(mapList.get("account_id").toString(), paramsVo.getStartTime(), paramsVo.getEndTime());
                ProfitReportKuaiShouVo voSource = new ProfitReportKuaiShouVo();
                voSource.setAccountId(map.getOrDefault("accountId", "") + "");//账户id
                voSource.setProductName(!Check.isNull(map.get("productName")) ? map.getOrDefault("productName", "") + "" : "");//产品名称
                voSource.setKsId(map.getOrDefault("ksId", "") + "");//快手id
                voSource.setAdvertiserName(!Check.isNull(map.get("advertiserName")) ? map.getOrDefault("advertiserName", "") + "" : "");//广告主名称

                //销售
                Map<String, Object> slaeMap = reportSettlementMapper.getProfitReportSale(map.get("accountId") + "");
                voSource.setSaleName(Check.isNull(slaeMap) ? "" : slaeMap.getOrDefault("saleName", "") + "");//销售
                //运营
                Map<String, Object> operateMap = reportSettlementMapper.getProfitReportOperateAndArea(map.get("accountId") + "");
                if (!Check.isNull(operateMap)) {
                    voSource.setOperateName(operateMap.getOrDefault("operateName", "") + "");//运营
                    voSource.setOperateArea(operateMap.getOrDefault("operateArea", "") + "");//运营所属区域
                }

                //政策所有时间点
                List<String> policyDaysList = new ArrayList<>();
                if (!Check.isNull(map.get("productName"))) {
                    //查询 快手利润表  返点类型和比列
                    List<Map<String, Object>> rateMap = reportSettlementMapper.getProfitBytedance(map.get("advertiserName") + "", map.get("productName") + "", slaeMap.get("saleId") + "", "2", paramsVo.getStartTime(), paramsVo.getEndTime());
                    List listPolicyTIme = new ArrayList();
                    for (Map<String, Object> rate : rateMap) {
                        listPolicyTIme.add(rate.get("policyStartDate"));
                        listPolicyTIme.add(rate.get("policyEndDate"));
                    }

                    //政策时间 去重 排序
                    List<Object> times = SettlementUtil.sortlistTest(listPolicyTIme);
                    // 使用政策的时间段 拼接 开始 和 截至 时间
                    List<Map<String, String>> arrayList = new ArrayList<>();
                    if (!Check.isNull(times)) {
                        for (int i = 0; i < times.size(); i++) {
                            HashMap<String, String> mapTime = new HashMap<>();
                            mapTime.put("startDate", times.get(i).toString());
                            mapTime.put("endDate", times.size() < 2 ? times.get(i).toString() : times.get(i + 1).toString());
                            i += 1;
                            arrayList.add(mapTime);
                        }
                    }

                    for (Map<String, String> stringMap : arrayList) {
                        ProfitReportKuaiShouVo vo = new ProfitReportKuaiShouVo();
                        //使用政策 返点类型和比例
                        Map<String, Object> policyRateMap = reportSettlementMapper.getProfitRebate(map.get("advertiserName") + "", map.get("productName") + "", slaeMap.get("saleId") + "", "2", stringMap.get("startDate"), stringMap.get("endDate"));
                        if (!Check.isNull(policyRateMap)) {
                            if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 0) {
                                vo.setRebateType("返现");//返点类型
                            } else if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 1) {
                                vo.setRebateType("返货");
                            } else if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 2) {
                                vo.setRebateType("返现+返货");
                            } else if (Integer.valueOf(policyRateMap.get("rebateType").toString()) == 3) {
                                vo.setRebateType("服务费");
                            }
                            vo.setRebateRate(policyRateMap.getOrDefault("rebateRate", "") + "%");//返点比列
                        } else {
                            vo.setRebateType("");
                        }

                        // 时间段内 账户流水 信息
                        List<Map<String, Object>> listAccount = reportSettlementMapper.getProfitKuaiShouCost(map.get("accountId") + "", stringMap.get("startDate"), stringMap.get("endDate"));
                        listAccount.removeAll(Collections.singleton(null));
                        vo.setCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cost", "") + "");//总消耗
                        vo.setCashCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cashCost", "") + "");//现金消耗
                        BeanUtils.copyProperties(voSource, vo, SettlementUtil.getNullPropertyNames(voSource));
                        vo.setTime(stringMap.get("startDate") + "----" + stringMap.get("endDate"));
                        resultList.add(vo);
                        policyDaysList.addAll(SettlementUtil.getAllDatesOfTwoTimes(stringMap.get("startDate"), stringMap.get("endDate")));
                    }
                }


                //不使用政策 的时间段
                // 获取两个日期之间 所有的 时间 年-月-日
                List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes(paramsVo.getStartTime(), paramsVo.getEndTime());
                // 时间差集（所有时间段 - 使用政策的时间段）
                List<String> reduceList = betweenDaysList.stream().filter(item -> !policyDaysList.contains(item)).collect(Collectors.toList());
                //差集拼接  开始 和 结束时间
                List<Map<String, String>> stringList = SettlementUtil.getTime(reduceList);
                for (Map<String, String> stringMap : stringList) {
                    ProfitReportKuaiShouVo vo = new ProfitReportKuaiShouVo();
                    // 不使用 政策 则 返点为空
                    //政策 返点类型和比例
                    /* Map<String,Object>  policyRateMap = reportSettlementMapper.getProfitRebate(map.get("productName")+"",stringMap.get("startDate"),stringMap.get("endDate"));
                     */
                    vo.setRebateType("");//返点类型
                    vo.setRebateRate("");//返点比列
                    //账户流水 信息
                    List<Map<String, Object>> listAccount = reportSettlementMapper.getProfitKuaiShouCost(map.get("accountId") + "", stringMap.get("startDate"), stringMap.get("endDate"));
                    listAccount.removeAll(Collections.singleton(null));
                    vo.setCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cost", "") + "");//总消耗
                    vo.setCashCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cashCost", "") + "");//现金消耗
                    BeanUtils.copyProperties(voSource, vo, SettlementUtil.getNullPropertyNames(voSource));
                    vo.setTime(!Check.isNull(vo.getRebateType()) ? stringMap.get("startDate") + "----" + stringMap.get("endDate") : "");
                    resultList.add(vo);
                }
            }

            Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("快手利润单", "快手利润单"), ProfitReportKuaiShouVo.class, resultList);
            try {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("快手利润单.xls", "UTF-8"));
                workbook.write(response.getOutputStream());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.errorMsg(e.getMessage());
        }
        return null;
    }


    /**
     * @param
     * @description: 给运营发送消息
     * @return: org.jeecg.common.api.vo.Result
     * @author: zianY
     */
    @Override
    public Result sendMessageToOperate() {
        //上个月份
        int month = Calendar.getInstance().get(Calendar.MONTH);
        int productNum = 0;
        int accountNum = 0;
        String productInfo = null;
        String message = "{0}，您好！您{1}月份有{2}个产品的账户需要进行媒体后台消耗截图上传，共计{3}个账户。产品分别为：{4}。请及时上传，多谢配合！";
        //查询所有 运营绑定的账户
        List<Map<String, Object>> userList = reportSettlementMapper.getAccountOperateUserId();
        for (Map<String, Object> userMap : userList) {
            String userId = userMap.get("userId").toString();
            //查询运营下的 账户 和 产品信息
            List<Map<String, Object>> productList = reportSettlementMapper.getAccountAndProductByOperate(userId);
            if (Check.isNull(productList)) {
                continue;
            }
            //产品名称
            List product = productList.stream().map(map -> map.get("productName")).distinct().collect(Collectors.toList());
            productNum = product.size();
            accountNum = productList.size();
            productInfo = StringUtils.join(product.toArray(), "、");
            //发送微信通知
            JSONObject jsonObject = mailLogMapper.getWChatIdByUserId(userId);
            String msg = MessageFormat.format(message, userMap.get("userName").toString(), month, productNum, accountNum, productInfo);
            corpWexinUtils.sendMessageByWeChatId(jsonObject, msg);
        }
        return Result.successMsg("成功", null);
    }

    @Override
    public Result sendMessageToOperateDemo(String userId) {
        //上个月份
        int month = Calendar.getInstance().get(Calendar.MONTH);
        int productNum = 0;
        int accountNum = 0;
        String productInfo = null;
        String message = "{0}，您好！您{1}月份有{2}个产品的账户需要进行媒体后台消耗截图上传，共计{3}个账户。产品分别为：{4}。请及时上传，多谢配合！";

        //查询所有 运营绑定的账户
        List<Map<String, Object>> userList = reportSettlementMapper.getAccountOperateUserId();
        for (Map<String, Object> userMap : userList) {
            String realUserId = userMap.get("userId").toString();
            //查询运营下的 账户 和 产品信息
            List<Map<String, Object>> productList = reportSettlementMapper.getAccountAndProductByOperate(realUserId);
            if (Check.isNull(productList)) {
                continue;
            }
            //产品名称
            List product = productList.stream().map(map -> map.get("productName")).distinct().collect(Collectors.toList());
            productNum = product.size();
            accountNum = productList.size();
            productInfo = StringUtils.join(product.toArray(), "、");
            //发送微信通知
            JSONObject jsonObject = mailLogMapper.getWChatIdByUserId(Check.isNull(userId) ? "f990f815ecef43fab9cbe1bb22bb6d63" : userId);
            String msg = MessageFormat.format(message, userMap.get("userName").toString(), month, productNum, accountNum, productInfo);
            corpWexinUtils.sendMessageByWeChatId(jsonObject, msg);
        }
        return Result.successMsg("发送微信通知成功-test", null);
    }

    @Resource
    private CwjsPolicyProductMapper cwjsPolicyProductMapper;

    @Resource
    private CwjsPolicyApprovalLogMapper policyApprovalLogMapper;

    @Override
    public void cwjsPRofit(CwjsPolicyInfo cwjsPolicyInfo) {
        // 获取两个日期之间 所有的 时间 年-月-日
        List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes(cwjsPolicyInfo.getPolicyStartDate(), cwjsPolicyInfo.getPolicyEndDate());
        //查看 政策下的产品
        List<CwjsPolicyProduct> productList = cwjsPolicyProductMapper.queryProductsByPolicyId(cwjsPolicyInfo.getId());
        if (!Check.isNull(productList)) {
            if (!Check.isNull(betweenDaysList)) {
                List<CtopCwjsSlettementReport> reportList = new ArrayList<>();
                for (CwjsPolicyProduct product : productList) {
                    for (String day : betweenDaysList) {
                        CtopCwjsSlettementReport report = new CtopCwjsSlettementReport();
                        report.setPolicyId(cwjsPolicyInfo.getId());
                        report.setAdvertiserName(cwjsPolicyInfo.getAdvertiserName());
                        report.setCompanyName(cwjsPolicyInfo.getCompanyName());
                        report.setProductName(product.getPolicyProductName());
                        report.setMediaType(cwjsPolicyInfo.getMediaType());
                        report.setCreateUserId(cwjsPolicyInfo.getCreateUserId());
                        report.setPolicyDate(day);
                        report.setPromotionType(cwjsPolicyInfo.getPromotionType());
                        reportList.add(report);
                    }
                }
                cwjsProfitMapper.replaceCwjsSlettementProfit(reportList);
            }
        }

        //添加记录
        CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
        policyApprovalLog.setPolicyId(cwjsPolicyInfo.getId());
        policyApprovalLog.setCreateUserId(cwjsPolicyInfo.getLoginUserId());
        policyApprovalLog.setApprovalStatus(0);
        policyApprovalLog.setApprovalContent(Check.isNull(cwjsPolicyInfo.getApprovalContent()) ? "终审通过" : cwjsPolicyInfo.getApprovalContent());
        policyApprovalLogMapper.insert(policyApprovalLog);


    }

    @Resource
    private CwjsPolicyInfoMapper cwjsPolicyInfoMapper;
    @Resource
    private SysUserMapper sysUserMapper;
    @Resource
    private CwjsCompanySubjectMapper cwjsCompanySubjectMapper;

    @Override
    public Result importPolicyInit(MultipartFile file) {
        try {
            //LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
            //settlementInfo.setCreateUserId(user.getId());
            //settlementInfo.setCreateUserId("b161b7d9793942f980dbfe8c931cd1b0");
            ImportParams importParams = new ImportParams();
            //表头行数
            importParams.setHeadRows(1);

            ExcelImportResult<PolicyImportVo> importResult = ExcelImportUtil.importExcelMore(file.getInputStream(), PolicyImportVo.class, importParams);
            if (importResult.getList().size() < 1) {
                return Result.error("读取Excel失败，数据不能为空，请重新检查数据并导入");
            }

            for (PolicyImportVo importVo : importResult.getList()) {
                if (cn.com.ctop.common.module.utils.Check.isNull(importVo.getCompanyName())) {
                    continue;
                }
                if (cn.com.ctop.common.module.utils.Check.isNull(importVo.getPolicyProductName())) {
                    continue;
                }
                List<String> productNameList = Arrays.asList(importVo.getPolicyProductName().split("-"));

                CwjsPolicyInfo cwjsPolicyInfo = new CwjsPolicyInfo();
                BeanUtils.copyProperties(importVo, cwjsPolicyInfo);

                // 销售 - 创建人
                QueryWrapper<SysUser> sysUserQw = new QueryWrapper<>();
                sysUserQw.eq("realname", importVo.getCreateUserName());
                sysUserQw.last("limit 1");
                SysUser user = sysUserMapper.selectOne(sysUserQw);
                cwjsPolicyInfo.setCreateUserId(user.getId());

                //公司主体
                QueryWrapper<CwjsCompanySubject> companySubQw = new QueryWrapper<>();
                companySubQw.eq("company_subject_name", importVo.getCompanySubjectIdStr());
                companySubQw.eq("area_info", importVo.getAreaInfo());
                companySubQw.last("limit 1");
                CwjsCompanySubject companySubject = cwjsCompanySubjectMapper.selectOne(companySubQw);
                cwjsPolicyInfo.setCompanySubjectId(companySubject.getId());

                cwjsPolicyInfo.setApprovedStatus(3);

                CwjsPolicyInfo policy = cwjsPolicyInfoMapper.getPolicyInfo(cwjsPolicyInfo);

                if (cn.com.ctop.common.module.utils.Check.isNull(policy)) {
                    cwjsPolicyInfoMapper.insert(cwjsPolicyInfo);
                    policy = cwjsPolicyInfoMapper.getPolicyInfo(cwjsPolicyInfo);
                }

                //查看 政策下的产品
                List<CwjsPolicyProduct> productList = cwjsPolicyProductMapper.queryProductsByPolicyId(policy.getId());
                List proList = productList.stream().map(CwjsPolicyProduct::getPolicyProductName).collect(Collectors.toList());
                for (String str : productNameList) {
                    if (!proList.contains(str)) {
                        //新增产品
                        CwjsPolicyProduct policyProduct = new CwjsPolicyProduct();
                        policyProduct.setPolicyId(policy.getId());
                        policyProduct.setPolicyProductName(str);
                        policyProduct.setCreateUserId(cwjsPolicyInfo.getCreateUserId());
                        policyProduct.setDelFlag(0);
                        cwjsPolicyProductMapper.insert(policyProduct);
                    }
                }
                this.cwjsPRofit(policy);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("政策数据上传失败，请使用正确的模板导入！");
        }
        return Result.successMsg("政策数据上传成功", null);
    }


}
