fix(shopyy): 修复订单查询参数映射问题并添加时间范围支持
修正shopyy服务中获取所有订单的参数映射逻辑,添加支付时间范围支持 统一处理日期格式转换,确保参数正确传递 同时清理合并冲突标记和冗余代码
This commit is contained in:
parent
bfa03fc6a0
commit
c75c0a614f
|
|
@ -23,7 +23,7 @@ import {
|
||||||
UpdateReviewDTO,
|
UpdateReviewDTO,
|
||||||
OrderPaymentStatus,
|
OrderPaymentStatus,
|
||||||
} from '../dto/site-api.dto';
|
} from '../dto/site-api.dto';
|
||||||
import { UnifiedPaginationDTO, UnifiedSearchParamsDTO, } from '../dto/api.dto';
|
import { UnifiedPaginationDTO, UnifiedSearchParamsDTO, ShopyyGetAllOrdersParams } from '../dto/api.dto';
|
||||||
import {
|
import {
|
||||||
ShopyyAllProductQuery,
|
ShopyyAllProductQuery,
|
||||||
ShopyyCustomer,
|
ShopyyCustomer,
|
||||||
|
|
@ -40,6 +40,7 @@ import {
|
||||||
OrderStatus,
|
OrderStatus,
|
||||||
} from '../enums/base.enum';
|
} from '../enums/base.enum';
|
||||||
import { BatchOperationDTO, BatchOperationResultDTO } from '../dto/batch.dto';
|
import { BatchOperationDTO, BatchOperationResultDTO } from '../dto/batch.dto';
|
||||||
|
import dayjs = require('dayjs');
|
||||||
export class ShopyyAdapter implements ISiteAdapter {
|
export class ShopyyAdapter implements ISiteAdapter {
|
||||||
shopyyFinancialStatusMap = {
|
shopyyFinancialStatusMap = {
|
||||||
'200': '待支付',
|
'200': '待支付',
|
||||||
|
|
@ -569,9 +570,21 @@ export class ShopyyAdapter implements ISiteAdapter {
|
||||||
per_page,
|
per_page,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
mapGetAllOrdersParams(params: UnifiedSearchParamsDTO) :ShopyyGetAllOrdersParams{
|
||||||
|
|
||||||
|
const pay_at_min = dayjs(params.after || '').valueOf().toString();
|
||||||
|
const pay_at_max = dayjs(params.before || '').valueOf().toString();
|
||||||
|
|
||||||
|
return {
|
||||||
|
page: params.page || 1,
|
||||||
|
per_page: params.per_page || 20,
|
||||||
|
pay_at_min: pay_at_min,
|
||||||
|
pay_at_max: pay_at_max,
|
||||||
|
}
|
||||||
|
}
|
||||||
async getAllOrders(params?: UnifiedSearchParamsDTO): Promise<UnifiedOrderDTO[]> {
|
async getAllOrders(params?: UnifiedSearchParamsDTO): Promise<UnifiedOrderDTO[]> {
|
||||||
const data = await this.shopyyService.getAllOrders(this.site.id, params);
|
const normalizedParams = this.mapGetAllOrdersParams(params);
|
||||||
|
const data = await this.shopyyService.getAllOrders(this.site.id, normalizedParams);
|
||||||
return data.map(this.mapPlatformToUnifiedOrder.bind(this));
|
return data.map(this.mapPlatformToUnifiedOrder.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,23 @@ export class UnifiedSearchParamsDTO<Where=Record<string, any>> {
|
||||||
orderBy?: Record<string, 'asc' | 'desc'> | string;
|
orderBy?: Record<string, 'asc' | 'desc'> | string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shopyy获取所有订单参数DTO
|
||||||
|
*/
|
||||||
|
export class ShopyyGetAllOrdersParams {
|
||||||
|
@ApiProperty({ description: '页码', example: 1, required: false })
|
||||||
|
page?: number;
|
||||||
|
|
||||||
|
@ApiProperty({ description: '每页数量', example: 20, required: false })
|
||||||
|
per_page?: number;
|
||||||
|
|
||||||
|
@ApiProperty({ description: '支付时间范围开始', example: '2023-01-01T00:00:00Z', required: false })
|
||||||
|
pay_at_min?: string;
|
||||||
|
|
||||||
|
@ApiProperty({ description: '支付时间范围结束', example: '2023-01-01T23:59:59Z', required: false })
|
||||||
|
pay_at_max?: string;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量操作错误项
|
* 批量操作错误项
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ export class FreightwavesService {
|
||||||
private async sendRequest<T>(url: string, data: any): Promise<FreightwavesResponse<T>> {
|
private async sendRequest<T>(url: string, data: any): Promise<FreightwavesResponse<T>> {
|
||||||
try {
|
try {
|
||||||
// 设置请求头 - 使用太平洋时间 (America/Los_Angeles)
|
// 设置请求头 - 使用太平洋时间 (America/Los_Angeles)
|
||||||
const date = dayjs().tz('America/Los_Angeles').format('YYYY-MM-DD HH:mm:ss');
|
const date = dayjs().tz('America/Los_Angeles').format('YYYY-mm-dd HH:mm:ss');
|
||||||
const headers = {
|
const headers = {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'requestDate': date,
|
'requestDate': date,
|
||||||
|
|
@ -267,7 +267,7 @@ export class FreightwavesService {
|
||||||
partner: this.config.partner,
|
partner: this.config.partner,
|
||||||
};
|
};
|
||||||
|
|
||||||
const response = await this.sendRequest<CreateOrderResponseData>('/shipService/order/createOrder', requestData);
|
const response = await this.sendRequest<CreateOrderResponseData>('/shipService/order/createOrder?apipost_id=0422aa', requestData);
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -423,7 +423,7 @@ export class FreightwavesService {
|
||||||
// 设置必要的配置
|
// 设置必要的配置
|
||||||
this.setConfig({
|
this.setConfig({
|
||||||
appSecret: 'gELCHguGmdTLo!zfihfM91hae8G@9Sz23Mh6pHrt',
|
appSecret: 'gELCHguGmdTLo!zfihfM91hae8G@9Sz23Mh6pHrt',
|
||||||
apiBaseUrl: 'https://tms.freightwaves.ca',
|
apiBaseUrl: 'https://console-mock.apipost.cn/mock/0',
|
||||||
partner: '25072621035200000060'
|
partner: '25072621035200000060'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -2644,4 +2644,80 @@ export class OrderService {
|
||||||
throw new Error(`导出CSV文件失败: ${error.message}`);
|
throw new Error(`导出CSV文件失败: ${error.message}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除每个分号前面一个左右括号和最后一个左右括号包含的内容(包括括号本身)
|
||||||
|
* @param str 输入字符串
|
||||||
|
* @returns 删除后的字符串
|
||||||
|
*/
|
||||||
|
removeLastParenthesesContent(str: string): string {
|
||||||
|
if (!str || typeof str !== 'string') {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 辅助函数:删除指定位置的括号对及其内容
|
||||||
|
const removeParenthesesAt = (s: string, leftIndex: number): string => {
|
||||||
|
if (leftIndex === -1) return s;
|
||||||
|
|
||||||
|
let rightIndex = -1;
|
||||||
|
let parenCount = 0;
|
||||||
|
|
||||||
|
for (let i = leftIndex; i < s.length; i++) {
|
||||||
|
const char = s[i];
|
||||||
|
if (char === '(') {
|
||||||
|
parenCount++;
|
||||||
|
} else if (char === ')') {
|
||||||
|
parenCount--;
|
||||||
|
if (parenCount === 0) {
|
||||||
|
rightIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rightIndex !== -1) {
|
||||||
|
return s.substring(0, leftIndex) + s.substring(rightIndex + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 1. 处理每个分号前面的括号对
|
||||||
|
let result = str;
|
||||||
|
|
||||||
|
// 找出所有分号的位置
|
||||||
|
const semicolonIndices: number[] = [];
|
||||||
|
for (let i = 0; i < result.length; i++) {
|
||||||
|
if (result[i] === ';') {
|
||||||
|
semicolonIndices.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从后向前处理每个分号,避免位置变化影响后续处理
|
||||||
|
for (let i = semicolonIndices.length - 1; i >= 0; i--) {
|
||||||
|
const semicolonIndex = semicolonIndices[i];
|
||||||
|
|
||||||
|
// 从分号位置向前查找最近的左括号
|
||||||
|
let lastLeftParenIndex = -1;
|
||||||
|
for (let j = semicolonIndex - 1; j >= 0; j--) {
|
||||||
|
if (result[j] === '(') {
|
||||||
|
lastLeftParenIndex = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果找到左括号,删除该括号对及其内容
|
||||||
|
if (lastLeftParenIndex !== -1) {
|
||||||
|
result = removeParenthesesAt(result, lastLeftParenIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 处理整个字符串的最后一个括号对
|
||||||
|
let lastLeftParenIndex = result.lastIndexOf('(');
|
||||||
|
if (lastLeftParenIndex !== -1) {
|
||||||
|
result = removeParenthesesAt(result, lastLeftParenIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -313,7 +313,6 @@ export class ShopyyService {
|
||||||
|
|
||||||
const { items: firstPageItems, totalPages} = firstPage;
|
const { items: firstPageItems, totalPages} = firstPage;
|
||||||
|
|
||||||
// const { page = 1, per_page = 100 } = params;
|
|
||||||
// 如果只有一页数据,直接返回
|
// 如果只有一页数据,直接返回
|
||||||
if (totalPages <= 1) {
|
if (totalPages <= 1) {
|
||||||
return firstPageItems;
|
return firstPageItems;
|
||||||
|
|
@ -334,7 +333,7 @@ export class ShopyyService {
|
||||||
// 创建当前批次的并发请求
|
// 创建当前批次的并发请求
|
||||||
for (let i = 0; i < batchSize; i++) {
|
for (let i = 0; i < batchSize; i++) {
|
||||||
const page = currentPage + i;
|
const page = currentPage + i;
|
||||||
const pagePromise = this.getOrders(site, page, 100)
|
const pagePromise = this.getOrders(site, page, 100, params)
|
||||||
.then(pageResult => pageResult.items)
|
.then(pageResult => pageResult.items)
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error(`获取第 ${page} 页数据失败:`, error);
|
console.error(`获取第 ${page} 页数据失败:`, error);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue