zhangwencui
8 天以前 dab35bff798cfce2ddf7e8a67e4e1cdb144f5b4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { API_BASE_URL, request, type ApiResponse } from './request';
import type { PageResult } from './basic-data';
 
export interface StorageAttachment { id: number; name?: string; url?: string; previewURL?: string; downloadURL?: string; }
export interface TenderProject { id?: number; tenderNo: string; tenderName: string; tenderType: number; purchaseOrg?: string; projectLeaderId?: number; projectLeaderName?: string; tenderStatus?: number; biddingMode?: string; budgetAmount?: number | string; startTime?: string; endTime?: string; bidOpenTime?: string; tenderDesc?: string; qualificationRequirements?: string; blobIds?: number[]; attachmentList?: StorageAttachment[]; purchaseRequestId?: number; awardId?: number; purchaseOrderNo?: string; }
export interface TenderMaterial { id?: number; tenderProjectId: number; productId?: number; productCode?: string; productName: string; productSpec?: string; quantity?: number | string; unit?: string; techRequirement?: string; estimatedPrice?: number | string; sort?: number; }
export interface TenderBid { id?: number; tenderProjectId: number; supplierId: number; supplierName?: string; bidNo: string; bidStatus?: number; bidTime?: string; bidTotalAmount?: number | string; withdrawReason?: string; }
export interface SupplierQuote { id?: number; tenderProjectId?: number; supplierId?: number; bidId: number; tenderMaterialId: number; materialName?: string; quotePrice?: number | string; taxRate?: number | string; deliveryCycle?: number | string; paymentTerms?: string; warrantyPeriod?: number | string; remark?: string; }
export interface BidEvaluation { id?: number; tenderProjectId: number; supplierId: number; supplierName?: string; bidId: number; priceScore?: number | string; techScore?: number | string; deliveryScore?: number | string; serviceScore?: number | string; compositeScore?: number | string; rank?: number; ranking?: number; evaluatorId?: number; evaluatorName?: string; evaluationOpinion?: string; }
export interface BidAward { id?: number; tenderProjectId: number; supplierId: number; supplierName?: string; bidId: number; awardNo: string; awardStatus?: number; awardAmount?: number | string; awardTime?: string; purchaseOrderId?: number; remark?: string; }
export interface BidOpen { id: number; tenderProjectId?: number; openTime?: string; }
export interface TenderStatistics { totalTenderCount: number; totalTenderAmount: number | string; totalAwardAmount: number | string; savedAmount: number | string; winRate: number | string; supplierCount: number; period: string; }
 
function authHeader(accessToken: string) { return { Authorization: `Bearer ${accessToken}` }; }
function toQuery(params: Record<string, string | number | undefined>) { const query = Object.entries(params).filter(([, value]) => value !== undefined && value !== '').map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join('&'); return query ? `?${query}` : ''; }
const options = (accessToken: string, method?: 'POST' | 'PUT' | 'DELETE', data?: Record<string, unknown>) => ({ method, data, header: authHeader(accessToken) });
 
