a322b2eed4
中标公告区域两块改动:
- 公告正文改按富文本渲染。一站式推的是富文本编辑器出的 HTML,原来当纯文本渲染
(whitespace-pre-line),会把 <p>、 、style="…" 原样显示在页面上。
判定(HTML / 纯文本)、净化、纯文本换行抽到 app/utils/richText.ts,
与 hjc-h5 的 src/utils/richText.js 同一套口径。
- 公告附件:渲染后端下发的 bulletinFiles(后端已解析成 {name,url} 并拼好完整
下载地址,含 URL 编码),复用 HjcTenderFiles 组件。公告附件是公开资料
(不判登录 / 资质 / 购买),与标书附件(付费内容、仅已支付订单下发)是两条线,
所以这里不做权限判断。
- types/tender.ts:补 bulletinFiles 字段。
验证:npm run build 通过
150 lines
4.7 KiB
TypeScript
150 lines
4.7 KiB
TypeScript
/** 汇吉采标书项目(前端视图模型,与 mp-java HjcBidProject 对齐) */
|
||
export interface Tender {
|
||
id: number
|
||
/** 项目编号 */
|
||
projectNo: string
|
||
/** 项目名称 */
|
||
projectName: string
|
||
/** 分类:服务类/工程类/货物类 */
|
||
category?: string
|
||
/** 发布时间 */
|
||
publishTime?: string
|
||
/** 投标截止时间 */
|
||
deadlineTime?: string
|
||
/** 招标人 */
|
||
tenderer?: string
|
||
/** 中标公司 */
|
||
winnerSupplier?: string
|
||
/** 中标金额 */
|
||
bidAmount?: number
|
||
/** 公告标题 */
|
||
bulletinTitle?: string
|
||
/** 公告正文 */
|
||
bulletinContent?: string
|
||
/** 公告附件(JSON字符串,一站式推送的原始值) */
|
||
bulletinFileList?: string
|
||
/**
|
||
* 公告附件(后端解析好的可下载列表)。
|
||
*
|
||
* **门槛与 `tenderFiles` 不同**:公告附件是公开资料(公告正文本来就公开下发),
|
||
* 匿名也能拿到——不判登录、不判资质、不判购买;`tenderFiles`(标书附件)才是付费内容、
|
||
* 只在已支付订单上出现。
|
||
*
|
||
* **唯一没有的情况是项目已下架**:后端对 `status != 1` 的项目不下发本字段(前端不自己判)。
|
||
*/
|
||
bulletinFiles?: HjcTenderFile[] | null
|
||
/** 标书价格(信息服务费) */
|
||
tenderPrice?: number
|
||
/** 标书附件(JSON字符串) */
|
||
tenderFile?: string
|
||
/** 开售时间 */
|
||
onsaleTime?: string
|
||
/** 停售时间 */
|
||
offsaleTime?: string
|
||
/** 售卖方式:1公司财务 2公众号 3交易中心 4政采云 */
|
||
sellingMethod?: number
|
||
/** 是否卖标书 */
|
||
needSell?: number
|
||
/** 状态:1上架 0停售 */
|
||
status?: number
|
||
/** 来源 */
|
||
dataSource?: string
|
||
/** 已售数量(下单即加、从不回退;当前已无展示用途,历史字段) */
|
||
saleCount?: number
|
||
/**
|
||
* 购买人数:后端实时统计的**已付款订单数**(`COUNT(*) WHERE pay_status=1`)。
|
||
* 口径与「人数」字面有偏差(同一企业买 2 单计 2),这是明确拍定的取值。
|
||
*/
|
||
buyerCount?: number
|
||
/**
|
||
* 当前登录企业是否已收藏本项目(后端**内联**在详情响应里的非表字段)。
|
||
* 未登录恒为 `false` —— 详情是公开接口,不因为没登录而报错。
|
||
*/
|
||
favorited?: boolean
|
||
}
|
||
|
||
/** 「我的收藏」单条(对应 mp-java HjcFavoriteVo) */
|
||
export interface HjcFavorite {
|
||
/** 收藏行 id(排查用,不是项目 id) */
|
||
id: number
|
||
/** 标书项目 id(进详情要用它,不是 id) */
|
||
projectId: number
|
||
/** 收藏时间 */
|
||
createTime?: string
|
||
/** 项目已被物理删除时为 null */
|
||
projectName?: string
|
||
projectNo?: string
|
||
category?: string
|
||
tenderPrice?: number
|
||
deadlineTime?: string
|
||
offsaleTime?: string
|
||
/**
|
||
* 售卖状态,由**后端**算好(口径只有一份):`onsale` 在售 / `ended` 已结束 / `removed` 已下架。
|
||
* 前端只渲染文案,不要自己比 status 或算时间。
|
||
*/
|
||
saleState?: 'onsale' | 'ended' | 'removed'
|
||
/**
|
||
* 本企业是否已购买该项目(已付款订单口径,与详情页「购买人数」同一口径)。
|
||
* 已购**不会**从收藏夹移除——收藏是存档,不是购物车。
|
||
*/
|
||
purchased?: boolean
|
||
}
|
||
|
||
/** 分页返回结构 */
|
||
export interface TenderPage {
|
||
list: Tender[]
|
||
count: number
|
||
}
|
||
|
||
/**
|
||
* 标书附件(对应 mp-java `HjcTenderFileVo`)。
|
||
*
|
||
* 由**后端**把项目的 `tender_file`(JSON 数组或逗号分隔)解析成结构化列表,
|
||
* 前端只渲染、不解析也不判权限。
|
||
*/
|
||
export interface HjcTenderFile {
|
||
/** 展示名;后端取不到时会兜底成「标书附件」 */
|
||
name?: string
|
||
/** 可下载地址 */
|
||
url: string
|
||
}
|
||
|
||
/**
|
||
* 订单(对应 mp-java `HjcOrder`,只列页面用得到的字段)。
|
||
*
|
||
* `tenderFiles` 是**付费内容**:只有 `payStatus === 1`(已支付)的订单,后端才会下发;
|
||
* 待支付 / 支付失败 / 已退款一律为 `null`(空数组表示已支付但项目没有附件)。
|
||
* 前端**不根据 payStatus 自己拼地址**——地址没下发就是拿不到。
|
||
*/
|
||
export interface HjcOrder {
|
||
id: number
|
||
orderNo: string
|
||
projectId?: number
|
||
projectNo?: string
|
||
projectName?: string
|
||
enterpriseName?: string
|
||
contactName?: string
|
||
contactPhone?: string
|
||
contactEmail?: string
|
||
quantity?: number
|
||
unitPrice?: number
|
||
totalAmount?: number
|
||
payMethod?: string
|
||
payTime?: string
|
||
payStatus?: number
|
||
orderStatus?: number
|
||
createTime?: string
|
||
/** 仅已支付订单由后端下发 */
|
||
tenderFiles?: HjcTenderFile[] | null
|
||
}
|
||
|
||
/** 登录用户(对应后端 common.system.User 关键字段) */
|
||
export interface HjcUser {
|
||
userId: number
|
||
username: string
|
||
nickname?: string
|
||
phone?: string
|
||
tenantId?: number
|
||
[key: string]: any
|
||
}
|