package com.muzhi.mt.test1;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.*;
import com.muzhi.mt.service.DingAccessTokenService;
import com.taobao.api.ApiException;
import com.taobao.api.FileItem;
import com.taobao.api.internal.util.WebUtils;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;


@SpringBootTest
public class Test1 {

    @Autowired
    private DingAccessTokenService dingAccessTokenService;

    //审批详情
    public static String shenpiXQ = null;

    //审批附件id
    public static String fileId = null;
    //审批附件名称
    public static String fileName = null;
    //审批附件长度
    public static Long fileSize = 0L;
    //审批附件类型
    public static String fileType = null;
    //审批钉盘空间id
    public static String spaceId = null;

    //审批单提交人员id
    public static String originator_userid = null;
    //审批单提交人员部门id
    public static String originator_dept_id = null;

    //审批附件
    public static String shenpiFJ = null;

    // 水印透明度
    private static float alpha = 0.5f;
    // 水印之间的间隔
    private static final int XMOVE = 200;
    // 水印之间的间隔
    private static final int YMOVE = 200;

    @Test
    public void aaa(){
//        addPictureWaterMark("D:\\pdf\\chun.jpg", "D:\\pdf\\chun.png", "我是水印");
//        setPictureWatermark("D:\\pdf\\xia.jpg", "D:\\pdf\\xia.png", Color.GRAY, "我是水印");

        //原始文件路径
        String a = "D:\\pdf\\" + "保证合同-扬州龙川.pdf";
        //添加水印后保存路径
        String b = "D:\\pdf\\" + "保证合同-扬州龙川-AAA.pdf";
        //生成合同编号
        String c = "MTFL2022-SE-022-03" + "茅台（上海）融资租赁有限公司";

        setPdfWatermark(a, b, c);

    }

//    @Test
//    public void qwe(){
//        String c = "HT20210101-123" + "茅台（上海）融资租赁有限公司";
//        System.out.println(c);
//    }

//    /**
//     * @param srcImgPath       源图片路径
//     * @param tarImgPath       保存的图片路径
//     * @param waterMarkContent 水印内容
//     */
//    @Test
//    public void addPictureWaterMark(String srcImgPath, String tarImgPath,
//                                    String waterMarkContent){
//        FileOutputStream outImgStream = null;
//        try {
//            // 读取原图片信息
//            File srcImgFile = new File(srcImgPath);// 得到文件
//            Image srcImg = ImageIO.read(srcImgFile);// 文件转化为图片
//            int srcImgWidth = srcImg.getWidth(null);// 获取图片的宽
//            int srcImgHeight = srcImg.getHeight(null);// 获取图片的高
//            // 加水印
//            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight,
//                    BufferedImage.TYPE_INT_RGB);
//            Graphics2D g = bufImg.createGraphics();
//            // 设置对线段的锯齿状边缘处理
//            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
//                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//            // 设置水印旋转
//            g.rotate(Math.toRadians(-40),
//                    (double) bufImg.getWidth() / 2,
//                    (double) bufImg.getHeight() / 2);
//            g.setColor(new Color(107, 109, 106)); // 根据图片的背景设置水印颜色
//            Font font = new Font("宋体", Font.PLAIN, 20);
//            g.setFont(font); // 设置字体
//            // 设置水印文字透明度
////			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
//
//            //根据不同的像素判断多个水印还是单个水印300*300
//            if (srcImgWidth > 300 && srcImgHeight > 300) {
//                //多个水印
//                // 设置水印的坐标
//                int x = -srcImgWidth / 2;
//                int y = -srcImgHeight / 2;
//                int markWidth = font.getSize() * getTextLength(waterMarkContent);// 字体长度
//                int markHeight = font.getSize();// 字体高度
//                // 循环添加水印
//                while (x < srcImgWidth * 1.5) {
//                    y = -srcImgHeight / 2;
//                    while (y < srcImgHeight * 1.5) {
//                        g.drawString(waterMarkContent, x, y);
//                        y += markHeight + YMOVE;
//                    }
//                    x += markWidth + XMOVE;
//                }
//            } else {
//                //单个水印
//                int x = (srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
//                int y = srcImgHeight / 2;
//                g.drawString(waterMarkContent, x, y);
//            }
//            g.dispose();
//            // 输出图片
//            outImgStream = new FileOutputStream(tarImgPath);
//            String formatName = srcImgPath.substring(srcImgPath.lastIndexOf(".") + 1, srcImgPath.length());
//            ImageIO.write(bufImg, formatName, outImgStream);
//            outImgStream.flush();
//        } catch (Exception e) {
////            log.error("addPictureWatermark fail", e);
////            throw new MyException(ResultCode.FAILURE, "addPictureWatermark fail");
//            e.printStackTrace();
//        } finally {
//            if (outImgStream != null) {
//                try {
//                    outImgStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }



//    /**
//     * 图片添加水印
//     *
//     * @param srcImgPath       需要添加水印的图片的路径
//     * @param outImgPath       添加水印后图片输出路径
//     * @param markContentColor 水印文字的颜色
//     * @param waterMarkContent 水印的文字
//     */
//    public static void setPictureWatermark(String srcImgPath, String outImgPath, Color markContentColor, String waterMarkContent) {
//        FileOutputStream outImgStream = null;
//        try {
//            // 读取原图片信息
//            File srcImgFile = new File(srcImgPath);
//            Image srcImg = ImageIO.read(srcImgFile);
//            int srcImgWidth = srcImg.getWidth(null);
//            int srcImgHeight = srcImg.getHeight(null);
//            // 加水印
//            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
//            Graphics2D g = bufImg.createGraphics();
//            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//            Font font = new Font("宋体", Font.BOLD, srcImgHeight / 6);
//            //根据图片的背景设置水印颜色
//            g.setColor(markContentColor);
//            //设置旋转角度
//            g.rotate(Math.toRadians(-45), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);
//            //设置水印透明度
//            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.2F));
//
//            g.setFont(font);
//            int x = (srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
//            int y = srcImgHeight / 2;
//            g.drawString(waterMarkContent, x, y);
//            g.dispose();
//            // 输出图片
//            outImgStream = new FileOutputStream(outImgPath);
//            ImageIO.write(bufImg, "jpg", outImgStream);
//            outImgStream.flush();
//            outImgStream.close();
//        } catch (Exception e) {
////            log.error("setPictureWatermark fail", e);
////            throw new MyException(ResultCode.FAILURE, "setPictureWatermark fail");
//            e.printStackTrace();
//        } finally {
//            if (outImgStream != null) {
//                try {
//                    outImgStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }



