import { CptModelName, SubModelName, ActionType } from './base';
import { BusinessTypeKey } from './gather';
import { IProcessMatter, IStepMatter } from './matter';

// 环节类型
export enum SectorType {
  APPROVAL = 'approval', // 审批
  CONDITION = 'condition', // 条件
  APOSTILLE = 'apostille', // 加签
}

export enum ProcessStatus {
  WAITING = 'waiting', // 待审批
  APPROVED = 'approved', // 审批通过
  ACTIVATING = 'activating', // 当前流程
  FAILED = 'failed', //  审批退回
}

// 审批方式
export enum ApprovalWay {
  REPORT = 'report', // 上报审批
  ACCOUNT = 'account', // 指定用户
  JOINTLYSIGN = 'jointlySign', // 会签
  ORSIGN = 'orSign', // 或签
  ORDERAPPROVAL = 'orderApproval', // 依次审批
  PREACCOUNT = 'prevAccount', // 上一审批人设置
}

// 角色权限
export enum RolePermission {
  MY_REPORT = 'report', // 我的项目-项目上报
  MY_FREE_REPORT = 'freeReport', // 我的项目-指定审批人
  MY_ADD_PROJECT = 'addProject', // 我的项目-新建项目
  MY_EDIT_PROJECT = 'editProject', // 我的项目-编辑项目
  MY_EXPORT_PROJECT = 'exportProject', // 我的项目-导出项目
  MY_DEL_PROJECT = 'delProject', // 我的项目-删除项目
  MY_VIEW_PROJECT = 'viewProject', // 我的项目-查看项目
  MY_VIEW_APPROVAL = 'viewApproval', // 我的项目-审批进度
  MY_SAVE_INDEX = 'viewZbkProject', // 我的项目-指标入库
  JOIN_VIEW_PARTICIPATING_PROJECT = 'viewParticipatingProject', // 我参与的项目-查看项目
  JOIN_SAVE_INDEX = 'saveIndex', // 我参与的项目-指标入库
  JOIN_EXPORT_PARTICIPATING_PROJECT = 'exportParticipatingProject', // 我参与的项目-导出项目
  ALL_SET_PROJECT = 'setProjects', // 全部项目-项目设置
  ALL_VIEW_ALL_PROJECTS = 'viewAllProjects', // 全部项目-查看项目
  ALL_SAVE_INDEX = 'saveIndexAll', // 全部项目-指标入库
  ALL_EXPORT_PROJECTS = 'exportProjects', // 全部项目-导出项目
  ZBK_ENABLE = 'zbkEnable', // 指标库启用
  ZBK_DYNAMIC = 'zbkDynamic', // 指标库-动态计算
  ZBK_DELETE = 'zbkDelete', // 指标库-删除指标
  ZBK_OPEN_PROJECT = 'zbkOpenProject', // 指标库-打开原始项目
  ZBK_PROJECT_VISIBLE = 'zbkProjectVisibility', // 指标库-项目名称可见
  ZBK_EDIT = 'zbkEdit', // 指标库-编辑
  SAVE_INDEX = 'saveIndex', // 我参与的项目-指标入库
  CJK_ENABLE = 'cjkEnable', // 材价库-启用
  CJK_EDIT = 'cjkEdit', // 材价库-编辑
  BACK_STAGE_ENABLE = 'backstageEnable', // 小后台权限
  ENABLE_NOTICE = 'enableNotice', // 管理员发布通知
  ENABLE_LOGO = 'enableLogo',
  // TODO 指标库 区间对数
}

// 系统角色
export enum RoleType {
  SYSTEM = 'system',
  SYSTEM_NORMAL = 'systemNormal',
  NORMAL = 'normal',
}

// 角色
export interface IRole {
  ID: string;
  name: string;
  roleType: RoleType;
  frontPermission: RolePermission[];
  backstagePermission: string[]; // 后台权限
}

// 参与者模式
export enum ParticipantMode {
  ACCOUNT = 'account', // 用户模式
  ROLE = 'role', // 角色模式（未来）
}

export enum AccountConfigure {
  SKIP = 'skip', // 允许跳过
  RETURN = 'return', // 允许退回
  REVOKE = 'revoke', // 允许撤回
  ASSISTAUDIT = 'assistAudit', // 协审
  ADDSIGN = 'addSign', // 加签
  NEXTSECTOR = 'nextSector', // 是否可添加环节
}

