fix(ts): 批量收敛类型问题并支持 Dialog loading

- Dialog 增加 loading prop,支付详情弹窗改用统一加载态
- 对齐支付/会员/商城等 API VO 类型,修复 dall3 尺寸入参转换
- 复用 VO/ReqVO 简化表单和查询参数类型
- 必填字段使用非空断言,减少过度防御
- 忽略 .playwright-cli 自动化测试产物

ts:check 478 → 252,无新增类型错误
master
YunaiV 2026-06-21 01:10:09 -07:00
parent bc25430fa5
commit ba6ac7a420
80 changed files with 650 additions and 496 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@ auto-*.d.ts
.idea .idea
.history .history
output/ output/
.playwright-cli/

View File

@ -39,7 +39,7 @@ export const ChatConversationApi = {
}, },
// 删除【我的】聊天对话 // 删除【我的】聊天对话
deleteChatConversationMy: async (id: string) => { deleteChatConversationMy: async (id: number) => {
return await request.delete({ url: `/ai/chat/conversation/delete-my?id=${id}` }) return await request.delete({ url: `/ai/chat/conversation/delete-my?id=${id}` })
}, },

View File

@ -23,8 +23,8 @@ export interface ImageDrawReqVO {
prompt: string // 提示词 prompt: string // 提示词
modelId: number // 模型 modelId: number // 模型
style: string // 图像生成的风格 style: string // 图像生成的风格
width: string // 图片宽度 width: number // 图片宽度
height: string // 图片高度 height: number // 图片高度
options: object // 绘制参数Map<String, String> options: object // 绘制参数Map<String, String>
} }

View File

@ -2,11 +2,17 @@ import request from '@/config/axios'
export interface Favorite { export interface Favorite {
id?: number id?: number
userId?: string // 用户编号 userId?: number // 用户编号
spuId?: number | null // 商品 SPU 编号 spuId?: number | null // 商品 SPU 编号
name?: string
picUrl?: string
price?: number
salesCount?: number
createTime?: Date
status?: number
} }
// 获得 ProductFavorite 列表 // 获得 ProductFavorite 列表
export const getFavoritePage = (params: PageParam) => { export const getFavoritePage = (params: PageParam) => {
return request.get({ url: '/product/favorite/page', params }) return request.get<PageResult<Favorite[]>>({ url: '/product/favorite/page', params })
} }

View File