    /**
     * pdf设置文字水印
     *
     * @param inputPath
     * @param outPath
     * @param markStr
     */
    public static void setPdfWatermark(String inputPath, String outPath, String markStr) {
        File file = new File(outPath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
//                log.error("setPdfWatermark fail: 创建输出文件IO异常", e);
//                throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail: 创建输出文件IO异常");
                e.printStackTrace();
            }
        }
        BufferedOutputStream bufferOut = null;
        try {
            bufferOut = new BufferedOutputStream(new FileOutputStream(file));
        } catch (FileNotFoundException e) {
//            log.error("setPdfWatermark fail: 源文件不存在", e);
//            throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail: 源文件不存在");
            e.printStackTrace();
        }
        PdfStamper stamper = null;
        int total = 0;
        PdfContentByte content;
        Rectangle pageSizeWithRotation = null;
        BaseFont base = null;
        PdfReader reader = null;
        try {
            reader = new PdfReader(inputPath);
            //解决PdfReader not opened with owner password
            Field f = PdfReader.class.getDeclaredField("ownerPasswordUsed");
            f.setAccessible(true);
            f.set(reader, Boolean.TRUE);
            stamper = new PdfStamper(reader, bufferOut);
            total = reader.getNumberOfPages() + 1;
            base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
        } catch (IOException e) {
//            log.error("setPdfWatermark fail:", e);
//            throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail");
            e.printStackTrace();
        } catch (DocumentException e) {
//            log.error("setPdfWatermark fail:", e);
//            throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        // 获取水印文字的高度和宽度
        int textH = 0, textW = 0;
        JLabel label = new JLabel();
        label.setText(markStr);
        FontMetrics metrics = label.getFontMetrics(label.getFont());
        textH = metrics.getHeight();
        textW = metrics.stringWidth(label.getText());
        PdfGState gs = new PdfGState();
        for (int i = 1; i < total; i++) {
            //在内容上方加水印
            content = stamper.getOverContent(i);
            gs.setFillOpacity(0.5f);
            content.saveState();
            content.setGState(gs);
            content.beginText();
            //设置水印文字颜色
            content.setRGBColorFill(220, 220, 220);
            content.setFontAndSize(base, 20);
            // 获取每一页的高度、宽度
            com.itextpdf.text.Rectangle pageSizeWithRotation1 = reader.getPageSizeWithRotation(i);
            float pageHeight = pageSizeWithRotation1.getHeight();
            float pageWidth = pageSizeWithRotation1.getWidth();

            // 根据纸张大小多次添加， 水印文字成30度角倾斜
            for (int height = -5 + textH; height < pageHeight; height = height + YMOVE) {
                for (int width = -5 + textW; width < pageWidth + textW; width = width + XMOVE) {
                    content.showTextAligned(Element.ALIGN_LEFT, markStr, width - textW, height - textH, 30);
                }
            }
            content.endText();
        }
        try {
            stamper.close();
            bufferOut.flush();
            bufferOut.close();
            reader.close();
        } catch (IOException e) {
//            log.error("setPdfWatermark fail:", e);
//            throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail");
            e.printStackTrace();
        } catch (DocumentException e) {
//            log.error("setPdfWatermark fail:", e);
//            throw new MyException(ResultCode.FAILURE, "setPdfWatermark fail");
            e.printStackTrace();
        }
    }



//    /**
//     * 获取水印文字总长度
//     *
//     * @param waterMarkContent 水印的文字
//     * @param g
//     * @return 水印文字总长度
//     */
//    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
//        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
//    }
//
//    /**
//     * 获取文本长度。汉字为1:1，英文和数字为2:1
//     */
//    private static int getTextLength(String text) {
//        int length = text.length();
//        for (int i = 0; i < text.length(); i++) {
//            String s = String.valueOf(text.charAt(i));
//            if (s.getBytes().length > 1) {
//                length++;
//            }
//        }
//        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
//        return length;
//    }

//    /**
//     * 获取水印文字图片流
//     *
//     * @param text
//     * @return
//     */
//    private static ByteArrayOutputStream getImage(String text) {
//        ByteArrayOutputStream os = new ByteArrayOutputStream();
//        try {
//            // 导出到字节流B
//            BufferedImage image = createWaterMarkImageBig(text);
//            ImageIO.write(image, "png", os);
//        } catch (IOException e) {
////            log.error("getImage fail: 创建水印图片IO异常", e);
////            throw new MyException(ResultCode.FAILURE, "getImage fail: 创建水印图片IO异常");
//            e.printStackTrace();
//        }
//        return os;
//    }
//
//    /**
//     * 根据文字生成水印图片（大号 平铺）
//     *
//     * @param text
//     * @return
//     */
//    public static BufferedImage createWaterMarkImageBig(String text) {
//        Integer width = 1000;
//        Integer height = 800;
//        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象
//        Font font = new Font("宋体", Font.PLAIN, 70);
//        Graphics2D g2d = image.createGraphics();
//        image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
//        g2d.dispose();
//        g2d = image.createGraphics();
//        //设置字体颜色和透明度
//        g2d.setColor(new Color(0, 0, 0, 60));
//        //设置字体
//        g2d.setStroke(new BasicStroke(1));
//        //设置字体类型  加粗 大小
//        g2d.setFont(font);
//        //设置倾斜度
//        g2d.rotate(Math.toRadians(-30), (double) image.getWidth() / 2, (double) image.getHeight() / 2);
//        FontRenderContext context = g2d.getFontRenderContext();
//        Rectangle2D bounds = font.getStringBounds(text, context);
//        double x = (width - bounds.getWidth()) / 2;
//        double y = (height - bounds.getHeight()) / 2;
//        double ascent = -bounds.getY();
//        double baseY = y + ascent;
//        //写入水印文字原定高度过小，所以累计写水印，增加高度
//        g2d.drawString(text, (int) x, (int) baseY);
//        //设置透明度
//        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
//        //释放对象
//        g2d.dispose();
//        return image;
//    }



//    public static File saveUrlAs(String url,String filePath,String method){
//        //System.out.println("fileName---->"+filePath);
//        //创建不同的文件夹目录
//        File file=new File(filePath);
//        //判断文件夹是否存在
//        if (!file.exists())
//        {
//            //如果文件夹不存在，则创建新的的文件夹
//            file.mkdirs();
//        }
//        FileOutputStream fileOut = null;
//        HttpURLConnection conn = null;
//        InputStream inputStream = null;
//        try
//        {
//            // 建立链接
//            URL httpUrl=new URL(url);
//            conn=(HttpURLConnection) httpUrl.openConnection();
//            //以Post方式提交表单，默认get方式
//            conn.setRequestMethod(method);
//            conn.setDoInput(true);
//            conn.setDoOutput(true);
//            // post方式不能使用缓存
//            conn.setUseCaches(false);
//            //连接指定的资源
//            conn.connect();
//            //获取网络输入流
//            inputStream=conn.getInputStream();
//            BufferedInputStream bis = new BufferedInputStream(inputStream);
//            //判断文件的保存路径后面是否以/结尾
//            if (!filePath.endsWith("/")) {
//                filePath += "/";
//            }
//            //写入到文件（注意文件保存路径的后面一定要加上文件的名称）
//            fileOut = new FileOutputStream(filePath+"123.png");
//            BufferedOutputStream bos = new BufferedOutputStream(fileOut);
//
//            byte[] buf = new byte[4096];
//            int length = bis.read(buf);
//            //保存文件
//            while(length != -1)
//            {
//                bos.write(buf, 0, length);
//                length = bis.read(buf);
//            }
//            bos.close();
//            bis.close();
//            conn.disconnect();
//        } catch (Exception e)
//        {
//            e.printStackTrace();
//            System.out.println("抛出异常！！");
//        }
//
//        return file;
//
//    }


//    @SuppressWarnings("finally")
//    public static File downloadFile(String urlPath, String downloadDir) {
//        File file = null;
//        try {
//
//            URL url = new URL(urlPath);
//
//            URLConnection urlConnection = url.openConnection();
//
//            HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;// http的连接类
//
//            //String contentType = httpURLConnection.getContentType();//请求类型,可用来过滤请求，
//
//            httpURLConnection.setConnectTimeout(1000*5);//设置超时
//
//            httpURLConnection.setRequestMethod("GET");//设置请求方式，默认是GET
//
//            httpURLConnection.setRequestProperty("Charset", "UTF-8");// 设置字符编码
//
//
//            httpURLConnection.connect();// 打开连接
//
//            BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
//
//            //TODO 修改成动态文件名称：当前审批单的文件名称
////            String fileName = "ceshi.pdf";// 指定文件名称
//
//            String path = downloadDir + File.separatorChar + fileName;// 指定存放位置，此处使用的是全局变量的文件名称
//            file = new File(path);
//            // 校验文件夹目录是否存在，不存在就创建一个目录
//            if (!file.getParentFile().exists()) {
//                file.getParentFile().mkdirs();
//            }
//
//            OutputStream out = new FileOutputStream(file);
//            int size = 0;
//
//            byte[] b = new byte[2048];
//            //把输入流的文件读取到字节数据b中，然后输出到指定目录的文件
//            while ((size = bin.read(b)) != -1) {
//                out.write(b, 0, size);
//            }
//            // 关闭资源
//            bin.close();
//            out.close();
//            System.out.println("文件下载成功！");
//        } catch (MalformedURLException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//            System.out.println("文件下载失败！");
//        } finally {
//            return file;
//        }
//
//    }

