Files
hjc-web/app/types/tender.ts
T
weicw1996 2e847b5e09 feat(hjc-web): 新建订单详情页,订单列表与详情支持下载已支付订单的标书
此前 PC 没有订单详情页,标书下载只有两句文案(`.scratch/hjc-web-order-detail/01`)。

- 新增 `app/pages/tender/orders/[id].vue`:订单状态、标书附件、待支付操作区、
  标书/支付/购买人信息;取数走 `useRequestFetch()`(裸 `$fetch` 在 SSR 不转发 Cookie,
  会把用户登出)
- `app/pages/tender/orders.vue` → `orders/index.vue`:Nuxt 里同名 file+目录会生成父子路由,
  详情页会被父页吞掉,必须让列表页是 `index.vue`
- 列表页每张卡片加「标书附件」(仅已支付)与「查看详情」,不整卡可点(卡内已有按钮与链接)
- 新增 `app/components/HjcTenderFiles.vue` 与代理 `server/api/tender/order-detail.get.ts`
- 附件地址来自后端按 `payStatus=1` 下发的 `tenderFiles`,前端不做权限判断、不自己拼地址

规格与验收:`.scratch/hjc-tender-download/`
2026-09-17 18:09:27 +08:00

140 lines
4.1 KiB
TypeScript
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.
/** 汇吉采标书项目(前端视图模型,与 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
/** 标书价格(信息服务费) */
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
}