export interface ICoreView {
  ID: string; // 用户ID
  projectIDs: string[]; // 充许协审的单位工程ID，为空数组时表示可以协审当前环节的所有项目
}

export interface IProcessAccount {
  // ID 账号ID name 名称institutionID 企事业ID
  ID: string;
  name: string; // 曾用名，不会变动
  institutionID?: string; // 单位ID（可能不会用到）
  institutionName?: string; // 单位名称（不要保存到数据库，而是在使用的时候通过ID去查）
  status: ProcessStatus; // 审批状态
  alreadyAddProcess?: boolean; // 是否已经添加了新环节（暂时用的，用于标记是否添加了环节，以后可能删除）
  configure: AccountConfigure[]; // 权限配置
  remark: string; // 审批意见(肯定有，会有默认值)
  coreViews: ICoreView[]; // 协审人信息
  projectIDs: string[]; // 允许审批的单位工程ID，为空数组时表示可以审批当前环节的所有项目
}

// 参与者信息
export interface IParticipantInfo {
  approvalWay: ApprovalWay;
  participantMode: ParticipantMode;
  accounts: IProcessAccount[];
}

// 后台的

// 流程中的一个环节
export interface IProcess {
  ID: string;
  name: string;
  sectorType: SectorType;
  seq?: number;
  createdByProcess?: string; // 上环节ID， 表示哪个环节创建的(上环节添加的)
  time?: number; // 当前环节完成时间（仅当审批通过或审批退回时会有时间）
  participantInfo: IParticipantInfo;
  afterAuditMoney?: number; // 审后的金额
  referenceID?: string; // 流程引用的templateID添加
}

export interface Members {
  ID: string;
  approvalStatus: string;
  approvalTime: number | string;
  approvalComment: string;
  name?: string;
  institutionID?: string;
  institutionName?: string;
  approvedType?: string;
}

export interface IProcessExecutorSelectedInfo {
  ID: string | number;
  label: string;
  rangeType: string;
  icon?: string;
  [key: string]: any;
}

// 3合1执行者
export interface IProcessExecutor {
  ID: string;
  permission: string[];
  configure: string[];
  businessType: BusinessTypeKey;
  gatherID: string;
  setType: string;
  participantMode: string;
  name: string;
  dataID: string;
  reportTime?: string; // 三合一审批流程第一位的上报时间
  scope?: string;
  members?: Members[];
  // 事项中组件及其权限
  inProcessMatters?: IProcessMatter[];
  // 事项后组件及其权限
  afterProcessMatters?: IProcessMatter[];
  // 用户选择器选择的值，用于回显
  selectedInfo?: IProcessExecutorSelectedInfo;
}

// 动态步骤执行者信息（选择执行者的负责人）
export interface IExecutorManager {
  type: string;
  memberID: string;
  userSelectVal: IProcessExecutorSelectedInfo;
}

export interface SimpleDynamicStep {
  stepID: string;
  stepName: string;
  executorID?: string;
  executorName?: string;
}

// export interface ICollaboratorPermission {
//   matterID: string;
//   form: string[];
//   cost: string[];
//   profile: string[];
// }

export interface ICollaboratorExecutorInfo {
  executorID: string;
  executorName: string;
  executorDataID?: string;
}

// 3合1协审人信息
export interface ICollaborator {
  ID: string; // 用户ID
  creatorID?: string; // 创建协审人的ID
  canAddCo?: boolean; // 该协审是否可以添加协审
  enable?: boolean; // 是否启用（目前只用在固定协审人上面）
  executorInfo?: ICollaboratorExecutorInfo; // 执行者
  fixCollaborator?: boolean;
  institutionID?: string; // 机构ID，只在协审角色为审批单位的时候存在
  name?: string; // 用户姓名
  deadline: string | number; //  截至时间
  // 事项中组件及其权限
  inProcessMatters?: IProcessMatter[];
  // 事项后组件及其权限
  afterProcessMatters?: IProcessMatter[];
}

// 3合1添加协审下拉选项
export interface ICollaboratorItem {
  institutionID?: string;
  institutionName?: string;
  approvalMembers: string[];
  approverName?: string;
  executorInfo?: ICollaboratorExecutorInfo;
}