    //获取当前日期转换成指定的日期格式
//    @Test
//    public void time(){
//        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
//
//        String format = df.format(new Date());
//
//        System.out.println(format);// new Date()为获取当前系统时间
//    }

//    @Test
//    public void download(){
//
//        //下载审批附件
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/file/url/get");
//            OapiProcessinstanceFileUrlGetRequest req = new OapiProcessinstanceFileUrlGetRequest();
//            OapiProcessinstanceFileUrlGetRequest.GrantCspaceRequest obj1 = new OapiProcessinstanceFileUrlGetRequest.GrantCspaceRequest();
//
//            //TODO 审批单实例id（通过OA审批连接器获取到）
//            obj1.setProcessInstanceId("38b8f0a0-e346-42bf-87c0-53fa3fe2ace4");
//
//            //TODO 获取审批实例详情接口中 解析出文件id
//            obj1.setFileId("45388419179");
//
//            req.setRequest(obj1);
//            OapiProcessinstanceFileUrlGetResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            shenpiFJ = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject = JSON.parseObject(shenpiFJ);
//        JSONObject result = jsonObject.getJSONObject("result");
//        String download_uri = result.getString("download_uri");
//        System.out.println(download_uri);
//
//        //获取当前日期，用于创建文件保存目录中增加当前日期的文件夹作区分
//        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 yyyy-MM-dd HH:mm:ss
//        String format = df.format(new Date());
//        System.out.println(format);// new Date()为获取当前系统时间
//
//        downloadFile(download_uri,"D:\\pdf\\" + format);
//    }

