package com.jwipc.api.dto;

import lombok.Data;

import java.util.List;

/**
 * 功能描述:
 *
 * @Author: zx
 * @Date: 2024/4/12 0012 11:45
 */
@Data
public class SubjectDTO {


    private String subject;

    /**
     * 第三方签署流程业务id
     */
    private String businessNo;

    /**
     * 业务类型ID从统一门户-业务模板-配置-签署方式获取“签署业务类型编码）
     */
    private String businessTypeCode;

    /**
     * 是否强制阅读至最后一页：0否，1是；默认为0
     */
    private Integer readComplete;

    /**
     * 流程备注（长度200）
     */
    private String remark;

    /**
     * 签署截止日期：超过签署截止日期后流程过期
     */
    private String signFlowExpireTime;

    /**
     * 回调接口地址 完整路径
     */
    private String signNotifyUrl;

    /**
     * 付费方：1：发起方、2：相对方，默认1；需要开启“相对方付费”功能后，该参数生效
     */
    private Integer chargingType = 1;

    /**
     * 是否开启签约须知：0否，1是；默认为0
     */
    private Integer advertisement=0;

    /**
     * 签署完成重定向地址
     */
    private String redirectUrl;

    /**
     * 自动重定向时间
     * 时间：支持0-60之间整数；单位为秒
     *
     * 不传值/传空，默认为3
     * 如果传0，签署页所有文件签署成功，提交签署后则会自动跳转到redirectUrl传入的地址
     */
    private Integer autoRedirectTime;

    /**
     * 发起方信息集合
     */

    private InitiatorInfo initiatorInfo;

    /**
     * 流程文档信息集合
     */
    private List<SignFiles> signFiles ;

    /**
     * 签署方信息集合
     */
    private List<SignerInfos>  signerInfos;

    /**
     * 手动发起/结束配置项
     */
    private ManualConfig manualConfig;

    /**
     * 附件信息集合
     */
    private List attachments;

    /**
     * 抄送方信息集合
     */
//    private List CCInfos ;

    @Data
    public static class ManualConfig{

        /**
         * 流程发起方式：默认自动开启。
         * 0自动开启：创建后流程状态=签署中
         * 1手动开启：创建后流程状态=草稿，在出参返回签署区设置页地址
         */
        private Integer startMode;

        /**
         * 流程结束方式：默认自动结束。
         * 0自动结束：所有签署方签署完成，流程自动完成
         * 1手动结束：所有签署方签署完成，需调用无节点签署的【结束签署流程】接口，主动结束流程
         */
        private Integer finishMode;

        /**
         * 签署区设置页配置项（startMode传1手动开启时此参数生效，不传使用默认值。仅草稿状态的流程可以在签署区设置页设置）
         * 签署区设置页按钮：【保存】（固定显示），【发起】（根据showStartButton参数配置）
         */
        private SigningAreaPageConfig signingAreaPageConfig;


    }


    @Data
    public static class SigningAreaPageConfig{

        /**
         * 允许查看、操作的用户类型：INITIATOR发起人，ALL-INNERS所有内部用户，默认INITIATOR
         */
        private String allowUsersType;

        /**
         * 发起人打开签署区设置页，是否展示【发起】按钮，0：不显示按钮，1：显示按钮。默认1
         */
        private String showStartButton;

        /**
         * 签署区设置页重定向地址。页面保存、直接发起成功，触发跳转至重定向地址
         */
        private String areaPageRedirectUrl;

    }


    @Data
    public static class InitiatorInfo{

        /**
         * 用户编码（本系统的唯一标识）。
         * userCode、customAccountNo二选一必填，如果userCode、customAccountNo两者都有值，以userCode为准
         */
        private String userCode;

        /**
         * 用户账号（客户系统的唯一标识）。
         * userCode、customAccountNo二选一必填，如果userCode、customAccountNo两者都有值，以userCode为准
         */
        private String customAccountNo;

        /**
         * 用户所属企业编码（本系统的唯一标识）。
         * organizationCode、customOrgNo二选一必填
         * 如果organizationCode、customOrgNo两者都有值，以organizationCode为准。
         * 企业授权：企业印章管理-制作企业印章-发布后授权用印人
         */
        private String organizationCode;

        /**
         * 用户所属企业账号（客户系统的唯一标识）。
         * organizationCode、customOrgNo二选一必填
         * 如果organizationCode、customOrgNo两者都有值，以organizationCode为准。
         * 企业授权：企业印章管理-制作企业印章-发布后授权用印人
         */
        private String customOrgNo;

