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
.history
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}` })
},

View File

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

View File

@ -2,11 +2,17 @@ import request from '@/config/axios'
export interface Favorite {
id?: number
userId?: string // 用户编号
userId?: number // 用户编号
spuId?: number | null // 商品 SPU 编号
name?: string
picUrl?: string
price?: number
salesCount?: number
createTime?: Date
status?: number
}
// 获得 ProductFavorite 列表
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 type { OrderItemRespVO, OrderVO } from '@/api/mall/trade/order'
export interface TradeAfterSaleVO {
id?: number | null // 售后编号,主键自增
@ -32,6 +33,21 @@ export interface TradeAfterSaleVO {
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 {
propertyId?: number | null // 属性的编号
propertyName?: string // 属性的名称
@ -41,12 +57,15 @@ export interface ProductPropertiesVO {
// 获得交易售后分页
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) => {
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) => {
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) => {
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'
export interface ConfigVO {
id?: number | null
afterSaleRefundReasons: string[]
afterSaleReturnReasons: string[]
deliveryExpressFreeEnabled: boolean
deliveryExpressFreePrice: number
deliveryPickUpEnabled: boolean
brokerageEnabled: boolean
brokerageEnabledCondition: number
brokerageBindMode: number
brokeragePosterUrls: string
brokerageEnabledCondition?: number
brokerageBindMode?: number
brokeragePosterUrls: string[]
brokerageFirstPercent: number
brokerageSecondPercent: number
brokerageWithdrawMinPrice: number
brokerageWithdrawFeePercent: number
brokerageFrozenDays: number
brokerageWithdrawTypes: string
brokerageWithdrawTypes: number[]
tencentLbsKey?: string
}
// 查询交易中心配置详情
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'
export interface DeliveryExpressVO {
id: number
id?: number
code: string
name: string
logo: string
@ -11,17 +11,20 @@ export interface DeliveryExpressVO {
// 查询快递公司列表
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) => {
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 = () => {
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'
export interface DeliveryExpressTemplateVO {
id: number
id?: number
name: string
chargeMode: number
sort: number
templateCharge: ExpressTemplateChargeVO[]
templateFree: ExpressTemplateFreeVO[]
charges: ExpressTemplateChargeVO[]
frees: ExpressTemplateFreeVO[]
}
export declare type ExpressTemplateChargeVO = {
@ -25,17 +25,24 @@ export declare type ExpressTemplateFreeVO = {
// 查询快递运费模板列表
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) => {
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 () => {
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 type { UserVO } from '@/api/system/user'
export interface DeliveryPickUpStoreVO {
id: number
id?: number
name: string
introduction: string
phone: string
areaId: number
areaId?: number
detailAddress: string
logo: string
openingTime: string
closingTime: string
latitude: number
longitude: number
openingTime?: string
closingTime?: string
latitude?: number
longitude?: number
status: number
verifyUserIds: number[] // 绑定用户编号组数
verifyUserIds?: number[] // 绑定用户编号组数
verifyUsers?: UserVO[] // 绑定用户列表
}
export interface DeliveryPickUpStoreBindReqVO {
id: number
verifyUserIds: number[]
}
// 查询自提门店列表
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) => {
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[]> => {
return await request.get({ url: '/trade/delivery/pick-up-store/simple-list' })
export const getSimpleDeliveryPickUpStoreList = async () => {
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 })
}

View File

@ -122,7 +122,7 @@ export interface TradeOrderSummaryRespVO {
// 查询交易订单列表
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) => {
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) => {
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 {

View File

@ -1,8 +1,8 @@
import request from '@/config/axios'
export interface ConfigVO {
id: number
pointTradeDeductEnable: number
id?: number
pointTradeDeductEnable: boolean
pointTradeDeductUnitPrice: number
pointTradeDeductMaxPrice: number
pointTradeGivePoint: number
@ -10,7 +10,7 @@ export interface ConfigVO {
// 查询积分设置详情
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) => {
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) => {
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'
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
avatar: string | undefined
birthday: number | undefined
createTime: number | undefined
loginDate: number | undefined
loginIp: string
mark: string
mobile: string
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
levelId: number
reason: string
}
export interface UserPointUpdateReqVO {
id: number
point: number
}
// 查询会员用户列表
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) => {
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 })
}
// 修改会员用户积分
export const updateUserPoint = async (data: any) => {
export const updateUserPoint = async (data: UserPointUpdateReqVO) => {
return await request.put({ url: `/member/user/update-point`, data })
}

View File

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

View File

@ -1,15 +1,43 @@
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) => {
return request.get({
export const getNotifyTaskDetail = (id: number) => {
return request.get<NotifyTaskVO>({
url: '/pay/notify/get-detail?id=' + id
})
}
// 获得支付通知分页
export const getNotifyTaskPage = (query) => {
return request.get({
export const getNotifyTaskPage = (query: any) => {
return request.get<PageResult<NotifyTaskVO[]>>({
url: '/pay/notify/page',
params: query
})

View File

@ -12,6 +12,7 @@ export interface OrderVO {
notifyUrl: string
notifyStatus: number
amount: number
price: number
channelFeeRate: number
channelFeeAmount: number
status: number
@ -28,64 +29,43 @@ export interface OrderVO {
createTime: Date
}
export interface OrderPageReqVO extends PageParam {
merchantId?: number
appId?: number
channelId?: number
channelCode?: string
export interface OrderDetailVO {
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
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
merchantOrderId?: 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
userIp?: string
channelOrderNo?: string
createTime?: Date[]
channelUserId?: string
notifyUrl?: string
extension?: {
channelNotifyData?: string
}
}
// 查询列表支付订单
export const getOrderPage = async (params: OrderPageReqVO) => {
return await request.get({ url: '/pay/order/page', params })
export const getOrderPage = async (params: any) => {
return await request.get<PageResult<OrderDetailVO[]>>({
url: '/pay/order/page',
params
})
}
// 查询详情支付订单
export const getOrder = async (id: number, sync?: boolean) => {
return await request.get({
return await request.get<OrderVO>({
url: '/pay/order/get',
params: {
id,
@ -96,7 +76,7 @@ export const getOrder = async (id: number, sync?: boolean) => {
// 获得支付订单的明细
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 })
}

View File

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

View File

@ -1,16 +1,42 @@
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) => {
return await request.get({ url: `/pay/transfer/page`, params })
export const getTransferPage = async (params: any) => {
return await request.get<PageResult<TransferVO[]>>({
url: `/pay/transfer/page`,
params
})
}
// 查询转账单详情
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 })
}

View File

@ -16,6 +16,12 @@ export interface WalletVO {
freezePrice: number
}
/** 修改会员钱包余额 Request VO */
export interface WalletBalanceUpdateReqVO {
userId: number
balance: number
}
/** 查询用户钱包详情 */
export const getWallet = async (params: PayWalletUserReqVO) => {
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 })
}

View File

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

View File

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

View File

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

View File

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

View File

@ -41,7 +41,7 @@
:key="conversation.id"
@click="handleConversationClick(conversation.id)"
@mouseover="hoverConversationId = conversation.id"
@mouseout="hoverConversationId = ''"
@mouseout="hoverConversationId = null"
>
<div
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
const props = defineProps({
activeId: {
type: String || null,
type: [Number, String],
required: true
}
})
@ -186,11 +186,9 @@ const handleConversationClick = async (id: number) => {
const filterConversation = conversationList.value.filter((item) => {
return item.id === id
})
// onConversationClick
// noinspection JSVoidFunctionReturnValueUsed
const success = emits('onConversationClick', filterConversation[0])
//
if (success) {
// onConversationClick
if (filterConversation[0]) {
emits('onConversationClick', filterConversation[0])
activeConversationId.value = id
}
}
@ -366,7 +364,7 @@ const handleRoleRepository = async () => {
/** 监听选中的对话 */
const { activeId } = toRefs(props)
watch(activeId, async (newValue, _oldValue) => {
activeConversationId.value = newValue as string
activeConversationId.value = newValue ? Number(newValue) : null
})
// public
@ -378,7 +376,7 @@ onMounted(async () => {
await getChatConversationList()
//
if (props.activeId) {
activeConversationId.value = props.activeId
activeConversationId.value = Number(props.activeId)
} else {
//
if (conversationList.value.length) {

View File

@ -72,7 +72,15 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) //
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,
systemMessage: undefined,
modelId: undefined,
@ -104,7 +112,7 @@ const open = async (id: number) => {
obj[key] = data[key]
}
return obj
}, {})
}, {} as ConversationFormData)
} finally {
formLoading.value = false
}

View File

@ -18,26 +18,16 @@
class="!p-10px !m-0"
text
:icon="Download"
@click="handleButtonClick('download', detail)"
@click="handleButtonClick('download')"
/>
<el-button
class="!p-10px !m-0"
text
:icon="RefreshRight"
@click="handleButtonClick('regeneration', detail)"
/>
<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)"
@click="handleButtonClick('regeneration')"
/>
<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 class="!overflow-hidden !mt-20px !h-280px !flex-1" ref="cardImageRef">
@ -56,7 +46,7 @@
<el-button
size="small"
v-for="button in detail?.buttons"
:key="button"
:key="button.customId"
class="min-w-40px ml-0 mr-10px mt-5px"
@click="handleMidjourneyBtnClick(button)"
>
@ -77,7 +67,7 @@ const message = useMessage() // 消息
const props = defineProps({
detail: {
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 handleButtonClick = async (type, detail: ImageVO) => {
emits('onBtnClick', type, detail)
const handleButtonClick = async (type: string) => {
emits('onBtnClick', type, props.detail)
}
/** 处理 Midjourney 按钮点击事件 */
@ -101,7 +91,7 @@ const emits = defineEmits(['onBtnClick', 'onMjBtnClick']) // emits
/** 监听详情 */
const { detail } = toRefs(props)
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 () => {
await handleLoading(props.detail.status as string)
await handleLoading(props.detail.status)
})
</script>

View File

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

View File

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

View File

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

View File

@ -4,10 +4,10 @@
<el-descriptions title="订单信息">
<el-descriptions-item label="订单号: ">{{ formData.orderNo }}</el-descriptions-item>
<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 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 label="收货人: ">
{{ formData.order.receiverName }}
@ -16,7 +16,7 @@
{{ formData.order.userRemark }}
</el-descriptions-item>
<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 label="联系电话: ">
{{ formData.order.receiverMobile }}
@ -26,7 +26,7 @@
{{ formData.order.payOrderId }}
</el-descriptions-item>
<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 label="买家: ">{{ formData?.user?.nickname }}</el-descriptions-item>
</el-descriptions>
@ -38,13 +38,13 @@
{{ formatDate(formData.auditTime) }}
</el-descriptions-item>
<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 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 label="退款金额: ">
{{ fenToYuan(formData.refundPrice) }}
{{ fenToYuan(formData.refundPrice!) }}
</el-descriptions-item>
<el-descriptions-item label="退款原因: ">{{ formData.applyReason }}</el-descriptions-item>
<el-descriptions-item label="补充描述: ">
@ -52,11 +52,12 @@
</el-descriptions-item>
<el-descriptions-item label="凭证图片: ">
<el-image
v-for="(item, index) in formData.applyPicUrls"
v-for="(item, index) in formData.applyPicUrls || []"
:key="index"
:src="item.url"
:src="item"
:preview-src-list="formData.applyPicUrls || []"
class="mr-10px h-60px w-60px"
@click="imagePreview(formData.applyPicUrls)"
preview-teleported
/>
</el-descriptions-item>
</el-descriptions>
@ -64,7 +65,7 @@
<!-- 退款状态 -->
<el-descriptions :column="1" title="退款状态">
<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 label-class-name="no-colon">
<el-button v-if="formData.status === 10" type="primary" @click="agree"></el-button>
@ -132,10 +133,10 @@
</div>
<template #dot>
<span
:style="{ backgroundColor: getUserTypeColor(saleLog.userType) }"
:style="{ backgroundColor: getUserTypeColor(saleLog.userType ?? 0) }"
class="dot-node-style"
>
{{ getDictLabel(DICT_TYPE.USER_TYPE, saleLog.userType)[0] || '系' }}
{{ getDictLabel(DICT_TYPE.USER_TYPE, saleLog.userType ?? 0)[0] || '系' }}
</span>
</template>
</el-timeline-item>
@ -153,8 +154,6 @@ import { fenToYuan } from '@/utils'
import { DICT_TYPE, getDictLabel, getDictObj } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime'
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'
defineOptions({ name: 'TradeAfterSaleDetail' })
@ -163,10 +162,10 @@ const { t } = useI18n() // 国际化
const message = useMessage() //
const { params } = useRoute() //
const { push, currentRoute } = useRouter() //
const formData = ref({
const formData = ref<AfterSaleApi.TradeAfterSaleDetailVO>({
order: {},
logs: []
})
} as AfterSaleApi.TradeAfterSaleDetailVO)
const updateAuditReasonFormRef = ref() // Ref
/** 获得 userType 颜色 */
@ -187,7 +186,7 @@ const getUserTypeColor = (type: number) => {
/** 获得详情 */
const getDetail = async () => {
const id = params.id as unknown as number
const id = Number(params.id)
if (id) {
const res = await AfterSaleApi.getAfterSale(id)
//
@ -252,20 +251,6 @@ const refund = async () => {
} 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() //
/** 关闭 tag */
const close = () => {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -37,7 +37,7 @@
<template #label>
<descriptions-item-label icon="fa:mars-double" label="性别" />
</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>
<template #label>
@ -103,7 +103,7 @@
<template #label>
<descriptions-item-label icon="fa:mars-double" label="性别" />
</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>
<template #label>

View File

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

View File

@ -183,7 +183,7 @@ onMounted(() => {
for (const dict of getIntDictOptions(DICT_TYPE.PROMOTION_COUPON_STATUS)) {
statusTabs.push({
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 total = ref(0) //
const list = ref([]) //
const list = ref<ExperienceRecordApi.ExperienceRecordVO[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: null,
bizId: null,
bizType: null,
title: null,
description: null,
experience: null,
totalExperience: null,
userId: undefined as number | undefined,
bizId: undefined as number | undefined,
bizType: undefined as number | undefined,
title: undefined as string | undefined,
description: undefined as string | undefined,
experience: undefined as number | undefined,
totalExperience: undefined as number | undefined,
createTime: []
})
const queryFormRef = ref() //

View File

@ -5,7 +5,12 @@
<el-table-column key="id" align="center" label="商品编号" width="180" prop="id" />
<el-table-column label="商品图" min-width="80">
<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>
</el-table-column>
<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 total = ref(0) //
const list = ref([]) //
const list = ref<FavoriteApi.Favorite[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,

View File

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

View File

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

View File

@ -231,18 +231,18 @@ const message = useMessage() // 消息弹窗
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const list = ref<UserApi.UserVO[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
nickname: null,
mobile: null,
email: null,
nickname: undefined as string | undefined,
mobile: undefined as string | undefined,
email: undefined as string | undefined,
loginDate: [],
createTime: [],
tagIds: [],
levelId: null,
groupId: null
levelId: undefined as number | undefined,
groupId: undefined as number | undefined
})
const queryFormRef = ref() //
const updateLevelFormRef = ref() //
@ -288,7 +288,7 @@ const openForm = (type: string, id?: number) => {
/** 表格选中事件 */
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>
<div>
<Dialog v-model="dialogVisible" :title="dialogTitle" width="830px" @closed="close">
<Dialog v-model="dialogVisible" :title="dialogTitle" width="830px">
<el-form
ref="formRef"
v-loading="formLoading"

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<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-item label="商户单号">
<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.appName }}</el-descriptions-item>
<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 label="支付金额">
<el-tag type="success" size="small"
>{{ ((detailData.price || 0) / 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 label="手续费">
<el-tag type="warning" size="small">
{{ ((detailData.channelFeePrice || 0) / 100.0).toFixed(2) }}
{{ (detailData.channelFeePrice! / 100.0).toFixed(2) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="手续费比例">
{{ (detailData.channelFeeRate || 0).toFixed(2) }}%
{{ detailData.channelFeeRate!.toFixed(2) }}%
</el-descriptions-item>
<el-descriptions-item label="支付时间">
{{ formatDate(detailData.successTime) }}
@ -44,7 +49,11 @@
<el-descriptions-item label="商品标题">{{ detailData.subject }}</el-descriptions-item>
<el-descriptions-item label="商品描述">{{ detailData.body }}</el-descriptions-item>
<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 label="支付 IP">{{ detailData.userIp }}</el-descriptions-item>
<el-descriptions-item label="渠道单号">
@ -55,7 +64,7 @@
<el-descriptions-item label="渠道用户">{{ detailData.channelUserId }}</el-descriptions-item>
<el-descriptions-item label="退款金额">
<el-tag size="small" type="danger">
{{ ((detailData.refundPrice || 0) / 100.0).toFixed(2) }}
{{ (detailData.refundPrice! / 100.0).toFixed(2) }}
</el-tag>
</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-item label="支付通道异步回调内容">
<el-text style="overflow-wrap: anywhere; white-space: pre-wrap">
{{ detailData.extension.channelNotifyData }}
{{ detailData.extension?.channelNotifyData }}
</el-text>
</el-descriptions-item>
</el-descriptions>
@ -80,15 +89,15 @@ defineOptions({ name: 'PayOrderDetail' })
const dialogVisible = ref(false) //
const detailLoading = ref(false) //
const detailData = ref({
const detailData = ref<OrderApi.OrderDetailVO>({
extension: {}
})
/** 打开弹窗 */
const open = async (id: number) => {
dialogVisible.value = true
//
detailLoading.value = true
dialogVisible.value = true
try {
detailData.value = await OrderApi.getOrderDetail(id)
if (!detailData.value.extension) {

View File

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

View File

@ -1,5 +1,5 @@
<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-item label="商户退款单号">
<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="支付金额">
<el-tag type="success" size="small">
{{ (refundDetail.payPrice / 100.0).toFixed(2) }}
{{ (refundDetail.payPrice! / 100.0).toFixed(2) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="退款金额">
<el-tag size="small" type="danger">
{{ (refundDetail.refundPrice / 100.0).toFixed(2) }}
{{ (refundDetail.refundPrice! / 100.0).toFixed(2) }}
</el-tag>
</el-descriptions-item>
<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 label="退款时间">
{{ formatDate(refundDetail.successTime) }}
@ -44,7 +48,11 @@
<el-divider />
<el-descriptions :column="2" label-class-name="desc-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 label="退款原因">{{ refundDetail.reason }}</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 detailLoading = ref(false) //
const refundDetail = ref({})
const refundDetail = ref<RefundApi.RefundDetailVO>({})
/** 打开弹窗 */
const open = async (id: number) => {
dialogVisible.value = true
//
detailLoading.value = true
dialogVisible.value = true
try {
refundDetail.value = await RefundApi.getRefund(id)
} finally {

View File

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

View File

@ -1,5 +1,5 @@
<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-item label="商户单号">
<el-tag size="small">{{ detailData.merchantTransferId }}</el-tag>
@ -9,10 +9,17 @@
</el-descriptions-item>
<el-descriptions-item label="应用编号">{{ detailData.appId }}</el-descriptions-item>
<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 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 label="转账时间">
{{ formatDate(detailData.successTime) }}
@ -27,7 +34,11 @@
<el-descriptions-item label="收款人姓名">{{ detailData.userName }}</el-descriptions-item>
<el-descriptions-item label="收款人账号">{{ detailData.userAccount }}</el-descriptions-item>
<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 label="支付 IP">{{ detailData.userIp }}</el-descriptions-item>
<el-descriptions-item label="渠道单号">
@ -61,13 +72,13 @@ defineOptions({ name: 'PayTransferDetail' })
const dialogVisible = ref(false) //
const detailLoading = ref(false) //
const detailData = ref({})
const detailData = ref<TransferApi.TransferVO>({})
/** 打开弹窗 */
const open = async (id: number) => {
dialogVisible.value = true
//
detailLoading.value = true
dialogVisible.value = true
try {
detailData.value = await TransferApi.getTransfer(id)
} finally {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,7 +10,7 @@
</el-descriptions-item>
<el-descriptions-item label="短信模板">
{{ 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 label="API 的模板编号">
{{ detailData.apiTemplateId }}
@ -32,7 +32,7 @@
{{ formatDate(detailData.createTime) }}
</el-descriptions-item>
<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 label="发送时间">
{{ formatDate(detailData.sendTime) }}
@ -47,7 +47,7 @@
{{ detailData.apiRequestId }}
</el-descriptions-item>
<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) }}
</el-descriptions-item>
<el-descriptions-item label="API 接收结果">
@ -66,8 +66,8 @@ defineOptions({ name: 'SystemSmsLogDetail' })
const dialogVisible = ref(false) //
const detailLoading = ref(false) //
const detailData = ref() //
const channelList = ref([]) //
const detailData = ref<SmsLogApi.SmsLogVO>({} as SmsLogApi.SmsLogVO) //
const channelList = ref<SmsChannelApi.SmsChannelVO[]>([]) //
/** 打开弹窗 */
const open = async (data: SmsLogApi.SmsLogVO) => {