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 提升为独立列。 * *

主键 id 语义(V2.0 C.2"id 语义"):CMS 迁移时**原值 identity insert**——CMS 门户指南页 * 路由 /sv/{itemId} 直接携带本表主键;本应用自增起点须大于迁移 max(id)。 * *

索引声明口径:带排序方向的门户列表索引(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=发起无需表单);发起时取最新已发布版本。 * *

本列已停止新写入(v3/TASK_1):表单定义归表单中心,事项只能绑 {@code fcFormUuid} * 那组服务器验证过的坐标。存量行为双轨期的历史数据保留读路径(办件回显与 {@code effectiveFlowGuid} * 仍认它),保存链路遇到"写一个不一样的 code"直接拒。

*/ @Column(name = "form_code", length = 64) private String formCode; /** 绑定表单中心表单 uuid(form-center 对外身份,32 位;NULL=未绑远端表单) */ @Column(name = "fc_form_uuid", length = 32) private String fcFormUuid; /** * 绑定表单中心的确切版本(与 {@link #fcFormUuid} 成对,单传一个即拒)。 * 存的是服务器侧校验过的版本号,不是前端自由输入的字符串。 */ @Column(name = "fc_form_version") private Integer fcFormVersion; /** 绑定流程中心流程(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; // 服务承诺字段(P1-1):政务服务化度量口径,空=未维护 /** 收费标准 */ @Column(name = "fee_desc", length = 200) private String feeDesc; /** 收费依据 */ @Column(name = "fee_basis", length = 200) private String feeBasis; /** 协办部门(顿号分隔文本快照,不做部门树外键) */ @Column(name = "coop_depts", length = 500) private String coopDepts; /** 经办人员 */ @Column(name = "handler_name", length = 64) private String handlerName; /** 办理时间(办公时段,区别于 handle_time_limit 办理时限) */ @Column(name = "handle_time_desc", length = 200) private String handleTimeDesc; /** 跑现场次数(0=零跑动) */ @Column(name = "run_count") private Integer runCount; /** 是否快递送达:0 否 / 1 是(到付)/ 2 是(学校承担) */ @Column(name = "express_flag") private Integer expressFlag; /** 管理端自定义排序(列表默认排序第一优先级,升序) */ @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; }