// 三合一协审人范围
export interface ICollaboratorScope {
  type: string;
  accounts: string[];
  institutionRoles: string[];
}

// 组件权限配置（主审、固定协审通用）
export interface IComponentPermissionConfig {
  matterID: string;
  formPermission?: string[];
  costPermission?: string[];
  profilePermission?: string[];
  auditCommentsPermission?: string[];
  settlementPermission?: string[];
  budgetComparePermission?: string[];
  changeAuditPermission?: string[];
}

// 固定协审配置
export interface IFixedCollaboratorConfig {
  executors: string[]; // 固定协审
  permissions: IComponentPermissionConfig[];
  cooperative?: boolean; // 固定协审人是否可以添加协审
}

// 参与者配置项
export interface IParticipantConfig {
  type: string;
  accounts?: string[];
  institutionRoles?: string[];
  fixedCollaborators?: IFixedCollaboratorConfig[];
  cooperations?: { type: string; value: string }[];
  [key: string]: any;
}

export interface IProcedureParticipantExecutor {
  ID: string;
  members?: Members[];
  reportTime?: string | number;
  approvaledPermission?: string[]; // 事项后原始数据
  inProcessMatters?: IProcessMatter[];
  afterProcessMatters?: IProcessMatter[];
}

// 3合1参与者信息
export interface IProcedureParticipantInfo {
  approvalWay: string;
  configure?: IParticipantConfig[];
  executor: IProcedureParticipantExecutor;
  collaborators: ICollaborator[];
  dynamicSteps: SimpleDynamicStep[];
  stepMatters?: IStepMatter[];
}

// 3合1分支判断信息
export interface IConditionItem {
  ID: string;
  field: string;
  type: string;
  symbol: string;
  value: string;
}

// 3合1分支条件信息
// eslint-disable-next-line prettier/prettier, no-use-before-define
export interface IConditionInfoItem<T = IProcedureProcess> {
  ID: string;
  conditions: IConditionItem[];
  // eslint-disable-next-line prettier/prettier, no-use-before-define
  process: T[];
}

export interface IApostilleInfo {
  parentProcessID: string;
  parentProcessReferenceID: string;
  nextProcessID?: string;
  afterApostille?: string;
}

export interface IReturnInfo {
  process: string;
  rule: 'skip' | 'restart';
}

export interface IReturnProcessInfo {
  nextProcessReferenceID?: string;
  rule?: 'skip' | 'restart';
}

// 3合1步骤中的一个环节
export interface IProcedureProcess {
  ID: string;
  referenceID: string;
  name: string;
  sectorType: SectorType;
  isReportProcess?: boolean; // 是否上报环节（因为上报环节是特殊的，所以加个字段方便处理）
  participantInfo?: IProcedureParticipantInfo;
  conditionInfo?: IConditionInfoItem[];
  apostilleInfo?: IApostilleInfo;
  returnInfo?: IReturnProcessInfo;
  condition?: {
    ID: string;
    processID: string;
    field: string;
    fieldValue: string;
  };
  // 步骤事项中的造价是否可编辑
  costEditable?: boolean;
}

export interface IProcedureItem {
  ID: string;
  approvalStatus: string;
  content: string;
  approvalTime: string;
  firstApprovalTime?: string;
  executor?: IProcessExecutor;
  executorProcessMatter?: {
    inProcessMatters: IProcessMatter[];
    afterProcessMatters: IProcessMatter[];
  };
  collaborators?: ICollaborator[];
  isReportProcess?: boolean;
  // members?: executorMember[];
  processID?: string;
  approvalWay?: string;
  dynamicSteps?: SimpleDynamicStep[];
  stepMatters?: IStepMatter[];
  nextProcessSectorType?: SectorType;
  conclusion?: string;
  addition?: string;
  reduction?: string;
  configure?: IParticipantConfig[];
  sectorType?: 'apostille' | 'condition' | 'approval';
  apostilleInfo?: IApostilleInfo;
  apostilleProcess?: IProcedureItem;
  returnInfo?: IReturnProcessInfo;
}

export interface IScopeType {
  type: string;
  value: string;
}

export interface IApproval {
  ID: string;
  name: string;
  createdID: string;
  createdTime: number;
  process: IProcess[];
  templateProcess?: IProcedureProcess[]; // 三合一需要用的流程模板
  scope?: IScopeType[];
  subjectID?: string;
  businessType?: BusinessTypeKey;
  matterListID?: string;
  institutionID?: string;
}

