億夏內容提醒管理系統
背景
許多中小企業面臨這樣的問題,比如合同或者文件資料都有一個到期時間,到期的時候需要去提醒相應的主體去做相應的事情,但是以前往往是通過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;
}