亿夏内容提醒管理系统
背景
许多中小企业面临这样的问题,比如合同或者文件资料都有一个到期时间,到期的时候需要去提醒相应的主体去做相应的事情,但是以前往往是通过excel等软件来手工完成相应的工作,但是随着内容的增多,针对excel的手工提醒方式已经不能满足日常工作的需要, 因此急需要一款专门用于资料的汇总查询管理并自带提醒功能的软件来完成相应的操作,把手工做这件事情的人力资源解放出来。 由于之前研究过动态表单,就是用户自己定义字段生成一个表单,然后使用,就在这个万能表单的基础上添加提醒功能,构建了一个内容提醒管理系统。
提醒系统的构建主要注意的问题:
- 不能重复提醒,很多程序比如提醒短信等等,发送完成之后没有立即更改提醒状态,就会导致多次发送邮件或者短信的情况
- 提醒内容的排序,将要提醒的内容是排在最前面的,也就是时间升序,但是已经过期的内容是需要按照最近过期的排序,也就是倒序,这个时候可能需要用到case when来分别处理两种情况
- 多个提醒点的设置要考虑提醒历史和时间先后的计算。
大致总结一下完成的特性:
- 可任意自定义字段
- 安全,所有内容在用户的本地机器上
- 可通过邮件等方式进行有效的提醒
- 支持多用户
- 一键安装部署
包含
- 可实现对有截止日期内容的邮件提醒,可设置多个提醒时间点,比如提前三十天,十天进行提醒。(后期会加入企业微信,公众号,和钉钉等提醒方式)
- 用户自主定制所资料所需要的字段,允许定义文件类型的字段。理论上可支持任意类型的资料数据的管理和提醒。
- 资料内容完全自主定制,可实现内容的增删改查导出,不设置提醒时相当于一个万能资料管理系统。
演示效果图:
主要代码展示:
@QClass(name = "自定义类")
@Entity
@Table(name = "b_my_class")
public class MyClass extends BaseEntity {
@QField(name = "名称", as = {A.edit, A.show, A.query}, query = Q.like, nullable = false)
@Column(name = "name", columnDefinition = "varchar(100) COMMENT '名称'")
private String name;
@QField(name = "是否提醒")
@Column(name = "if_remind", columnDefinition = "varchar(255) COMMENT '是否提醒'")
@Enumerated(EnumType.STRING)
private YesNo ifRemind;//是否提醒
@OneToMany(mappedBy = "myClass", cascade = CascadeType.ALL)
@JsonManagedReference
@OrderBy("seq ASC")
private List<MyProperty> properties;
}
@QClass(name = "动态实体")
@Entity
@Table(name = "b_my_object")
public class MyObject extends BaseEntity {
@ManyToOne
@JoinColumn(name = "my_class_id")
private MyClass myClass;
@QField(name = "到期时间", type = QType.date, as = {A.edit, A.show}, query = Q.like)
@Column(name = "expiration_date", columnDefinition = "datetime COMMENT '到期时间'")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date expirationDate;//到期时间
@QField(name = "通知历史")
@Column(name = "notice_history", columnDefinition = "varchar(100) COMMENT '通知历史'")
private String noticeHistory;//通知历史(比如90,20,40),每通知一次都会增量保存,下次判断是否通知的时候会先排序,然后跟设定的提醒天数进行比较,来动态确定下一步是否继续提醒
@QField(name = "是否过期")
@Column(name = "expired")
private Integer expired = 0;//是否过期
@OneToMany(mappedBy = "myObject", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Item> items;
@Transient
private Map<String, String> propertyMap;
@Transient
private String expirationDateStr;
}
@QClass(name = "自定义属性")
@Entity
@Table(name = "b_my_property")
public class MyProperty extends BaseEntity {
@QField(name = "名称", as = {A.edit, A.show}, query = Q.like, nullable = false)
@Column(name = "name", columnDefinition = "varchar(100) COMMENT '名称'")
private String name;//名称
@QField(name = "字段")
@Column(name = "field", columnDefinition = "varchar(100) COMMENT '字段'")
private String field;//字段
@QField(name = "类型", as = {A.edit, A.show}, query = Q.like)
@Column(name = "field_type", columnDefinition = "varchar(50) COMMENT '类型'")
@Enumerated(EnumType.STRING)
private FieldType fieldType;//类型
@QField(name = "是否显示", as = {A.show}, query = Q.like)
@Column(name = "if_show")
private Boolean ifShow;//是否显示
@QField(name = "排序", nullable = false)
@Column(name = "seq")
private Integer seq;
@ManyToOne
@JoinColumn(name = "my_class_id")
@JsonBackReference
private MyClass myClass;
}