        /**
         * 用户默认组织编号/其他组织编号（本系统的唯一标识），需与organizationCode、customOrgNo匹配。
         * 默认取默认组织编号。
         * departmentCode  、customDepartmentNo二选一必填
         * 如果departmentCode  、customDepartmentNo两者都有值，以departmentCode为准
         */
        private String departmentCode;

        /**
         * 用户默认组织编号/其他组织账号（客户系统的唯一标识），需与organizationCode、customOrgNo匹配。
         * 默认取默认组织编号。
         * departmentCode  、customDepartmentNo二选一必填
         * 如果departmentCode  、customDepartmentNo两者都有值，以departmentCode为准。
         */
        private String customDepartmentNo;

    }

    @Data
    public static class SignFiles{

        /**
         * 签署文档fileKey（支持PDF与OFD格式文件）
         *
         * 同一流程中不能同时存在PDF与OFD文件
         */
        private String fileKey;

        /**
         * 文档顺序,用于页面文档顺序显示
         */
        private String fileOrder;

        /**
         * 是否添加二维码，0否，1是；默认为0（值为1时二维码配置以接口传值为准）
         */
        private Integer qrFile;

        /**
         * 二维码配置集合
         */
//        private List qrFileInfos;

    }

    @Data
    public static class SignerInfos{

        /**
         * 用户类型：1-内部，2-相对方
         */
        private Integer userType;

        /**
         * 用户编码（本系统的唯一标识）。
         *
         * 如果userCode、customAccountNo两者都有值，以userCode为准
         */
        private String userCode;

        /**
         * 用户账号（客户系统的唯一标识）。
         *
         * 如果userCode、customAccountNo两者都有值，以userCode为准
         */
        private String customAccountNo;

        private String departmentCode;

        private String organizationCode;

        private String customOrgNo;

        private String customDepartmentNo;

        /**
         * 是否静默签署：0否，1是；默认为0；只针对内部用户，开启静默签署后会自动使用用户的印章和证书完成签署
         */
        private Integer autoSign;

        /**
         * 签署人所在签署网络节点id；需要使用签署网络像其他系统发送签署时必传
         */
        private String estpNode;

        /**
         * 是否允许添加签署附件 0否，1是；默认为0
         */
        private Integer allowAddAttachment=0;

        /**
         * 可用印章介质：0-云印章及UKey印章、1-仅UKey印章、2-仅云印章。不传或传空时默认为2
         *
         * 外部用户不支持UKey印章
         * UKey印章不支持静默签署
         */
        private Integer UkeyOnly;

        /**
         * 签署节点，最小为1。节点之间有顺序，节点内的签署方都签署完成后，再进入下一个节点进行签署
         */
        private Integer signNode;

        /**
         * 节点内排序方式：0-顺序签，1-无序签，2-或签，默认0
         */
        private Integer signMode;

        /**
         * 节点内顺序，允许的顺序值为1-99999，无值时默认1。
         *
         * 当signMode=0顺序签，每个签署方按顺序值从小到大依次签署，同一节点内允许有多个签署方，顺序不能重复；
         *
         * 当signMode=1无序签，每个签署方签署顺序不分先后，同一节点内允许有多个签署方，顺序值传或不传，都按顺序1处理，表示无序；
         *
         * 当signMode=2或签，一方签署后，其他签署方无需签署，自动进入下一节点。同一节点内允许有多个签署方且必须都是内部 或都是外部签署方，顺序值传或不传，都按顺序1处理
         */
        private Integer signOrder;

        /**
         * 指定印章类型，签署主体为个人是不支持指定印章类型，默认不指定，支持多个，用“,”隔开
         *
         * 1.内部企业盖章数据来源于企业授权给经办人的印章类型（包含法人章）
         *
         * 2.外部企业盖章数据来源于固定印章类型：
         *
         * PUBLIC ：公章
         * CONTRACT：合同专用章
         * FINANCE：财务章
         * COMMON：其他
         * PERSONNEL：人事专用章
         *
         * LEGAL-PERSON-SEAL：法人章
         *
         * 3.如果sealTypeCode、sealId两者都有值，校验二者关系
         */
        private String sealTypeCode;

        /**
         * 签署任务信息：
         *
         * 1、指定文档进行签署；
         *
         * 2、未指定的文档：
         *
         * 2.1未指定当前签署方、指定了其他签署方签署，则对当前签署方只读。
         *
         * 2.2未指定任何签署方，则对所有签署方必签（自由签）。
         */
        private List<SealInfos> sealInfos;

    }



    @Data
    public static class SealInfos{

        /**
         * 签署文档fileKey
         */
        private String fileKey;

        /**
         * 签署位置信息;必须指定签署位置信息才可以签署
         */
        private List<SignConfigs> signConfigs;

    }

    @Data
    public static class SignConfigs{

