/** 短信消息 */
@extendAbstractAuditingEntity
@skipFakeData
@entityPackage(system)
@moduleName(system)
@skipMobile
entity SmsMessage {
  title String /** 消息标题 */
  sendType MessageSendType /** 发送方式 */
  receiver String /** 接收人 */
  /**
   * 发送所需参数
   * Json格式
   */
  params String
  content TextBlob /** 推送内容 */
  sendTime ZonedDateTime /** 推送时间 */
  sendStatus SendStatus /** 推送状态 */
  /**
   * 发送次数
   * 超过5次不再发送
   */
  retryNum Integer
  failResult String /** 推送失败原因 */
  remark String /** 备注 */
}

/**
 * 系统通告
 */
@extendAbstractAuditingEntity
@skipFakeData
@entityPackage(system)
@useTemplate(edit)
@moduleName(system)
@addCustomMethod(repository-clientService-service-listComponent-rest)
@publicApiBy("category=NOTICE,receiverType=ALL")
@skipComponent(appEditPage)
@mobileConfig(addToBottomNav-addToHomeMenu-addToHomeRecommend)
entity Announcement {
  title String required /** 标题 */
  @endUsed(textArea)
  summary TextBlob /** 摘要 */
  content TextBlob /** 内容 */
  startTime ZonedDateTime /** 开始时间 */
  endTime ZonedDateTime /** 结束时间 */
  @fieldConfig(hideInForm)
  senderId <%= databaseTypeSql ? userIdTypeName : 'String'%> /** 发布人Id */
  /**
   * 优先级
   *（L低，M中，H高）
   */
  priority PriorityLevel
  /**
   * 消息类型
   * 通知公告,系统消息
   */
  category AnnoCategory
  /**
   * 通告对象类型
   *（USER:指定用户，ALL:全体用户）
   */
  receiverType ReceiverType required
  /**
   * 发布状态
   *
   */
  @fieldConfig(hideInForm)
  sendStatus AnnoSendStatus
  @fieldConfig(hideInForm)
  sendTime ZonedDateTime /** 发布时间 */
  @fieldConfig(hideInForm)
  cancelTime ZonedDateTime /** 撤销时间 */
  /**
   * 业务类型
   * (email:邮件 bpm:流程)
   */
  @fieldConfig(hideInForm)
  businessType AnnoBusinessType
  @fieldConfig(hideInForm)
  businessId <%= databaseTypeSql ? 'Long' : 'String'%> /** 业务id */
  openType AnnoOpenType /** 打开方式 */
  openPage String /** 组件/路由 地址 */
  // @customWrapType(Array_<%= databaseTypeSql ? 'Long' : 'String'%>)
  @showBy("receiverType!=ALL")
  @endUsed(selectModal)
  @collectIdByRelationFrom("User=receiverType")
  receiverIds TextBlob /** 指定接收者id */
}
/**
 * 发布状态
 */
enum AnnoSendStatus {
    /** 未发布 */
    NOT_RELEASE,
    /** 已发布 */
    RELEASED,
    /** 已撤销 */
    CANCELED
}
/**
 * 打开方式
 */
enum AnnoOpenType {
    /** URL地址 */
    URL,
    /** 组件 */
    COMPONENT,
    /** 弹窗详情 */
    MODAL_DETAIL
}
/**
 * 业务类型
 */
enum AnnoBusinessType {
    /** 邮件 */
    EMAIL,
    /** 工作流 */
    WORKFLOW
}
/**
 * 通告对象类型
 */
enum ReceiverType {
    /** 全部 */
    ALL,
    /** 用户 */
    USER,
    /** 部门 */
    DEPARTMENT,
    /** 角色 */
    AUTHORITY,
    /** 岗位 */
    POSITION
}

/**
 * 消息类型
 */
enum AnnoCategory {
    /** 系统消息 */
    SYSTEM_INFO,
    /** 通知 */
    NOTICE,
    /** 待办 */
    TODO
}
/**
 * 优先级
 */
enum PriorityLevel {
    /** 高 */
    HIGH,
    /** 中 */
    MEDIUM,
    /** 低 */
    LOW
}

/**
 * 通告阅读记录
 */
@extendAbstractAuditingEntity
@skipFakeData
@entityPackage(system)
@addCustomMethod(service)
@skipMenu
@skipWebButton(listEdit-listDelete-listAdd)
@moduleName(system)
@skipComponent(appEditPage)
entity AnnouncementRecord {
  anntId <%= databaseTypeSql ? 'Long' : 'String'%> /** 通告ID */
  userId <%= databaseTypeSql ? userIdTypeName : 'String'%> /** 用户id */
  hasRead Boolean /** 是否已读 */
  readTime ZonedDateTime /** 阅读时间 */
}

/**
 * 任务配置
 */
@extendAbstractAuditingEntity
@skipFakeData
@entityPackage(taskjob)
@moduleName(taskjob)
@addCustomMethod(service)
@importData
@skipMobile
@skipWebsite
entity TaskJobConfig {
    name String /** 任务名称 */
    jobClassName String /** 任务类名 */
    cronExpression String /** cron表达式 */
    parameter String /** 参数 */
    description String /** 描述 */
    jobStatus JobStatus /** 任务状态 */
}
/** 任务状态 */
enum JobStatus {
    /** 正常 */
    NORMAL,
    /** 暂停 */
    PAUSED,
    /** 完成 */
    COMPLETE,
    /** 错误 */
    ERROR,
    /** 阻塞 */
    BLOCKED
}

/** 推送状态 */
enum SendStatus {
    /** 未推送 */
    WAITING,
    /** 推送成功 */
    SUCCESS,
    /** 推送失败 */
    FAILURE,
    /** 失败不再发送 */
    NOT_TRY
}

service all with serviceClass
filter *
dto all with mapstruct
paginate all with pagination
clientRootFolder SmsMessage, Announcement, AnnouncementRecord, TaskJobConfig with system
clientRootFolder TaskJobConfig with taskjob @I18nValue("定时任务")
//<%_ if (searchEngine === 'elasticsearch') { _%>
search SmsMessage, Announcement, AnnouncementRecord with elasticsearch
//<%_ } _%>