    //审批详情，主要用于获取原始审批单的审批钉盘中合同附件id
//    @Test
//    public void shenpiXQ() throws IOException{
//
//        //***审批详情***
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/get");
//            OapiProcessinstanceGetRequest req = new OapiProcessinstanceGetRequest();
//
//            //TODO 审批单实例id（通过OA审批连接器获取到）
//            req.setProcessInstanceId("38b8f0a0-e346-42bf-87c0-53fa3fe2ace4");
//
//            OapiProcessinstanceGetResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            shenpiXQ = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject = JSON.parseObject(shenpiXQ);
//        JSONObject processInstance = jsonObject.getJSONObject("process_instance");
//        JSONArray form_component_values = processInstance.getJSONArray("form_component_values");
//
//        //***严格按照OA审批模板中的顺序来填写数组下标，获取附件控件的value值***
//        String value = form_component_values.getJSONObject(2).getString("value");
//        System.out.println("审批实例详情文件控件的数据：" + value);
//
//        JSONArray jsonArray = JSON.parseArray(value);
//
//        fileId = jsonArray.getJSONObject(0).getString("fileId");
//        System.out.println("审批钉盘文件id：" + fileId);
//
//        fileName = jsonArray.getJSONObject(0).getString("fileName");
//        System.out.println("审批钉盘文件名称：" + fileName);
//
//        fileSize = jsonArray.getJSONObject(0).getLong("fileSize");
//        System.out.println("审批钉盘文件长度：" + fileSize);
//
//        fileType = jsonArray.getJSONObject(0).getString("fileType");
//        System.out.println("审批钉盘文件类型：" + fileType);
//
//        spaceId = jsonArray.getJSONObject(0).getString("spaceId");
//        System.out.println("审批钉盘空间id：" + spaceId);
//
//
//
//        //***下载审批附件***
//        //调用钉钉下载审批附件的接口来下载审批单中的附件（合同pdf文件）
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/file/url/get");
//            OapiProcessinstanceFileUrlGetRequest req = new OapiProcessinstanceFileUrlGetRequest();
//            OapiProcessinstanceFileUrlGetRequest.GrantCspaceRequest obj1 = new OapiProcessinstanceFileUrlGetRequest.GrantCspaceRequest();
//
//            //TODO 审批单实例id（通过OA审批连接器获取到）
//            obj1.setProcessInstanceId("38b8f0a0-e346-42bf-87c0-53fa3fe2ace4");
//
//            //TODO 审批实例详情接口中解析出的文件id
//            obj1.setFileId(fileId);
//
//            req.setRequest(obj1);
//            OapiProcessinstanceFileUrlGetResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            shenpiFJ = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject1 = JSON.parseObject(shenpiFJ);
//        JSONObject result1 = jsonObject1.getJSONObject("result");
//        String download_uri = result1.getString("download_uri");
//        System.out.println("下载审批钉盘文件返回结果解析出来的url下载地址：" + download_uri);
//
//        //获取当前日期，用于创建文件保存目录中增加当前日期的文件夹作区分
//        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 yyyy-MM-dd HH:mm:ss
//        String format = df.format(new Date());
//        System.out.println(format);// new Date()为获取当前系统时间
//
//        downloadFile(download_uri,"D:\\pdf\\" + format);
//
//
//
//        //***合同添加水印方法***
//        //原始文件路径
//        String a = "D:\\pdf\\" + format + "\\" + fileName;
//        //添加水印后保存路径
//        String b = "D:\\pdf\\" + format + "\\AAA-" + fileName;
//        //生成合同编号
//        String c = "HT20210101-123";
//
//        setPdfWatermark(a, b, c);
//
//
//        //***单步文件上传***
//        String DB_id = null;
//
//        try {
//            OapiFileUploadSingleRequest request = new OapiFileUploadSingleRequest();
//            //文件大小
//            request.setFileSize(fileSize);
//            //应用id（自建应用id即可）
//            request.setAgentId("1200391050");
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/file/upload/single?" + WebUtils.buildQuery(request.getTextParams(), "utf-8"));
//            // 必须重新new一个请求
//            request = new OapiFileUploadSingleRequest();
//
//            //待上传文件本地路径
//            request.setFile(new FileItem(b));
//
//            OapiFileUploadSingleResponse response = client.execute(request, dingAccessTokenService.getMuZhiAccessToken());
//            DB_id = response.getBody();
//            System.out.println(response.getBody());
//        }catch (ApiException e){
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject_DB = JSON.parseObject(DB_id);
//        String media_id = jsonObject_DB.getString("media_id");
//        System.out.println("单步上传文件返回的media_id：" + media_id);
//
//
//
//        //***获取审批钉盘空间信息（企业审批附件钉盘空间，需通过获取审批钉盘空间信息接口进行【授权】）***
//        String space_XX = null;
//
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/cspace/info");
//            OapiProcessinstanceCspaceInfoRequest req = new OapiProcessinstanceCspaceInfoRequest();
//            //用户id
//            req.setUserId("manager5889");
//            //企业应用标识，此处可以不传
////            req.setAgentId(1200391050L);
//            OapiProcessinstanceCspaceInfoResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            space_XX = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject_space = JSON.parseObject(space_XX);
//        JSONObject result_space = jsonObject_space.getJSONObject("result");
//        String space_id = result_space.getString("space_id");
//        System.out.println("审批钉盘空间id：" + space_id);
//
//
//
//        //***保存文件到自定义或审批钉盘空间***
//        String DP = null;
//
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/cspace/add");
//            OapiCspaceAddRequest req = new OapiCspaceAddRequest();
//
//            //应用id（自建应用id即可）
//            req.setAgentId("1200391050");
//
//            //TODO H5应用免登接口返回的免登授权码code（获取的免登授权码有效期5分钟，且只能使用一次）
//            req.setCode("579d07c16b4f33c4adcf602ded245b28");
//
//            //单步文件上传接口返回的media_id
//            req.setMediaId(media_id);
//            //space_id是审批附件钉盘，folder_id参数传0
//            req.setFolderId("0");
//            //审批钉盘id（一个架构中，审批钉盘id是唯一的）
//            req.setSpaceId("5204064651");
//            //上传文件名称
//            req.setName(fileName);
//            //上传至钉盘审批空间是否覆盖同名文件（true：覆盖;false：不覆盖）
//            req.setOverwrite(true);
//
//            req.setHttpMethod("GET");
//            OapiCspaceAddResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            DP = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject_DP = JSON.parseObject(DP);
//        JSONObject dentry = jsonObject_DP.getJSONObject("dentry");
//        String id = dentry.getString("id");
//        System.out.println("保存文件至审批钉盘后返回的钉盘审批文件id：" + id);
//
//
//        //***发起审批实例（最终创建的OA审批单）***
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/create");
//            OapiProcessinstanceCreateRequest req = new OapiProcessinstanceCreateRequest();
//
//            //TODO 审批模板编号
//            req.setProcessCode("PROC-E148EDE8-EF20-4573-BA7E-22F26BC53A33");
//            //TODO 发起人编号
//            req.setOriginatorUserId("manager5889");
//            //TODO 发起人所在部门，根部门填写-1
//            req.setDeptId(-1L);
//
//            ArrayList<OapiProcessinstanceCreateRequest.FormComponentValueVo> formComponentValueVoArrayList = new ArrayList<>();
//
//            OapiProcessinstanceCreateRequest.FormComponentValueVo formComponentValueVo = new OapiProcessinstanceCreateRequest.FormComponentValueVo();
//            OapiProcessinstanceCreateRequest.FormComponentValueVo formComponentValueVo1 = new OapiProcessinstanceCreateRequest.FormComponentValueVo();
//            OapiProcessinstanceCreateRequest.FormComponentValueVo formComponentValueVo10 = new OapiProcessinstanceCreateRequest.FormComponentValueVo();
//
//            formComponentValueVo.setName("附件类型名称");
//            formComponentValueVo.setValue("测试附件类型输入文字···");
//
//            formComponentValueVo1.setName("合同编号-自动生成");
//            formComponentValueVo1.setValue("测试合同编号输入文字···");
//
//            JSONObject jsonObject_OA = new JSONObject();
//            //TODO 批钉盘空间id（每个架构只有一个唯一的钉盘空间id）
//            jsonObject_OA.put("spaceId", "5204064651");
//            //上传文件名称，带后缀
//            jsonObject_OA.put("fileName", fileName);
//            //文件大小，可不传，但是审批单进入后看不到文件大小
//            jsonObject_OA.put("fileSize", fileSize);
//            //上传文件格式
//            jsonObject_OA.put("fileType", fileType);
//            //TODO 审批钉盘文件id
//            jsonObject_OA.put("fileId", id);
//            Object o[] = new Object[]{jsonObject_OA};
//            String s = JSON.toJSONString(o);
//            formComponentValueVo10.setName("附件");
//            formComponentValueVo10.setValue(s);
//
//            formComponentValueVoArrayList.add(formComponentValueVo);
//            formComponentValueVoArrayList.add(formComponentValueVo1);
//            formComponentValueVoArrayList.add(formComponentValueVo10);
//
//            req.setFormComponentValues(formComponentValueVoArrayList);
//            OapiProcessinstanceCreateResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//    }