@ -1,4 +1,5 @@
import request from '@/config/axios' import request from '@/config/axios'
import type { OrderItemRespVO, OrderVO } from '@/api/mall/trade/order'
export interface TradeAfterSaleVO { export interface TradeAfterSaleVO {
id?: number | null // 售后编号,主键自增 id?: number | null // 售后编号,主键自增
@ -32,6 +33,21 @@ export interface TradeAfterSaleVO {
receiveReason?: string // 收货备注 receiveReason?: string // 收货备注
} }
export interface TradeAfterSaleDetailVO extends TradeAfterSaleVO {
order: OrderVO
orderItem?: OrderItemRespVO
user?: {
id?: number
nickname?: string
}
logs: Array<{
id?: number
createTime?: Date
content?: string
userType?: number
}>
}
export interface ProductPropertiesVO { export interface ProductPropertiesVO {
propertyId?: number | null // 属性的编号 propertyId?: number | null // 属性的编号
propertyName?: string // 属性的名称 propertyName?: string // 属性的名称
@ -41,12 +57,15 @@ export interface ProductPropertiesVO {
// 获得交易售后分页 // 获得交易售后分页
export const getAfterSalePage = async (params) => { export const getAfterSalePage = async (params) => {
return await request.get({ url: `/trade/after-sale/page`, params }) return await request.get<PageResult<TradeAfterSaleVO[]>>({
url: `/trade/after-sale/page`,
params
})
} }
// 获得交易售后详情 // 获得交易售后详情
export const getAfterSale = async (id: any) => { export const getAfterSale = async (id: any) => {
return await request.get({ url: `/trade/after-sale/get-detail?id=${id}` }) return await request.get<TradeAfterSaleDetailVO>({ url: `/trade/after-sale/get-detail?id=${id}` })
} }
// 同意售后 // 同意售后

View File

@ -20,12 +20,15 @@ export const createBrokerageUser = (data: any) => {
// 查询分销用户列表 // 查询分销用户列表
export const getBrokerageUserPage = async (params: any) => { export const getBrokerageUserPage = async (params: any) => {
return await request.get({ url: `/trade/brokerage-user/page`, params }) return await request.get<PageResult<BrokerageUserVO[]>>({
url: `/trade/brokerage-user/page`,
params
})
} }
// 查询分销用户详情 // 查询分销用户详情
export const getBrokerageUser = async (id: number) => { export const getBrokerageUser = async (id: number) => {
return await request.get({ url: `/trade/brokerage-user/get?id=` + id }) return await request.get<BrokerageUserVO>({ url: `/trade/brokerage-user/get?id=` + id })
} }
// 修改推广员 // 修改推广员

View File

@ -1,20 +1,28 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface ConfigVO { export interface ConfigVO {
id?: number | null
afterSaleRefundReasons: string[]
afterSaleReturnReasons: string[]
deliveryExpressFreeEnabled: boolean
deliveryExpressFreePrice: number
deliveryPickUpEnabled: boolean
brokerageEnabled: boolean brokerageEnabled: boolean
brokerageEnabledCondition: number brokerageEnabledCondition?: number
brokerageBindMode: number brokerageBindMode?: number
brokeragePosterUrls: string brokeragePosterUrls: string[]
brokerageFirstPercent: number brokerageFirstPercent: number
brokerageSecondPercent: number brokerageSecondPercent: number
brokerageWithdrawMinPrice: number brokerageWithdrawMinPrice: number
brokerageWithdrawFeePercent: number
brokerageFrozenDays: number brokerageFrozenDays: number
brokerageWithdrawTypes: string brokerageWithdrawTypes: number[]
tencentLbsKey?: string
} }
// 查询交易中心配置详情 // 查询交易中心配置详情
export const getTradeConfig = async () => { export const getTradeConfig = async () => {
return await request.get({ url: `/trade/config/get` }) return await request.get<ConfigVO>({ url: `/trade/config/get` })
} }
// 保存交易中心配置 // 保存交易中心配置

View File

@ -1,7 +1,7 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface DeliveryExpressVO { export interface DeliveryExpressVO {
id: number id?: number
code: string code: string
name: string name: string
logo: string logo: string
@ -11,17 +11,20 @@ export interface DeliveryExpressVO {
// 查询快递公司列表 // 查询快递公司列表
export const getDeliveryExpressPage = async (params: PageParam) => { export const getDeliveryExpressPage = async (params: PageParam) => {
return await request.get({ url: '/trade/delivery/express/page', params }) return await request.get<PageResult<DeliveryExpressVO[]>>({
url: '/trade/delivery/express/page',
params
})
} }
// 查询快递公司详情 // 查询快递公司详情
export const getDeliveryExpress = async (id: number) => { export const getDeliveryExpress = async (id: number) => {
return await request.get({ url: '/trade/delivery/express/get?id=' + id }) return await request.get<DeliveryExpressVO>({ url: '/trade/delivery/express/get?id=' + id })
} }
// 获得快递公司精简信息列表 // 获得快递公司精简信息列表
export const getSimpleDeliveryExpressList = () => { export const getSimpleDeliveryExpressList = () => {
return request.get({ url: '/trade/delivery/express/list-all-simple' }) return request.get<DeliveryExpressVO[]>({ url: '/trade/delivery/express/list-all-simple' })
} }
// 新增快递公司 // 新增快递公司

View File

@ -1,12 +1,12 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface DeliveryExpressTemplateVO { export interface DeliveryExpressTemplateVO {
id: number id?: number
name: string name: string
chargeMode: number chargeMode: number
sort: number sort: number
templateCharge: ExpressTemplateChargeVO[] charges: ExpressTemplateChargeVO[]
templateFree: ExpressTemplateFreeVO[] frees: ExpressTemplateFreeVO[]
} }
export declare type ExpressTemplateChargeVO = { export declare type ExpressTemplateChargeVO = {
@ -25,17 +25,24 @@ export declare type ExpressTemplateFreeVO = {
// 查询快递运费模板列表 // 查询快递运费模板列表
export const getDeliveryExpressTemplatePage = async (params: PageParam) => { export const getDeliveryExpressTemplatePage = async (params: PageParam) => {
return await request.get({ url: '/trade/delivery/express-template/page', params }) return await request.get<PageResult<DeliveryExpressTemplateVO[]>>({
url: '/trade/delivery/express-template/page',
params
})
} }
// 查询快递运费模板详情 // 查询快递运费模板详情
export const getDeliveryExpressTemplate = async (id: number) => { export const getDeliveryExpressTemplate = async (id: number) => {
return await request.get({ url: '/trade/delivery/express-template/get?id=' + id }) return await request.get<DeliveryExpressTemplateVO>({
url: '/trade/delivery/express-template/get?id=' + id
})
} }
// 查询快递运费模板详情 // 查询快递运费模板详情
export const getSimpleTemplateList = async () => { export const getSimpleTemplateList = async () => {
return await request.get({ url: '/trade/delivery/express-template/list-all-simple' }) return await request.get<DeliveryExpressTemplateVO[]>({
url: '/trade/delivery/express-template/list-all-simple'
})
} }
// 新增快递运费模板 // 新增快递运费模板

View File

@ -1,34 +1,48 @@
import request from '@/config/axios' import request from '@/config/axios'
import type { UserVO } from '@/api/system/user'
export interface DeliveryPickUpStoreVO { export interface DeliveryPickUpStoreVO {
id: number id?: number
name: string name: string
introduction: string introduction: string
phone: string phone: string
areaId: number areaId?: number
detailAddress: string detailAddress: string
logo: string logo: string
openingTime: string openingTime?: string
closingTime: string closingTime?: string
latitude: number latitude?: number
longitude: number longitude?: number
status: number status: number
verifyUserIds: number[] // 绑定用户编号组数 verifyUserIds?: number[] // 绑定用户编号组数
verifyUsers?: UserVO[] // 绑定用户列表
}
export interface DeliveryPickUpStoreBindReqVO {
id: number
verifyUserIds: number[]
} }
// 查询自提门店列表 // 查询自提门店列表
export const getDeliveryPickUpStorePage = async (params: any) => { export const getDeliveryPickUpStorePage = async (params: any) => {
return await request.get({ url: '/trade/delivery/pick-up-store/page', params }) return await request.get<PageResult<DeliveryPickUpStoreVO[]>>({
url: '/trade/delivery/pick-up-store/page',
params
})
} }
// 查询自提门店详情 // 查询自提门店详情
export const getDeliveryPickUpStore = async (id: number) => { export const getDeliveryPickUpStore = async (id: number) => {
return await request.get({ url: '/trade/delivery/pick-up-store/get?id=' + id }) return await request.get<DeliveryPickUpStoreVO>({
url: '/trade/delivery/pick-up-store/get?id=' + id
})
} }
// 查询自提门店精简列表 // 查询自提门店精简列表
export const getSimpleDeliveryPickUpStoreList = async (): Promise<DeliveryPickUpStoreVO[]> => { export const getSimpleDeliveryPickUpStoreList = async () => {
return await request.get({ url: '/trade/delivery/pick-up-store/simple-list' }) return await request.get<DeliveryPickUpStoreVO[]>({
url: '/trade/delivery/pick-up-store/simple-list'
})
} }
// 新增自提门店 // 新增自提门店
@ -47,6 +61,6 @@ export const deleteDeliveryPickUpStore = async (id: number) => {
} }
// 绑定自提店员 // 绑定自提店员
export const bindStoreStaffId = async (data: any) => { export const bindStoreStaffId = async (data: DeliveryPickUpStoreBindReqVO) => {
return await request.post({ url: '/trade/delivery/pick-up-store/bind', data }) return await request.post({ url: '/trade/delivery/pick-up-store/bind', data })
} }

View File

@ -122,7 +122,7 @@ export interface TradeOrderSummaryRespVO {
// 查询交易订单列表 // 查询交易订单列表
export const getOrderPage = async (params: any) => { export const getOrderPage = async (params: any) => {
return await request.get({ url: `/trade/order/page`, params }) return await request.get<PageResult<OrderVO[]>>({ url: `/trade/order/page`, params })
} }
// 查询交易订单统计 // 查询交易订单统计
@ -132,12 +132,14 @@ export const getOrderSummary = async (params: any) => {
// 查询交易订单详情 // 查询交易订单详情
export const getOrder = async (id: number | null) => { export const getOrder = async (id: number | null) => {
return await request.get({ url: `/trade/order/get-detail?id=` + id }) return await request.get<OrderVO>({ url: `/trade/order/get-detail?id=` + id })
} }
// 查询交易订单物流详情 // 查询交易订单物流详情
export const getExpressTrackList = async (id: number | null) => { export const getExpressTrackList = async (id: number | null) => {
return await request.get({ url: `/trade/order/get-express-track-list?id=` + id }) return await request.get<Array<{ time?: Date | string; content?: string }>>({
url: `/trade/order/get-express-track-list?id=` + id
})
} }
export interface DeliveryVO { export interface DeliveryVO {

View File

@ -1,8 +1,8 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface ConfigVO { export interface ConfigVO {
id: number id?: number
pointTradeDeductEnable: number pointTradeDeductEnable: boolean
pointTradeDeductUnitPrice: number pointTradeDeductUnitPrice: number
pointTradeDeductMaxPrice: number pointTradeDeductMaxPrice: number
pointTradeGivePoint: number pointTradeGivePoint: number
@ -10,7 +10,7 @@ export interface ConfigVO {
// 查询积分设置详情 // 查询积分设置详情
export const getConfig = async () => { export const getConfig = async () => {
return await request.get({ url: `/member/config/get` }) return await request.get<ConfigVO>({ url: `/member/config/get` })
} }
// 新增修改积分设置 // 新增修改积分设置

View File

@ -13,10 +13,13 @@ export interface ExperienceRecordVO {
// 查询会员经验记录列表 // 查询会员经验记录列表
export const getExperienceRecordPage = async (params) => { export const getExperienceRecordPage = async (params) => {
return await request.get({ url: `/member/experience-record/page`, params }) return await request.get<PageResult<ExperienceRecordVO[]>>({
url: `/member/experience-record/page`,
params
})
} }
// 查询会员经验记录详情 // 查询会员经验记录详情
export const getExperienceRecord = async (id: number) => { export const getExperienceRecord = async (id: number) => {
return await request.get({ url: `/member/experience-record/get?id=` + id }) return await request.get<ExperienceRecordVO>({ url: `/member/experience-record/get?id=` + id })
} }

View File

@ -1,36 +1,51 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface UserVO { export interface UserVO {
id?: number
avatar?: string
birthday?: number
createTime?: number
loginDate?: number
loginIp?: string
mark?: string
mobile?: string
email?: string
password?: string
name?: string
nickname?: string
registerIp?: string
sex?: number
status?: number
areaId?: number
areaName?: string
tagIds?: number[]
groupId?: number
levelId?: number
levelName?: string | null
point?: number | null
totalPoint?: number | null
experience?: number | null
}
export interface UserLevelUpdateReqVO {
id: number id: number
avatar: string | undefined levelId: number
birthday: number | undefined reason: string
createTime: number | undefined }
loginDate: number | undefined
loginIp: string export interface UserPointUpdateReqVO {
mark: string id: number
mobile: string point: number
email: string | undefined
name: string | undefined
nickname: string | undefined
registerIp: string
sex: number
status: number
areaId: number | undefined
areaName: string | undefined
levelName: string | null
point: number | undefined | null
totalPoint: number | undefined | null
experience: number | null | undefined
} }
// 查询会员用户列表 // 查询会员用户列表
export const getUserPage = async (params) => { export const getUserPage = async (params) => {
return await request.get({ url: `/member/user/page`, params }) return await request.get<PageResult<UserVO[]>>({ url: `/member/user/page`, params })
} }
// 查询会员用户详情 // 查询会员用户详情
export const getUser = async (id: number) => { export const getUser = async (id: number) => {
return await request.get({ url: `/member/user/get?id=` + id }) return await request.get<UserVO>({ url: `/member/user/get?id=` + id })
} }
// 修改会员用户 // 修改会员用户
@ -39,11 +54,11 @@ export const updateUser = async (data: UserVO) => {
} }
// 修改会员用户等级 // 修改会员用户等级
export const updateUserLevel = async (data: any) => { export const updateUserLevel = async (data: UserLevelUpdateReqVO) => {
return await request.put({ url: `/member/user/update-level`, data }) return await request.put({ url: `/member/user/update-level`, data })
} }
// 修改会员用户积分 // 修改会员用户积分
export const updateUserPoint = async (data: any) => { export const updateUserPoint = async (data: UserPointUpdateReqVO) => {
return await request.put({ url: `/member/user/update-point`, data }) return await request.put({ url: `/member/user/update-point`, data })
} }

View File

@ -62,7 +62,7 @@ export const deleteApp = (id: number) => {
// 获得支付应用列表 // 获得支付应用列表
export const getAppList = () => { export const getAppList = () => {
return request.get({ return request.get<AppVO[]>({
url: '/pay/app/list' url: '/pay/app/list'
}) })
} }

View File

@ -1,15 +1,43 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface NotifyLogVO {
id?: number
status?: number
notifyTimes?: number
lastExecuteTime?: Date
createTime?: Date
response?: string
}
export interface NotifyTaskVO {
id?: number
appId?: number
appName?: string
merchantOrderId?: string
merchantRefundId?: string
merchantTransferId?: string
dataId?: number
type?: number
status?: number
notifyTimes?: number
maxNotifyTimes?: number
lastExecuteTime?: Date
nextNotifyTime?: Date
createTime?: Date
updateTime?: Date
logs?: NotifyLogVO[]
}
// 获得支付通知明细 // 获得支付通知明细
export const getNotifyTaskDetail = (id) => { export const getNotifyTaskDetail = (id: number) => {
return request.get({ return request.get<NotifyTaskVO>({
url: '/pay/notify/get-detail?id=' + id url: '/pay/notify/get-detail?id=' + id
}) })
} }
// 获得支付通知分页 // 获得支付通知分页
export const getNotifyTaskPage = (query) => { export const getNotifyTaskPage = (query: any) => {
return request.get({ return request.get<PageResult<NotifyTaskVO[]>>({
url: '/pay/notify/page', url: '/pay/notify/page',
params: query params: query
}) })

View File

@ -12,6 +12,7 @@ export interface OrderVO {
notifyUrl: string notifyUrl: string
notifyStatus: number notifyStatus: number
amount: number amount: number
price: number
channelFeeRate: number channelFeeRate: number
channelFeeAmount: number channelFeeAmount: number
status: number status: number
@ -28,64 +29,43 @@ export interface OrderVO {
createTime: Date createTime: Date
} }
export interface OrderPageReqVO extends PageParam { export interface OrderDetailVO {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
merchantOrderId?: string merchantOrderId?: string
no?: string
appId?: number
appName?: string
status?: number
price?: number
refundPrice?: number
channelFeePrice?: number
channelFeeRate?: number
successTime?: Date
expireTime?: Date
createTime?: Date
updateTime?: Date
subject?: string subject?: string
body?: string body?: string
notifyUrl?: string
notifyStatus?: number
amount?: number
channelFeeRate?: number
channelFeeAmount?: number
status?: number
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
successExtensionId?: number
refundStatus?: number
refundTimes?: number
channelUserId?: string
channelOrderNo?: string
createTime?: Date[]
}
export interface OrderExportReqVO {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string channelCode?: string
merchantOrderId?: string userIp?: string
subject?: string
body?: string
notifyUrl?: string
notifyStatus?: number
amount?: number
channelFeeRate?: number
channelFeeAmount?: number
status?: number
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
successExtensionId?: number
refundStatus?: number
refundTimes?: number
channelUserId?: string
channelOrderNo?: string channelOrderNo?: string
createTime?: Date[] channelUserId?: string
notifyUrl?: string
extension?: {
channelNotifyData?: string
}
} }
// 查询列表支付订单 // 查询列表支付订单
export const getOrderPage = async (params: OrderPageReqVO) => { export const getOrderPage = async (params: any) => {
return await request.get({ url: '/pay/order/page', params }) return await request.get<PageResult<OrderDetailVO[]>>({
url: '/pay/order/page',
params
})
} }
// 查询详情支付订单 // 查询详情支付订单
export const getOrder = async (id: number, sync?: boolean) => { export const getOrder = async (id: number, sync?: boolean) => {
return await request.get({ return await request.get<OrderVO>({
url: '/pay/order/get', url: '/pay/order/get',
params: { params: {
id, id,
@ -96,7 +76,7 @@ export const getOrder = async (id: number, sync?: boolean) => {
// 获得支付订单的明细 // 获得支付订单的明细
export const getOrderDetail = async (id: number) => { export const getOrderDetail = async (id: number) => {
return await request.get({ url: '/pay/order/get-detail?id=' + id }) return await request.get<OrderDetailVO>({ url: '/pay/order/get-detail?id=' + id })
} }
// 提交支付订单 // 提交支付订单
@ -105,6 +85,6 @@ export const submitOrder = async (data: any) => {
} }
// 导出支付订单 // 导出支付订单
export const exportOrder = async (params: OrderExportReqVO) => { export const exportOrder = async (params: any) => {
return await request.download({ url: '/pay/order/export-excel', params }) return await request.download({ url: '/pay/order/export-excel', params })
} }

View File

@ -29,70 +29,36 @@ export interface RefundVO {
createTime: Date createTime: Date
} }
export interface RefundPageReqVO extends PageParam { export interface RefundDetailVO {
merchantId?: number merchantRefundId?: string
appId?: number channelRefundNo?: string
channelId?: number
channelCode?: string
orderId?: string
tradeNo?: string
merchantOrderId?: string merchantOrderId?: string
merchantRefundNo?: string channelOrderNo?: string
notifyUrl?: string appId?: number
notifyStatus?: number appName?: string
payPrice?: number
refundPrice?: number
status?: number status?: number
type?: number successTime?: Date
payAmount?: number createTime?: Date
refundAmount?: number updateTime?: Date
channelCode?: string
reason?: string reason?: string
userIp?: string userIp?: string
channelOrderNo?: string
channelRefundNo?: string
channelErrorCode?: string
channelErrorMsg?: string
channelExtras?: string
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
createTime?: Date[]
}
export interface PayRefundExportReqVO {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
orderId?: string
tradeNo?: string
merchantOrderId?: string
merchantRefundNo?: string
notifyUrl?: string notifyUrl?: string
notifyStatus?: number
status?: number
type?: number
payAmount?: number
refundAmount?: number
reason?: string
userIp?: string
channelOrderNo?: string
channelRefundNo?: string
channelErrorCode?: string channelErrorCode?: string
channelErrorMsg?: string channelErrorMsg?: string
channelExtras?: string channelNotifyData?: string
expireTime?: Date[]
successTime?: Date[]
notifyTime?: Date[]
createTime?: Date[]
} }
// 查询列表退款订单 // 查询列表退款订单
export const getRefundPage = (params: RefundPageReqVO) => { export const getRefundPage = (params: any) => {
return request.get({ url: '/pay/refund/page', params }) return request.get<PageResult<RefundDetailVO[]>>({ url: '/pay/refund/page', params })
} }
// 查询详情退款订单 // 查询详情退款订单
export const getRefund = (id: number) => { export const getRefund = (id: number) => {
return request.get({ url: '/pay/refund/get?id=' + id }) return request.get<RefundDetailVO>({ url: '/pay/refund/get?id=' + id })
} }
// 新增退款订单 // 新增退款订单
@ -111,6 +77,6 @@ export const deleteRefund = (id: number) => {
} }
// 导出退款订单 // 导出退款订单
export const exportRefund = (params: PayRefundExportReqVO) => { export const exportRefund = (params: any) => {
return request.download({ url: '/pay/refund/export-excel', params }) return request.download({ url: '/pay/refund/export-excel', params })
} }

View File

@ -1,16 +1,42 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface TransferVO {
id?: number
no?: string
appId?: number
appName?: string
channelId?: number
channelCode?: string
merchantTransferId?: string
type?: string
status?: number
successTime?: Date
price?: number
subject?: string
userName?: string
userAccount?: string
accountNo?: string
channelTransferNo?: string
userIp?: string
notifyUrl?: string
channelNotifyData?: string
createTime?: Date
}
// 查询转账单列表 // 查询转账单列表
export const getTransferPage = async (params: PageParam) => { export const getTransferPage = async (params: any) => {
return await request.get({ url: `/pay/transfer/page`, params }) return await request.get<PageResult<TransferVO[]>>({
url: `/pay/transfer/page`,
params
})
} }
// 查询转账单详情 // 查询转账单详情
export const getTransfer = async (id: number) => { export const getTransfer = async (id: number) => {
return await request.get({ url: '/pay/transfer/get?id=' + id }) return await request.get<TransferVO>({ url: '/pay/transfer/get?id=' + id })
} }
// 导出转账单 // 导出转账单
export const exportTransfer = async (params: PageParam) => { export const exportTransfer = async (params: any) => {
return await request.download({ url: '/pay/transfer/export-excel', params }) return await request.download({ url: '/pay/transfer/export-excel', params })
} }

View File

@ -16,6 +16,12 @@ export interface WalletVO {
freezePrice: number freezePrice: number
} }
/** 修改会员钱包余额 Request VO */
export interface WalletBalanceUpdateReqVO {
userId: number
balance: number
}
/** 查询用户钱包详情 */ /** 查询用户钱包详情 */
export const getWallet = async (params: PayWalletUserReqVO) => { export const getWallet = async (params: PayWalletUserReqVO) => {
return await request.get<WalletVO>({ url: `/pay/wallet/get`, params }) return await request.get<WalletVO>({ url: `/pay/wallet/get`, params })
@ -27,6 +33,6 @@ export const getWalletPage = async (params: any) => {
} }
/** 修改会员钱包余额 */ /** 修改会员钱包余额 */
export const updateWalletBalance = async (data: any) => { export const updateWalletBalance = async (data: WalletBalanceUpdateReqVO) => {
return await request.put({ url: `/pay/wallet/update-balance`, data }) return await request.put({ url: `/pay/wallet/update-balance`, data })
} }

View File

@ -1,8 +1,8 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface DictDataVO { export interface DictDataVO {
id: number id?: number
sort: number sort?: number
label: string label: string
value: string value: string
dictType: string dictType: string
@ -10,7 +10,7 @@ export interface DictDataVO {
colorType: string colorType: string
cssClass: string cssClass: string
remark: string remark: string
createTime: Date createTime?: Date
} }
// 查询字典数据(精简)列表 // 查询字典数据(精简)列表

View File

@ -1,12 +1,12 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface DictTypeVO { export interface DictTypeVO {
id: number id?: number
name: string name: string
type: string type: string
status: number status: number
remark: string remark: string
createTime: Date createTime?: Date
} }
// 查询字典(精简)列表 // 查询字典(精简)列表

View File

@ -1,7 +1,7 @@
import request from '@/config/axios' import request from '@/config/axios'
export interface MailAccountVO { export interface MailAccountVO {
id: number id?: number
mail: string mail: string
username: string username: string
password: string password: string

View File

@ -13,11 +13,12 @@ const props = defineProps({
fullscreen: propTypes.bool.def(true), fullscreen: propTypes.bool.def(true),
width: propTypes.oneOfType([String, Number]).def('40%'), width: propTypes.oneOfType([String, Number]).def('40%'),
scroll: propTypes.bool.def(false), // maxHeight scroll: propTypes.bool.def(false), // maxHeight
maxHeight: propTypes.oneOfType([String, Number]).def('400px') maxHeight: propTypes.oneOfType([String, Number]).def('400px'),
loading: propTypes.bool.def(false)
}) })
const getBindValue = computed(() => { const getBindValue = computed(() => {
const delArr: string[] = ['fullscreen', 'title', 'maxHeight', 'appendToBody'] const delArr: string[] = ['fullscreen', 'title', 'maxHeight', 'appendToBody', 'loading']
const attrs = useAttrs() const attrs = useAttrs()
const obj = { ...attrs, ...props } const obj = { ...attrs, ...props }
for (const key in obj) { for (const key in obj) {
@ -111,10 +112,14 @@ function closedHandler() {
</div> </div>
</template> </template>
<ElScrollbar v-if="scroll" :style="dialogStyle"> <div v-loading="loading" :style="loading ? { minHeight: '120px' } : undefined">
<slot></slot> <template v-if="!loading">
</ElScrollbar> <ElScrollbar v-if="scroll" :style="dialogStyle">
<slot v-else></slot> <slot></slot>
</ElScrollbar>
<slot v-else></slot>
</template>
</div>
<template v-if="slots.footer" #footer> <template v-if="slots.footer" #footer>
<div :style="{ 'pointer-events': closing ? 'none' : 'auto' }"> <div :style="{ 'pointer-events': closing ? 'none' : 'auto' }">
<slot name="footer"></slot> <slot name="footer"></slot>

View File

@ -41,7 +41,7 @@
:key="conversation.id" :key="conversation.id"
@click="handleConversationClick(conversation.id)" @click="handleConversationClick(conversation.id)"
@mouseover="hoverConversationId = conversation.id" @mouseover="hoverConversationId = conversation.id"
@mouseout="hoverConversationId = ''" @mouseout="hoverConversationId = null"
> >
<div <div
class="flex flex-row justify-between flex-1 px-1.25 cursor-pointer rounded-1.25 items-center leading-7.5" class="flex flex-row justify-between flex-1 px-1.25 cursor-pointer rounded-1.25 items-center leading-7.5"
@ -153,7 +153,7 @@ const loadingTime = ref<any>() // 加载中定时器
// props // props
const props = defineProps({ const props = defineProps({
activeId: { activeId: {
type: String || null, type: [Number, String],
required: true required: true
} }
}) })
@ -186,11 +186,9 @@ const handleConversationClick = async (id: number) => {
const filterConversation = conversationList.value.filter((item) => { const filterConversation = conversationList.value.filter((item) => {
return item.id === id return item.id === id
}) })
// onConversationClick // onConversationClick
// noinspection JSVoidFunctionReturnValueUsed if (filterConversation[0]) {
const success = emits('onConversationClick', filterConversation[0]) emits('onConversationClick', filterConversation[0])
//
if (success) {
activeConversationId.value = id activeConversationId.value = id
} }
} }
@ -366,7 +364,7 @@ const handleRoleRepository = async () => {
/** 监听选中的对话 */ /** 监听选中的对话 */
const { activeId } = toRefs(props) const { activeId } = toRefs(props)
watch(activeId, async (newValue, _oldValue) => { watch(activeId, async (newValue, _oldValue) => {
activeConversationId.value = newValue as string activeConversationId.value = newValue ? Number(newValue) : null
}) })
// public // public
@ -378,7 +376,7 @@ onMounted(async () => {
await getChatConversationList() await getChatConversationList()
// //
if (props.activeId) { if (props.activeId) {
activeConversationId.value = props.activeId activeConversationId.value = Number(props.activeId)
} else { } else {
// //
if (conversationList.value.length) { if (conversationList.value.length) {

View File

@ -72,7 +72,15 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ type ConversationFormData = {
id?: number
systemMessage?: string
modelId?: number
temperature?: number
maxTokens?: number
maxContexts?: number
}
const formData = ref<ConversationFormData>({
id: undefined, id: undefined,
systemMessage: undefined, systemMessage: undefined,
modelId: undefined, modelId: undefined,
@ -104,7 +112,7 @@ const open = async (id: number) => {
obj[key] = data[key] obj[key] = data[key]
} }
return obj return obj
}, {}) }, {} as ConversationFormData)
} finally { } finally {
formLoading.value = false formLoading.value = false
} }

View File

@ -18,26 +18,16 @@
class="!p-10px !m-0" class="!p-10px !m-0"
text text
:icon="Download" :icon="Download"
@click="handleButtonClick('download', detail)" @click="handleButtonClick('download')"
/> />
<el-button <el-button
class="!p-10px !m-0" class="!p-10px !m-0"
text text
:icon="RefreshRight" :icon="RefreshRight"
@click="handleButtonClick('regeneration', detail)" @click="handleButtonClick('regeneration')"
/>
<el-button
class="!p-10px !m-0"
text
:icon="Delete"
@click="handleButtonClick('delete', detail)"
/>
<el-button
class="!p-10px !m-0"
text
:icon="More"
@click="handleButtonClick('more', detail)"
/> />
<el-button class="!p-10px !m-0" text :icon="Delete" @click="handleButtonClick('delete')" />
<el-button class="!p-10px !m-0" text :icon="More" @click="handleButtonClick('more')" />
</div> </div>
</div> </div>
<div class="!overflow-hidden !mt-20px !h-280px !flex-1" ref="cardImageRef"> <div class="!overflow-hidden !mt-20px !h-280px !flex-1" ref="cardImageRef">
@ -56,7 +46,7 @@
<el-button <el-button
size="small" size="small"
v-for="button in detail?.buttons" v-for="button in detail?.buttons"
:key="button" :key="button.customId"
class="min-w-40px ml-0 mr-10px mt-5px" class="min-w-40px ml-0 mr-10px mt-5px"
@click="handleMidjourneyBtnClick(button)" @click="handleMidjourneyBtnClick(button)"
> >
@ -77,7 +67,7 @@ const message = useMessage() // 消息
const props = defineProps({ const props = defineProps({
detail: { detail: {
type: Object as PropType<ImageVO>, type: Object as PropType<ImageVO>,
require: true required: true
} }
}) })
@ -85,8 +75,8 @@ const cardImageRef = ref<any>() // 卡片 image ref
const cardImageLoadingInstance = ref<any>() // image ref const cardImageLoadingInstance = ref<any>() // image ref
/** 处理点击事件 */ /** 处理点击事件 */
const handleButtonClick = async (type, detail: ImageVO) => { const handleButtonClick = async (type: string) => {
emits('onBtnClick', type, detail) emits('onBtnClick', type, props.detail)
} }
/** 处理 Midjourney 按钮点击事件 */ /** 处理 Midjourney 按钮点击事件 */
@ -101,7 +91,7 @@ const emits = defineEmits(['onBtnClick', 'onMjBtnClick']) // emits
/** 监听详情 */ /** 监听详情 */
const { detail } = toRefs(props) const { detail } = toRefs(props)
watch(detail, async (newVal, _oldVal) => { watch(detail, async (newVal, _oldVal) => {
await handleLoading(newVal.status as string) await handleLoading(newVal.status)
}) })
/** 处理加载状态 */ /** 处理加载状态 */
@ -123,6 +113,6 @@ const handleLoading = async (status: number) => {
/** 初始化 */ /** 初始化 */
onMounted(async () => { onMounted(async () => {
await handleLoading(props.detail.status as string) await handleLoading(props.detail.status)
}) })
</script> </script>

View File

@ -211,8 +211,8 @@ const handleGenerateImage = async () => {
prompt: prompt.value, // prompt: prompt.value, //
modelId: matchedModel.id, // 使 modelId: matchedModel.id, // 使
style: style.value, // style: style.value, //
width: imageSize.width, // size width: Number(imageSize.width), // size
height: imageSize.height, // size height: Number(imageSize.height), // size
options: { options: {
style: style.value // style: style.value //
} }

View File

@ -199,6 +199,7 @@ const handleGenerateImage = async () => {
const req = { const req = {
prompt: prompt.value, prompt: prompt.value,
modelId: matchedModel.id, modelId: matchedModel.id,
base64Array: [],
width: imageSize.width, width: imageSize.width,
height: imageSize.height, height: imageSize.height,
version: selectVersion.value, version: selectVersion.value,

View File

@ -22,7 +22,7 @@
v-for="item in deliveryTemplateList" v-for="item in deliveryTemplateList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -89,7 +89,7 @@ const validate = async () => {
defineExpose({ validate }) defineExpose({ validate })
/** 初始化 */ /** 初始化 */
const deliveryTemplateList = ref([]) // const deliveryTemplateList = ref<ExpressTemplateApi.DeliveryExpressTemplateVO[]>([]) //
onMounted(async () => { onMounted(async () => {
deliveryTemplateList.value = await ExpressTemplateApi.getSimpleTemplateList() deliveryTemplateList.value = await ExpressTemplateApi.getSimpleTemplateList()
}) })

View File

@ -4,10 +4,10 @@
<el-descriptions title="订单信息"> <el-descriptions title="订单信息">
<el-descriptions-item label="订单号: ">{{ formData.orderNo }}</el-descriptions-item> <el-descriptions-item label="订单号: ">{{ formData.orderNo }}</el-descriptions-item>
<el-descriptions-item label="配送方式: "> <el-descriptions-item label="配送方式: ">
<dict-tag :type="DICT_TYPE.TRADE_DELIVERY_TYPE" :value="formData.order.deliveryType" /> <dict-tag :type="DICT_TYPE.TRADE_DELIVERY_TYPE" :value="formData.order.deliveryType!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="订单类型: "> <el-descriptions-item label="订单类型: ">
<dict-tag :type="DICT_TYPE.TRADE_ORDER_TYPE" :value="formData.order.type" /> <dict-tag :type="DICT_TYPE.TRADE_ORDER_TYPE" :value="formData.order.type!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="收货人: "> <el-descriptions-item label="收货人: ">
{{ formData.order.receiverName }} {{ formData.order.receiverName }}
@ -16,7 +16,7 @@
{{ formData.order.userRemark }} {{ formData.order.userRemark }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="订单来源: "> <el-descriptions-item label="订单来源: ">
<dict-tag :type="DICT_TYPE.TERMINAL" :value="formData.order.terminal" /> <dict-tag :type="DICT_TYPE.TERMINAL" :value="formData.order.terminal!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="联系电话: "> <el-descriptions-item label="联系电话: ">
{{ formData.order.receiverMobile }} {{ formData.order.receiverMobile }}
@ -26,7 +26,7 @@
{{ formData.order.payOrderId }} {{ formData.order.payOrderId }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="付款方式: "> <el-descriptions-item label="付款方式: ">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="formData.order.payChannelCode" /> <dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="formData.order.payChannelCode!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="买家: ">{{ formData?.user?.nickname }}</el-descriptions-item> <el-descriptions-item label="买家: ">{{ formData?.user?.nickname }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
@ -38,13 +38,13 @@
{{ formatDate(formData.auditTime) }} {{ formatDate(formData.auditTime) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="售后类型: "> <el-descriptions-item label="售后类型: ">
<dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_TYPE" :value="formData.type" /> <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_TYPE" :value="formData.type!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="售后方式: "> <el-descriptions-item label="售后方式: ">
<dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_WAY" :value="formData.way" /> <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_WAY" :value="formData.way!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款金额: "> <el-descriptions-item label="退款金额: ">
{{ fenToYuan(formData.refundPrice) }} {{ fenToYuan(formData.refundPrice!) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款原因: ">{{ formData.applyReason }}</el-descriptions-item> <el-descriptions-item label="退款原因: ">{{ formData.applyReason }}</el-descriptions-item>
<el-descriptions-item label="补充描述: "> <el-descriptions-item label="补充描述: ">
@ -52,11 +52,12 @@
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="凭证图片: "> <el-descriptions-item label="凭证图片: ">
<el-image <el-image
v-for="(item, index) in formData.applyPicUrls" v-for="(item, index) in formData.applyPicUrls || []"
:key="index" :key="index"
:src="item.url" :src="item"
:preview-src-list="formData.applyPicUrls || []"
class="mr-10px h-60px w-60px" class="mr-10px h-60px w-60px"
@click="imagePreview(formData.applyPicUrls)" preview-teleported
/> />
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
@ -64,7 +65,7 @@
<!-- 退款状态 --> <!-- 退款状态 -->
<el-descriptions :column="1" title="退款状态"> <el-descriptions :column="1" title="退款状态">
<el-descriptions-item label="退款状态: "> <el-descriptions-item label="退款状态: ">
<dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_STATUS" :value="formData.status" /> <dict-tag :type="DICT_TYPE.TRADE_AFTER_SALE_STATUS" :value="formData.status!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label-class-name="no-colon"> <el-descriptions-item label-class-name="no-colon">
<el-button v-if="formData.status === 10" type="primary" @click="agree"></el-button> <el-button v-if="formData.status === 10" type="primary" @click="agree"></el-button>
@ -132,10 +133,10 @@
</div> </div>
<template #dot> <template #dot>
<span <span
:style="{ backgroundColor: getUserTypeColor(saleLog.userType) }" :style="{ backgroundColor: getUserTypeColor(saleLog.userType ?? 0) }"
class="dot-node-style" class="dot-node-style"
> >
{{ getDictLabel(DICT_TYPE.USER_TYPE, saleLog.userType)[0] || '系' }} {{ getDictLabel(DICT_TYPE.USER_TYPE, saleLog.userType ?? 0)[0] || '系' }}
</span> </span>
</template> </template>
</el-timeline-item> </el-timeline-item>
@ -153,8 +154,6 @@ import { fenToYuan } from '@/utils'
import { DICT_TYPE, getDictLabel, getDictObj } from '@/utils/dict' import { DICT_TYPE, getDictLabel, getDictObj } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import UpdateAuditReasonForm from '@/views/mall/trade/afterSale/form/AfterSaleDisagreeForm.vue' import UpdateAuditReasonForm from '@/views/mall/trade/afterSale/form/AfterSaleDisagreeForm.vue'
import { createImageViewer } from '@/components/ImageViewer'
import { isArray } from '@/utils/is'
import { useTagsViewStore } from '@/store/modules/tagsView' import { useTagsViewStore } from '@/store/modules/tagsView'
defineOptions({ name: 'TradeAfterSaleDetail' }) defineOptions({ name: 'TradeAfterSaleDetail' })
@ -163,10 +162,10 @@ const { t } = useI18n() // 国际化
const message = useMessage() // const message = useMessage() //
const { params } = useRoute() // const { params } = useRoute() //
const { push, currentRoute } = useRouter() // const { push, currentRoute } = useRouter() //
const formData = ref({ const formData = ref<AfterSaleApi.TradeAfterSaleDetailVO>({
order: {}, order: {},
logs: [] logs: []
}) } as AfterSaleApi.TradeAfterSaleDetailVO)
const updateAuditReasonFormRef = ref() // Ref const updateAuditReasonFormRef = ref() // Ref
/** 获得 userType 颜色 */ /** 获得 userType 颜色 */
@ -187,7 +186,7 @@ const getUserTypeColor = (type: number) => {
/** 获得详情 */ /** 获得详情 */
const getDetail = async () => { const getDetail = async () => {
const id = params.id as unknown as number const id = Number(params.id)
if (id) { if (id) {
const res = await AfterSaleApi.getAfterSale(id) const res = await AfterSaleApi.getAfterSale(id)
// //
@ -252,20 +251,6 @@ const refund = async () => {
} catch {} } catch {}
} }
/** 图片预览 */
const imagePreview = (args) => {
const urlList = []
if (isArray(args)) {
args.forEach((item) => {
urlList.push(item.url)
})
} else {
urlList.push(args)
}
createImageViewer({
urlList
})
}
const { delView } = useTagsViewStore() // const { delView } = useTagsViewStore() //
/** 关闭 tag */ /** 关闭 tag */
const close = () => { const close = () => {

View File

@ -138,7 +138,7 @@ const resetForm = () => {
/** 查询推广员和分销员 */ /** 查询推广员和分销员 */
const userInfo = reactive<{ const userInfo = reactive<{
bindUser: BrokerageUserApi.BrokerageUserVO | undefined bindUser: BrokerageUserApi.BrokerageUserVO | undefined
user: BrokerageUserApi.BrokerageUserVO | undefined user: UserApi.UserVO | undefined
}>({ }>({
bindUser: undefined, bindUser: undefined,
user: undefined user: undefined
@ -154,7 +154,11 @@ const handleGetUser = async (id: any, userType: string) => {
} }
const user = const user =
userType === '推广员' ? await BrokerageUserApi.getBrokerageUser(id) : await UserApi.getUser(id) userType === '推广员' ? await BrokerageUserApi.getBrokerageUser(id) : await UserApi.getUser(id)
userType === '推广员' ? (userInfo.bindUser = user) : (userInfo.user = user) if (userType === '推广员') {
userInfo.bindUser = user as BrokerageUserApi.BrokerageUserVO
} else {
userInfo.user = user as UserApi.UserVO
}
if (!user) { if (!user) {
message.warning(`${userType}不存在`) message.warning(`${userType}不存在`)
} }

View File

@ -90,11 +90,11 @@ defineOptions({ name: 'BrokerageUserListDialog' })
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<BrokerageUserApi.BrokerageUserVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
bindUserId: null, bindUserId: undefined as number | undefined,
level: '', level: '',
bindUserTime: [] bindUserTime: []
}) })

View File

@ -212,7 +212,7 @@ const message = useMessage() // 消息弹窗
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formRef = ref() const formRef = ref()
const formData = ref({ const formData = ref<ConfigApi.ConfigVO>({
id: null, id: null,
afterSaleRefundReasons: [], afterSaleRefundReasons: [],
afterSaleReturnReasons: [], afterSaleReturnReasons: [],

View File

@ -52,7 +52,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<DeliveryExpressApi.DeliveryExpressVO>({
id: undefined, id: undefined,
code: '', code: '',
name: '', name: '',
@ -97,7 +97,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as DeliveryExpressApi.DeliveryExpressVO const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
await DeliveryExpressApi.createDeliveryExpress(data) await DeliveryExpressApi.createDeliveryExpress(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))

View File

@ -148,7 +148,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<DeliveryExpressTemplateApi.DeliveryExpressTemplateVO>({
id: undefined, id: undefined,
name: '', name: '',
chargeMode: 1, chargeMode: 1,
@ -156,12 +156,13 @@ const formData = ref({
charges: [], charges: [],
frees: [] frees: []
}) })
const columnTitleMap = new Map()
const columnTitle = ref({ const columnTitle = ref({
startCountTitle: '首件', startCountTitle: '首件',
extraCountTitle: '续件', extraCountTitle: '续件',
freeCountTitle: '包邮件数' freeCountTitle: '包邮件数'
}) })
const columnTitleMap = new Map<number, typeof columnTitle.value>()
const getColumnTitle = (chargeMode: number) => columnTitleMap.get(chargeMode) || columnTitle.value
const formRules = reactive({ const formRules = reactive({
name: [{ required: true, message: '模板名称不能为空', trigger: 'blur' }], name: [{ required: true, message: '模板名称不能为空', trigger: 'blur' }],
chargeMode: [{ required: true, message: '配送计费方式不能为空', trigger: 'blur' }], chargeMode: [{ required: true, message: '配送计费方式不能为空', trigger: 'blur' }],
@ -180,14 +181,14 @@ const open = async (type: string, id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
formData.value = await DeliveryExpressTemplateApi.getDeliveryExpressTemplate(id) formData.value = await DeliveryExpressTemplateApi.getDeliveryExpressTemplate(id)
columnTitle.value = columnTitleMap.get(formData.value.chargeMode) columnTitle.value = getColumnTitle(formData.value.chargeMode)
formData.value.charges.forEach((item) => { formData.value.charges.forEach((item) => {
// //
item.startPrice = fenToYuan(item.startPrice) item.startPrice = Number(fenToYuan(item.startPrice))
item.extraPrice = fenToYuan(item.extraPrice) item.extraPrice = Number(fenToYuan(item.extraPrice))
}) })
formData.value.frees.forEach((item) => { formData.value.frees.forEach((item) => {
item.freePrice = fenToYuan(item.freePrice) item.freePrice = Number(fenToYuan(item.freePrice))
}) })
} }
} finally { } finally {
@ -206,7 +207,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = cloneDeep(formData.value) as DeliveryExpressTemplateApi.DeliveryExpressTemplateVO const data = cloneDeep(formData.value)
// //
data.charges.forEach((item) => { data.charges.forEach((item) => {
item.startPrice = yuanToFen(item.startPrice) item.startPrice = yuanToFen(item.startPrice)
@ -248,17 +249,17 @@ const resetForm = () => {
frees: [], frees: [],
sort: 0 sort: 0
} }
columnTitle.value = columnTitleMap.get(1) columnTitle.value = getColumnTitle(1)
formRef.value?.resetFields() formRef.value?.resetFields()
} }
/** 配送计费方法改变 */ /** 配送计费方法改变 */
const changeChargeMode = (chargeMode: number) => { const changeChargeMode = (chargeMode: number) => {
columnTitle.value = columnTitleMap.get(chargeMode) columnTitle.value = getColumnTitle(chargeMode)
} }
/** 初始化数据 */ /** 初始化数据 */
const areaTree = ref([]) const areaTree = ref<any[]>([])
const initData = async () => { const initData = async () => {
// //
columnTitleMap.set(1, { columnTitleMap.set(1, {
@ -293,7 +294,7 @@ const addChargeArea = () => {
} }
/** 删除计费区域 */ /** 删除计费区域 */
const deleteChargeArea = (index) => { const deleteChargeArea = (index: number) => {
const data = formData.value const data = formData.value
data.charges.splice(index, 1) data.charges.splice(index, 1)
} }
@ -309,7 +310,7 @@ const addFreeArea = () => {
} }
/** 删除包邮区域 */ /** 删除包邮区域 */
const deleteFreeArea = (index) => { const deleteFreeArea = (index: number) => {
const data = formData.value const data = formData.value
data.frees.splice(index, 1) data.frees.splice(index, 1)
} }

View File

@ -33,7 +33,7 @@
v-for="item in pickUpStoreList" v-for="item in pickUpStoreList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -111,7 +111,7 @@
icon-bg-color="text-purple-500" icon-bg-color="text-purple-500"
prefix="¥" prefix="¥"
:decimals="2" :decimals="2"
:value="fenToYuan(summary?.orderPayPrice || 0)" :value="Number(fenToYuan(summary?.orderPayPrice || 0))"
/> />
</el-col> </el-col>
<el-col :sm="6" :xs="12" v-loading="loading"> <el-col :sm="6" :xs="12" v-loading="loading">
@ -131,7 +131,7 @@
icon-bg-color="text-green-500" icon-bg-color="text-green-500"
prefix="¥" prefix="¥"
:decimals="2" :decimals="2"
:value="fenToYuan(summary?.afterSalePrice || 0)" :value="Number(fenToYuan(summary?.afterSalePrice || 0))"
/> />
</el-col> </el-col>
</el-row> </el-row>
@ -309,7 +309,7 @@ const resetQuery = () => {
queryFormRef.value?.resetFields() queryFormRef.value?.resetFields()
queryParams.value = { ...INIT_QUERY_PARAMS } queryParams.value = { ...INIT_QUERY_PARAMS }
if (pickUpStoreList.value.length > 0) { if (pickUpStoreList.value.length > 0) {
queryParams.value.pickUpStoreIds = pickUpStoreList.value[0].id queryParams.value.pickUpStoreIds = pickUpStoreList.value[0].id!
} }
handleQuery() handleQuery()
} }
@ -418,7 +418,7 @@ onMounted(async () => {
} }
// //
queryParams.value.pickUpStoreIds = pickUpStoreList.value[0].id queryParams.value.pickUpStoreIds = pickUpStoreList.value[0].id!
isUse.value = false isUse.value = false
await getList() await getList()
}) })

View File

@ -64,6 +64,7 @@
import * as DeliveryPickUpStoreApi from '@/api/mall/trade/delivery/pickUpStore' import * as DeliveryPickUpStoreApi from '@/api/mall/trade/delivery/pickUpStore'
import StoreStaffTableSelect from './components/StoreStaffTableSelect.vue' import StoreStaffTableSelect from './components/StoreStaffTableSelect.vue'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import type { UserVO } from '@/api/system/user'
const message = useMessage() // const message = useMessage() //
@ -71,10 +72,9 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ const formData = ref({
id: undefined, id: undefined as number | undefined,
name: '', name: '',
verifyUserIds: [], verifyUsers: [] as UserVO[]
verifyUsers: []
}) })
const formRules = reactive({}) const formRules = reactive({})
const formRef = ref() // Ref const formRef = ref() // Ref
@ -87,7 +87,12 @@ const open = async (id: number) => {
resetForm() resetForm()
formLoading.value = true formLoading.value = true
try { try {
formData.value = await DeliveryPickUpStoreApi.getDeliveryPickUpStore(id) const data = await DeliveryPickUpStoreApi.getDeliveryPickUpStore(id)
formData.value = {
id: data.id,
name: data.name,
verifyUsers: data.verifyUsers || []
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -103,9 +108,9 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = { const data: DeliveryPickUpStoreApi.DeliveryPickUpStoreBindReqVO = {
id: formData.value.id, id: formData.value.id!,
verifyUserIds: formData.value.verifyUsers.map((item: any) => item.id) verifyUserIds: formData.value.verifyUsers.map((item) => item.id)
} }
await DeliveryPickUpStoreApi.bindStoreStaffId(data) await DeliveryPickUpStoreApi.bindStoreStaffId(data)
message.success('绑定成功') message.success('绑定成功')
@ -116,17 +121,13 @@ const submitForm = async () => {
} }
/** 处理选择员工操作 */ /** 处理选择员工操作 */
const handleSelect = (checkedUsers: []) => { const handleSelect = (checkedUsers: UserVO[]) => {
formData.value.verifyUsers = checkedUsers formData.value.verifyUsers = checkedUsers
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (id: number) => { const handleDelete = async (id: number) => {
const index = formData.value.verifyUsers.findIndex((item: any) => { const index = formData.value.verifyUsers.findIndex((item) => item.id === id)
if (item.id == id) {
return true
}
})
formData.value.verifyUsers.splice(index, 1) formData.value.verifyUsers.splice(index, 1)
} }
@ -135,7 +136,6 @@ const resetForm = () => {
formData.value = { formData.value = {
id: undefined, id: undefined,
name: '', name: '',
verifyUserIds: [],
verifyUsers: [] verifyUsers: []
} }
formRef.value?.resetFields() formRef.value?.resetFields()

View File

@ -118,6 +118,11 @@ import { CommonStatusEnum } from '@/utils/constants'
import { defaultProps } from '@/utils/tree' import { defaultProps } from '@/utils/tree'
import { getAreaTree } from '@/api/system/area' import { getAreaTree } from '@/api/system/area'
import * as ConfigApi from '@/api/mall/trade/config' import * as ConfigApi from '@/api/mall/trade/config'
declare global {
interface Window {
selectAddress: (loc: any) => void
}
}
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
@ -126,14 +131,14 @@ const mapDialogVisible = ref(false) // 地图弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<DeliveryPickUpStoreApi.DeliveryPickUpStoreVO>({
id: undefined, id: undefined,
name: '', name: '',
phone: '', phone: '',
logo: '', logo: '',
detailAddress: '', detailAddress: '',
introduction: '', introduction: '',
areaId: 0, areaId: undefined,
openingTime: undefined, openingTime: undefined,
closingTime: undefined, closingTime: undefined,
latitude: undefined, latitude: undefined,
@ -187,7 +192,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as DeliveryPickUpStoreApi.DeliveryPickUpStoreVO const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
await DeliveryPickUpStoreApi.createDeliveryPickUpStore(data) await DeliveryPickUpStoreApi.createDeliveryPickUpStore(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))

View File

@ -137,6 +137,7 @@
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import type { UserVO } from '@/api/system/user'
import DeptTreeSelect from '@/views/system/dept/components/DeptTreeSelect.vue' import DeptTreeSelect from '@/views/system/dept/components/DeptTreeSelect.vue'
// //
@ -144,7 +145,7 @@ const isCheckAll = ref(false)
// && // &&
const isIndeterminate = ref(false) const isIndeterminate = ref(false)
// //
const checkedUsers = ref([]) const checkedUsers = ref<UserVO[]>([])
// keyIDvalue // keyIDvalue
const checkedStatus = ref<Record<string, boolean>>({}) const checkedStatus = ref<Record<string, boolean>>({})
@ -152,15 +153,15 @@ const dialogTitle = '选择店员'
const dialogVisible = ref(false) const dialogVisible = ref(false)
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<UserVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
username: undefined, username: undefined as string | undefined,
mobile: undefined, mobile: undefined as string | undefined,
status: undefined, status: undefined as number | undefined,
deptId: undefined as number | undefined, deptId: undefined as number | undefined,
createTime: [] createTime: [] as string[]
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
@ -211,24 +212,24 @@ const handleCheckAll = (checked: boolean) => {
isCheckAll.value = checked isCheckAll.value = checked
isIndeterminate.value = false isIndeterminate.value = false
list.value.forEach((combinationActivity) => handleCheckOne(checked, combinationActivity, false)) list.value.forEach((user) => handleCheckOne(checked, user, false))
} }
/** /**
* 选中一行 * 选中一行
* @param checked 是否选中 * @param checked 是否选中
* @param combinationActivity 活动 * @param user 用户
* @param isCalcCheckAll 是否计算全选 * @param isCalcCheckAll 是否计算全选
*/ */
const handleCheckOne = (checked: boolean, combinationActivity, isCalcCheckAll: boolean) => { const handleCheckOne = (checked: boolean, user: UserVO, isCalcCheckAll: boolean) => {
if (checked) { if (checked) {
checkedUsers.value.push(combinationActivity as never) checkedUsers.value.push(user)
checkedStatus.value[combinationActivity.id] = true checkedStatus.value[user.id] = true
} else { } else {
const index = findCheckedIndex(combinationActivity) const index = findCheckedIndex(user)
if (index > -1) { if (index > -1) {
checkedUsers.value.splice(index, 1) checkedUsers.value.splice(index, 1)
checkedStatus.value[combinationActivity.id] = false checkedStatus.value[user.id] = false
isCheckAll.value = false isCheckAll.value = false
} }
} }
@ -240,7 +241,8 @@ const handleCheckOne = (checked: boolean, combinationActivity, isCalcCheckAll: b
} }
// //
const findCheckedIndex = (user) => checkedUsers.value.findIndex((item) => item.id === user.id) const findCheckedIndex = (user: UserVO) =>
checkedUsers.value.findIndex((item) => item.id === user.id)
// //
const calculateIsCheckAll = () => { const calculateIsCheckAll = () => {
@ -259,6 +261,6 @@ const handleEmitChange = () => {
/** 确认选择时的触发事件 */ /** 确认选择时的触发事件 */
const emits = defineEmits<{ const emits = defineEmits<{
change: [CombinationActivityApi: any] change: [users: UserVO[]]
}>() }>()
</script> </script>

View File

@ -195,6 +195,7 @@ const headerStyle = ({ row, columnIndex }: any) => {
display: 'none' display: 'none'
} }
} }
return {}
} }
interface SpanMethodProps { interface SpanMethodProps {

View File

@ -259,6 +259,7 @@ const getUserTypeColor = (type: number) => {
// //
const formData = ref<TradeOrderApi.OrderVO>({ const formData = ref<TradeOrderApi.OrderVO>({
items: [],
logs: [] logs: []
}) })
@ -299,7 +300,7 @@ const props = defineProps({
id: propTypes.number.def(undefined), // ID id: propTypes.number.def(undefined), // ID
showPickUp: propTypes.bool.def(true) // showPickUp: propTypes.bool.def(true) //
}) })
const id = (params.id || props.id) as unknown as number const id = Number(params.id || props.id)
const getDetail = async () => { const getDetail = async () => {
if (id) { if (id) {
const res = (await TradeOrderApi.getOrder(id)) as TradeOrderApi.OrderVO const res = (await TradeOrderApi.getOrder(id)) as TradeOrderApi.OrderVO
@ -326,9 +327,9 @@ const clipboardSuccess = () => {
} }
/** 初始化 **/ /** 初始化 **/
const deliveryExpressList = ref([]) // const deliveryExpressList = ref<DeliveryExpressApi.DeliveryExpressVO[]>([]) //
const expressTrackList = ref([]) // const expressTrackList = ref<Array<{ time?: Date | string; content?: string }>>([]) //
const pickUpStore = ref({}) // const pickUpStore = ref<DeliveryPickUpStoreApi.DeliveryPickUpStoreVO>() //
onMounted(async () => { onMounted(async () => {
await getDetail() await getDetail()
// //

View File

@ -14,7 +14,7 @@
v-for="item in deliveryExpressList" v-for="item in deliveryExpressList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -92,7 +92,7 @@ const resetForm = () => {
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }
const deliveryExpressList = ref([]) const deliveryExpressList = ref<DeliveryExpressApi.DeliveryExpressVO[]>([])
onMounted(async () => { onMounted(async () => {
deliveryExpressList.value = await DeliveryExpressApi.getSimpleDeliveryExpressList() deliveryExpressList.value = await DeliveryExpressApi.getSimpleDeliveryExpressList()
}) })

View File

@ -87,7 +87,7 @@
v-for="item in deliveryExpressList" v-for="item in deliveryExpressList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -107,7 +107,7 @@
v-for="item in pickUpStoreList" v-for="item in pickUpStoreList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>

View File

@ -66,7 +66,7 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ const formData = ref<ConfigApi.ConfigVO>({
id: undefined, id: undefined,
pointTradeDeductEnable: true, pointTradeDeductEnable: true,
pointTradeDeductUnitPrice: 0, pointTradeDeductUnitPrice: 0,
@ -94,7 +94,7 @@ const onSubmit = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as unknown as ConfigApi.ConfigVO const data = formData.value
await ConfigApi.saveConfig(data) await ConfigApi.saveConfig(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
dialogVisible.value = false dialogVisible.value = false

View File

@ -91,7 +91,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<UserApi.UserVO>({
id: undefined, id: undefined,
mobile: undefined, mobile: undefined,
email: undefined, email: undefined,
@ -125,7 +125,12 @@ const open = async (type: string, id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await UserApi.getUser(id) formData.value = {
...(await UserApi.getUser(id)),
password: undefined,
tagIds: [],
groupId: undefined
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -145,7 +150,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as unknown as UserApi.UserVO const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
// //
// await UserApi.createUser(data) // await UserApi.createUser(data)

View File

@ -55,8 +55,8 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ const formData = ref({
id: undefined, id: undefined as number | undefined,
nickname: undefined, nickname: undefined as string | undefined,
balance: '0', balance: '0',
changeBalance: 0, changeBalance: 0,
changeType: 1 changeType: 1
@ -75,7 +75,7 @@ const open = async (id?: number) => {
formLoading.value = true formLoading.value = true
try { try {
const user = await UserApi.getUser(id) const user = await UserApi.getUser(id)
const wallet = await WalletApi.getWallet({ userId: user.id || 0 }) const wallet = await WalletApi.getWallet({ userId: user.id! })
formData.value.id = user.id formData.value.id = user.id
formData.value.nickname = user.nickname formData.value.nickname = user.nickname
formData.value.balance = formatToFraction(wallet.balance) formData.value.balance = formatToFraction(wallet.balance)
@ -108,14 +108,14 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
await WalletApi.updateWalletBalance({ const data: WalletApi.WalletBalanceUpdateReqVO = {
userId: formData.value.id, userId: formData.value.id!,
balance: convertToInteger(formData.value.changeBalance) * formData.value.changeType balance: convertToInteger(formData.value.changeBalance) * formData.value.changeType
}) }
await WalletApi.updateWalletBalance(data)
//
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
dialogVisible.value = false dialogVisible.value = false
//
emit('success') emit('success')
} finally { } finally {
formLoading.value = false formLoading.value = false

View File

@ -41,10 +41,10 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ const formData = ref({
id: undefined, id: undefined as number | undefined,
nickname: undefined, nickname: undefined as string | undefined,
levelId: undefined, levelId: undefined as number | undefined,
reason: undefined reason: undefined as string | undefined
}) })
const formRules = reactive({ const formRules = reactive({
reason: [{ required: true, message: '修改原因不能为空', trigger: 'blur' }] reason: [{ required: true, message: '修改原因不能为空', trigger: 'blur' }]
@ -59,7 +59,13 @@ const open = async (id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await UserApi.getUser(id) const user = await UserApi.getUser(id)
formData.value = {
id: user.id,
nickname: user.nickname,
levelId: undefined,
reason: undefined
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -77,11 +83,15 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
await UserApi.updateUserLevel(formData.value) const data: UserApi.UserLevelUpdateReqVO = {
id: formData.value.id!,
levelId: formData.value.levelId!,
reason: formData.value.reason!
}
await UserApi.updateUserLevel(data)
//
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
dialogVisible.value = false dialogVisible.value = false
//
emit('success') emit('success')
} finally { } finally {
formLoading.value = false formLoading.value = false

View File

@ -47,8 +47,8 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ const formData = ref({
id: undefined, id: undefined as number | undefined,
nickname: undefined, nickname: undefined as string | undefined,
point: 0, point: 0,
changePoint: 0, changePoint: 0,
changeType: 1 changeType: 1
@ -66,9 +66,14 @@ const open = async (id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await UserApi.getUser(id) const user = await UserApi.getUser(id)
formData.value.changeType = 1 // formData.value = {
formData.value.changePoint = 0 // 0 id: user.id,
nickname: user.nickname,
point: user.point!,
changeType: 1, //
changePoint: 0 // 0
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -96,14 +101,14 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
await UserApi.updateUserPoint({ const data: UserApi.UserPointUpdateReqVO = {
id: formData.value.id, id: formData.value.id!,
point: formData.value.changePoint * formData.value.changeType point: formData.value.changePoint * formData.value.changeType
}) }
await UserApi.updateUserPoint(data)
//
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
dialogVisible.value = false dialogVisible.value = false
//
emit('success') emit('success')
} finally { } finally {
formLoading.value = false formLoading.value = false

View File

@ -37,7 +37,7 @@
<template #label> <template #label>
<descriptions-item-label icon="fa:mars-double" label="性别" /> <descriptions-item-label icon="fa:mars-double" label="性别" />
</template> </template>
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="user.sex" /> <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="user.sex ?? 0" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item> <el-descriptions-item>
<template #label> <template #label>
@ -103,7 +103,7 @@
<template #label> <template #label>
<descriptions-item-label icon="fa:mars-double" label="性别" /> <descriptions-item-label icon="fa:mars-double" label="性别" />
</template> </template>
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="user.sex" /> <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="user.sex ?? 0" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item> <el-descriptions-item>
<template #label> <template #label>

View File

@ -83,11 +83,11 @@ const { bindUserId }: { bindUserId: number } = defineProps({
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<BrokerageUserApi.BrokerageUserVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
bindUserId: null, bindUserId: undefined as number | undefined,
level: '', level: '',
bindUserTime: [] bindUserTime: []
}) })

View File

@ -183,7 +183,7 @@ onMounted(() => {
for (const dict of getIntDictOptions(DICT_TYPE.PROMOTION_COUPON_STATUS)) { for (const dict of getIntDictOptions(DICT_TYPE.PROMOTION_COUPON_STATUS)) {
statusTabs.push({ statusTabs.push({
label: dict.label, label: dict.label,
value: dict.value as string value: String(dict.value)
}) })
} }
}) })

View File

@ -106,17 +106,17 @@ defineOptions({ name: 'UserExperienceRecordList' })
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<ExperienceRecordApi.ExperienceRecordVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
userId: null, userId: undefined as number | undefined,
bizId: null, bizId: undefined as number | undefined,
bizType: null, bizType: undefined as number | undefined,
title: null, title: undefined as string | undefined,
description: null, description: undefined as string | undefined,
experience: null, experience: undefined as number | undefined,
totalExperience: null, totalExperience: undefined as number | undefined,
createTime: [] createTime: []
}) })
const queryFormRef = ref() // const queryFormRef = ref() //

View File

@ -5,7 +5,12 @@
<el-table-column key="id" align="center" label="商品编号" width="180" prop="id" /> <el-table-column key="id" align="center" label="商品编号" width="180" prop="id" />
<el-table-column label="商品图" min-width="80"> <el-table-column label="商品图" min-width="80">
<template #default="{ row }"> <template #default="{ row }">
<el-image :src="row.picUrl" class="h-30px w-30px" @click="imagePreview(row.picUrl)" /> <el-image
:src="row.picUrl"
:preview-src-list="row.picUrl ? [row.picUrl] : []"
class="h-30px w-30px"
preview-teleported
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :show-overflow-tooltip="true" label="商品名称" min-width="300" prop="name" /> <el-table-column :show-overflow-tooltip="true" label="商品名称" min-width="300" prop="name" />
@ -44,7 +49,7 @@ import { floatToFixed2 } from '@/utils'
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<FavoriteApi.Favorite[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,

View File

@ -84,7 +84,7 @@
v-for="item in deliveryExpressList" v-for="item in deliveryExpressList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -104,7 +104,7 @@
v-for="item in pickUpStoreList" v-for="item in pickUpStoreList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -199,7 +199,7 @@ const { userId } = defineProps<{
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<OrderApi.OrderVO[]>([]) //
const pickUpStoreList = ref<PickUpStoreApi.DeliveryPickUpStoreVO[]>([]) // const pickUpStoreList = ref<PickUpStoreApi.DeliveryPickUpStoreVO[]>([]) //
const deliveryExpressList = ref<DeliveryExpressApi.DeliveryExpressVO[]>([]) // const deliveryExpressList = ref<DeliveryExpressApi.DeliveryExpressVO[]>([]) //
const queryFormRef = ref<FormInstance>() // const queryFormRef = ref<FormInstance>() //

View File

@ -113,7 +113,7 @@ const getUserData = async (id: number) => {
const { currentRoute } = useRouter() // const { currentRoute } = useRouter() //
const { delView } = useTagsViewStore() // const { delView } = useTagsViewStore() //
const route = useRoute() const route = useRoute()
const id = route.params.id const id = Number(route.params.id)
/* 用户钱包相关信息 */ /* 用户钱包相关信息 */
const WALLET_INIT_DATA = { const WALLET_INIT_DATA = {
balance: 0, balance: 0,

View File

@ -231,18 +231,18 @@ const message = useMessage() // 消息弹窗
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<UserApi.UserVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
nickname: null, nickname: undefined as string | undefined,
mobile: null, mobile: undefined as string | undefined,
email: null, email: undefined as string | undefined,
loginDate: [], loginDate: [],
createTime: [], createTime: [],
tagIds: [], tagIds: [],
levelId: null, levelId: undefined as number | undefined,
groupId: null groupId: undefined as number | undefined
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const updateLevelFormRef = ref() // const updateLevelFormRef = ref() //
@ -288,7 +288,7 @@ const openForm = (type: string, id?: number) => {
/** 表格选中事件 */ /** 表格选中事件 */
const handleSelectionChange = (rows: UserApi.UserVO[]) => { const handleSelectionChange = (rows: UserApi.UserVO[]) => {
selectedIds.value = rows.map((row) => row.id) selectedIds.value = rows.map((row) => row.id!)
} }
/** 发送优惠券 */ /** 发送优惠券 */

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<Dialog v-model="dialogVisible" :title="dialogTitle" width="830px" @closed="close"> <Dialog v-model="dialogVisible" :title="dialogTitle" width="830px">
<el-form <el-form
ref="formRef" ref="formRef"
v-loading="formLoading" v-loading="formLoading"

View File

@ -142,10 +142,10 @@ const route = useRoute() // 路由
const { push, currentRoute } = useRouter() // const { push, currentRoute } = useRouter() //
const { delView } = useTagsViewStore() // const { delView } = useTagsViewStore() //
const id = ref(undefined) // const id = ref<number>() //
const returnUrl = ref<string | undefined>(undefined) // const returnUrl = ref<string | undefined>(undefined) //
const loading = ref(false) // loading const loading = ref(false) // loading
const payOrder = ref({}) // const payOrder = ref<PayOrderApi.OrderVO>({} as PayOrderApi.OrderVO) //
const channelsAlipay = [ const channelsAlipay = [
{ {
name: '支付宝 PC 网站支付', name: '支付宝 PC 网站支付',
@ -390,6 +390,9 @@ const createQueryInterval = () => {
return return
} }
interval.value = setInterval(async () => { interval.value = setInterval(async () => {
if (!id.value) {
return
}
const data = await PayOrderApi.getOrder(id.value) const data = await PayOrderApi.getOrder(id.value)
// //
if (data.status === PayOrderStatusEnum.SUCCESS.status) { if (data.status === PayOrderStatusEnum.SUCCESS.status) {
@ -454,8 +457,10 @@ const goReturnUrl = (payResult) => {
/** 初始化 */ /** 初始化 */
onMounted(() => { onMounted(() => {
id.value = route.query.id if (typeof route.query.id === 'string') {
if (route.query.returnUrl) { id.value = Number(route.query.id)
}
if (typeof route.query.returnUrl === 'string') {
returnUrl.value = decodeURIComponent(route.query.returnUrl) returnUrl.value = decodeURIComponent(route.query.returnUrl)
} }
getDetail() getDetail()

View File

@ -1,8 +1,8 @@
<template> <template>
<Dialog v-model="dialogVisible" title="通知详情" width="50%"> <Dialog v-model="dialogVisible" title="通知详情" width="50%" :loading="detailLoading">
<el-descriptions :column="2"> <el-descriptions :column="2">
<el-descriptions-item label="通知状态" :span="2"> <el-descriptions-item label="通知状态" :span="2">
<dict-tag :type="DICT_TYPE.PAY_NOTIFY_STATUS" :value="detailData.status" /> <dict-tag :type="DICT_TYPE.PAY_NOTIFY_STATUS" :value="detailData.status!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="商户订单编号" :span="2"> <el-descriptions-item label="商户订单编号" :span="2">
<el-tag>{{ detailData.merchantOrderId }}</el-tag> <el-tag>{{ detailData.merchantOrderId }}</el-tag>
@ -19,7 +19,7 @@
<el-descriptions-item label="关联编号">{{ detailData.dataId }}</el-descriptions-item> <el-descriptions-item label="关联编号">{{ detailData.dataId }}</el-descriptions-item>
<el-descriptions-item label="通知类型"> <el-descriptions-item label="通知类型">
<dict-tag :type="DICT_TYPE.PAY_NOTIFY_TYPE" :value="detailData.type" /> <dict-tag :type="DICT_TYPE.PAY_NOTIFY_TYPE" :value="detailData.type!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="通知次数">{{ detailData.notifyTimes }}</el-descriptions-item> <el-descriptions-item label="通知次数">{{ detailData.notifyTimes }}</el-descriptions-item>
@ -47,7 +47,7 @@
<el-descriptions :column="1" direction="vertical" border> <el-descriptions :column="1" direction="vertical" border>
<el-descriptions-item label="回调日志"> <el-descriptions-item label="回调日志">
<el-table :data="detailData.logs"> <el-table :data="detailData.logs || []">
<el-table-column label="日志编号" align="center" prop="id" /> <el-table-column label="日志编号" align="center" prop="id" />
<el-table-column label="通知状态" align="center" prop="status"> <el-table-column label="通知状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
@ -75,13 +75,13 @@ defineOptions({ name: 'PayNotifyDetail' })
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const detailLoading = ref(false) // const detailLoading = ref(false) //
const detailData = ref({}) const detailData = ref<PayNotifyApi.NotifyTaskVO>({ logs: [] })
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (id: number) => { const open = async (id: number) => {
dialogVisible.value = true
// //
detailLoading.value = true detailLoading.value = true
dialogVisible.value = true
try { try {
detailData.value = await PayNotifyApi.getNotifyTaskDetail(id) detailData.value = await PayNotifyApi.getNotifyTaskDetail(id)
} finally { } finally {

View File

@ -194,21 +194,21 @@ defineOptions({ name: 'PayNotify' })
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref() // const list = ref<PayNotifyApi.NotifyTaskVO[]>([]) //
const queryParams = ref({ const queryParams = ref({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
appId: null, appId: null as number | null,
type: null, type: null as number | null,
dataId: null, dataId: null as string | null,
status: null, status: null as number | null,
merchantOrderId: null, merchantOrderId: null as string | null,
merchantRefundId: null, merchantRefundId: null as string | null,
merchantTransferId: null, merchantTransferId: null as string | null,
createTime: [] createTime: [] as string[]
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const appList = ref([]) // const appList = ref<PayAppApi.AppVO[]>([]) //
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {

View File

@ -1,5 +1,5 @@
<template> <template>
<Dialog v-model="dialogVisible" title="订单详情" width="700px"> <Dialog v-model="dialogVisible" title="订单详情" width="700px" :loading="detailLoading">
<el-descriptions :column="2" label-class-name="desc-label"> <el-descriptions :column="2" label-class-name="desc-label">
<el-descriptions-item label="商户单号"> <el-descriptions-item label="商户单号">
<el-tag size="small">{{ detailData.merchantOrderId }}</el-tag> <el-tag size="small">{{ detailData.merchantOrderId }}</el-tag>
@ -10,20 +10,25 @@
<el-descriptions-item label="应用编号">{{ detailData.appId }}</el-descriptions-item> <el-descriptions-item label="应用编号">{{ detailData.appId }}</el-descriptions-item>
<el-descriptions-item label="应用名称">{{ detailData.appName }}</el-descriptions-item> <el-descriptions-item label="应用名称">{{ detailData.appName }}</el-descriptions-item>
<el-descriptions-item label="支付状态"> <el-descriptions-item label="支付状态">
<dict-tag :type="DICT_TYPE.PAY_ORDER_STATUS" :value="detailData.status" size="small" /> <dict-tag
v-if="detailData.status !== undefined"
:type="DICT_TYPE.PAY_ORDER_STATUS"
:value="detailData.status"
size="small"
/>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="支付金额"> <el-descriptions-item label="支付金额">
<el-tag type="success" size="small" <el-tag type="success" size="small">
>{{ ((detailData.price || 0) / 100.0).toFixed(2) }}</el-tag {{ (detailData.price! / 100.0).toFixed(2) }}
> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="手续费"> <el-descriptions-item label="手续费">
<el-tag type="warning" size="small"> <el-tag type="warning" size="small">
{{ ((detailData.channelFeePrice || 0) / 100.0).toFixed(2) }} {{ (detailData.channelFeePrice! / 100.0).toFixed(2) }}
</el-tag> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="手续费比例"> <el-descriptions-item label="手续费比例">
{{ (detailData.channelFeeRate || 0).toFixed(2) }}% {{ detailData.channelFeeRate!.toFixed(2) }}%
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="支付时间"> <el-descriptions-item label="支付时间">
{{ formatDate(detailData.successTime) }} {{ formatDate(detailData.successTime) }}
@ -44,7 +49,11 @@
<el-descriptions-item label="商品标题">{{ detailData.subject }}</el-descriptions-item> <el-descriptions-item label="商品标题">{{ detailData.subject }}</el-descriptions-item>
<el-descriptions-item label="商品描述">{{ detailData.body }}</el-descriptions-item> <el-descriptions-item label="商品描述">{{ detailData.body }}</el-descriptions-item>
<el-descriptions-item label="支付渠道"> <el-descriptions-item label="支付渠道">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="detailData.channelCode" /> <dict-tag
v-if="detailData.channelCode"
:type="DICT_TYPE.PAY_CHANNEL_CODE"
:value="detailData.channelCode"
/>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="支付 IP">{{ detailData.userIp }}</el-descriptions-item> <el-descriptions-item label="支付 IP">{{ detailData.userIp }}</el-descriptions-item>
<el-descriptions-item label="渠道单号"> <el-descriptions-item label="渠道单号">
@ -55,7 +64,7 @@
<el-descriptions-item label="渠道用户">{{ detailData.channelUserId }}</el-descriptions-item> <el-descriptions-item label="渠道用户">{{ detailData.channelUserId }}</el-descriptions-item>
<el-descriptions-item label="退款金额"> <el-descriptions-item label="退款金额">
<el-tag size="small" type="danger"> <el-tag size="small" type="danger">
{{ ((detailData.refundPrice || 0) / 100.0).toFixed(2) }} {{ (detailData.refundPrice! / 100.0).toFixed(2) }}
</el-tag> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="通知 URL">{{ detailData.notifyUrl }}</el-descriptions-item> <el-descriptions-item label="通知 URL">{{ detailData.notifyUrl }}</el-descriptions-item>
@ -65,7 +74,7 @@
<el-descriptions :column="1" label-class-name="desc-label" direction="vertical" border> <el-descriptions :column="1" label-class-name="desc-label" direction="vertical" border>
<el-descriptions-item label="支付通道异步回调内容"> <el-descriptions-item label="支付通道异步回调内容">
<el-text style="overflow-wrap: anywhere; white-space: pre-wrap"> <el-text style="overflow-wrap: anywhere; white-space: pre-wrap">
{{ detailData.extension.channelNotifyData }} {{ detailData.extension?.channelNotifyData }}
</el-text> </el-text>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
@ -80,15 +89,15 @@ defineOptions({ name: 'PayOrderDetail' })
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const detailLoading = ref(false) // const detailLoading = ref(false) //
const detailData = ref({ const detailData = ref<OrderApi.OrderDetailVO>({
extension: {} extension: {}
}) })
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (id: number) => { const open = async (id: number) => {
dialogVisible.value = true
// //
detailLoading.value = true detailLoading.value = true
dialogVisible.value = true
try { try {
detailData.value = await OrderApi.getOrderDetail(id) detailData.value = await OrderApi.getOrderDetail(id)
if (!detailData.value.extension) { if (!detailData.value.extension) {

View File

@ -117,16 +117,14 @@
:formatter="dateFormatter" :formatter="dateFormatter"
/> />
<el-table-column label="支付金额" align="center" prop="price" width="100"> <el-table-column label="支付金额" align="center" prop="price" width="100">
<template #default="scope"> {{ parseFloat(scope.row.price / 100).toFixed(2) }} </template> <template #default="scope"> {{ (scope.row.price! / 100).toFixed(2) }} </template>
</el-table-column> </el-table-column>
<el-table-column label="退款金额" align="center" prop="refundPrice" width="100"> <el-table-column label="退款金额" align="center" prop="refundPrice" width="100">
<template #default="scope"> <template #default="scope"> {{ (scope.row.refundPrice! / 100).toFixed(2) }} </template>
{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="手续金额" align="center" prop="channelFeePrice" width="100"> <el-table-column label="手续金额" align="center" prop="channelFeePrice" width="100">
<template #default="scope"> <template #default="scope">
{{ parseFloat(scope.row.channelFeePrice / 100).toFixed(2) }} {{ (scope.row.channelFeePrice! / 100).toFixed(2) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单号" align="left" width="300"> <el-table-column label="订单号" align="left" width="300">
@ -149,7 +147,11 @@
</el-table-column> </el-table-column>
<el-table-column label="支付渠道" align="center" prop="channelCode" width="140"> <el-table-column label="支付渠道" align="center" prop="channelCode" width="140">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="scope.row.channelCode" /> <dict-tag
v-if="scope.row.channelCode"
:type="DICT_TYPE.PAY_CHANNEL_CODE"
:value="scope.row.channelCode"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -192,7 +194,7 @@ import { dateFormatter } from '@/utils/formatTime'
import * as OrderApi from '@/api/pay/order' import * as OrderApi from '@/api/pay/order'
import OrderDetail from './OrderDetail.vue' import OrderDetail from './OrderDetail.vue'
import download from '@/utils/download' import download from '@/utils/download'
import { getAppList } from '@/api/pay/app' import { AppVO, getAppList } from '@/api/pay/app'
defineOptions({ name: 'PayOrder' }) defineOptions({ name: 'PayOrder' })
@ -200,21 +202,21 @@ const message = useMessage() // 消息弹窗
const loading = ref(false) // const loading = ref(false) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<OrderApi.OrderDetailVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
appId: null, appId: null as number | null,
channelCode: null, channelCode: null as string | null,
merchantOrderId: null, merchantOrderId: null as string | null,
channelOrderNo: null, channelOrderNo: null as string | null,
no: null, no: null as string | null,
status: null, status: null as number | null,
createTime: [] createTime: [] as string[]
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
const appList = ref([]) // const appList = ref<AppVO[]>([]) //
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {

View File

@ -1,5 +1,5 @@
<template> <template>
<Dialog v-model="dialogVisible" title="详情" width="700px"> <Dialog v-model="dialogVisible" title="详情" width="700px" :loading="detailLoading">
<el-descriptions :column="2" label-class-name="desc-label"> <el-descriptions :column="2" label-class-name="desc-label">
<el-descriptions-item label="商户退款单号"> <el-descriptions-item label="商户退款单号">
<el-tag size="small">{{ refundDetail.merchantRefundId }}</el-tag> <el-tag size="small">{{ refundDetail.merchantRefundId }}</el-tag>
@ -19,16 +19,20 @@
<el-descriptions-item label="应用名称">{{ refundDetail.appName }}</el-descriptions-item> <el-descriptions-item label="应用名称">{{ refundDetail.appName }}</el-descriptions-item>
<el-descriptions-item label="支付金额"> <el-descriptions-item label="支付金额">
<el-tag type="success" size="small"> <el-tag type="success" size="small">
{{ (refundDetail.payPrice / 100.0).toFixed(2) }} {{ (refundDetail.payPrice! / 100.0).toFixed(2) }}
</el-tag> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款金额"> <el-descriptions-item label="退款金额">
<el-tag size="small" type="danger"> <el-tag size="small" type="danger">
{{ (refundDetail.refundPrice / 100.0).toFixed(2) }} {{ (refundDetail.refundPrice! / 100.0).toFixed(2) }}
</el-tag> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款状态"> <el-descriptions-item label="退款状态">
<dict-tag :type="DICT_TYPE.PAY_REFUND_STATUS" :value="refundDetail.status" /> <dict-tag
v-if="refundDetail.status !== undefined"
:type="DICT_TYPE.PAY_REFUND_STATUS"
:value="refundDetail.status"
/>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款时间"> <el-descriptions-item label="退款时间">
{{ formatDate(refundDetail.successTime) }} {{ formatDate(refundDetail.successTime) }}
@ -44,7 +48,11 @@
<el-divider /> <el-divider />
<el-descriptions :column="2" label-class-name="desc-label"> <el-descriptions :column="2" label-class-name="desc-label">
<el-descriptions-item label="退款渠道"> <el-descriptions-item label="退款渠道">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="refundDetail.channelCode" /> <dict-tag
v-if="refundDetail.channelCode"
:type="DICT_TYPE.PAY_CHANNEL_CODE"
:value="refundDetail.channelCode"
/>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款原因">{{ refundDetail.reason }}</el-descriptions-item> <el-descriptions-item label="退款原因">{{ refundDetail.reason }}</el-descriptions-item>
<el-descriptions-item label="退款 IP">{{ refundDetail.userIp }}</el-descriptions-item> <el-descriptions-item label="退款 IP">{{ refundDetail.userIp }}</el-descriptions-item>
@ -78,13 +86,13 @@ defineOptions({ name: 'PayRefundDetail' })
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const detailLoading = ref(false) // const detailLoading = ref(false) //
const refundDetail = ref({}) const refundDetail = ref<RefundApi.RefundDetailVO>({})
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (id: number) => { const open = async (id: number) => {
dialogVisible.value = true
// //
detailLoading.value = true detailLoading.value = true
dialogVisible.value = true
try { try {
refundDetail.value = await RefundApi.getRefund(id) refundDetail.value = await RefundApi.getRefund(id)
} finally { } finally {

View File

@ -125,14 +125,10 @@
:formatter="dateFormatter" :formatter="dateFormatter"
/> />
<el-table-column label="支付金额" align="center" prop="payPrice" width="100"> <el-table-column label="支付金额" align="center" prop="payPrice" width="100">
<template #default="scope"> <template #default="scope"> {{ (scope.row.payPrice! / 100).toFixed(2) }} </template>
{{ parseFloat(scope.row.payPrice / 100).toFixed(2) }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="退款金额" align="center" prop="refundPrice" width="100"> <el-table-column label="退款金额" align="center" prop="refundPrice" width="100">
<template #default="scope"> <template #default="scope"> {{ (scope.row.refundPrice! / 100).toFixed(2) }} </template>
{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="退款订单号" align="left" width="300"> <el-table-column label="退款订单号" align="left" width="300">
<template #default="scope"> <template #default="scope">
@ -164,7 +160,11 @@
</el-table-column> </el-table-column>
<el-table-column label="退款渠道" align="center" width="140"> <el-table-column label="退款渠道" align="center" width="140">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="scope.row.channelCode" /> <dict-tag
v-if="scope.row.channelCode"
:type="DICT_TYPE.PAY_CHANNEL_CODE"
:value="scope.row.channelCode"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -218,26 +218,26 @@ const message = useMessage() // 消息弹窗
const loading = ref(false) // const loading = ref(false) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<RefundApi.RefundDetailVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
merchantId: undefined, merchantId: undefined as number | undefined,
appId: undefined, appId: undefined as number | undefined,
channelCode: undefined, channelCode: undefined as string | undefined,
merchantOrderId: undefined, merchantOrderId: undefined as string | undefined,
merchantRefundId: undefined, merchantRefundId: undefined as string | undefined,
status: undefined, status: undefined as number | undefined,
payPrice: undefined, payPrice: undefined as number | undefined,
refundPrice: undefined, refundPrice: undefined as number | undefined,
channelOrderNo: undefined, channelOrderNo: undefined as string | undefined,
channelRefundNo: undefined, channelRefundNo: undefined as string | undefined,
createTime: [], createTime: [] as string[],
successTime: [] successTime: [] as string[]
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
const appList = ref([]) // const appList = ref<AppApi.AppVO[]>([]) //
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {

View File

@ -1,5 +1,5 @@
<template> <template>
<Dialog v-model="dialogVisible" title="转账单详情" width="700px"> <Dialog v-model="dialogVisible" title="转账单详情" width="700px" :loading="detailLoading">
<el-descriptions :column="2" label-class-name="desc-label"> <el-descriptions :column="2" label-class-name="desc-label">
<el-descriptions-item label="商户单号"> <el-descriptions-item label="商户单号">
<el-tag size="small">{{ detailData.merchantTransferId }}</el-tag> <el-tag size="small">{{ detailData.merchantTransferId }}</el-tag>
@ -9,10 +9,17 @@
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="应用编号">{{ detailData.appId }}</el-descriptions-item> <el-descriptions-item label="应用编号">{{ detailData.appId }}</el-descriptions-item>
<el-descriptions-item label="转账状态"> <el-descriptions-item label="转账状态">
<dict-tag :type="DICT_TYPE.PAY_TRANSFER_STATUS" :value="detailData.status" size="small" /> <dict-tag
v-if="detailData.status !== undefined"
:type="DICT_TYPE.PAY_TRANSFER_STATUS"
:value="detailData.status"
size="small"
/>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="转账金额"> <el-descriptions-item label="转账金额">
<el-tag type="success" size="small">{{ (detailData.price / 100.0).toFixed(2) }}</el-tag> <el-tag type="success" size="small">
{{ (detailData.price! / 100.0).toFixed(2) }}
</el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="转账时间"> <el-descriptions-item label="转账时间">
{{ formatDate(detailData.successTime) }} {{ formatDate(detailData.successTime) }}
@ -27,7 +34,11 @@
<el-descriptions-item label="收款人姓名">{{ detailData.userName }}</el-descriptions-item> <el-descriptions-item label="收款人姓名">{{ detailData.userName }}</el-descriptions-item>
<el-descriptions-item label="收款人账号">{{ detailData.userAccount }}</el-descriptions-item> <el-descriptions-item label="收款人账号">{{ detailData.userAccount }}</el-descriptions-item>
<el-descriptions-item label="支付渠道"> <el-descriptions-item label="支付渠道">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="detailData.channelCode" /> <dict-tag
v-if="detailData.channelCode"
:type="DICT_TYPE.PAY_CHANNEL_CODE"
:value="detailData.channelCode"
/>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="支付 IP">{{ detailData.userIp }}</el-descriptions-item> <el-descriptions-item label="支付 IP">{{ detailData.userIp }}</el-descriptions-item>
<el-descriptions-item label="渠道单号"> <el-descriptions-item label="渠道单号">
@ -61,13 +72,13 @@ defineOptions({ name: 'PayTransferDetail' })
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const detailLoading = ref(false) // const detailLoading = ref(false) //
const detailData = ref({}) const detailData = ref<TransferApi.TransferVO>({})
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (id: number) => { const open = async (id: number) => {
dialogVisible.value = true
// //
detailLoading.value = true detailLoading.value = true
dialogVisible.value = true
try { try {
detailData.value = await TransferApi.getTransfer(id) detailData.value = await TransferApi.getTransfer(id)
} finally { } finally {

View File

@ -163,7 +163,11 @@
<el-table-column label="转账标题" align="center" prop="subject" width="120" /> <el-table-column label="转账标题" align="center" prop="subject" width="120" />
<el-table-column label="转账渠道" align="center" prop="channelCode"> <el-table-column label="转账渠道" align="center" prop="channelCode">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="scope.row.channelCode" /> <dict-tag
v-if="scope.row.channelCode"
:type="DICT_TYPE.PAY_CHANNEL_CODE"
:value="scope.row.channelCode"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -203,23 +207,25 @@ const message = useMessage() // 消息弹窗
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref<TransferApi.TransferVO[]>([]) //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
no: null, no: null as string | null,
appId: null, appId: null as number | null,
channelId: null, channelId: null as number | null,
channelCode: null, channelCode: null as string | null,
merchantTransferId: null, merchantTransferId: null as string | null,
type: null, type: null as string | null,
status: null, status: null as number | null,
successTime: [], successTime: [] as string[],
price: null, price: null as number | null,
subject: null, subject: null as string | null,
userName: null, userName: null as string | null,
userAccount: null, userAccount: null as string | null,
createTime: [] accountNo: null as string | null,
channelTransferNo: null as string | null,
createTime: [] as string[]
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //

View File

@ -52,7 +52,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<DictTypeApi.DictTypeVO>({
id: undefined, id: undefined,
name: '', name: '',
type: '', type: '',
@ -94,7 +94,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as DictTypeApi.DictTypeVO const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
await DictTypeApi.createDictType(data) await DictTypeApi.createDictType(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))

View File

@ -71,7 +71,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<DictDataApi.DictDataVO>({
id: undefined, id: undefined,
sort: undefined, sort: undefined,
label: '', label: '',
@ -149,7 +149,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as DictDataApi.DictDataVO const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
await DictDataApi.createDictData(data) await DictDataApi.createDictData(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))

View File

@ -205,7 +205,7 @@ const handleDelete = async (id: number) => {
/** 批量删除按钮操作 */ /** 批量删除按钮操作 */
const checkedIds = ref<number[]>([]) const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (rows: DictDataApi.DictDataVO[]) => { const handleRowCheckboxChange = (rows: DictDataApi.DictDataVO[]) => {
checkedIds.value = rows.map((row) => row.id) checkedIds.value = rows.map((row) => row.id!)
} }
const handleDeleteBatch = async () => { const handleDeleteBatch = async () => {

View File

@ -223,7 +223,7 @@ const handleDelete = async (id: number) => {
/** 批量删除按钮操作 */ /** 批量删除按钮操作 */
const checkedIds = ref<number[]>([]) const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (rows: DictTypeApi.DictTypeVO[]) => { const handleRowCheckboxChange = (rows: DictTypeApi.DictTypeVO[]) => {
checkedIds.value = rows.map((row) => row.id) checkedIds.value = rows.map((row) => row.id!)
} }
const handleDeleteBatch = async () => { const handleDeleteBatch = async () => {

View File

@ -74,7 +74,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref<MailAccountApi.MailAccountVO>({
id: undefined, id: undefined,
mail: '', mail: '',
username: '', username: '',
@ -126,7 +126,7 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as MailAccountApi.MailAccountVO const data = formData.value
if (formType.value === 'create') { if (formType.value === 'create') {
await MailAccountApi.createMailAccount(data) await MailAccountApi.createMailAccount(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))

View File

@ -190,7 +190,7 @@ const handleDelete = async (id: number) => {
/** 批量删除按钮操作 */ /** 批量删除按钮操作 */
const checkedIds = ref<number[]>([]) const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (rows: MailAccountApi.MailAccountVO[]) => { const handleRowCheckboxChange = (rows: MailAccountApi.MailAccountVO[]) => {
checkedIds.value = rows.map((row) => row.id) checkedIds.value = rows.map((row) => row.id!)
} }
const handleDeleteBatch = async () => { const handleDeleteBatch = async () => {

View File

@ -29,7 +29,7 @@
<el-option <el-option
v-for="account in accountList" v-for="account in accountList"
:key="account.id" :key="account.id"
:value="account.id" :value="account.id!"
:label="account.mail" :label="account.mail"
/> />
</el-select> </el-select>

View File

@ -13,7 +13,7 @@
v-for="account in accountList" v-for="account in accountList"
:key="account.id" :key="account.id"
:label="account.mail" :label="account.mail"
:value="account.id" :value="account.id!"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>

View File

@ -38,7 +38,7 @@
<el-option <el-option
v-for="account in accountList" v-for="account in accountList"
:key="account.id" :key="account.id"
:value="account.id" :value="account.id!"
:label="account.mail" :label="account.mail"
/> />
</el-select> </el-select>

View File

@ -73,7 +73,7 @@
v-model:expanded-row-keys="expandedRowKeys" v-model:expanded-row-keys="expandedRowKeys"
:columns="columns" :columns="columns"
:data="list" :data="list"
:expand-column-key="columns[0].key" :expand-column-key="String(columns[0].key)"
:height="1000" :height="1000"
:width="width" :width="width"
fixed fixed
@ -94,7 +94,7 @@ import { MenuVO } from '@/api/system/menu'
import MenuForm from './MenuForm.vue' import MenuForm from './MenuForm.vue'
import DictTag from '@/components/DictTag/src/DictTag.vue' import DictTag from '@/components/DictTag/src/DictTag.vue'
import { Icon } from '@/components/Icon' import { Icon } from '@/components/Icon'
import { ElButton, TableV2FixedDir, ElSwitch } from 'element-plus' import { ElButton, TableV2FixedDir, ElSwitch, type Column } from 'element-plus'
import { checkPermi } from '@/utils/permission' import { checkPermi } from '@/utils/permission'
import { CommonStatusEnum } from '@/utils/constants' import { CommonStatusEnum } from '@/utils/constants'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache' import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
@ -102,7 +102,7 @@ import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
defineOptions({ name: 'SystemMenu' }) defineOptions({ name: 'SystemMenu' })
// //
const columns = [ const columns: Column<MenuVO>[] = [
{ {
key: 'name', key: 'name',
title: '菜单名称', title: '菜单名称',

View File

@ -184,7 +184,7 @@ const handleDelete = async (id: number) => {
/** 批量删除按钮操作 */ /** 批量删除按钮操作 */
const checkedIds = ref<number[]>([]) const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (rows: NoticeApi.NoticeVO[]) => { const handleRowCheckboxChange = (rows: NoticeApi.NoticeVO[]) => {
checkedIds.value = rows.map((row) => row.id) checkedIds.value = rows.map((row) => row.id!)
} }
const handleDeleteBatch = async () => { const handleDeleteBatch = async () => {

View File

@ -194,7 +194,7 @@ const handleDelete = async (id: number) => {
/** 批量删除按钮操作 */ /** 批量删除按钮操作 */
const checkedIds = ref<number[]>([]) const checkedIds = ref<number[]>([])
const handleRowCheckboxChange = (rows: PostApi.PostVO[]) => { const handleRowCheckboxChange = (rows: PostApi.PostVO[]) => {
checkedIds.value = rows.map((row) => row.id) checkedIds.value = rows.map((row) => row.id!)
} }
const handleDeleteBatch = async () => { const handleDeleteBatch = async () => {

View File

@ -10,7 +10,7 @@
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="短信模板"> <el-descriptions-item label="短信模板">
{{ detailData.templateId }} | {{ detailData.templateCode }} {{ detailData.templateId }} | {{ detailData.templateCode }}
<dict-tag :type="DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE" :value="detailData.templateType" /> <dict-tag :type="DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE" :value="detailData.templateType!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="API 的模板编号"> <el-descriptions-item label="API 的模板编号">
{{ detailData.apiTemplateId }} {{ detailData.apiTemplateId }}
@ -32,7 +32,7 @@
{{ formatDate(detailData.createTime) }} {{ formatDate(detailData.createTime) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="发送状态"> <el-descriptions-item label="发送状态">
<dict-tag :type="DICT_TYPE.SYSTEM_SMS_SEND_STATUS" :value="detailData.sendStatus" /> <dict-tag :type="DICT_TYPE.SYSTEM_SMS_SEND_STATUS" :value="detailData.sendStatus!" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="发送时间"> <el-descriptions-item label="发送时间">
{{ formatDate(detailData.sendTime) }} {{ formatDate(detailData.sendTime) }}
@ -47,7 +47,7 @@
{{ detailData.apiRequestId }} {{ detailData.apiRequestId }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="API 接收状态"> <el-descriptions-item label="API 接收状态">
<dict-tag :type="DICT_TYPE.SYSTEM_SMS_RECEIVE_STATUS" :value="detailData.receiveStatus" /> <dict-tag :type="DICT_TYPE.SYSTEM_SMS_RECEIVE_STATUS" :value="detailData.receiveStatus!" />
{{ formatDate(detailData.receiveTime) }} {{ formatDate(detailData.receiveTime) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="API 接收结果"> <el-descriptions-item label="API 接收结果">
@ -66,8 +66,8 @@ defineOptions({ name: 'SystemSmsLogDetail' })
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const detailLoading = ref(false) // const detailLoading = ref(false) //
const detailData = ref() // const detailData = ref<SmsLogApi.SmsLogVO>({} as SmsLogApi.SmsLogVO) //
const channelList = ref([]) // const channelList = ref<SmsChannelApi.SmsChannelVO[]>([]) //
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (data: SmsLogApi.SmsLogVO) => { const open = async (data: SmsLogApi.SmsLogVO) => {