Files
weicw1996 1ff4dfffb9 feat(hjc-web): 订单页展示并下载电子发票
发票由一站式平台开具后推给后端(官方网不开票,见工作区根目录 docs/adr/0006),
订单响应里新增 invoices;文件是本平台副本,下载走与附件同一条链路(点击时取票)。

- 抽出 composable useAttachmentDownload:把「先换票据、再取文件」的逻辑从
  HjcTenderFiles 里提出来,附件与发票共用(各写一份必然分叉);同时把资源标识解析
  扩到 orderNo/projectNo/invoiceId 三种。
- 新增 HjcInvoiceFiles.vue:发票号/类型/开票日期/金额 + 下载;作废(红冲)的也列出来
  且仍可下载——它是留档凭证。
- HjcTenderFiles.vue 改用 composable,行为不变。
- 订单详情加发票区块,订单列表加「已开票」标记与发票列表。
- 不判"是否已支付":有没有发票取决于甲方开没开票,与订单当前状态无关。

校验:npm run build 通过。
2026-09-18 17:33:01 +08:00

178 lines
5.7 KiB
TypeScript
Raw Permalink 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
/**
* 公告附件(后端解析好的可下载列表)。
*
* **门槛与 `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
/**
* 电子发票:**有才有**(甲方开票后推送过来才会有这条记录)。
* 作废(红冲)的也在列表里(仍可下载原件),靠 `status` 区分。
*/
invoices?: HjcInvoiceFile[] | null
}
/**
* 电子发票(对应后端 `HjcInvoiceVo`)。
*
* 由**一站式平台开具后推给我们的**(官方网不开票,见 ADR 0006);文件留的是本平台副本,
* 下载地址同样是资源地址——点击时先换票据(见 `useAttachmentDownload`)。
*/
export interface HjcInvoiceFile {
/** 发票号码 */
invoiceNo?: string
/** VAT_NORMAL 电子普票 / VAT_SPECIAL 电子专票 */
invoiceType?: string
/** 开票日期 yyyy-MM-dd */
invoiceDate?: string
/** 发票金额(含税) */
amount?: number
/** ISSUED 已开票 / CANCELLED 已作废(红冲) */
status?: string
/** 展示名(下载时用作文件名) */
name?: string
/** 可下载地址(本平台资源地址,点击时先换票据) */
url: string
}
/** 登录用户(对应后端 common.system.User 关键字段) */
export interface HjcUser {
userId: number
username: string
nickname?: string
phone?: string
tenantId?: number
[key: string]: any
}