    //发起审批实例
//    @Test
//    public void create(){
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/create");
//            OapiProcessinstanceCreateRequest req = new OapiProcessinstanceCreateRequest();
//
//            //TODO 审批模板编号
//            req.setProcessCode("PROC-E148EDE8-EF20-4573-BA7E-22F26BC53A33");
//            //TODO 发起人编号
//            req.setOriginatorUserId("manager5889");
//            //TODO 发起人所在部门，根部门填写-1
//            req.setDeptId(-1L);
//
//            ArrayList<OapiProcessinstanceCreateRequest.FormComponentValueVo> formComponentValueVoArrayList = new ArrayList<>();
//
//            OapiProcessinstanceCreateRequest.FormComponentValueVo formComponentValueVo = new OapiProcessinstanceCreateRequest.FormComponentValueVo();
//            OapiProcessinstanceCreateRequest.FormComponentValueVo formComponentValueVo1 = new OapiProcessinstanceCreateRequest.FormComponentValueVo();
//            OapiProcessinstanceCreateRequest.FormComponentValueVo formComponentValueVo10 = new OapiProcessinstanceCreateRequest.FormComponentValueVo();
//
//            formComponentValueVo.setName("附件类型名称");
//            formComponentValueVo.setValue("测试附件类型输入文字···");
//
//            formComponentValueVo1.setName("合同编号-自动生成");
//            formComponentValueVo1.setValue("测试合同编号输入文字···");
//
//            JSONObject jsonObject = new JSONObject();
//            //TODO 批钉盘空间id（每个架构只有一个唯一的钉盘空间id）
//            jsonObject.put("spaceId", "5204064651");
//            //上传文件名称，带后缀
//            jsonObject.put("fileName", fileName);
//            //文件大小，可不传，但是审批单进入后看不到文件大小
//            jsonObject.put("fileSize", fileSize);
//            //上传文件格式
//            jsonObject.put("fileType", fileType);
//            //TODO 审批钉盘文件id
//            jsonObject.put("fileId", "45388419179");
//            Object o[] = new Object[]{jsonObject};
//            String s = JSON.toJSONString(o);
//            formComponentValueVo10.setName("附件");
//            formComponentValueVo10.setValue(s);
//
//            formComponentValueVoArrayList.add(formComponentValueVo);
//            formComponentValueVoArrayList.add(formComponentValueVo1);
//            formComponentValueVoArrayList.add(formComponentValueVo10);
//
//            req.setFormComponentValues(formComponentValueVoArrayList);
//            OapiProcessinstanceCreateResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//    }