export enum ApprovalStatus {
  CREATED = 'created', // 创建完成
  PROCESSING = 'processing', // 正在审批
  APPROVED = 'approved', // 审批通过
}

// 造价文件（费用项、建设项目）的添加类型
export enum CostFileAddType {
  // 上报（第一步新增）
  REPORT = 'report',
  // 步骤中新增
  ADD = 'add',
  // 增报
  ADD_REPORT = 'addReport',
}

// 新增的、增报的费用项、 建设项目需要存储的步骤信息
export interface IAddCostFileInfo {
  addType: CostFileAddType;
  // 来自步骤ID添加的
  processID: string;
  // 来自步骤ID添加的
  processName: string;
  // 创建人ID
  creatorID: string;
  // 创建人名字
  creatorName: string;
}

// 审核费用类型
export enum AuditMoneyType {
  // 建设项目相关费用
  CONSTRUCTION = 'construction',
  // 费用项
  FEE_ITEM = 'feeItem',
}

export interface IProcessAuditMoney {
  ID: string;
  type: AuditMoneyType;
  // 来源ID，有的数据是基于某条数据拷贝而来的，sourceID为被拷贝数据的ID，方便查找源数据
  sourceID?: string;
  processID: string;
  addInfo?: IAddCostFileInfo;
  data: any[];
}

// 复制到项目里的流程
export interface IProjectApproval extends IApproval {
  financialProjectID: string; // 财审项目ID
  constructionID: string; // 建设项目ID
  projectIDs: string[]; // 包含在流程里的项目（单位工程）
  status: ApprovalStatus; // 状态
  approvalTime?: number; // 审批通过时间
  currentProcessID?: string; // 当前正处于哪个环节ID
  businessID?: string; // 业务ID
  gatherID?: string;
}

// 三合一项目里的流程
export interface IProcedureApproval {
  ID: string;
  name?: string;
  gatherID: string;
  businessType: BusinessTypeKey;
  businessID: string;
  templateProcess: IProcedureProcess[];
  process: IProcedureProcess[];
}

// 流程过程中存储的数据
export interface IProcessData {
  ID: string;
  module: CptModelName | SubModelName; // 编辑的模块
  action: ActionType; // 动作,增删改等
  oDoc: any; // 存放删除时或者修改时的数据
  createTime: number; // 创建时间
}

// 备份数据集合
export interface IProcessDataDoc {
  projectID: string;
  processID: string;
  index: number;
  processData: IProcessData[];
}

// 环节状态(精简)
export enum SimpleProcessStatus {
  APPROVED = 'approved', // 审批通过
  FAILED = 'failed', // 失败
  REPORTED = 'reported', // 上报
  APOSTILLE = 'apostille', // 加签
}

// 审批待办类型
export enum ApprovalType {
  APPROVER = 'approver', // 审批
  COREVIEW = 'coreview', // 协审
  REPORT = 'report', // 上报
}

export enum FinancialProjectStatus {
  UNREPORTED = 'unreported',
  APPROVING = 'approving',
  COMPLETION = 'completion',
}

// 流程环节待办列表项
export interface IApprovalTodoData {
  approvalID: string; // 流程 id
  processID: string; // 环节 id
  financialProjectID: string; // 项目 ID
  constructionID?: string; // 建设项目 ID
  projectName?: string; // 项目名称
  reporterID?: string; // 发起人ID
  reporterName?: string; // 发起人名称
  lastID?: string; // 上环节ID（暂定为上环节用户ID，之后可能为上环节ID）
  lastName?: string; // 上环节名称（暂定为上环节用户名称，之后可能为上环节名称） 三合一是上环节名称
  nextID?: string; // 下一个步骤ID（三合一）
  nextName?: string; // 下一个步骤名称（三合一）
  reportTime?: number; // 上报时间
  lastStatus?: SimpleProcessStatus; // 上一环节的状态
  approveTime?: number; // 当前环节审批时间
  approveType?: SimpleProcessStatus; // 审批办结状态
  moveUserID?: string; // 环节流转（用户ID）
  moveUserName?: string; // 环节流转（用户名）
  approvalStatus?: ApprovalStatus; // 审批流程的状态
  type: ApprovalType; // 审批待办类型
  gatherID?: string;
  genTodoDataTime?: number; // 生成todoData的时间
}

