feat: 办事大厅后端源码首次入库(事项/字典/表单/申报 + 流程回调)
build / build-push (push) Failing after 39s

This commit is contained in:
chenxing
2026-09-15 11:00:00 +08:00
parent 1eeb7a4276
commit d47951abd7
70 changed files with 7569 additions and 0 deletions
@@ -0,0 +1,171 @@
package com.yunhai.svchall.entity;
import com.yunhai.svchall.enums.ServiceItemStatusEnum;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import java.time.LocalDateTime;
/**
* 事项主表(承袭 CMS cms_service_item 全字段,V2.0 Part B.2.1)。
* 变化点:site_id → site_code(跨应用后 CMS 自增 id 无意义,sch_id 定租户);
* 新增 form_code(绑定自定义表单)/ flow_guid(绑定流程中心流程,NULL=纯指南事项);
* apply_url 由 ext_json 提升为独立列。
*
* <p>主键 id 语义(V2.0 C.2"id 语义"):CMS 迁移时**原值 identity insert**——CMS 门户指南页
* 路由 /sv/{itemId} 直接携带本表主键;本应用自增起点须大于迁移 max(id)。
*
* <p>索引声明口径:带排序方向的门户列表索引(sch_id, site_code, status, sort_no ASC,
* publish_time DESC, id DESC)含 DESC 列,Hibernate {@code @Index} 无法表达,由 sql/ 升级脚本补建。
*/
@Getter
@Setter
@Entity
@Table(name = "service_item",
uniqueConstraints = @UniqueConstraint(name = "uk_svc_item_code",
columnNames = {"sch_id", "site_code", "item_code"}),
indexes = {
@Index(name = "idx_svc_item_list", columnList = "sch_id, site_code, status, online_flag, sort_no"),
@Index(name = "idx_svc_item_obj", columnList = "sch_id, site_code, status, object_key"),
@Index(name = "idx_svc_item_cat", columnList = "sch_id, site_code, status, category_key"),
@Index(name = "idx_svc_item_dept", columnList = "sch_id, site_code, status, dept_group_id"),
@Index(name = "idx_svc_item_flow", columnList = "flow_guid"),
@Index(name = "idx_svc_item_form", columnList = "form_code")})
public class ServiceItem extends BaseEntity {
/** 租户键(= UserBase 学校 id,承袭 CMS site.sch_id 口径) */
@Column(name = "sch_id", nullable = false)
private Long schId;
/** 站点编码(CMS cms_site.code 引用;办事大厅不建 site 表,站点目录经 CMS oapi 解析) */
@Column(name = "site_code", nullable = false, length = 64)
private String siteCode;
/** 事项编码,站点内唯一;跨服务键的一半(另一半是 siteCode) */
@Column(name = "item_code", nullable = false, length = 64)
private String itemCode;
/** 事项名称 */
@Column(name = "title", nullable = false, length = 200)
private String title;
/** 一句话简介(列表卡片副标题、办件 biz_snapshot 摘要) */
@Column(name = "summary", length = 500)
private String summary;
/** 服务对象,指向 service_dict(dict_type=object) 的 dict_key */
@Column(name = "object_key", length = 64)
private String objectKey;
/** 事项类别,指向 service_dict(dict_type=category) 的 dict_key */
@Column(name = "category_key", length = 64)
private String categoryKey;
/** 服务部门 = UserBase 组树节点 id 快照(不建字典表) */
@Column(name = "dept_group_id")
private Integer deptGroupId;
/** 部门名快照(列表/指南免跨服务查名;改名不自动同步,靠 syncDeptName) */
@Column(name = "dept_name", length = 128)
private String deptName;
/** 办理方式:1 线上 / 2 线下 / 3 线上线上线下(HandleModeEnum) */
@Column(name = "handle_mode", nullable = false)
private Integer handleMode = 1;
/** 是否可在线办理:1 是 / 0 否。一致性校验:=1 时 flowGuid 必须非空(V2.0 B.2.1) */
@Column(name = "online_flag", nullable = false)
private Integer onlineFlag = 1;
/** 办理地点 */
@Column(name = "handle_place", length = 200)
private String handlePlace;
/** 办理时限(文本,如"3 个工作日") */
@Column(name = "handle_time_limit", length = 64)
private String handleTimeLimit;
/** 承诺时限(文本) */
@Column(name = "promise_time_limit", length = 64)
private String promiseTimeLimit;
/** 咨询电话 */
@Column(name = "contact_phone", length = 64)
private String contactPhone;
/** 监督投诉电话 */
@Column(name = "supervise_phone", length = 64)
private String supervisePhone;
/** 办理流程(保存时 jsoup 白名单清洗;库内相对 /upload/ 路径,oapi 出参绝对化) */
@Column(name = "process_html", columnDefinition = "LONGTEXT")
private String processHtml;
/** 所需材料(同上) */
@Column(name = "material_html", columnDefinition = "LONGTEXT")
private String materialHtml;
/** 注意事项(同上) */
@Column(name = "notice_html", columnDefinition = "LONGTEXT")
private String noticeHtml;
/**
* 关联 CMS 栏目:常见问题(**不透明引用** → cms_category.id,本应用不校验存在性,
* CMS detail 转调时解析为 URL;V2.0 Part C.2/R2)
*/
@Column(name = "faq_category_id")
private Integer faqCategoryId;
/** 关联 CMS 栏目:公告信息 */
@Column(name = "notice_category_id")
private Integer noticeCategoryId;
/** 关联 CMS 栏目:文件规定 */
@Column(name = "rule_category_id")
private Integer ruleCategoryId;
/** 事项封面(库内相对 /upload/ 路径,出参绝对化) */
@Column(name = "cover_image", length = 500)
private String coverImage;
/** 绑定自定义表单 code(service_form.code;NULL=发起无需表单);发起时取最新已发布版本 */
@Column(name = "form_code", length = 64)
private String formCode;
/** 绑定流程中心流程(flw_def.flow_guid;NULL=纯指南事项不可在线办理) */
@Column(name = "flow_guid", length = 32)
private String flowGuid;
/** "我要办理"手填外链(http(s)://;三态优先级最高,承袭 CMS ext_json.apply_url 语义) */
@Column(name = "apply_url", length = 500)
private String applyUrl;
/** 管理端自定义排序(列表默认排序第一优先级,升序) */
@Column(name = "sort_no", nullable = false)
private Integer sortNo = 0;
/** 状态:0 草稿 / 1 已发布 / 2 已下架(ServiceItemStatusEnum) */
@Column(name = "status", nullable = false)
private Integer status = ServiceItemStatusEnum.DRAFT.getCode();
/** 发布时间 */
@Column(name = "publish_time")
private LocalDateTime publishTime;
/** 下架时间 */
@Column(name = "offline_time")
private LocalDateTime offlineTime;
/** 指南页浏览量(CMS 经 /oapi/svc/item/view 异步累加,不承诺精确) */
@Column(name = "view_count", nullable = false)
private Integer viewCount = 0;
/** 扩展字段 JSON(预留,一期不写) */
@Column(name = "ext_json", columnDefinition = "JSON")
private String extJson;
}