diff --git a/package.json b/package.json
index eb34ec17..22334907 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "yudao-ui-admin-vue3",
- "version": "1.8.1-snapshot",
+ "version": "1.8.2-snapshot",
"description": "基于vue3、vite4、element-plus、typesScript",
"author": "xingyu",
"private": false,
diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts
index 3177eefc..ccd5c4ee 100644
--- a/src/api/bpm/task/index.ts
+++ b/src/api/bpm/task/index.ts
@@ -42,20 +42,14 @@ export const exportTask = async (params) => {
return await request.download({ url: '/bpm/task/export', params })
}
-/**
- * 获取所有可回退的节点
- * @param params
- */
+// 获取所有可回退的节点
export const getReturnList = async (params) => {
return await request.get({ url: '/bpm/task/get-return-list', params })
}
-/**
- * 确认回退
- * @param params
- */
-export const okRollback = async (data) => {
- return await request.put({ url: '/bpm/task/rollback', data })
+// 回退
+export const returnTask = async (data) => {
+ return await request.put({ url: '/bpm/task/return', data })
}
/**
diff --git a/src/api/mall/product/spu.ts b/src/api/mall/product/spu.ts
index 2ad9bc60..6c476b8c 100644
--- a/src/api/mall/product/spu.ts
+++ b/src/api/mall/product/spu.ts
@@ -20,8 +20,8 @@ export interface Sku {
stock?: number // 库存
weight?: number // 商品重量,单位:kg 千克
volume?: number // 商品体积,单位:m^3 平米
- subCommissionFirstPrice?: number | string // 一级分销的佣金
- subCommissionSecondPrice?: number | string // 二级分销的佣金
+ firstBrokerageRecord?: number | string // 一级分销的佣金
+ secondBrokerageRecord?: number | string // 二级分销的佣金
salesCount?: number // 商品销量
}
diff --git a/src/api/mall/trade/brokerage/record/index.ts b/src/api/mall/trade/brokerage/record/index.ts
new file mode 100644
index 00000000..7df9a225
--- /dev/null
+++ b/src/api/mall/trade/brokerage/record/index.ts
@@ -0,0 +1,11 @@
+import request from '@/config/axios'
+
+// 查询佣金记录列表
+export const getBrokerageRecordPage = async (params: any) => {
+ return await request.get({ url: `/trade/brokerage-record/page`, params })
+}
+
+// 查询佣金记录详情
+export const getBrokerageRecord = async (id: number) => {
+ return await request.get({ url: `/trade/brokerage-record/get?id=` + id })
+}
diff --git a/src/api/mall/trade/brokerage/user/index.ts b/src/api/mall/trade/brokerage/user/index.ts
new file mode 100644
index 00000000..1fed3bfa
--- /dev/null
+++ b/src/api/mall/trade/brokerage/user/index.ts
@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+export interface BrokerageUserVO {
+ id: number
+ bindUserId: number
+ bindUserTime: Date
+ brokerageEnabled: boolean
+ brokerageTime: Date
+ price: number
+ frozenPrice: number
+
+ nickname: string
+ avatar: string
+}
+
+// 查询分销用户列表
+export const getBrokerageUserPage = async (params: any) => {
+ return await request.get({ url: `/trade/brokerage-user/page`, params })
+}
+
+// 查询分销用户详情
+export const getBrokerageUser = async (id: number) => {
+ return await request.get({ url: `/trade/brokerage-user/get?id=` + id })
+}
+
+// 修改推广员
+export const updateBindUser = async (data: any) => {
+ return await request.put({ url: `/trade/brokerage-user/update-bind-user`, data })
+}
+
+// 清除推广员
+export const clearBindUser = async (data: any) => {
+ return await request.put({ url: `/trade/brokerage-user/clear-bind-user`, data })
+}
+
+// 修改推广资格
+export const updateBrokerageEnabled = async (data: any) => {
+ return await request.put({ url: `/trade/brokerage-user/update-brokerage-enable`, data })
+}
diff --git a/src/api/mall/trade/brokerage/withdraw/index.ts b/src/api/mall/trade/brokerage/withdraw/index.ts
new file mode 100644
index 00000000..c93286a9
--- /dev/null
+++ b/src/api/mall/trade/brokerage/withdraw/index.ts
@@ -0,0 +1,39 @@
+import request from '@/config/axios'
+
+export interface BrokerageWithdrawVO {
+ id: number
+ userId: number
+ price: number
+ feePrice: number
+ totalPrice: number
+ type: number
+ name: string
+ accountNo: string
+ bankName: string
+ bankAddress: string
+ accountQrCodeUrl: string
+ status: number
+ auditReason: string
+ auditTime: Date
+ remark: string
+}
+
+// 查询佣金提现列表
+export const getBrokerageWithdrawPage = async (params: any) => {
+ return await request.get({ url: `/trade/brokerage-withdraw/page`, params })
+}
+
+// 查询佣金提现详情
+export const getBrokerageWithdraw = async (id: number) => {
+ return await request.get({ url: `/trade/brokerage-withdraw/get?id=` + id })
+}
+
+// 佣金提现 - 通过申请
+export const approveBrokerageWithdraw = async (id: number) => {
+ return await request.put({ url: `/trade/brokerage-withdraw/approve?id=` + id })
+}
+
+// 审核佣金提现 - 驳回申请
+export const rejectBrokerageWithdraw = async (data: BrokerageWithdrawVO) => {
+ return await request.put({ url: `/trade/brokerage-withdraw/reject`, data })
+}
diff --git a/src/api/mall/trade/config/index.ts b/src/api/mall/trade/config/index.ts
new file mode 100644
index 00000000..3a1771d8
--- /dev/null
+++ b/src/api/mall/trade/config/index.ts
@@ -0,0 +1,24 @@
+import request from '@/config/axios'
+
+export interface ConfigVO {
+ brokerageEnabled: boolean
+ brokerageEnabledCondition: number
+ brokerageBindMode: number
+ brokeragePostUrls: string
+ brokerageFirstPercent: number
+ brokerageSecondPercent: number
+ brokerageWithdrawMinPrice: number
+ brokerageBankNames: string
+ brokerageFrozenDays: number
+ brokerageWithdrawType: string
+}
+
+// 查询交易中心配置详情
+export const getTradeConfig = async () => {
+ return await request.get({ url: `/trade/config/get` })
+}
+
+// 保存交易中心配置
+export const saveTradeConfig = async (data: ConfigVO) => {
+ return await request.put({ url: `/trade/config/save`, data })
+}
diff --git a/src/api/mall/trade/order/index.ts b/src/api/mall/trade/order/index.ts
index d4a22944..80669c57 100644
--- a/src/api/mall/trade/order/index.ts
+++ b/src/api/mall/trade/order/index.ts
@@ -51,12 +51,13 @@ export interface OrderVO {
avatar?: string
}
// 订单操作日志
- orderLog: orderLog[]
+ logs?: OrderLogRespVO[]
}
-export interface orderLog {
+export interface OrderLogRespVO {
content?: string
createTime?: Date
+ userType?: number
}
export interface OrderItemRespVO {
diff --git a/src/api/member/experience-record/index.ts b/src/api/member/experience-record/index.ts
new file mode 100644
index 00000000..6d40a48d
--- /dev/null
+++ b/src/api/member/experience-record/index.ts
@@ -0,0 +1,22 @@
+import request from '@/config/axios'
+
+export interface ExperienceRecordVO {
+ id: number
+ userId: number
+ bizId: string
+ bizType: number
+ title: string
+ description: string
+ experience: number
+ totalExperience: number
+}
+
+// 查询会员经验记录列表
+export const getExperienceRecordPage = async (params) => {
+ return await request.get({ url: `/member/experience-record/page`, params })
+}
+
+// 查询会员经验记录详情
+export const getExperienceRecord = async (id: number) => {
+ return await request.get({ url: `/member/experience-record/get?id=` + id })
+}
diff --git a/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue b/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
index dd4c8456..e2cd4679 100644
--- a/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
+++ b/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
@@ -11,6 +11,7 @@ import BpmnViewer from 'bpmn-js/lib/Viewer'
import DefaultEmptyXML from './plugins/defaultEmpty'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime'
+import { isEmpty } from '@/utils/is'
defineOptions({ name: 'MyProcessViewer' })
@@ -85,6 +86,7 @@ const createNewDiagram = async (xml) => {
// console.error(`[Process Designer Warn]: ${e?.message || e}`);
}
}
+
/* 高亮流程图 */
// TODO 芋艿:如果多个 endActivity 的话,目前的逻辑可能有一定的问题。https://www.jdon.com/workflow/multi-events.html
const highlightDiagram = async () => {
@@ -97,6 +99,9 @@ const highlightDiagram = async () => {
let canvas = bpmnModeler.get('canvas')
let todoActivity: any = activityList.find((m: any) => !m.endTime) // 找到待办的任务
let endActivity: any = activityList[activityList.length - 1] // 获得最后一个任务
+ let findProcessTask = false //是否已经高亮了进行中的任务
+ //进行中高亮之后的任务 key 集合,用于过滤掉 taskList 进行中后面的任务,避免进行中后面的数据 Hover 还有数据
+ let removeTaskDefinitionKeyList = []
// debugger
bpmnModeler.getDefinitions().rootElements[0].flowElements?.forEach((n: any) => {
let activity: any = activityList.find((m: any) => m.key === n.id) // 找到对应的活动
@@ -110,9 +115,17 @@ const highlightDiagram = async () => {
if (!task) {
return
}
+ //进行中的任务已经高亮过了,则不高亮后面的任务了
+ if (findProcessTask) {
+ removeTaskDefinitionKeyList.push(n.id)
+ return
+ }
// 高亮任务
canvas.addMarker(n.id, getResultCss(task.result))
-
+ //标记是否高亮了进行中任务
+ if (task.result === 1) {
+ findProcessTask = true
+ }
// 如果非通过,就不走后面的线条了
if (task.result !== 2) {
return
@@ -212,6 +225,11 @@ const highlightDiagram = async () => {
}
}
})
+ if (!isEmpty(removeTaskDefinitionKeyList)) {
+ taskList.value = taskList.value.filter(
+ (item) => !removeTaskDefinitionKeyList.includes(item.definitionKey)
+ )
+ }
}
const getActivityHighlightCss = (activity) => {
return activity.endTime ? 'highlight' : 'highlight-todo'
@@ -231,7 +249,7 @@ const getResultCss = (result) => {
return 'highlight-cancel'
} else if (result === 5) {
// 退回
- return 'highlight-rollback'
+ return 'highlight-return'
}
return ''
}
@@ -276,9 +294,9 @@ const elementHover = (element) => {
console.log(element.value, 'element.value')
const activity = activityLists.value.find((m) => m.key === element.value.id)
console.log(activity, 'activityactivityactivityactivity')
- // if (!activity) {
- // return
- // }
+ if (!activity) {
+ return
+ }
if (!elementOverlayIds.value[element.value.id] && element.value.type !== 'bpmn:Process') {
let html = `
Elemet id: ${element.value.id}
@@ -568,41 +586,41 @@ watch(
}
/** 回退 */
-.highlight-rollback.djs-shape .djs-visual > :nth-child(1) {
+.highlight-return.djs-shape .djs-visual > :nth-child(1) {
fill: #e6a23c !important;
stroke: #e6a23c !important;
fill-opacity: 0.2 !important;
}
-.highlight-rollback.djs-shape .djs-visual > :nth-child(2) {
+.highlight-return.djs-shape .djs-visual > :nth-child(2) {
fill: #e6a23c !important;
}
-.highlight-rollback.djs-shape .djs-visual > path {
+.highlight-return.djs-shape .djs-visual > path {
fill: #e6a23c !important;
fill-opacity: 0.2 !important;
stroke: #e6a23c !important;
}
-.highlight-rollback.djs-connection > .djs-visual > path {
+.highlight-return.djs-connection > .djs-visual > path {
stroke: #e6a23c !important;
}
-.highlight-rollback:not(.djs-connection) .djs-visual > :nth-child(1) {
+.highlight-return:not(.djs-connection) .djs-visual > :nth-child(1) {
fill: #e6a23c !important; /* color elements as green */
}
-:deep(.highlight-rollback.djs-shape .djs-visual > :nth-child(1)) {
+:deep(.highlight-return.djs-shape .djs-visual > :nth-child(1)) {
fill: #e6a23c !important;
stroke: #e6a23c !important;
fill-opacity: 0.2 !important;
}
-:deep(.highlight-rollback.djs-shape .djs-visual > :nth-child(2)) {
+:deep(.highlight-return.djs-shape .djs-visual > :nth-child(2)) {
fill: #e6a23c !important;
}
-:deep(.highlight-rollback.djs-shape .djs-visual > path) {
+:deep(.highlight-return.djs-shape .djs-visual > path) {
fill: #e6a23c !important;
fill-opacity: 0.2 !important;
stroke: #e6a23c !important;
}
-:deep(.highlight-rollback.djs-connection > .djs-visual > path) {
+:deep(.highlight-return.djs-connection > .djs-visual > path) {
stroke: #e6a23c !important;
}
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 8d783635..6f3ded5c 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -272,3 +272,89 @@ export const PromotionDiscountTypeEnum = {
name: '折扣'
}
}
+
+/**
+ * 分销关系绑定模式枚举
+ */
+export const BrokerageBindModeEnum = {
+ ANYTIME: {
+ mode: 0,
+ name: '没有推广人'
+ },
+ REGISTER: {
+ mode: 1,
+ name: '新用户'
+ }
+}
+/**
+ * 分佣模式枚举
+ */
+export const BrokerageEnabledConditionEnum = {
+ ALL: {
+ condition: 0,
+ name: '人人分销'
+ },
+ ADMIN: {
+ condition: 1,
+ name: '指定分销'
+ }
+}
+/**
+ * 佣金记录业务类型枚举
+ */
+export const BrokerageRecordBizTypeEnum = {
+ ORDER: {
+ type: 1,
+ name: '获得推广佣金'
+ },
+ WITHDRAW: {
+ type: 2,
+ name: '提现申请'
+ }
+}
+/**
+ * 佣金提现状态枚举
+ */
+export const BrokerageWithdrawStatusEnum = {
+ AUDITING: {
+ status: 0,
+ name: '审核中'
+ },
+ AUDIT_SUCCESS: {
+ status: 10,
+ name: '审核通过'
+ },
+ AUDIT_FAIL: {
+ status: 20,
+ name: '审核不通过'
+ },
+ WITHDRAW_SUCCESS: {
+ status: 11,
+ name: '提现成功'
+ },
+ WITHDRAW_FAIL: {
+ status: 21,
+ name: '提现失败'
+ }
+}
+/**
+ * 佣金提现类型枚举
+ */
+export const BrokerageWithdrawTypeEnum = {
+ WALLET: {
+ type: 1,
+ name: '钱包'
+ },
+ BANK: {
+ type: 2,
+ name: '银行卡'
+ },
+ WECHAT: {
+ type: 3,
+ name: '微信'
+ },
+ ALIPAY: {
+ type: 4,
+ name: '支付宝'
+ }
+}
diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index 6b163628..aa948594 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -60,13 +60,19 @@ export const getBoolDictOptions = (dictType: string) => {
return dictOption
}
-export const getDictObj = (dictType: string, value: any) => {
+/**
+ * 获取指定字典类型的指定值对应的字典对象
+ * @param dictType 字典类型
+ * @param value 字典值
+ * @return DictDataType 字典对象
+ */
+export const getDictObj = (dictType: string, value: any): DictDataType | undefined => {
const dictOptions: DictDataType[] = getDictOptions(dictType)
- dictOptions.forEach((dict: DictDataType) => {
- if (dict.value === value.toString()) {
+ for (const dict of dictOptions) {
+ if (dict.value === value + '') {
return dict
}
- })
+ }
}
/**
@@ -74,12 +80,13 @@ export const getDictObj = (dictType: string, value: any) => {
*
* @param dictType 字典类型
* @param value 字典数据的值
+ * @return 字典名称
*/
-export const getDictLabel = (dictType: string, value: any) => {
+export const getDictLabel = (dictType: string, value: any): string => {
const dictOptions: DictDataType[] = getDictOptions(dictType)
const dictLabel = ref('')
dictOptions.forEach((dict: DictDataType) => {
- if (dict.value === value) {
+ if (dict.value === value + '') {
dictLabel.value = dict.label
}
})
@@ -131,7 +138,7 @@ export enum DICT_TYPE {
BPM_OA_LEAVE_TYPE = 'bpm_oa_leave_type',
// ========== PAY 模块 ==========
- PAY_CHANNEL_CODE = 'pay_channel_code_type', // 支付渠道编码类型
+ PAY_CHANNEL_CODE = 'pay_channel_code', // 支付渠道编码类型
PAY_ORDER_STATUS = 'pay_order_status', // 商户支付订单状态
PAY_REFUND_STATUS = 'pay_refund_status', // 退款订单状态
PAY_NOTIFY_STATUS = 'pay_notify_status', // 商户支付回调状态
@@ -143,6 +150,7 @@ export enum DICT_TYPE {
// ========== MALL - 会员模块 ==========
MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型
+ MEMBER_EXPERIENCE_BIZ_TYPE = 'member_experience_biz_type', // 会员经验业务类型
// ========== MALL - 商品模块 ==========
PRODUCT_UNIT = 'product_unit', // 商品单位
@@ -157,6 +165,13 @@ export enum DICT_TYPE {
TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态
TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态
TRADE_DELIVERY_TYPE = 'trade_delivery_type', // 配送方式
+ BROKERAGE_ENABLED_CONDITION = 'brokerage_enabled_condition', // 分佣模式
+ BROKERAGE_BIND_MODE = 'brokerage_bind_mode', // 分销关系绑定模式
+ BROKERAGE_BANK_NAME = 'brokerage_bank_name', // 佣金提现银行
+ BROKERAGE_WITHDRAW_TYPE = 'brokerage_withdraw_type', // 佣金提现类型
+ BROKERAGE_RECORD_BIZ_TYPE = 'brokerage_record_biz_type', // 佣金业务类型
+ BROKERAGE_RECORD_STATUS = 'brokerage_record_status', // 佣金状态
+ BROKERAGE_WITHDRAW_STATUS = 'brokerage_withdraw_status', // 佣金提现状态
// ========== MALL - 营销模块 ==========
PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型
diff --git a/src/utils/formatter.ts b/src/utils/formatter.ts
new file mode 100644
index 00000000..7c6e39ff
--- /dev/null
+++ b/src/utils/formatter.ts
@@ -0,0 +1,12 @@
+import { fenToYuan } from '@/utils'
+import { TableColumnCtx } from 'element-plus'
+
+// 格式化金额【分转元】
+export const fenToYuanFormat = (
+ row: any,
+ column: TableColumnCtx
,
+ cellValue: any,
+ index: number
+) => {
+ return `¥${fenToYuan(cellValue)}`
+}
diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue
index 49742f00..a4eb0b92 100644
--- a/src/views/Login/components/LoginForm.vue
+++ b/src/views/Login/components/LoginForm.vue
@@ -230,6 +230,7 @@ const getCookie = () => {
}
}
}
+const loading = ref() // ElLoading.service 返回的实例
// 登录
const handleLogin = async (params) => {
loginLoading.value = true
@@ -244,7 +245,7 @@ const handleLogin = async (params) => {
if (!res) {
return
}
- ElLoading.service({
+ loading.value = ElLoading.service({
lock: true,
text: '正在加载系统中...',
background: 'rgba(0, 0, 0, 0.7)'
@@ -264,13 +265,9 @@ const handleLogin = async (params) => {
} else {
push({ path: redirect.value || permissionStore.addRouters[0].path })
}
- } catch {
- loginLoading.value = false
} finally {
- setTimeout(() => {
- const loadingInstance = ElLoading.service()
- loadingInstance.close()
- }, 400)
+ loginLoading.value = false
+ loading.value.close()
}
}
diff --git a/src/views/bpm/processInstance/detail/TaskRollbackDialogForm.vue b/src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue
similarity index 95%
rename from src/views/bpm/processInstance/detail/TaskRollbackDialogForm.vue
rename to src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue
index 168fd1a8..f93bf2c5 100644
--- a/src/views/bpm/processInstance/detail/TaskRollbackDialogForm.vue
+++ b/src/views/bpm/processInstance/detail/TaskReturnDialogForm.vue
@@ -11,9 +11,9 @@
@@ -68,7 +68,7 @@ const submitForm = async () => {
// 提交请求
formLoading.value = true
try {
- await TaskApi.okRollback(formData.value)
+ await TaskApi.returnTask(formData.value)
message.success('回退成功')
dialogVisible.value = false
// 发送操作成功的事件
diff --git a/src/views/bpm/processInstance/detail/index.vue b/src/views/bpm/processInstance/detail/index.vue
index d513bbbd..585c60db 100644
--- a/src/views/bpm/processInstance/detail/index.vue
+++ b/src/views/bpm/processInstance/detail/index.vue
@@ -92,7 +92,7 @@
-
+
@@ -107,7 +107,7 @@ import * as TaskApi from '@/api/bpm/task'
import TaskUpdateAssigneeForm from './TaskUpdateAssigneeForm.vue'
import ProcessInstanceBpmnViewer from './ProcessInstanceBpmnViewer.vue'
import ProcessInstanceTaskList from './ProcessInstanceTaskList.vue'
-import TaskRollbackDialog from './TaskRollbackDialogForm.vue'
+import TaskReturnDialog from './TaskReturnDialogForm.vue'
import TaskDelegateForm from './taskDelegateForm.vue'
import { registerComponent } from '@/utils/routerHelper'
@@ -179,10 +179,10 @@ const handleDelegate = async (task) => {
}
//回退弹框组件
-const taskRollbackRef = ref()
+const taskReturnDialogRef = ref()
/** 处理审批退回的操作 */
const handleBack = async (task) => {
- taskRollbackRef.value.open(task.id)
+ taskReturnDialogRef.value.open(task.id)
}
/** 获得详情 */
diff --git a/src/views/infra/server/index.vue b/src/views/infra/server/index.vue
index 06c35d97..b9a157a5 100644
--- a/src/views/infra/server/index.vue
+++ b/src/views/infra/server/index.vue
@@ -16,6 +16,9 @@ const src = ref(import.meta.env.VITE_BASE_URL + '/admin/applications')
/** 初始化 */
onMounted(async () => {
try {
+ // 友情提示:如果访问出现 404 问题:
+ // 1)boot 参考 https://doc.iocoder.cn/server-monitor/ 解决;
+ // 2)cloud 参考 https://cloud.iocoder.cn/server-monitor/ 解决
const data = await ConfigApi.getConfigKey('url.spring-boot-admin')
if (data && data.length > 0) {
src.value = data
diff --git a/src/views/mall/product/spu/components/SkuList.vue b/src/views/mall/product/spu/components/SkuList.vue
index f64e4a98..7a4605c6 100644
--- a/src/views/mall/product/spu/components/SkuList.vue
+++ b/src/views/mall/product/spu/components/SkuList.vue
@@ -80,7 +80,7 @@
- {{ row.subCommissionFirstPrice }}
+ {{ row.firstBrokerageRecord }}
- {{ row.subCommissionSecondPrice }}
+ {{ row.secondBrokerageRecord }}
@@ -295,8 +295,8 @@ const skuList = ref([
stock: 0, // 库存
weight: 0, // 商品重量
volume: 0, // 商品体积
- subCommissionFirstPrice: 0, // 一级分销的佣金
- subCommissionSecondPrice: 0 // 二级分销的佣金
+ firstBrokerageRecord: 0, // 一级分销的佣金
+ secondBrokerageRecord: 0 // 二级分销的佣金
}
]) // 批量添加时的临时数据
@@ -415,8 +415,8 @@ const generateTableData = (propertyList: any[]) => {
stock: 0,
weight: 0,
volume: 0,
- subCommissionFirstPrice: 0,
- subCommissionSecondPrice: 0
+ firstBrokerageRecord: 0,
+ secondBrokerageRecord: 0
}
// 如果存在属性相同的 sku 则不做处理
const index = formData.value!.skus!.findIndex(
@@ -491,8 +491,8 @@ watch(
stock: 0,
weight: 0,
volume: 0,
- subCommissionFirstPrice: 0,
- subCommissionSecondPrice: 0
+ firstBrokerageRecord: 0,
+ secondBrokerageRecord: 0
}
]
}
diff --git a/src/views/mall/product/spu/form/BasicInfoForm.vue b/src/views/mall/product/spu/form/BasicInfoForm.vue
index b41300cc..66523432 100644
--- a/src/views/mall/product/spu/form/BasicInfoForm.vue
+++ b/src/views/mall/product/spu/form/BasicInfoForm.vue
@@ -332,8 +332,8 @@ defineExpose({ validate })
const changeSubCommissionType = () => {
// 默认为零,类型切换后也要重置为零
for (const item of formData.skus) {
- item.subCommissionFirstPrice = 0
- item.subCommissionSecondPrice = 0
+ item.firstBrokerageRecord = 0
+ item.secondBrokerageRecord = 0
}
}
@@ -352,8 +352,8 @@ const onChangeSpec = () => {
stock: 0,
weight: 0,
volume: 0,
- subCommissionFirstPrice: 0,
- subCommissionSecondPrice: 0
+ firstBrokerageRecord: 0,
+ secondBrokerageRecord: 0
}
]
}
diff --git a/src/views/mall/product/spu/form/index.vue b/src/views/mall/product/spu/form/index.vue
index 0ba7a6d8..e6364f5d 100644
--- a/src/views/mall/product/spu/form/index.vue
+++ b/src/views/mall/product/spu/form/index.vue
@@ -82,8 +82,8 @@ const formData = ref({
stock: 0, // 库存
weight: 0, // 商品重量
volume: 0, // 商品体积
- subCommissionFirstPrice: 0, // 一级分销的佣金
- subCommissionSecondPrice: 0 // 二级分销的佣金
+ firstBrokerageRecord: 0, // 一级分销的佣金
+ secondBrokerageRecord: 0 // 二级分销的佣金
}
],
description: '', // 商品详情
@@ -112,15 +112,15 @@ const getDetail = async () => {
item.price = floatToFixed2(item.price)
item.marketPrice = floatToFixed2(item.marketPrice)
item.costPrice = floatToFixed2(item.costPrice)
- item.subCommissionFirstPrice = floatToFixed2(item.subCommissionFirstPrice)
- item.subCommissionSecondPrice = floatToFixed2(item.subCommissionSecondPrice)
+ item.firstBrokerageRecord = floatToFixed2(item.firstBrokerageRecord)
+ item.secondBrokerageRecord = floatToFixed2(item.secondBrokerageRecord)
} else {
// 回显价格分转元
item.price = formatToFraction(item.price)
item.marketPrice = formatToFraction(item.marketPrice)
item.costPrice = formatToFraction(item.costPrice)
- item.subCommissionFirstPrice = formatToFraction(item.subCommissionFirstPrice)
- item.subCommissionSecondPrice = formatToFraction(item.subCommissionSecondPrice)
+ item.firstBrokerageRecord = formatToFraction(item.firstBrokerageRecord)
+ item.secondBrokerageRecord = formatToFraction(item.secondBrokerageRecord)
}
})
formData.value = res
@@ -149,8 +149,8 @@ const submitForm = async () => {
item.price = convertToInteger(item.price)
item.marketPrice = convertToInteger(item.marketPrice)
item.costPrice = convertToInteger(item.costPrice)
- item.subCommissionFirstPrice = convertToInteger(item.subCommissionFirstPrice)
- item.subCommissionSecondPrice = convertToInteger(item.subCommissionSecondPrice)
+ item.firstBrokerageRecord = convertToInteger(item.firstBrokerageRecord)
+ item.secondBrokerageRecord = convertToInteger(item.secondBrokerageRecord)
})
// 处理轮播图列表
const newSliderPicUrls: any[] = []
diff --git a/src/views/mall/promotion/components/SpuAndSkuList.vue b/src/views/mall/promotion/components/SpuAndSkuList.vue
index e09b34dd..facc6cf3 100644
--- a/src/views/mall/promotion/components/SpuAndSkuList.vue
+++ b/src/views/mall/promotion/components/SpuAndSkuList.vue
@@ -41,7 +41,7 @@ import { SpuProperty } from '@/views/mall/promotion/components/index'
defineOptions({ name: 'PromotionSpuAndSkuList' })
const props = defineProps<{
- spuList: T[] // TODO 为了方便兼容后续可能有需要展示多个 spu 的情况暂时保持,如果后续都是只操作一个 spu 的话则可更改为接受一个 spu 或保持
+ spuList: T[]
ruleConfig: RuleConfig[]
spuPropertyListP: SpuProperty[]
}>()
diff --git a/src/views/mall/trade/afterSale/detail/index.vue b/src/views/mall/trade/afterSale/detail/index.vue
index dbe9cdf3..557e6b6e 100644
--- a/src/views/mall/trade/afterSale/detail/index.vue
+++ b/src/views/mall/trade/afterSale/detail/index.vue
@@ -126,28 +126,22 @@
-
- 用户类型:
-
- 售后状态(之前):
-
- 售后状态(之后):
-
- 操作明细:{{ saleLog.content }}
-
+
+ {{ saleLog.content }}
+
+
+
+ {{ getDictLabel(DICT_TYPE.USER_TYPE, saleLog.userType)[0] || '系' }}
+
+
@@ -160,28 +154,52 @@
diff --git a/src/views/mall/trade/brokerage/user/BrokerageOrderListDialog.vue b/src/views/mall/trade/brokerage/user/BrokerageOrderListDialog.vue
new file mode 100644
index 00000000..d2c0568f
--- /dev/null
+++ b/src/views/mall/trade/brokerage/user/BrokerageOrderListDialog.vue
@@ -0,0 +1,152 @@
+
+
+
+
+
diff --git a/src/views/mall/trade/brokerage/user/BrokerageUserListDialog.vue b/src/views/mall/trade/brokerage/user/BrokerageUserListDialog.vue
new file mode 100644
index 00000000..2277cc01
--- /dev/null
+++ b/src/views/mall/trade/brokerage/user/BrokerageUserListDialog.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
diff --git a/src/views/mall/trade/brokerage/user/UpdateBindUserForm.vue b/src/views/mall/trade/brokerage/user/UpdateBindUserForm.vue
new file mode 100644
index 00000000..b4c04780
--- /dev/null
+++ b/src/views/mall/trade/brokerage/user/UpdateBindUserForm.vue
@@ -0,0 +1,127 @@
+
+
+
+
diff --git a/src/views/mall/trade/brokerage/user/index.vue b/src/views/mall/trade/brokerage/user/index.vue
new file mode 100644
index 00000000..285c49ee
--- /dev/null
+++ b/src/views/mall/trade/brokerage/user/index.vue
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ handleCommand(command, scope.row)"
+ v-hasPermi="[
+ 'trade:brokerage-user:user-query',
+ 'trade:brokerage-user:order-query',
+ 'trade:brokerage-user:update-bind-user',
+ 'trade:brokerage-user:clear-bind-user'
+ ]"
+ >
+
+
+ 更多
+
+
+
+
+ 推广人
+
+
+ 推广订单
+
+
+ 修改上级推广人
+
+
+ 清除上级推广人
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/mall/trade/brokerage/withdraw/BrokerageWithdrawRejectForm.vue b/src/views/mall/trade/brokerage/withdraw/BrokerageWithdrawRejectForm.vue
new file mode 100644
index 00000000..2a69b5b0
--- /dev/null
+++ b/src/views/mall/trade/brokerage/withdraw/BrokerageWithdrawRejectForm.vue
@@ -0,0 +1,73 @@
+
+
+
+
diff --git a/src/views/mall/trade/brokerage/withdraw/index.vue b/src/views/mall/trade/brokerage/withdraw/index.vue
new file mode 100644
index 00000000..535387e9
--- /dev/null
+++ b/src/views/mall/trade/brokerage/withdraw/index.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+ 编号:{{ scope.row.userId }}
+ 昵称:{{ scope.row.userNickname }}
+
+
+
+
+ 金 额:¥{{ fenToYuan(scope.row.price) }}
+ 手续费:¥{{ fenToYuan(scope.row.feePrice) }}
+
+
+
+
+ 余额
+
+ {{ getDictLabel(DICT_TYPE.BROKERAGE_WITHDRAW_TYPE, scope.row.type) }}账号:
+ {{ scope.row.accountNo }}
+
+
+ 真实姓名:{{ scope.row.name }}
+
+ 银行名称:
+
+
+ 开户地址:{{ scope.row.bankAddress }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 时间:{{ formatDate(scope.row.auditTime) }}
+
+
+ 原因:{{ scope.row.auditReason }}
+
+
+
+
+
+
+
+ 通过
+
+
+ 驳回
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/mall/trade/config/index.vue b/src/views/mall/trade/config/index.vue
new file mode 100644
index 00000000..6fa41cad
--- /dev/null
+++ b/src/views/mall/trade/config/index.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+ 商城是否启用全场包邮
+
+
+
+ 商城商品满多少金额即可包邮
+
+
+
+
+
+ 商城是否开启分销模式
+
+
+
+
+ {{ dict.label }}
+
+
+
+ 人人分销:每个用户都可以成为推广员
+
+
+ 指定分销:仅可在后台手动设置推广员
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+ 没有推广人:只要用户没有推广人,随时都可以绑定推广关系
+
+
+ 新用户:只有新用户注册时或首次进入系统时才可以绑定推广关系
+
+
+
+
+
+ 个人中心分销海报图片,建议尺寸600x1000
+
+
+
+
+
+ 订单交易成功后给推广人返佣的百分比
+
+
+
+
+
+ 订单交易成功后给推广人的推荐人返佣的百分比
+
+
+
+
+
+ 防止用户退款,佣金被提现了,所以需要设置佣金冻结时间,单位:天
+
+
+
+
+
+ 用户提现最低金额限制,单位:元
+
+
+
+
+
+ 提现手续费百分比,范围0-100,0为无提现手续费,例:设置10,即收取10%手续费,提现100元,到账90元,10元手续费
+
+
+
+
+
+ {{ dict.label }}
+
+
+ 商城开通提现的付款方式
+
+
+
+
+
+ 商城开通提现的银行列表
+
+
+
+
+
+ 保存
+
+
+
+
+
+
diff --git a/src/views/mall/trade/order/detail/index.vue b/src/views/mall/trade/order/detail/index.vue
index a823fef5..e92fa82c 100644
--- a/src/views/mall/trade/order/detail/index.vue
+++ b/src/views/mall/trade/order/detail/index.vue
@@ -40,12 +40,17 @@
-
- 调整价格
- 备注
- 发货
- 修改地址
+
+ 调整价格
+
+ 备注
+
+ 发货
+
+
+ 修改地址
+
提醒:
@@ -152,11 +157,22 @@
- {{ log.content }}
+
+ {{ log.content }}
+
+
+
+ {{ getDictLabel(DICT_TYPE.USER_TYPE, log.userType)[0] }}
+
+
@@ -173,42 +189,55 @@
import * as TradeOrderApi from '@/api/mall/trade/order'
import { floatToFixed2 } from '@/utils'
import { formatDate } from '@/utils/formatTime'
-import { DICT_TYPE } from '@/utils/dict'
+import { DICT_TYPE, getDictLabel, getDictObj } from '@/utils/dict'
import OrderUpdateRemarkForm from '@/views/mall/trade/order/form/OrderUpdateRemarkForm.vue'
import OrderDeliveryForm from '@/views/mall/trade/order/form/OrderDeliveryForm.vue'
import OrderUpdateAddressForm from '@/views/mall/trade/order/form/OrderUpdateAddressForm.vue'
import OrderUpdatePriceForm from '@/views/mall/trade/order/form/OrderUpdatePriceForm.vue'
import * as DeliveryExpressApi from '@/api/mall/trade/delivery/express'
+import { useTagsViewStore } from '@/store/modules/tagsView'
defineOptions({ name: 'TradeOrderDetail' })
const message = useMessage() // 消息弹窗
+/** 获得 userType 颜色 */
+const getUserTypeColor = (type: number) => {
+ const dict = getDictObj(DICT_TYPE.USER_TYPE, type)
+ switch (dict?.colorType) {
+ case 'success':
+ return '#67C23A'
+ case 'info':
+ return '#909399'
+ case 'warning':
+ return '#E6A23C'
+ case 'danger':
+ return '#F56C6C'
+ }
+ return '#409EFF'
+}
+
// 订单详情
const formData = ref({
- orderLog: [] // TODO @puhui999:orderLogs
+ logs: []
})
-// TODO @puhui999:这个最好也拆掉哈
-const deliveryFormRef = ref() // 发货表单 Ref
+/** 各种操作 */
const updateRemarkForm = ref() // 订单备注表单 Ref
+const remark = () => {
+ updateRemarkForm.value?.open(formData.value)
+}
+const deliveryFormRef = ref() // 发货表单 Ref
+const delivery = () => {
+ deliveryFormRef.value?.open(formData.value)
+}
const updateAddressFormRef = ref() // 收货地址表单 Ref
+const updateAddress = () => {
+ updateAddressFormRef.value?.open(formData.value)
+}
const updatePriceFormRef = ref() // 订单调价表单 Ref
-const openForm = (type: string) => {
- switch (type) {
- case 'remark':
- updateRemarkForm.value?.open(formData.value)
- break
- case 'delivery':
- deliveryFormRef.value?.open(formData.value)
- break
- case 'updateAddress':
- updateAddressFormRef.value?.open(formData.value)
- break
- case 'updatePrice':
- updatePriceFormRef.value?.open(formData.value)
- break
- }
+const updatePrice = () => {
+ updatePriceFormRef.value?.open(formData.value)
}
/** 获得详情 */
@@ -217,10 +246,23 @@ const getDetail = async () => {
const id = params.orderId as unknown as number
if (id) {
const res = (await TradeOrderApi.getOrder(id)) as TradeOrderApi.OrderVO
+ // 没有表单信息则关闭页面返回
+ if (res === null) {
+ message.error('交易订单不存在')
+ close()
+ }
formData.value = res
}
}
+/** 关闭 tag */
+const { delView } = useTagsViewStore() // 视图操作
+const { push, currentRoute } = useRouter() // 路由
+const close = () => {
+ delView(unref(currentRoute))
+ push({ name: 'TradeOrder' })
+}
+
/** 复制 */
const clipboardSuccess = () => {
message.success('复制成功')
@@ -267,4 +309,51 @@ onMounted(async () => {
}
}
}
+
+// 时间线样式调整
+:deep(.el-timeline) {
+ margin: 10px 0px 0px 160px;
+
+ .el-timeline-item__wrapper {
+ position: relative;
+ top: -20px;
+
+ .el-timeline-item__timestamp {
+ position: absolute !important;
+ top: 10px;
+ left: -150px;
+ }
+ }
+
+ .el-timeline-right-content {
+ display: flex;
+ align-items: center;
+ min-height: 30px;
+ padding: 10px;
+ background-color: #f7f8fa;
+
+ &::before {
+ content: ''; /* 必须设置 content 属性 */
+ position: absolute;
+ top: 10px;
+ left: 13px; /* 将伪元素水平居中 */
+ border-width: 8px; /* 调整尖角大小 */
+ border-style: solid;
+ border-color: transparent #f7f8fa transparent transparent; /* 尖角颜色,左侧朝向 */
+ }
+ }
+
+ .dot-node-style {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: -5px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 50%;
+ color: #fff;
+ font-size: 10px;
+ }
+}
diff --git a/src/views/mall/trade/order/index.vue b/src/views/mall/trade/order/index.vue
index 4b8d295f..0970f6bc 100644
--- a/src/views/mall/trade/order/index.vue
+++ b/src/views/mall/trade/order/index.vue
@@ -100,17 +100,24 @@
/>
-
+
+
-
+
-
+
商品信息
单价(元)/数量
@@ -266,8 +273,8 @@
-
-
+
+
详情
@@ -335,41 +342,42 @@ const total = ref(2) // 列表的总页数
const list = ref
([]) // 列表的数据
const queryFormRef = ref() // 搜索的表单
// 表单搜索
-const queryParams = reactive({
- pageNo: 1, //首页
- pageSize: 10, //页面大小
- no: '',
- userId: '',
- userNickname: '',
- userMobile: '',
- receiverName: '',
- receiverMobile: '',
-
- terminal: '',
- type: null,
- status: null,
- payChannelCode: '',
- createTime: [],
- deliveryType: null,
- spuName: '',
- itemCount: '',
- pickUpStoreId: [],
- logisticsId: null,
- all: ''
+const queryParams = ref({
+ pageNo: 1, // 页数
+ pageSize: 10, // 每页显示数量
+ status: null, // 订单状态
+ payChannelCode: null, // 支付方式
+ createTime: null, // 创建时间
+ terminal: null, // 订单来源
+ type: null, // 订单类型
+ deliveryType: null, // 配送方式
+ logisticsId: null, // 快递公司
+ pickUpStoreId: null // 自提门店
})
-const queryType = reactive({ k: '', v: '' }) // 订单搜索类型kv
-/**
- * 订单聚合搜索
- * 商品名称、商品件数、全部
- *
- * 需要后端支持 TODO
- */
+const queryType = reactive({ k: '' }) // 订单搜索类型 k
+
+// 订单聚合搜索 select 类型配置
+// TODO @puhui999:dynamicSearchList,动态搜索;其它相关的变量和方法,都可以朝着这个变量靠哈;这样更容易理解;
const searchList = ref([
{ value: 'no', label: '订单号' },
{ value: 'userId', label: '用户UID' },
{ value: 'userNickname', label: '用户昵称' },
{ value: 'userMobile', label: '用户电话' }
])
+/**
+ * 聚合搜索切换查询对象时触发
+ * @param val
+ */
+const inputChangeSelect = (val: string) => {
+ searchList.value
+ .filter((item) => item.value !== val)
+ ?.forEach((item1) => {
+ // 清除集合搜索无用属性
+ if (queryParams.value.hasOwnProperty(item1.value)) {
+ delete queryParams.value[item1.value]
+ }
+ })
+}
const headerStyle = ({ row, columnIndex }: any) => {
// 表头第一行第一列占 8
@@ -417,7 +425,7 @@ const spanMethod = ({ row, rowIndex, columnIndex }: SpanMethodProps) => {
const getList = async () => {
loading.value = true
try {
- const data = await TradeOrderApi.getOrderPage(queryParams)
+ const data = await TradeOrderApi.getOrderPage(unref(queryParams))
list.value = data.list
total.value = data.total
} finally {
@@ -427,13 +435,25 @@ const getList = async () => {
/** 搜索按钮操作 */
const handleQuery = async () => {
- queryParams.pageNo = 1
+ queryParams.value.pageNo = 1
await getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields()
+ queryParams.value = {
+ pageNo: 1, // 页数
+ pageSize: 10, // 每页显示数量
+ status: null, // 订单状态
+ payChannelCode: null, // 支付方式
+ createTime: null, // 创建时间
+ terminal: null, // 订单来源
+ type: null, // 订单类型
+ deliveryType: null, // 配送方式
+ logisticsId: null, // 快递公司
+ pickUpStoreId: null // 自提门店
+ }
handleQuery()
}
@@ -445,7 +465,7 @@ const imagePreview = (imgUrl: string) => {
}
/** 查看订单详情 */
-const openForm = (id: number) => {
+const openDetail = (id: number) => {
push({ name: 'TradeOrderDetail', params: { orderId: id } })
}
diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue
index 27c52085..ed000537 100644
--- a/src/views/member/point/config/index.vue
+++ b/src/views/member/point/config/index.vue
@@ -10,47 +10,44 @@
-
-
-
-
- 下单积分是否抵用订单金额
-
-
-
-
-
-
- 积分抵用比例(1 积分抵多少金额),单位:元
-
-
-
-
-
-
- 单次下单积分使用上限,0 不限制
-
-
-
-
-
-
- 下单支付金额按比例赠送积分(实际支付 1 元赠送多少积分)
-
-
+
+
+
+
+
+ 下单积分是否抵用订单金额
+
+
+
+
+ 积分抵用比例(1 积分抵多少金额),单位:元
+
+
+
+
+
+ 单次下单积分使用上限,0 不限制
+
+
+
+
+
+ 下单支付金额按比例赠送积分(实际支付 1 元赠送多少积分)
+
+
+
+
+
保存
@@ -68,6 +65,7 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formData = ref({
+ id: undefined,
tradeDeductEnable: true,
tradeDeductUnitPrice: 0,
tradeDeductMaxPrice: 0,
@@ -119,9 +117,3 @@ onMounted(() => {
getConfig()
})
-
-
diff --git a/src/views/member/user/detail/UserExperienceRecordList.vue b/src/views/member/user/detail/UserExperienceRecordList.vue
new file mode 100644
index 00000000..64414ad1
--- /dev/null
+++ b/src/views/member/user/detail/UserExperienceRecordList.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+ +{{ scope.row.experience }}
+
+
+ {{ scope.row.experience }}
+
+
+
+
+
+
+ {{ scope.row.totalExperience }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/member/user/detail/UserOrderList.vue b/src/views/member/user/detail/UserOrderList.vue
new file mode 100644
index 00000000..86c121bc
--- /dev/null
+++ b/src/views/member/user/detail/UserOrderList.vue
@@ -0,0 +1,403 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
商品信息
+
单价(元)/数量
+
售后状态
+
实付金额(元)
+
买家/收货人
+
配送方式
+
订单状态
+
操作
+
+
+
+
+
+
+
+ 订单号:{{ scope.row.no }}
+ 下单时间:{{ formatDate(scope.row.createTime) }}
+ 订单来源:
+
+ 支付方式:
+
+ 未支付
+
+ 支付时间:{{ formatDate(scope.row.payTime) }}
+
+ 订单类型:
+
+
+
+
+
+
+ {{ row.spuName }}
+
+ {{ property.propertyName }}: {{ property.valueName }}
+
+
+
+
+
+
+ {{ floatToFixed2(row.price) }} 元 / {{ row.count }}
+
+
+
+
+
+
+
+
+
+ {{ floatToFixed2(scope.row.payPrice) + '元' }}
+
+
+
+
+
+
+ 买家:{{ scope.row.user.nickname }}
+
+ 收货人:{{ scope.row.receiverName }} {{ scope.row.receiverMobile }}
+ {{ scope.row.receiverAreaName }} {{ scope.row.receiverDetailAddress }}
+
+
+
+
+
+ 门店名称:
+ {{ pickUpStoreList.find((p) => p.id === scope.row.pickUpStoreId)?.name }}
+
+
+ 门店手机:
+ {{ pickUpStoreList.find((p) => p.id === scope.row.pickUpStoreId)?.phone }}
+
+
+ 自提门店:
+ {{
+ pickUpStoreList.find((p) => p.id === scope.row.pickUpStoreId)?.detailAddress
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 详情
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/member/user/detail/index.vue b/src/views/member/user/detail/index.vue
index bd084687..d9fa844e 100644
--- a/src/views/member/user/detail/index.vue
+++ b/src/views/member/user/detail/index.vue
@@ -36,12 +36,16 @@
- 成长值(WIP)
+
+
余额(WIP)
- 订单管理(WIP)
+
+
+
售后管理(WIP)
收藏记录(WIP)
优惠劵(WIP)
@@ -62,14 +66,16 @@ import UserAccountInfo from './UserAccountInfo.vue'
import UserAddressList from './UserAddressList.vue'
import UserPointList from './UserPointList.vue'
import UserSignList from './UserSignList.vue'
+import UserExperienceRecordList from './UserExperienceRecordList.vue'
import { CardTitle } from '@/components/Card/index'
+import UserOrderList from '@/views/member/user/detail/UserOrderList.vue'
import { ElMessage } from 'element-plus'
defineOptions({ name: 'MemberDetail' })
const activeName = ref('point') // 账户明细 选中的 tabs
const loading = ref(true) // 加载中
-const user = ref()
+const user = ref({})
/** 添加/修改操作 */
const formRef = ref()
diff --git a/src/views/member/user/index.vue b/src/views/member/user/index.vue
index fa62dea5..8350f743 100644
--- a/src/views/member/user/index.vue
+++ b/src/views/member/user/index.vue
@@ -160,6 +160,7 @@
import { dateFormatter } from '@/utils/formatTime'
import * as UserApi from '@/api/member/user'
import { DICT_TYPE } from '@/utils/dict'
+import UserForm from './UserForm.vue'
import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue'
import MemberLevelSelect from '@/views/member/level/components/MemberLevelSelect.vue'
import MemberGroupSelect from '@/views/member/group/components/MemberGroupSelect.vue'
@@ -218,6 +219,12 @@ const openDetail = (id: number) => {
push({ name: 'MemberUserDetail', params: { id } })
}
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+ formRef.value.open(type, id)
+}
+
/** 表格选中事件 */
const handleSelectionChange = (rows: UserApi.UserVO[]) => {
selectedIds.value = rows.map((row) => row.id)