export interface IApprovalTodoData2 {
  approvalID: string; // 流程 id
  processID: string; // 环节 id
  financialProjectID: string; // 项目 ID
  constructionID: string; // 建设项目 ID
  projectName?: string; // 项目名称
  // reporterID: string; // 发起人ID  （删）
  // reporterName: string; // 发起人名称（删）
  lastID?: string; // 为上环节用户ID
  lastName?: string; // 上环节用户名称
  // reportTime: number; // 上报时间（删）
  lastStatus?: SimpleProcessStatus; // 上环节办结状态
  // approveTime: number; // 审批办结时间（删）
  approveType?: SimpleProcessStatus; // 审批办结状态
  // approvalStatus: ApprovalStatus; // 审批流程的状态（删）
  moveUserID?: string; // 环节流转（用户ID）
  moveUserName?: string; // 环节流转（用户名）
  type: ApprovalType; // 审批待办类型
}

export enum TodoType {
  APPROVAL = 'approval',
}

export enum TodoStatus {
  REMAIN = 'remain',
  COMPLETED = 'completed',
}

export interface ITodo {
  ID: string; // 待办 ID
  userID: string; // 用户 ID
  createdTime: number; // 创建时间（相当于环节流转时间）
  completedTime: number; // 完成时间（相当于审批办结时间）
  todoType: TodoType;
  data: any;
  status: TodoStatus;
}

export interface IApprovalTodo extends ITodo {
  data: IApprovalTodoData;
}

export enum ChangeRecord {
  CURRENT = 'current', // 当前清单
  ALLBILLS = 'all-bills', // 全部清单
  ALLGLJS = 'all-gljs', // 全部材价
}

export enum BusinessType {
  /** 预算 */
  BUDGET = 'undo',
  /** 结算 */
  SETTLEMENT = 'doing',
  /** 决算 */
  FINAL = 'done',
}

export enum BusinessStatus {
  /** 未上报 */
  UNREPORTED = 'unreported',
  /** 审批中 */
  APPROVING = 'approving',
  /** 审批完成 */
  COMPLETION = 'completion',
}

export interface IBusinessApprovalItem {
  ID?: string;
  name?: string;
  code?: string;
  gatherID?: string;
  businessType?: BusinessType;
  status?: BusinessStatus;
  /** 送审时间 */
  sendReviewTime?: string;
  /** 审结时间 */
  completionTime?: string;
  /** 送审金额 */
  reportMoney?: string;
  /** 审结金额 */
  conclusion?: string;
  /** 审增金额 */
  addition?: string;
  /** 审减金额 */
  reduction?: string;
  created?: string;
  createdID?: string;
  createTime?: string;
}

export interface IConditionSetting {
  ID: string;
  gatherID: string;
  schema?: string;
}

// 审核金额 核减、增金额数据
export interface IAuditSummaryDiff {
  // 核减金额
  decFee: string;
  // 核增金额
  incFee: string;
  // 核减率
  decRate: string;
  // 核减率提示
  decRateTips?: string;
  // 核增率
  incRate: string;
  // 核增率提示
  incRateTips?: string;
}

// 审批金额汇总表数据
export interface IAuditSummaryItem {
  // 阶段
  stage: string;
  // 执行者名称
  executor: string;
  // 执行者单位
  institution: string;
  // 审核步骤名称
  process: string;
  // 审结时间
  approvalTime: string;
  // 金额
  fee: string;
  // 大写金额
  feeInWords: string;
  // 与上一阶段对比
  compareToPrev: IAuditSummaryDiff;
  // 与上送审对比
  compareToReport: IAuditSummaryDiff;
}

// 审核明细数据
export interface IAuditDetailItem {
  // 唯一标识，table渲染需要
  ID: string;
  // 步骤名
  process: string;
  // 单位
  institution: string;
  // 姓名
  userName: string;
  // 角色：负责人、协审
  role: string;
  // 起始金额
  beginFee: string;
  // 结束金额
  endFee: string;
  // 审增
  incFee: string;
  // 审减
  decFee: string;
  // 增减比例
  rate: string;
  // 状态文本
  status: string;
  // 审核状态
  approvalStatus: string;
  // 协审为子项
  children: IAuditDetailItem[];
}

