Files
svc-hall-service/src/main/java/com/yunhai/svchall/entity/ServiceItem.java
T
chenxing 391281582a
build / build-push (push) Successful in 1m21s
t1~t3+精修: 事项FC绑定/可信建件(意图+投影+恢复)/答卷对账Worker
含10-22精修: 对账有限重试(retry_count/指数退避/work_version防旧覆盖)+接缝身份(source-app-key空拒收)+应急对账闸让位FlowApplyRecoveryService+同attempt指令不重开终态。SQL未执行。
2026-10-22 10:03:07 +08:00

218 lines
8.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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=发起无需表单);发起时取最新已发布版本。
*
* <p><b>本列已停止新写入</b>(v3/TASK_1):表单定义归表单中心,事项只能绑 {@code fcFormUuid}
* 那组服务器验证过的坐标。存量行为双轨期的历史数据保留读路径(办件回显与 {@code effectiveFlowGuid}
* 仍认它),保存链路遇到"写一个不一样的 code"直接拒。</p>
*/
@Column(name = "form_code", length = 64)
private String formCode;
/** 绑定表单中心表单 uuid(form-center 对外身份,32 位;NULL=未绑远端表单) */
@Column(name = "fc_form_uuid", length = 32)
private String fcFormUuid;
/**
* 绑定表单中心的<b>确切版本</b>(与 {@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;
}