package com.malk.service.dingtalk;

import com.malk.server.dingtalk.DDR_New;

import java.io.File;
import java.util.List;
import java.util.Map;

public interface DDClient_Workflow {

    /**
     * 发起审批实例 [旧版本有字段报错提示] ppExt: 子组件内的数字输入框只要是开了编辑权限的，审批以后都会计入修改记录 [但手动发起不编辑不会记录]
     *
     * @param body_ext 包含必填字段, 不能为空, 统一扩展合并到请求参数内
     * @implNote 若approvers已传值时（即直接指定审批人列表, 最大列表长度：20。），则deptId不需填写。若approvers未传值时（即不直接指定审批人列表），则deptId需必填，若为根部门ID需填1。
     * @implNote targetSelectActioners 使用OA后台设置的默认流程，并且流程中有审批人自选节点，该参数必填。
     * @implNote formComponentValues 表单数据内容，控件列表，最大列表长度：150。
     */
    String doProcessInstances(String access_token, String originatorUserId, String processCode, List formComponentValues, Map body_ext);

    /**
     * 获取审批实例详情
     */
    Map getProcessInstanceId(String access_token, String processInstanceId);

    /**
     * 撤回审批实例 NOTE: 终审通过无法撤销，若是假勤管理单据才能通知撤销
     *
     * @param processInstanceId 审批实例ID
     * @param isSystem          是否通过系统操作
     * @param remark            终止说明
     * @param operatingUserId   操作人的userid, 当isSystem为false时，该参数必传
     */
    boolean terminateRunningApprove(String access_token, String processInstanceId, boolean isSystem, String remark, String operatingUserId);

    /**
     * 同意或拒绝审批任务
     */
    boolean executeRunningApprove(String access_token, String processInstanceId, String actionerUserId, String taskId, String result, String remark, Map file);

    /**
     * 通知审批撤销
     */
    boolean cancelRunningApprove(String access_token, String userid, String approve_id);

    /**
     * 添加审批评论
     *
     * @param processInstanceId 审批实例ID
     * @param file              文件
     * @param text              评论的内容
     * @param commentUserid     评论人的userid
     */
    boolean commentApproveInstance(String access_token, String processInstanceId, File file, String text, String commentUserid);

    /**
     * 获取审批实例ID列表
     *
     * @param body_ext 扩展参数
     *                 - nextToken 分页游标: 如果是首次调用，该参数不传。
     *                 - maxResults 分页参数，每页大小，最多传20。
     *                 - userIds 发起人userId列表，最大列表长度为10。
     *                 - statuses 流程实例状态：NEW：新创建, RUNNING：审批中, TERMINATED：被终止, COMPLETED：完成, CANCELED：取消
     */
    Map getInstanceIds(String access_token, String processCode, long startTime, long endTime, Map body_ext);

    /**
     * 获取审批实例ID列表_全部 [若轮询, 时间需要覆盖]
     *
     * @param startTime 审批实例开始时间，Unix时间戳，单位毫秒。
     * @param endTime   审批实例结束时间，Unix时间戳，单位毫秒。
     */
    List<String> getInstanceIds_all(String access_token, String processCode, long startTime, long endTime, Map extInfo);

    /**
     * 创建钉钉待办任务
     *
     * @param createUserId       包含 unionId 与 operatorId 参数, 通过 userId 换取对应的 unionId 值
     * @param subject            待办标题，最大长度1024
     * @param description        待办备注描述，最大长度4096 [不显示]
     * @param dueTime            截止时间，Unix时间戳，单位毫秒
     * @param executorIds        执行者的unionId，最大数量1000
     * @param participantIds     参与者的unionId，最大数量1000
     * @param detailUrl          详情页url跳转地址: appUrl APP端详情页url跳转地址, pcUrl PC端详情页url跳转地址
     * @param isOnlyShowExecutor 生成的待办是否仅展示在执行者的待办列表中
     * @param priority           优先级，取值：10：较低, 20：普通, 30：紧急,40：非常紧急
     * @param notifyConfigs      待办通知配置: dingNotify DING通知配置，目前仅支持取值为1，表示应用内DING
     */
    @Deprecated
    DDR_New createTBTask(String access_token, String createUserId, String subject, String description, long dueTime, List<String> executorIds, List<String> participantIds, Map detailUrl, boolean isOnlyShowExecutor, int priority, Map notifyConfigs);

    /**
     * 创建钉钉个人待办任务
     *
     * @apiNote https://open.dingtalk.com/document/isvapp/api-createpersonaltodotask
     */
    DDR_New createPersonalTodo(String access_token, String user_token, String subject, List<String> executorIds, Map extInfo);
}