        /**
         * 是否自由签章，0否，1是；默认为0
         *
         * 自由签章不限制签章个数
         */
        private Integer freeMode = 0;

        /**
         * 印章id，需要校验用印权限；如果sealTypeCode、signatureType有值，需同时校验印章类型是否一致。
         *
         * 自由签签署区可指定多个，多个逗号间隔
         *
         * PDF文件使用商密印章进行签署；OFD文件使用国密印章进行签署
         */
        private String sealId;

        /**
         * 是否允许移动，0否，1是；
         *
         * 1是：签署时可以在当前页面移动签署区位置；
         *
         * 0否：签署时不可以移动签署区位置；
         *
         * 不传值/传空，表示读取业务模板中【签署区/备注区默认可移动】参数，
         */
        private Integer allowMove;

        /**
         * 签署类型: COMMON-SIGN : 普通（包含单页签、多页签)， EDGE-SIGN:骑缝，KEYWORD-SIGN:关键字，默认COMMON-SIGN
         */
        private String signType;

        /**
         * 是否添加签署时间
         *
         * 指定签场景：0-否 1-是，
         *
         * addSignDate不传，落章默认不展示签署日期，日期配置不禁用；addSignDate=1时需传入sealSignDatePositionInfo
         *
         *
         * 自由签场景：0-否 1-是，addSignDate不传，落章默认不展示签署日期，日期配置不禁用；addSignDate=0无需传入sealSignDatePositionInfo
         *
         * OFD文件不支持添加签署时间
         */
        private Integer addSignDate = 0 ;

        /**
         * 骑缝章签署范围：0-指定页（默认全选），1-奇数页，2-偶数页，默认0
         */
        private Integer edgeScope=0;

        /**
         * 否强制手绘签名：0否，1是；默认为0
         *
         * 当signatureType=PERSON-SEAL时，生效
         */
        private Integer handEnable = 0;

        /**
         * 指定签署印章类型：PERSON-SEAL-个人印章、COMMON-SEAL-企业授权印章、LEGAL-PERSON-SEAL-法人章
         */
        private String signatureType;

        /**
         * 签署区类型，默认值为 0。
         *
         * 0 - 签章区（用于加盖印章或签名），1 - 备注区（用于添加备注文字信息）
         */
        private Integer signFieldType = 0;

        /**
         * 指定印章类型，签署主体为个人是不支持指定印章类型，默认不指定，支持多个，用“,”隔开
         *
         * 1.内部企业盖章数据来源于企业授权给经办人的印章类型（包含法人章）
         *
         * 2.外部企业盖章数据来源于固定印章类型：
         *
         * PUBLIC ：公章
         * CONTRACT：合同专用章
         * FINANCE：财务章
         * COMMON：其他
         * PERSONNEL：人事专用章
         *
         * LEGAL-PERSON-SEAL：法人章
         *
         * 3.如果sealTypeCode、sealId两者都有值，校验二者关系
         */
        private String sealTypeCode;

        /**
         * 关键字定位信息集合
         */
        private KeywordInfo keywordInfo;

        /**
         * 签署页码;连续页码用'-'连接，单独页码用','连接
         */
        private String pageNo;

        /**
         * x轴偏移量;骑缝签无视该参数
         *
         * PDF文件以页面左下角为原点，x偏移量正数向右偏移，负数向左偏移
         *
         * OFD文件以页面左上角为原点，x偏移量正数向右偏移，负数向左偏移
         */
        private Integer posX;

        /**
         * y轴偏移量
         *
         * PDF文件以页面左下角为原点，y偏移量正数向上偏移，负数向下偏移
         *
         * OFD文件以页面左上角为原点，y偏移量正数向下偏移，负数向上偏移
         *
         * 盖章效果：印章将以签署区定位点作为中心点进行签署
         */
        private Integer posY;
    }


    @Data
    public static class KeywordInfo{

        /**
         * 关键字（以关键字形成的矩形区域的左下角为参考点进行定位）
         *
         * 盖章效果：印章将以签署区定位点作为中心点进行签署
         */
        private String keyword;

        /**
         * 指定签署某个位置关键字,受页码范围控制。-1为最后一个,超过关键字总数选中最后一个
         */
        private Integer keywordIndex = -1 ;

        /**
         * 关键字横坐标偏移量
         *
         * PDF/OFD文件以关键字形成的矩形区域的左下角为原点，x偏移量正数向右偏移，负数向左偏移
         */
        private Double offsetPosX;

        /**
         * 关键字纵坐标偏移量
         *
         * PDF/OFD文件以关键字形成的矩形区域的左下角为原点，y偏移量正数向上偏移，负数向下偏移
         */
        private Double offsetPosY;

    }

}