    //单步文件上传
//    @Test
//    public void upload() throws IOException{
////        try {
////            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/file/upload/single");
////            OapiFileUploadSingleRequest req = new OapiFileUploadSingleRequest();
////            req.setAgentId("1200391050");
////            req.setFileSize(87585L);
////            req.setFile(new FileItem("D:\\pdf\\2021-12-06\\ceshi111.pdf"));
////            OapiFileUploadSingleResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
////            System.out.println(rsp.getBody());
////        } catch (ApiException e) {
////            e.printStackTrace();
////        }
//
//        String DB_id = null;
//
//        try {
//            OapiFileUploadSingleRequest request = new OapiFileUploadSingleRequest();
//            request.setFileSize(87585L);
//            request.setAgentId("1200391050");
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/file/upload/single?" + WebUtils.buildQuery(request.getTextParams(), "utf-8"));
//            // 必须重新new一个请求
//            request = new OapiFileUploadSingleRequest();
//            request.setFile(new FileItem("D:\\pdf\\2021-12-23\\ceshi111.pdf"));
//            OapiFileUploadSingleResponse response = client.execute(request, dingAccessTokenService.getMuZhiAccessToken());
//            DB_id = response.getBody();
//            System.out.println(response.getBody());
//        }catch (ApiException e){
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject = JSON.parseObject(DB_id);
//        String media_id = jsonObject.getString("media_id");
//        System.out.println("单步上传文件返回的media_id：" + media_id);
//
//        //最后一次调用返回：#iAEHAqRmaWxlA6h5dW5kaXNrMATOIQWGuwXNBdcGzVSmB85hwxBSCM0B2w
//    }