// 审核意见表（入库数据）
export interface IAuditComment {
  ID: string;
  // 业务ID
  businessID: string;
  // 关联模板步骤ID（一个步骤只有一份意见，所以得用模板ID，不能用全环节中的步骤）
  refProcessID: string;
  // 富文本
  richText: string;
  // 创建时间
  createTime: number;
  // 更新时间
  updateTime: number;
  // 富文本模板（只有第一版才有内容，方便还原模板）
  template?: string;
}

// 审核意见历史
export interface IAuditCommentHistory {
  // 意见ID
  commentID: string;
  // 步骤
  process: string;
  // 版本（第几版）
  version: string;
  // 执行者
  executor: string;
  // 单位
  institution: string;
  // 审批通过时间
  approvalTime?: string;
  // 审批状态
  status: ProcessStatus;
}

// 传统结算未上报数据
export interface ISettlementItem {
  // 建设项目ID
  constructionID: string;
  // 名称
  name: string;
  // 项目原报金额
  orgFee: string;
  // 当前步骤审核金额
  curFee: string;
  // 清单检测合格率
  billCheckRate: string;
  // 费用项ID
  feeID?: string;
  // 费用类型
  type?: AuditMoneyType;
  // 备注
  remark?: string;
}

// 传统结算已上报审核数据
export interface ISettlementAuditItem {
  // 唯一标识，table渲染需要
  ID: string;
  // 建设项目ID
  constructionID?: string;
  // 名称
  name: string;
  // 起始金额
  beginFee?: string;
  // 结束金额
  endFee?: string;
  // 增减金额
  incFee?: string;
  decFee?: string;
  // 增减率
  incRate?: string;
  decRate?: string;
  // 审核通过时间
  approvalTime?: string;
  // 用户信息
  user?: {
    name: string;
    institution: string;
    executor: string;
  };
  // 审核状态
  approvalStatus?: string;
  children: ISettlementAuditItem[];
  // 数据是否是原始数据（有的费用项是从上一步拷贝而来的，不给删除）
  isOriginal?: boolean;
  // 费用项ID
  feeID?: string;
  // 费用类型
  type?: AuditMoneyType;
  // 备注
  remark?: string;
  // 新增、增报项目费用项步骤信息
  addInfo?: IAddCostFileInfo;
  // 等待审批通过的行
  waitApproved?: boolean;
}

// 概算预算阶段造价对比 审核明细表格数据
export interface IBudgetEstimateTableItem {
  name: string;
  // 原报金额
  reportFee: string;
  // 审核金额
  auditFee: string;
  // 增减金额
  incFee?: string;
  decFee?: string;
  // 增减率
  incRate?: string;
  decRate?: string;
  // 审核状态
  approvalStatus?: string;
  // 审核状态文本
  approvalStatusText?: string;
}

export interface IApostilleParamUser {
  ID?: string;
  type?: string;
}

export enum AddSignType {
  MYDEPARTMENT = 'myDepartment', // 本部门
  ALLDEPARTMENT = 'allDepartment', // 本部门及下属部门
  MYINSTITUTION = 'myInstitution', // 本单位
  ACCOUNT = 'account', // 用户
  INSTITUTION = 'institution', // 单位
  DEPARTMENT = 'department', // 部门
  CONSTRUCTION = 'construction', // 建设单位
  CONSULTING = 'consulting', // 咨询单位
  AUDIT = 'audit', // 审核单位
  ALLEXECUTOR = 'allExecutor', // 执行者目录
  EXECUTOR = 'executor', // 执行者
  ALLINSTITUTIONROLE = 'allInstitutionRole', // 单位接收人目录
  INSTITUTIONROLE = 'institutionRole', // 单位接收人
}

export enum RangeSelectType {
  USER = 'user',
  ROLE = 'role',
}

export interface IRangeSelectTree<T extends RangeSelectType = any> {
  ID: string | number;
  label: string;
  rangeType: T;
  children?: IRangeSelectTree<T>[];
  icon?: string;
  [key: string]: any;
}

export interface IApostilleParam {
  permissions: Record<string, string[]>;
  user: IApostilleParamUser;
  afterApostille: 'next' | 'me';
  canCollaborate: boolean;
  collaborators: IRangeSelectTree[];
}
