feat: 添加回收订单 修改其他

This commit is contained in:
快乐橙 2025-04-20 22:46:41 +08:00
parent 7c0b7f8a66
commit 9cb9ce5cfb
25 changed files with 1141 additions and 55 deletions

View File

@ -5,21 +5,34 @@
"ComponentPublicInstance": true,
"ComputedRef": true,
"Debounce": true,
"DirectiveBinding": true,
"EMAIL_REGEXP": true,
"EffectScope": true,
"ElMessage": true,
"ExtractDefaultPropTypes": true,
"ExtractPropTypes": true,
"ExtractPublicPropTypes": true,
"InjectionKey": true,
"MOBILE_REGEXP": true,
"MaybeRef": true,
"MaybeRefOrGetter": true,
"PASSWORD_REGEXP": true,
"PropType": true,
"Ref": true,
"STAR_MOBILE_REGEXP": true,
"UNIFIED_SOCIAL_CREDIT_CODE": true,
"USER_NAME_REGEXP": true,
"VNode": true,
"WritableComputedRef": true,
"addClass": true,
"addDomain": true,
"byteLength": true,
"checkFile": true,
"checkIDCard": true,
"cleanArray": true,
"computed": true,
"configDefInfo": true,
"countComboPrice": true,
"createApp": true,
"createUniqueString": true,
"customRef": true,
@ -29,28 +42,32 @@
"defineComponent": true,
"effectScope": true,
"encrypt": true,
"filterAsyncRoutes": true,
"excelRequest": true,
"flatten": true,
"formatConfigInfo": true,
"formatHtml": true,
"formatTime": true,
"formatPrice": true,
"formatTime": true,
"generateTitle": true,
"getAreaNameList": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"getDateTimeRange": true,
"getLevels": true,
"getParseTime": true,
"getQueryObject": true,
"getTime": true,
"getToken": true,
"getUUID": true,
"h": true,
"handleArr": true,
"handleOrderItems": true,
"hasClass": true,
"html2Text": true,
"idList": true,
"inject": true,
"isAuth": true,
"isArray": true,
"isAuth": true,
"isCreditCode": true,
"isEmail": true,
"isExternal": true,
@ -61,9 +78,9 @@
"isReactive": true,
"isReadonly": true,
"isRef": true,
"isStarMobile": true,
"isString": true,
"isUserName": true,
"loadView": true,
"markRaw": true,
"nextTick": true,
"noSpacesBothSides": true,
@ -83,6 +100,7 @@
"onServerPrefetch": true,
"onUnmounted": true,
"onUpdated": true,
"onWatcherCleanup": true,
"param": true,
"param2Obj": true,
"parseTime": true,
@ -95,9 +113,11 @@
"request": true,
"resolveComponent": true,
"setToken": true,
"setupStore": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"store": true,
"toRaw": true,
"toRef": true,
"toRefs": true,
@ -107,17 +127,22 @@
"triggerRef": true,
"uniqueArr": true,
"unref": true,
"useAllinpayStore": true,
"useAppStore": true,
"useAttrs": true,
"useCommonStore": true,
"useProdStore": true,
"useCssModule": true,
"useCssVars": true,
"useId": true,
"useIncludeRouterName": true,
"useLink": true,
"useModel": true,
"usePermissionStore": true,
"useProdStore": true,
"useRoute": true,
"useRouter": true,
"useSlots": true,
"useTemplateRef": true,
"useUserStore": true,
"useWebConfigStore": true,
"validAlphabets": true,
@ -125,42 +150,13 @@
"validLowerCase": true,
"validNoEmptySpace": true,
"validPassword": true,
"validPassword2": true,
"validURL": true,
"validUpperCase": true,
"validUsername": true,
"watch": true,
"watchEffect": true,
"watchPostEffect": true,
"watchSyncEffect": true,
"stores": true,
"allinpay": true,
"useAllinpayStore": true,
"useTestStore": true,
"DirectiveBinding": true,
"ExtractDefaultPropTypes": true,
"ExtractPropTypes": true,
"ExtractPublicPropTypes": true,
"MaybeRef": true,
"MaybeRefOrGetter": true,
"STAR_MOBILE_REGEXP": true,
"WritableComputedRef": true,
"addDomain": true,
"checkFile": true,
"checkIDCard": true,
"countComboPrice": true,
"excelRequest": true,
"generateTitle": true,
"getDateTimeRange": true,
"getParseTime": true,
"handleOrderItems": true,
"isStarMobile": true,
"onWatcherCleanup": true,
"setupStore": true,
"store": true,
"useId": true,
"useIncludeRouterName": true,
"useModel": true,
"useTemplateRef": true,
"validPassword2": true
"watchSyncEffect": true
}
}