    //保存文件到自定义或审批钉盘空间
//    @Test
//    public void add(){
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/cspace/add");
//            OapiCspaceAddRequest req = new OapiCspaceAddRequest();
//            req.setAgentId("1200391050");
//            req.setCode("f12ccda6ffa5318489628da7dfc84877");
//            req.setMediaId("#iAEHAqRmaWxlA6h5dW5kaXNrMATOIQV2bQXNBaoGzVZSB85hw--6CM0BbA");
//            req.setFolderId("0");
//            req.setSpaceId("5204064651");
//            req.setName("ceshi222.pdf");
//            req.setOverwrite(true);
//            req.setHttpMethod("GET");
//            OapiCspaceAddResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//    }

    //获取审批钉盘空间信息（企业审批附件钉盘空间，需通过获取审批钉盘空间信息接口进行【授权】）
//    @Test
//    public void cspace(){
//
//        String space_XX = null;
//
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/cspace/info");
//            OapiProcessinstanceCspaceInfoRequest req = new OapiProcessinstanceCspaceInfoRequest();
//            //用户id
//            req.setUserId("manager5889");
//            //企业应用标识，此处可以不传
////            req.setAgentId(1200391050L);
//            OapiProcessinstanceCspaceInfoResponse rsp = client.execute(req, dingAccessTokenService.getMuZhiAccessToken());
//            space_XX = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject = JSON.parseObject(space_XX);
//        JSONObject result = jsonObject.getJSONObject("result");
//        String space_id = result.getString("space_id");
//        System.out.println("审批钉盘空间id：" + space_id);
//    }