export const getTenderProjectPage = (token: string, params: { pageNo: number; pageSize: number; tenderName?: string; tenderStatus?: number }) => request<PageResult<TenderProject>>(`/srm/tender-project/page${toQuery(params)}`, { header: authHeader(token) });
export const getTenderProject = (token: string, id: number) => request<TenderProject>(`/srm/tender-project/get${toQuery({ id })}`, { header: authHeader(token) });
export const createTenderProject = (token: string, data: TenderProject) => request<number>('/srm/tender-project/create', options(token, 'POST', data));
export const updateTenderProject = (token: string, data: TenderProject) => request<boolean>('/srm/tender-project/update', options(token, 'PUT', data));
export const updateTenderProjectInfo = (token: string, data: Pick<TenderProject, 'id' | 'tenderDesc' | 'qualificationRequirements' | 'blobIds'>) => request<boolean>('/srm/tender-project/update-info', options(token, 'PUT', data));
export function uploadTenderFile(accessToken: string, filePath: string) {
  return new Promise<StorageAttachment>((resolve, reject) => {
    uni.uploadFile({
      url: `${API_BASE_URL}/system/storage-blob/upload`,
      filePath,
      name: 'files',
      header: authHeader(accessToken),
      success: response => {
        try {
          const data = JSON.parse(response.data) as ApiResponse<StorageAttachment[]>;
          if (data.code === 0 && data.data?.[0]) resolve(data.data[0]);
          else reject(new Error(data.msg || '文件上传失败'));
        } catch { reject(new Error('文件上传响应解析失败')); }
      },
      fail: () => reject(new Error('文件上传失败,请检查网络后重试')),
    });
  });
}
export const deleteTenderProject = (token: string, id: number) => request<boolean>(`/srm/tender-project/delete${toQuery({ id })}`, options(token, 'DELETE'));
export const publishTender = (token: string, id: number) => request<boolean>(`/srm/tender-project/publish${toQuery({ id })}`, options(token, 'PUT'));
export const closeTender = (token: string, id: number) => request<boolean>(`/srm/tender-project/close${toQuery({ id })}`, options(token, 'PUT'));
export const startBidding = (token: string, id: number) => request<boolean>(`/srm/tender-project/start-bidding${toQuery({ id })}`, options(token, 'PUT'));
export const startEvaluation = (token: string, id: number) => request<boolean>(`/srm/tender-project/start-evaluation${toQuery({ id })}`, options(token, 'PUT'));
export const startPriceComparing = (token: string, id: number) => request<boolean>(`/srm/tender-project/start-price-comparing${toQuery({ id })}`, options(token, 'PUT'));
export const confirmTenderProject = (token: string, data: { id: number; bidId: number }) => request<boolean>('/srm/tender-project/confirm', options(token, 'PUT', data));
export const getTenderMaterialList = (token: string, tenderProjectId: number) => request<TenderMaterial[]>(`/srm/tender-project/material/list${toQuery({ tenderProjectId })}`, { header: authHeader(token) });
export const createTenderMaterial = (token: string, data: TenderMaterial) => request<number>('/srm/tender-project/material/create', options(token, 'POST', data));
export const updateTenderMaterial = (token: string, data: TenderMaterial) => request<boolean>('/srm/tender-project/material/update', options(token, 'PUT', data));
export const deleteTenderMaterial = (token: string, id: number) => request<boolean>(`/srm/tender-project/material/delete${toQuery({ id })}`, options(token, 'DELETE'));
export const getTenderBidList = (token: string, tenderProjectId: number) => request<TenderBid[]>(`/srm/tender-bid/list-by-project${toQuery({ tenderProjectId })}`, { header: authHeader(token) });
export const createTenderBid = (token: string, data: TenderBid) => request<number>('/srm/tender-bid/create', options(token, 'POST', data));
export const withdrawTenderBid = (token: string, id: number) => request<boolean>(`/srm/tender-bid/withdraw${toQuery({ id })}`, options(token, 'PUT'));
export const getQuoteList = (token: string, bidId: number) => request<SupplierQuote[]>(`/srm/tender-bid/quote/list-by-bid${toQuery({ bidId })}`, { header: authHeader(token) });
export const createQuote = (token: string, data: SupplierQuote) => request<number>('/srm/tender-bid/quote/create', options(token, 'POST', data));
export const updateQuote = (token: string, data: SupplierQuote) => request<boolean>('/srm/tender-bid/quote/update', options(token, 'PUT', data));
export const getBidEvaluationList = (token: string, tenderProjectId: number) => request<BidEvaluation[]>(`/srm/bid-evaluation/list-by-project${toQuery({ tenderProjectId })}`, { header: authHeader(token) });
export const createBidEvaluation = (token: string, data: BidEvaluation) => request<number>('/srm/bid-evaluation/create', options(token, 'POST', data));
export const updateBidEvaluation = (token: string, data: BidEvaluation) => request<boolean>('/srm/bid-evaluation/update', options(token, 'PUT', data));
export const calculateBidRanking = (token: string, tenderProjectId: number) => request<boolean>(`/srm/bid-evaluation/calculate-ranking${toQuery({ tenderProjectId })}`, options(token, 'PUT'));
export const createBidOpen = (token: string, tenderProjectId: number) => request<number>(`/srm/bid-evaluation/bid-open/create${toQuery({ tenderProjectId })}`, options(token, 'POST'));
export const getBidOpen = (token: string, id: number) => request<BidOpen>(`/srm/bid-evaluation/bid-open/get${toQuery({ id })}`, { header: authHeader(token) });
export const getAwardByProject = (token: string, tenderProjectId: number) => request<BidAward | null>(`/srm/bid-award/get-by-project${toQuery({ tenderProjectId })}`, { header: authHeader(token) });
export const createAward = (token: string, data: BidAward) => request<number>('/srm/bid-award/create', options(token, 'POST', data));
export const deleteAward = (token: string, id: number) => request<boolean>(`/srm/bid-award/delete${toQuery({ id })}`, options(token, 'DELETE'));
export const approveAward = (token: string, id: number) => request<boolean>(`/srm/bid-award/approve${toQuery({ id })}`, options(token, 'PUT'));
export const generatePurchaseOrder = (token: string, id: number) => request<boolean>(`/srm/bid-award/generate-purchase-order/${id}`, options(token, 'PUT'));
export const getTenderStatistics = (token: string, year: string) => request<TenderStatistics>(`/srm/statistics/tender${toQuery({ year })}`, { header: authHeader(token) });