View File

@ -1,4 +1,10 @@
/*
* @Description :
* @Autor : cl
* @Date : 2025-04-11 20:20:26
*/
module.exports = {
// lintOnSave: false,
env: {
browser: true,
es2021: true

View File

@ -1,6 +1,6 @@
server {
listen 80;
server_name cloud-admin.mall4j.com;
server_name cloud-admin.Tmerclub.com;
location / {
root /usr/share/nginx/html/admin;

View File

@ -11,7 +11,6 @@
<script type="module" src="/src/main.js"></script>
<script>
// eslint-disable-next-line no-console
console.log('mall4j.v240115')
</script>
</body>
</html>

View File

@ -1,6 +1,6 @@
server {
listen 80;
server_name cloud-multishop.mall4j.com;
server_name cloud-multishop.Tmerclub.com;
location / {
try_files $uri $uri/ /;

View File

@ -202,3 +202,47 @@ export function deleteStickDefect (params) {
params
})
}
// 获取回收订单
export function getRecycleOrder (params) {
return request({
url: '/tmerclub_local/admin/cueOrder/page',
method: 'get',
params
})
}
// 获取回收订单详情
export function getRecycleOrderDetail (params) {
return request({
url: '/tmerclub_local/admin/cueOrder',
method: 'get',
params
})
}
// 修改审核状态
export function updateRecycleOrderStatus (data) {
return request({
url: '/tmerclub_local/admin/cueOrder/updateAuditStatus',
method: 'put',
data
})
}
// 修改评估状态
export function updateRecycleOrderEvaluateStatus (data) {
return request({
url: '/tmerclub_local/admin/cueOrder/updateEvaluateStatus',
method: 'put',
data
})
}
// 退回
export function returnRecycleOrder (data) {
return request({
url: '/tmerclub_local/admin/cueOrder/cueRetracted',
method: 'put',
data
})
}

View File

@ -4,7 +4,7 @@
:close-on-click-modal="false"
:title="'修改密码'"
:append-to-body="true"
class="Mall4j"
class="Tmerclub"
>
<el-form
ref="dataFormRef"

View File

@ -1,6 +1,6 @@
<template>
<div
class="Mall4j container"
class="Tmerclub container"
:style="isDecorate? '':'margin-top: 40px;'"
>
<el-card

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j navbar">
<div class="Tmerclub navbar">
<div class="navbar-content">
<!-- 1.左边部分 -->
<div class="left-menu">

View File

@ -1,5 +1,5 @@
<template>
<aside class="Mall4j site-sidebar">
<aside class="Tmerclub site-sidebar">
<div class="menu-mod">
<el-scrollbar style="height: 100%">
<div class="menu-left">

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j menu-mod">
<div class="Tmerclub menu-mod">
<div v-if="expandMenu.children">
<el-sub-menu :index="expandMenu.id + ''">
<template #title>

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j">
<div class="Tmerclub">
<div class="menu-right-el">
<el-menu
class="el-menu-vertical-demo"

View File

@ -1,7 +1,12 @@
<!--
* @Description :
* @Autor : cl
* @Date : 2025-04-11 20:20:26
-->
<template>
<div
:class="classObj"
class="Mall4j app-wrapper"
class="Tmerclub app-wrapper"
>
<div :class="{'fixed-header':fixedHeader}">
<Navbar v-if="isDecorate" />

View File

@ -23,9 +23,9 @@ export const useWebConfigStore = defineStore('webConfigStore', {
this.webConfig = webConfigDataForm
const lang = localStorage.getItem('cloudLang')
if (lang !== 'en') {
document.title = webConfigDataForm.titleContentCn || 'Mall4j白洞版-商家端'
document.title = webConfigDataForm.titleContentCn || 'Tmerclub白洞版-商家端'
} else {
document.title = webConfigDataForm.titleContentEn || 'Mall4j White hole version Shop side'
document.title = webConfigDataForm.titleContentEn || 'Tmerclub White hole version Shop side'
}
let facicon = document.querySelector('link[rel="icon"]')

View File

@ -7,9 +7,9 @@ const configDefInfo = {
// 版权声明-英文
copyrightEn: '',
// 标题文本-中文
titleContentCn: 'Mall4j 白洞版 商家端',
titleContentCn: 'Tmerclub 白洞版 商家端',
// 标题文本-英文
titleContentEn: 'Mall4j 白洞版 商家端',
titleContentEn: 'Tmerclub 白洞版 商家端',
// 网站标题图标
titleImg: new URL('@/assets/website-config/title-icon.png', import.meta.url).href,
// 菜单栏顶部图标

View File

@ -1,5 +1,5 @@
<template>
<div class=" Mall4j dashboard-container">
<div class=" Tmerclub dashboard-container">
<!-- 1.店铺状态信息提示 -->
<div
v-if="shopStatusInfo.shopStatus !== null && shopStatusInfo.shopStatus !== 1"

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j page-login login-container">
<div class="Tmerclub page-login login-container">
<div class="login-frame">
<div class="login-img">
<img

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j">
<div class="Tmerclub">
<router-view />
</div>
</template>

View File

@ -0,0 +1,14 @@
<template>
<div class="order-detail" />
</template>
<script setup>
</script>
<style scoped>
.order-detail {
width: 100%;
height: 100%;
background-color: #fff;
}
</style>

View File

@ -0,0 +1,323 @@
<!--
* @Author: 快乐橙 1760016317@qq.com
* @Date: 2025-04-14 21:53:04
* @LastEditors: 快乐橙 1760016317@qq.com
* @LastEditTime: 2025-04-15 20:09:31
* @FilePath: \tmerclub-platform\src\views\modules\product\recycle\club\add-or-update.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div>
<div class="club-manage">
<el-dialog
v-model="visible"
:title="dataForm.productId ? $t('table.edit') : $t('table.create')"
:close-on-click-modal="false"
width="600px"
:destroy-on-close="true"
top="5vh"
class="el-dialog-bodyt"
@close="closeDialog"
>
<el-form
ref="dataFormRef"
:rules="rules"
:model="dataForm"
label-position="right"
label-width="110px"
style="width: 500px; margin-left: 35px"
@submit.prevent
>
<!-- 商品名称 -->
<el-form-item
label="商品名称:"
prop="productName"
>
<el-input
v-model="dataForm.productName"
type="text"
maxlength="10"
placeholder="商品名称"
/>
</el-form-item>
<!-- 商品图片 -->
<el-form-item
label="商品图片:"
prop="productImages"
>
<img-upload
v-model="dataForm.productImages"
@input="onPropChange('productImages')"
/>
<div
class=""
style="width: 100%"
>
建议图片尺寸为1920*45 0
</div>
</el-form-item>
<!-- 商品价格 -->
<el-form-item
label="商品价格:"
prop="productPrice"
>
<el-input
v-model="dataForm.productPrice"
type="text"
maxlength="10"
placeholder="商品价格"
/>
</el-form-item>
<!-- 品牌选择 -->
<el-form-item
label="品牌选择:"
prop="brandId"
>
<el-select
v-model="dataForm.brandId"
placeholder="请选择品牌"
:empty-values="[null, undefined]"
value-key="brandId"
>
<el-option
v-for="item in stickBrandList"
:key="item.brandId"
:disabled="item.brandStatus == 0"
:label="item.brandName"
:value="item.brandId"
/>
</el-select>
</el-form-item>
<!-- 类型选择 -->
<el-form-item
label="类型选择:"
prop="typeId"
>
<el-select
v-model="dataForm.typeId"
placeholder="请选择类型"
>
<el-option
v-for="item in stickTypeList"
:key="item.typeId"
:disabled="item.typeStatus == 0"
:label="item.typeName"
:value="item.typeId"
/>
</el-select>
</el-form-item>
<!-- 获取系列 -->
<el-form-item
label="系列选择:"
prop="seriesId"
>
<el-select
v-model="dataForm.seriesId"
placeholder="请选择系列"
>
<el-option
v-for="item in stickSeriesList"
:key="item.seriesId"
:disabled="item.seriesStatus == 0"
:label="item.seriesName"
:value="item.seriesId"
/>
</el-select>
</el-form-item>
<!-- 排序 -->
<el-form-item
label="排序:"
prop="productSeq"
>
<el-input
v-model="dataForm.productSeq"
type="text"
maxlength="10"
placeholder="排序"
/>
</el-form-item>
<!-- 状态 -->
<el-form-item
label="状态:"
prop="productStatus"
>
<el-radio-group v-model="dataForm.productStatus">
<el-radio :label="1">
上架
</el-radio>
<el-radio :label="0">
下架
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible = false">
取消
</el-button>
<el-button
type="primary"
:loading="btnLoading"
@click="onSubmit()"
>
确认
</el-button>
</div>
</template>
</el-dialog>
</div>
</div>
</template>
<script setup>
import { getStickDetail, addStick, updateStick } from '@/api/product/recycle'
import { ElMessage, ElMessageBox } from 'element-plus'
const props = defineProps({
stickBrandList: {
type: Array,
default: () => []
},
stickTypeList: {
type: Array,
default: () => []
},
stickSeriesList: {
type: Array,
default: () => []
}
})
const emit = defineEmits(['refresh-data-list'])
const { proxy } = getCurrentInstance()
const dataFormRef = ref(null)
const route = useRoute()
const router = useRouter()
const visible = ref(false)
const title = ref('')
const type = ref('')
const clubList = ref([])
const attrValue = ref('')
const btnLoading = ref(false)
const dataForm = ref({
productId: null,
productName: '',
productDescription: '',
productImages: '',
productPrice: '',
productSeq: '',
productStatus: 1,
typeId: null,
brandId: null,
seriesId: null
})
const rules = reactive({
productName: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
productPrice: [
{ required: true, message: '请输入商品价格', trigger: 'blur' },
// 0
{
pattern: /^\d+$/,
message: '价格必须为数字值且不能小于0',
trigger: 'blur'
}
],
productImages: [
{ required: true, message: '请选择商品图片', trigger: 'blur' }
],
productSeq: [
{ required: true, message: '请输入商品排序', trigger: 'blur' },
{
pattern: /^\d+$/,
message: '排序必须为数字值且不能小于0',
trigger: 'blur'
}
],
productStatus: [
{ required: true, message: '请选择商品状态', trigger: 'blur' }
],
typeId: [{ required: true, message: '请选择球杆类型', trigger: 'blur' }],
brandId: [{ required: true, message: '请选择球杆品牌', trigger: 'blur' }],
seriesId: [{ required: true, message: '请选择球杆系列', trigger: 'blur' }]
})
const init = (productId) => {
console.log('init', productId)
visible.value = true
dataForm.value.productId = productId || null
dataFormRef.value?.clearValidate()
if (productId) {
getClubInfo()
}
}
const closeDialog = () => {
visible.value = false
dataForm.value = {
productId: null,
productName: '',
productDescription: '',
productImages: '',
productPrice: '',
productSeq: '',
productStatus: 1,
typeId: null,
brandId: null,
seriesId: null
}
}
const getClubInfo = () => {
getStickDetail({ productId: dataForm.value.productId }).then((res) => {
Object.keys(dataForm.value).forEach((key) => {
dataForm.value[key] = res[key]
})
console.log(props.stickBrandList)
nextTick(() => {
dataFormRef.value?.forceUpdate()
})
console.log(dataForm.value)
})
}
const onPropChange = (prop) => {
dataFormRef.value?.validateField(prop)
}
const onSubmit = () => {
console.log(dataForm.value)
dataFormRef.value?.validate((valid) => {
if (valid) {
btnLoading.value = true
if (!dataForm.value.productId) {
addStick(dataForm.value).then(() => {
ElMessage.success('新增成功')
emit('refresh-data-list')
btnLoading.value = false
closeDialog()
}).catch((err) => {
btnLoading.value = false
console.log(err)
})
} else {
updateStick(dataForm.value).then(() => {
ElMessage.success('修改成功')
emit('refresh-data-list')
btnLoading.value = false
closeDialog()
}).catch((err) => {
btnLoading.value = false
console.log(err)
})
}
visible.value = false
} else {
console.log('error submit!!')
return false
}
})
}
defineExpose({
init
})
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,355 @@
<!--
* @Author: 快乐橙 1760016317@qq.com
* @Date: 2025-04-14 21:19:35
* @LastEditors: 快乐橙 1760016317@qq.com
* @LastEditTime: 2025-04-20 22:43:49
* @FilePath: \tmerclub-platform\src\views\modules\product\recycle\club\index.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<!--
* @Author: 快乐橙 1760016317@qq.com
* @Date: 2025-04-14 21:19:35
* @LastEditors: 快乐橙 1760016317@qq.com
* @LastEditTime: 2025-04-14 22:25:43
* @FilePath: \tmerclub-platform\src\views\modules\recycle\club\index.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div class="app-container order-home">
<!-- 搜索相关区域 -->
<div class="search-bar">
<!-- native modifier has been removed, please confirm whether the function has been affected -->
<el-form
ref="searchRef"
:inline="true"
:model="pageQuery"
class="demo-form-inline"
@submit.prevent
>
<div class="input-row">
<!-- 类型 -->
<el-form-item
label="类型:"
prop="cueOrderType"
>
<el-select
v-model="pageQuery.cueOrderType"
placeholder="请选择类型"
:empty-values="[null, undefined]"
value-key="brandId"
>
<el-option
label="回收"
:value="1"
/>
<el-option
label="置换"
:value="2"
/>
<el-option
label="寄售"
:value="3"
/>
</el-select>
</el-form-item>
<!-- 是否审核 -->
<el-form-item
label="审核:"
prop="orderStatus"
>
<el-select
v-model="pageQuery.orderStatus"
placeholder="请选择"
:empty-values="[null, undefined]"
value-key="brandId"
>
<el-option
label="待审核"
:value="0"
/>
<el-option
label="审核"
:value="1"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="onGetPage(true)"
>
{{ $t("table.search") }}
</el-button>
<el-button @click="onClearSearchInfo()">
{{ $t("table.reset") }}
</el-button>
</el-form-item>
</div>
</el-form>
</div>
<div class="main-content">
<div class="operation-bar">
<el-button
v-permission="['product:attr:save']"
type="primary"
class="filter-item"
@click="onAddOrUpdate()"
>
{{ $t("table.create") }}
</el-button>
</div>
<div class="table-con">
<!-- 列表相关区域 -->
<el-table
v-loading="pageLoading"
:data="pageVO.list"
header-cell-class-name="table-header"
row-class-name="table-row-low"
highlight-current-row
style="width: 100%"
>
<!-- 商品名称 -->
<el-table-column
label="商品名称"
prop="productName"
align="left"
/>
<!-- 商品图片 -->
<el-table-column
label="商品图片"
prop="productImages"
align="left"
>
<template #default="{ row }">
<img-show :src="row.productImages" />
</template>
</el-table-column>
<el-table-column
label="品牌"
prop="brandName"
align="left"
/>
<el-table-column
label="类型"
prop="typeName"
align="left"
/>
<el-table-column
label="回收类型"
prop="cueOrderType"
align="left"
>
<template #default="{ row }">
<span v-if="row.cueOrderType == 1"> 回收</span>
<span v-if="row.cueOrderType == 2">置换</span>
<span v-if="row.cueOrderType == 3">寄售</span>
</template>
</el-table-column>
<!-- 商品价格 -->
<el-table-column
label="价格"
prop="productPrice"
align="left"
/>
<el-table-column
label="状态"
prop="orderStatus"
align="left"
>
<template #default="{ row }">
<span v-if="row.orderStatus == 5">已完成</span>
<span v-if="row.orderStatus == 10">待审核</span>
<span v-if="row.orderStatus == 11">审核通过(待发货)</span>
<span v-if="row.orderStatus == 12">审核拒绝</span>
<span v-if="row.orderStatus == 13">已发货</span>
<span v-if="row.orderStatus == 14">已收货(评估中)</span>
<span v-if="row.orderStatus == 15">评估成功</span>
<span v-if="row.orderStatus == 16">评估失败</span>
<span v-if="row.orderStatus == 17">评估失败用户已填写回邮地址</span>
<span v-if="row.orderStatus == 18">评估失败(已退回)</span>
<span v-if="row.orderStatus == 19">拒绝(已填写回邮地址)</span>
<span v-if="row.orderStatus == 20">已完成</span>
</template>
</el-table-column>
<!-- 创建时间 -->
<el-table-column
:label="$t('table.createTime')"
prop="createTime"
align="center"
min-width="180"
>
<template #default="{ row }">
<span>{{ row.createTime }}</span>
</template>
</el-table-column>
<!-- 更新时间 -->
<el-table-column
:label="$t('table.updateTime')"
prop="updateTime"
align="center"
min-width="180"
>
<template #default="{ row }">
<span>{{ row.updateTime }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('table.actions')"
align="center"
width="230"
class-name="small-padding fixed-width"
>
<template #default="{ row }">
<div class="table-btn-con">
<el-button
v-permission="['product:attr:update']"
type="primary"
link
@click="review(row.orderId)"
>
查看详情
</el-button>
<!-- <el-button v-permission="['product:attr:update']" type="primary" link
@click="onAddOrUpdate(row.productId)">
{{ $t("table.edit") }}
</el-button> -->
<!-- <el-button v-permission="['product:attr:delete']" type="primary" link @click="onDelete(row.productId)">
{{ $t("table.delete") }}
</el-button> -->
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 分页条 -->
<pagination
v-show="pageVO.total > 0"
v-model:page="pageQuery.pageNum"
v-model:limit="pageQuery.pageSize"
:total="pageVO.total"
@pagination="onGetPage()"
/>
<add-or-update
ref="addOrUpdateRef"
:stick-brand-list="stickBrandList"
:stick-type-list="stickTypeList"
:stick-series-list="stickSeriesList"
@refresh-data-list="onGetPage()"
/>
<review-dialog ref="reviewDialogRef" />
</div>
</template>
<script setup>
import {
getRecycleOrder,
getStickBrand,
getStickType,
getStickSeries,
deleteStick
} from '@/api/product/recycle'
import AddOrUpdate from './add-or-update.vue'
import reviewDialog from './review-dialog.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
const router = useRouter()
const addOrUpdateRef = ref(null)
const reviewDialogRef = ref(null)
const searchRef = ref(null)
const pageLoading = ref(false)
const addOrUpdateVisible = ref(false)
const pageQuery = reactive({
pageNum: 1,
pageSize: 10,
cueOrderType: null,
orderStatus: null
})
const pageVO = reactive({
total: 0,
list: []
})
const stickBrandList = ref([]) //
const stickTypeList = ref([]) //
const stickSeriesList = ref([]) //
const onGetPage = () => {
pageLoading.value = true
getRecycleOrder(pageQuery)
.then((res) => {
console.log(res)
pageVO.list = res.list
pageVO.total = res.total
})
.finally(() => {
pageLoading.value = false
})
}
//
const onClearSearchInfo = () => {
searchRef.value.resetFields()
onGetPage()
}
const onAddOrUpdate = (id) => {
addOrUpdateVisible.value = true
nextTick(() => {
addOrUpdateRef.value.init(id)
})
}
//
const getStickBrandList = (val) => {
getStickBrand({
pageNum: 1,
pageSize: 10000
}).then((res) => {
stickBrandList.value = res.list
})
}
//
const getStickTypeList = (val) => {
getStickType({
pageNum: 1,
pageSize: 10000
}).then((res) => {
stickTypeList.value = res.list
})
}
//
const getStickSeriesList = (val) => {
getStickSeries({
pageNum: 1,
pageSize: 10000
}).then((res) => {
stickSeriesList.value = res.list
})
}
//
const onDelete = (productId) => {
ElMessageBox.confirm('确定删除该球杆吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
deleteStick({ productId }).then(() => {
ElMessage.success('删除成功')
onGetPage()
})
})
.catch(() => { })
}
const review = (orderId) => {
reviewDialogRef.value.init(orderId)
}
onMounted(() => {
onGetPage()
getStickBrandList()
getStickTypeList()
getStickSeriesList()
})
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,344 @@
<!--
* @Author: 快乐橙 1760016317@qq.com
* @Date: 2025-04-20 19:12:10
* @LastEditors: 快乐橙 1760016317@qq.com
* @LastEditTime: 2025-04-20 22:32:16
* @FilePath: \tmerclub-multishop\src\views\modules\product\recycle\order-page\review-dialog.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
<div>
<el-dialog
v-model="visible"
title="详情"
width="900"
@close="resetFormData"
>
<div class="container">
<el-descriptions
:column="2"
border
>
<el-descriptions-item label="商品名称">
{{ orderInfo.productName || '无' }}
</el-descriptions-item>
<el-descriptions-item label="商品图片">
<el-image
v-if="orderInfo.productImages"
:src="orderInfo.productImageUrl"
:preview-src-list="[orderInfo.productImageUrl]"
style="width: 100px; height: 100px"
/>
<span v-else></span>
</el-descriptions-item>
<el-descriptions-item label="品牌">
{{ orderInfo.brandName || '无' }}
</el-descriptions-item>
<el-descriptions-item label="类型">
{{ orderInfo.typeName || '无' }}
</el-descriptions-item>
<el-descriptions-item label="用户手机号">
{{ orderInfo.userPhone || '无' }}
</el-descriptions-item>
<el-descriptions-item label="收货物流单号">
{{ orderInfo.sendNumber || '无' }}
</el-descriptions-item>
<el-descriptions-item label="退货物流单号">
{{ orderInfo.returnTrackingNumber || '无' }}
</el-descriptions-item>
<el-descriptions-item label="订单类型">
{{ orderInfo.cueOrderType === 1 ? '回收' : orderInfo.cueOrderType === 2 ?
'置换' : '寄售' }}
</el-descriptions-item>
<el-descriptions-item
label="缺陷"
:span="2"
>
<div style="display: flex; flex-wrap: wrap; align-items: center; gap: 10px;">
<div
v-for="(item, index) in orderInfo.flawList"
:key="index"
>
{{ item.flawName }} ({{ item.isFlaw === 1 ? '是' : '否' }})
</div>
<span v-if="!orderInfo.flawList || orderInfo.flawList.length === 0"></span>
</div>
</el-descriptions-item>
<el-descriptions-item
label="缺陷图片"
:span="2"
>
<div style="display: flex; flex-wrap: wrap; align-items: center; gap: 10px;">
<el-image
v-for="(image, index) in imageList.slice(0, 8)"
:key="index"
:src="image"
:alt="image"
:preview-src-list="imageList"
style="width: 100px; height: 100px"
/>
<span v-if="!imageList || imageList.length === 0"></span>
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button
v-if="orderInfo.orderStatus === 10"
type="primary"
@click="formVisible2 = true"
>审核</el-button>
<el-button
v-if="orderInfo.orderStatus === 14 || orderInfo.orderStatus == 13"
type="primary"
@click="formVisible = true"
>评估</el-button>
</span>
</template>
</el-dialog>
<el-dialog
v-model="formVisible"
title="评估表单"
width="600"
>
<el-form
ref="formRef"
:model="formData"
:rules="rules"
label-width="120px"
>
<el-form-item
label="实际金额:"
prop="actualAmount"
>
<el-input
v-model="formData.actualAmount"
type="number"
/>
</el-form-item>
<el-form-item
label="代金券金额:"
prop="voucherAmount"
>
<el-input
v-model="formData.voucherAmount"
type="number"
/>
</el-form-item>
<el-form-item
label="佣金:"
prop="brokerage"
>
<el-input
v-model="formData.brokerage"
type="number"
/>
</el-form-item>
<el-form-item
label="服务费:"
prop="serviceCharge"
>
<el-input
v-model="formData.serviceCharge"
type="number"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="updateEvaluateStatus"
>
提交
</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-dialog
v-model="formVisible2"
title="预估"
role="rules2"
width="600"
>
<el-form
ref="formRef2"
:model="formData2"
:rules="rules"
label-width="120px"
>
<el-form-item
label="预估金额:"
prop="estimatedAmount"
>
<el-input
v-model="formData.estimatedAmount"
type="number"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="updateStatus(11)"
>
提交
</el-button>
</el-form-item>
</el-form>
</el-dialog>
</div>
</template>
<script setup>
import { getRecycleOrderDetail, updateRecycleOrderStatus, updateRecycleOrderEvaluateStatus } from '@/api/product/recycle'
const visible = ref(false)
const formVisible = ref(false)
const formVisible2 = ref(false)
const formRef = ref(null)
const formRef2 = ref(null)
const orderInfo = ref({})
const imageList = ref([])
const formData = ref({
actualAmount: 0,
voucherAmount: 0,
brokerage: 0,
serviceCharge: 0
})
const formData2 = ref({
estimatedAmount: 0
})
const rules = {
actualAmount: [
{ pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的数字格式', trigger: 'blur' }
],
voucherAmount: [
{ pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的数字格式', trigger: 'blur' }
],
brokerage: [
{ pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的数字格式', trigger: 'blur' }
],
serviceCharge: [
{ pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的数字格式', trigger: 'blur' }
]
}
const rules2 = {
estimatedAmount: [
{ pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的数字格式', trigger: 'blur' }
]
}
const init = (orderId) => {
console.log('init')
visible.value = true
getRecycleOrderDetail({
orderId
}).then(res => {
console.log(res)
orderInfo.value = {
...res,
productImageUrl: res.productImages ? import.meta.env.VITE_APP_RESOURCES_URL + '/' + res.productImages : null
}
imageList.value = res.flawImgUrl.split(',').map(v => {
return import.meta.env.VITE_APP_RESOURCES_URL + '/' + v
})
console.log(orderInfo.value.flawList)
})
}
const updateStatus = (status) => {
formRef2.value.validate((valid) => {
if (valid) {
updateRecycleOrderStatus({
orderId: orderInfo.value.orderId,
orderStatus: status,
userId: orderInfo.value.userId,
mallOrderId: orderInfo.value.mallOrderId,
estimatedAmount: formData2.value.estimatedAmount
}).then(res => {
visible.value = false
formVisible2.value = false
ElMessage.success('操作成功')
})
} else {
return false
}
})
}
// {
// "orderId": 22,
// "orderStatus": 5,
// "userId":5001,
// "mallOrderId":2504204005002001,
// "actualAmount": 100,
// "voucherAmount": 150,
// "brokerage": null,
// "serviceCharge":null,
// "cueOrderType":1
// }
const resetFormData = () => {
formData.value = {
actualAmount: 0,
voucherAmount: 0,
brokerage: 0,
serviceCharge: 0
}
formData2.value.estimatedAmount = 0
}
const updateEvaluateStatus = () => {
formRef.value.validate((valid) => {
if (valid) {
updateRecycleOrderEvaluateStatus({
orderId: orderInfo.value.orderId,
orderStatus: 15,
userId: orderInfo.value.userId,
mallOrderId: orderInfo.value.mallOrderId,
cueOrderType: orderInfo.value.cueOrderType,
actualAmount: formData.value.actualAmount,
voucherAmount: formData.value.voucherAmount,
brokerage: formData.value.brokerage,
serviceCharge: formData.value.serviceCharge
}).then(res => {
visible.value = false
formVisible.value = false
ElMessage.success('操作成功')
})
} else {
return false
}
})
}
defineExpose({
init
})
</script>
<style scoped>
.image-row {
width: 100%;
margin-top: 20px;
display: flex;
/* flex-wrap: wrap; */
gap: 10px;
align-items: flex-start;
}
.product-image {
width: calc((100% - 70px) / 8);
height: 70px;
object-fit: cover;
margin-top: 0;
margin-right: 10px;
}
.container {
width: 100%;
height: 800px;
overflow-y: auto;
}
.label {
width: 120px;
margin-bottom: 10px;
}
</style>

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j page-picture-manager">
<div class="Tmerclub page-picture-manager">
<div class="file-group">
<div class="upload-btn">
<div class="up-btn">

View File

@ -1,5 +1,5 @@
<template>
<div class="Mall4j selx-imgbox page-video-manager">
<div class="Tmerclub selx-imgbox page-video-manager">
<div class="file-group">
<div class="upload-btn">
<div class="up-btn">