    //茅台架构测试！！！
    //获取审批实例详情
//    @Test
//    public void MaoTaishenpiXQ(){
//        //***审批详情***
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/get");
//            OapiProcessinstanceGetRequest req = new OapiProcessinstanceGetRequest();
//
//            //TODO 审批单实例id（通过OA审批连接器获取到）
//            req.setProcessInstanceId("f2e04806-191a-456e-bac9-dcd2c3e48cb5");
//
//            OapiProcessinstanceGetResponse rsp = client.execute(req, dingAccessTokenService.getMaoTaiAccessToken());
//            shenpiXQ = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject = JSON.parseObject(shenpiXQ);
//        JSONObject processInstance = jsonObject.getJSONObject("process_instance");
//        JSONArray form_component_values = processInstance.getJSONArray("form_component_values");
//
//
//        //***严格按照OA审批模板中的顺序来填写数组下标，获取附件控件的value值***
//        String value = form_component_values.getJSONObject(8).getString("value");
//        System.out.println("审批实例详情文件控件的数据：" + value);
//
//        JSONArray jsonArray = JSON.parseArray(value);
//
//        fileId = jsonArray.getJSONObject(0).getString("fileId");
//        System.out.println("审批钉盘文件id：" + fileId);
//
//        fileName = jsonArray.getJSONObject(0).getString("fileName");
//        System.out.println("审批钉盘文件名称：" + fileName);
//
//        fileSize = jsonArray.getJSONObject(0).getLong("fileSize");
//        System.out.println("审批钉盘文件长度：" + fileSize);
//
//        fileType = jsonArray.getJSONObject(0).getString("fileType");
//        System.out.println("审批钉盘文件类型：" + fileType);
//
//        spaceId = jsonArray.getJSONObject(0).getString("spaceId");
//        System.out.println("审批钉盘空间id：" + spaceId);
//
//        originator_userid = processInstance.getString("originator_userid");
//        System.out.println("提交人id：" + originator_userid);
//
//        originator_dept_id = processInstance.getString("originator_dept_id");
//        System.out.println("提交人部门id：" + originator_dept_id);
//    }

    //获取审批钉盘空间、保存文件到审批钉盘空间
//    @Test
//    public void add_DP(){
//        //***获取审批钉盘空间信息（企业审批附件钉盘空间，需通过获取审批钉盘空间信息接口进行【授权】）***
//        String space_XX = null;
//
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/cspace/info");
//            OapiProcessinstanceCspaceInfoRequest req = new OapiProcessinstanceCspaceInfoRequest();
//            //用户id
//            req.setUserId("011556500519861159");
//            //企业应用标识，此处可以不传
////            req.setAgentId(1418526292L);
//            OapiProcessinstanceCspaceInfoResponse rsp = client.execute(req, dingAccessTokenService.getMaoTaiAccessToken());
//            space_XX = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject_space = JSON.parseObject(space_XX);
//        JSONObject result_space = jsonObject_space.getJSONObject("result");
//        String space_id = result_space.getString("space_id");
//        System.out.println("审批钉盘空间id：" + space_id);
//
//
//
//        //***保存文件到自定义或审批钉盘空间***
//        String DP = null;
//
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/cspace/add");
//            OapiCspaceAddRequest req = new OapiCspaceAddRequest();
//
//            //应用id（自建应用id即可）
//            req.setAgentId("1418526292");
//
//            //TODO H5应用免登接口返回的免登授权码code（获取的免登授权码有效期5分钟，且只能使用一次）
//            req.setCode("97778213a71f3fe99a7c3eb675285c90");
//
//            //单步文件上传接口返回的media_id
//            req.setMediaId("#iAEHAqRmaWxlA6h5dW5kaXNrMATOC7V1NwXNBXYGzVuNB85hxG6PCM0B7Q");
//            //space_id是审批附件钉盘，folder_id参数传0
//            req.setFolderId("0");
//            //审批钉盘id（一个架构中，审批钉盘id是唯一的）
//            req.setSpaceId("257306648");
//            //上传文件名称
//            req.setName("test.pdf");
//            //上传至钉盘审批空间是否覆盖同名文件（true：覆盖;false：不覆盖）
//            req.setOverwrite(true);
//
//            req.setHttpMethod("GET");
//            OapiCspaceAddResponse rsp = client.execute(req, dingAccessTokenService.getMaoTaiAccessToken());
//            DP = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject_DP = JSON.parseObject(DP);
//        JSONObject dentry = jsonObject_DP.getJSONObject("dentry");
//        String id = dentry.getString("id");
//        System.out.println("保存文件至审批钉盘后返回的钉盘审批文件id：" + id);
//    }

//    @Test
//    public void BianHao(){
//        String shenpiXQ = null;
//
//        try {
//            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/get");
//            OapiProcessinstanceGetRequest req = new OapiProcessinstanceGetRequest();
//            req.setProcessInstanceId("5e0b9c4c-4a45-449a-8094-b0f2472320ee");
//            OapiProcessinstanceGetResponse rsp = client.execute(req, dingAccessTokenService.getMaoTaiAccessToken());
//            shenpiXQ = rsp.getBody();
//            System.out.println(rsp.getBody());
//        } catch (ApiException e) {
//            e.printStackTrace();
//        }
//
//        JSONObject jsonObject = JSON.parseObject(shenpiXQ);
//        JSONObject processInstance = jsonObject.getJSONObject("process_instance");
//        JSONArray form_component_values = processInstance.getJSONArray("form_component_values");
//
//        JSONObject ext_value = form_component_values.getJSONObject(2).getJSONObject("ext_value");
//
//        JSONArray list = ext_value.getJSONArray("list");
//        String SP_ID = list.getJSONObject(0).getJSONArray("rowValue").getJSONObject(0).getString("value");
//        System.out.println("关联审批合同编号：" + SP_ID);
//    }
}