202506061628

This commit is contained in:
张潘 2025-06-06 16:28:19 +08:00
parent 687ec12974
commit 5b06f9755e
29 changed files with 1456 additions and 496 deletions

View File

@ -3,10 +3,9 @@ package com.ruoyi.system.controller;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.ruoyi.system.domain.Order; import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.ServiceGoods;
import com.ruoyi.system.domain.Users;
import com.ruoyi.system.service.IServiceGoodsService; import com.ruoyi.system.service.IServiceGoodsService;
import com.ruoyi.system.service.IUserAddressService;
import com.ruoyi.system.service.IUsersService; import com.ruoyi.system.service.IUsersService;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -22,7 +21,6 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.GoodsOrder;
import com.ruoyi.system.service.IGoodsOrderService; import com.ruoyi.system.service.IGoodsOrderService;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
@ -42,7 +40,9 @@ public class GoodsOrderController extends BaseController
@Autowired @Autowired
private IServiceGoodsService serviceGoodsService; private IServiceGoodsService serviceGoodsService;
@Autowired @Autowired
IUsersService usersService; private IUsersService usersService;
@Autowired
private IUserAddressService userAddressService;
/** /**
* 查询商品订单列表 * 查询商品订单列表
*/ */
@ -93,15 +93,31 @@ public class GoodsOrderController extends BaseController
} }
/** /**
* 新增商品订单 * 新增商品订单IServiceGoodsService serviceGoodsService;
*/ */
@PreAuthorize("@ss.hasPermi('system:GoodsOrder:add')") @PreAuthorize("@ss.hasPermi('system:GoodsOrder:add')")
@Log(title = "商品订单", businessType = BusinessType.INSERT) @Log(title = "商品订单", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@RequestBody GoodsOrder goodsOrder) public AjaxResult add(@RequestBody GoodsOrder goodsOrder)
{ {
if (goodsOrder.getAddressId()!=null){
UserAddress userAddress=userAddressService.selectUserAddressById(goodsOrder.getAddressId());
if (userAddress!=null){
goodsOrder.setName(userAddress.getName());
goodsOrder.setPhone(userAddress.getPhone());
goodsOrder.setAddress(userAddress.getAddressName());
}
}
if (goodsOrder.getProductId()!=null){
ServiceGoods serviceGoods=serviceGoodsService.selectServiceGoodsById(goodsOrder.getProductId());
if (serviceGoods!=null){
goodsOrder.setGoodPrice(serviceGoods.getPrice());
}
}
return toAjax(goodsOrderService.insertGoodsOrder(goodsOrder)); return toAjax(goodsOrderService.insertGoodsOrder(goodsOrder));
} }
/** /**
* 修改商品订单 * 修改商品订单

View File

@ -120,10 +120,12 @@ public class QuoteTypeController extends BaseController
* 获取项目报价--工艺分类详细信息 * 获取项目报价--工艺分类详细信息
*/ */
@PreAuthorize("@ss.hasPermi('system:QuoteType:query')") @PreAuthorize("@ss.hasPermi('system:QuoteType:query')")
@GetMapping(value = "/goodsDataList") @GetMapping(value = "/goodsDataList/{type}")
public AjaxResult goodsDataList() public AjaxResult goodsDataList(@PathVariable("type") int type)
{ {
return success(serviceGoodsService.selectServiceGoodsList(new ServiceGoods())); ServiceGoods serviceGoods=new ServiceGoods();
serviceGoods.setType(type);
return success(serviceGoodsService.selectServiceGoodsList(serviceGoods));
} }

View File

@ -76,10 +76,15 @@ public class UserAddressController extends BaseController
* 获取用户收货地址详细信息 * 获取用户收货地址详细信息
*/ */
@PreAuthorize("@ss.hasPermi('system:UserAddress:query')") @PreAuthorize("@ss.hasPermi('system:UserAddress:query')")
@GetMapping(value = "/getuserAddressList") @GetMapping(value = "/getuserAddressList/{id}")
public AjaxResult getuserAddressList() public AjaxResult getuserAddressList(@PathVariable("id") Long id)
{ {
return success(userAddressService.selectUserAddressList(new UserAddress())); UserAddress userAddress=new UserAddress();
if (id!=null){
userAddress.setUid(id);
}
return success(userAddressService.selectUserAddressList(userAddress));
} }

View File

@ -17,9 +17,9 @@ export function getCoupons(id) {
}) })
} }
export function getGoodsDataList() { export function getGoodsDataList(type) {
return request({ return request({
url: '/system/QuoteType/goodsDataList', url: '/system/QuoteType/goodsDataList/'+type,
method: 'get' method: 'get'
}) })
} }

View File

@ -16,12 +16,33 @@ export function getGoodsOrder(id) {
method: 'get' method: 'get'
}) })
} }
export function getGoodsDataList() {
export function getGoodsDataList(type) {
return request({ return request({
url: '/system/QuoteType/goodsDataList', url: '/system/QuoteType/goodsDataList/'+type,
method: 'get' method: 'get'
}) })
} }
export function generateCode() {
return request({
url: '/system/Order/generateCode/',
method: 'get'
})
}
// 获取用户地址列表 - 备选方案
export function getUserAddressList(userId) {
return request({
url: `/system/UserAddress/getuserAddressList/${userId}`,
method: 'get'
})
}
export function getSiteDeliveryList() { export function getSiteDeliveryList() {
return request({ return request({

View File

@ -50,12 +50,29 @@ export function getReceiveRecords(orderId) {
method: 'get' method: 'get'
}) })
} }
export function getGoodsDataList() { export function getGoodsDataList(type) {
return request({ return request({
url: '/system/QuoteType/goodsDataList', url: '/system/QuoteType/goodsDataList/'+type,
method: 'get' method: 'get'
}) })
} }
// 获取用户地址列表
export function getuserAddressList(id) {
return request({
url: '/system/UserAddress/getuserAddressList/' + id,
method: 'get'
})
}
// 获取用户地址列表 - 备选方案
export function getUserAddressList(userId) {
return request({
url: `/system/UserAddress/getuserAddressList/${userId}`,
method: 'get'
})
}
// 获取接单记录列表 // 获取接单记录列表
export function getUserDataList(type) { export function getUserDataList(type) {
return request({ return request({

View File

@ -9,9 +9,9 @@ export function listQuoteType(query) {
}) })
} }
export function getGoodsDataList() { export function getGoodsDataList(type) {
return request({ return request({
url: '/system/QuoteType/goodsDataList', url: '/system/QuoteType/goodsDataList/'+type,
method: 'get' method: 'get'
}) })
} }

View File

@ -231,7 +231,7 @@
.el-input__inner, .el-textarea__inner { .el-input__inner, .el-textarea__inner {
border-radius: 6px; border-radius: 6px;
border-color: #e2e8f0; // border-color: #e2e8f0;
transition: all 0.3s; transition: all 0.3s;
&:hover { &:hover {

View File

@ -19,6 +19,8 @@ $--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec; $--table-border: 1px solid #dfe6ec;
$--border-color-base:#c1c1c1;
/* icon font path, required */ /* icon font path, required */
$--font-path: '~element-ui/lib/theme-chalk/fonts'; $--font-path: '~element-ui/lib/theme-chalk/fonts';

View File

@ -0,0 +1,408 @@
<template>
<div>
<!-- 用户选择输入框 -->
<div @click="openDialog" :style="{ cursor: disabled ? 'not-allowed' : 'pointer' }">
<el-input
v-model="displayName"
:placeholder="placeholder"
readonly
:disabled="disabled"
:clearable="clearable && !disabled"
@clear="handleClear"
:style="{ cursor: disabled ? 'not-allowed' : 'pointer' }"
@click.native="()=>{}"
>
<template slot="suffix">
<i class="el-icon-search" :style="{ marginRight: '8px', cursor: disabled ? 'not-allowed' : 'pointer' }"></i>
</template>
</el-input>
</div>
<!-- 用户选择弹窗 -->
<el-dialog
:title="dialogTitle"
:visible.sync="dialogVisible"
:width="$store.state.app.device === 'mobile' ? '95%' : '900px'"
:close-on-click-modal="false"
append-to-body
center
class="user-select-dialog"
>
<!-- 搜索表单 -->
<el-form :model="queryParams" :inline="true" label-width="60px" class="search-form">
<el-form-item label="昵称">
<el-input
v-model="queryParams.name"
placeholder="请输入昵称"
clearable
@keyup.enter.native="handleQuery"
style="width: 160px;"
size="small"
/>
</el-form-item>
<el-form-item label="电话">
<el-input
v-model="queryParams.phone"
placeholder="请输入电话"
clearable
@keyup.enter.native="handleQuery"
style="width: 160px;"
size="small"
/>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable style="width: 100px;" size="small">
<el-option label="启用" :value="1" />
<el-option label="禁用" :value="0" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 用户列表表格 -->
<el-table
v-loading="loading"
:data="usersList"
@row-click="handleRowClick"
highlight-current-row
:row-class-name="getRowClassName"
max-height="400px"
style="width: 100%; margin-top: 15px;"
>
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column label="ID" prop="id" width="60" align="center" />
<el-table-column label="昵称" prop="name" min-width="100" show-overflow-tooltip />
<el-table-column label="电话" prop="phone" width="120" />
<el-table-column label="头像" width="70" align="center">
<template slot-scope="scope">
<el-avatar
v-if="scope.row.avatar"
:src="scope.row.avatar"
:size="35"
fit="cover"
/>
<el-avatar v-else :size="35" icon="el-icon-user-solid" />
</template>
</el-table-column>
<el-table-column label="状态" width="70" align="center">
<template slot-scope="scope">
<el-tag :type="scope.row.status === 1 ? 'success' : 'danger'" size="small">
{{ scope.row.status === 1 ? '启用' : '禁用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="createdAt" width="90" align="center">
<template slot-scope="scope">
<span style="font-size: 12px;">{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="70" align="center">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
@click.stop="selectUser(scope.row)"
>
选择
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
style="margin-top: 15px; margin-bottom: 10px;"
class="text-center"
/>
</el-dialog>
</div>
</template>
<script>
import { listUsers } from "@/api/system/users"
export default {
name: "UserSelect",
props: {
// ID
value: {
type: [String, Number],
default: null
},
//
placeholder: {
type: String,
default: "请选择用户"
},
//
disabled: {
type: Boolean,
default: false
},
//
clearable: {
type: Boolean,
default: true
},
//
dialogTitle: {
type: String,
default: "选择用户"
},
// (1: , 2: )
userType: {
type: String,
default: '1'
}
},
data() {
return {
dialogVisible: false,
loading: false,
usersList: [],
total: 0,
selectedUser: null,
displayName: '',
queryParams: {
pageNum: 1,
pageSize: 10,
type: this.userType,
name: null,
phone: null,
status: null
}
}
},
watch: {
value: {
handler(newVal) {
if (newVal) {
this.loadUserInfo(newVal)
} else {
this.displayName = ''
this.selectedUser = null
}
},
immediate: true
},
userType: {
handler(newVal) {
this.queryParams.type = newVal
if (this.dialogVisible) {
this.getList()
}
}
}
},
methods: {
//
openDialog() {
if (this.disabled) return
this.dialogVisible = true
this.resetQuery()
this.getList()
},
//
getList() {
this.loading = true
listUsers(this.queryParams).then(response => {
this.usersList = response.rows || []
this.total = response.total || 0
this.loading = false
}).catch(error => {
console.error('获取用户列表失败:', error)
this.loading = false
this.$message.error('获取用户列表失败,请重试')
})
},
//
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
//
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 10,
type: this.userType,
name: null,
phone: null,
status: null
}
this.getList()
},
//
handleRowClick(row) {
this.selectedUser = row
},
//
selectUser(user) {
this.selectedUser = user
this.displayName = user.name
this.$emit('input', user.id)
this.$emit('change', user)
this.dialogVisible = false
},
//
handleClear() {
this.displayName = ''
this.selectedUser = null
this.$emit('input', null)
this.$emit('change', null)
},
//
loadUserInfo(userId) {
if (!userId) return
// 使
const user = this.usersList.find(u => u.id == userId)
if (user) {
this.displayName = user.name
return
}
//
listUsers({
pageNum: 1,
pageSize: 1,
type: this.userType,
id: userId
}).then(response => {
if (response.rows && response.rows.length > 0) {
this.displayName = response.rows[0].name
}
}).catch(() => {
// ID
this.displayName = `用户ID: ${userId}`
})
},
//
getRowClassName({ row }) {
if (this.selectedUser && this.selectedUser.id === row.id) {
return 'selected-row'
}
return ''
},
//
parseTime(time, pattern) {
if (!time) return ''
const date = new Date(time)
if (isNaN(date.getTime())) return ''
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
return format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key]
return value.toString().padStart(2, '0')
})
}
}
}
</script>
<style lang="scss" scoped>
.search-form {
background: #f5f7fa;
padding: 12px;
border-radius: 6px;
margin-bottom: 0;
border: 1px solid #e4e7ed;
}
//
::v-deep .selected-row {
background-color: #ecf5ff !important;
}
::v-deep .el-table__row:hover {
background-color: #f5f7fa;
}
//
::v-deep .el-input__inner {
cursor: pointer;
}
::v-deep .el-input.is-disabled .el-input__inner {
cursor: not-allowed;
}
//
.user-select-dialog {
::v-deep .el-dialog__header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 15px 20px;
border-radius: 6px 6px 0 0;
}
::v-deep .el-dialog__title {
color: white;
font-weight: 600;
}
::v-deep .el-dialog__headerbtn .el-dialog__close {
color: white;
font-size: 18px;
}
::v-deep .el-dialog__body {
padding: 20px;
}
::v-deep .el-table {
border-radius: 6px;
overflow: hidden;
}
::v-deep .el-table th {
background-color: #f8f9fa;
color: #495057;
font-weight: 600;
}
}
//
::v-deep .el-table__row:hover {
background-color: #f8f9fa !important;
transition: background-color 0.2s ease;
}
//
.text-center {
text-align: center;
}
</style>

View File

@ -39,6 +39,8 @@ import VueMeta from 'vue-meta'
import DictData from '@/components/DictData' import DictData from '@/components/DictData'
// 美化包装组件 // 美化包装组件
import BeautyWrapper from '@/components/BeautyWrapper' import BeautyWrapper from '@/components/BeautyWrapper'
// 用户选择组件
import UserSelect from '@/components/UserSelect'
import sku from '@/components/Sku/sku' import sku from '@/components/Sku/sku'
@ -62,6 +64,7 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload) Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview) Vue.component('ImagePreview', ImagePreview)
Vue.component('BeautyWrapper', BeautyWrapper) Vue.component('BeautyWrapper', BeautyWrapper)
Vue.component('UserSelect', UserSelect)
Vue.component('Sku', sku) Vue.component('Sku', sku)
Vue.use(directive) Vue.use(directive)

View File

@ -2,9 +2,13 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="公司名称" prop="company"> <el-form-item label="公司名称" prop="company">
<el-input <el-input
@ -158,9 +162,12 @@
<el-input v-model="form.id" disabled /> <el-input v-model="form.id" disabled />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="form.uid" placeholder="请选择用户" clearable filterable style="width: 100%"> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="form.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="公司名称" prop="company"> <el-form-item label="公司名称" prop="company">
<el-input v-model="form.company" placeholder="请输入公司名称" /> <el-input v-model="form.company" placeholder="请输入公司名称" />
@ -193,7 +200,7 @@
</template> </template>
<script> <script>
import { listCooperate, getCooperate, delCooperate, addCooperate, updateCooperate,changetypeStatus,getUserDataList } from "@/api/system/Cooperate" import { listCooperate, getCooperate, delCooperate, addCooperate, updateCooperate,changetypeStatus } from "@/api/system/Cooperate"
export default { export default {
name: "Cooperate", name: "Cooperate",

View File

@ -2,11 +2,12 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input <user-select
v-model="queryParams.uid" v-model="queryParams.uid"
placeholder="请输入用户" placeholder="请选择用户"
clearable user-type="1"
@keyup.enter.native="handleQuery" dialog-title="选择用户"
style="width: 200px;"
/> />
</el-form-item> </el-form-item>
<el-form-item label="优惠券id" prop="couponId"> <el-form-item label="优惠券id" prop="couponId">
@ -206,7 +207,12 @@
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="优惠券id" prop="couponId"> <el-form-item label="优惠券id" prop="couponId">
<el-input v-model="form.couponId" placeholder="请输入优惠券id" /> <el-input v-model="form.couponId" placeholder="请输入优惠券id" />

View File

@ -908,7 +908,7 @@ export default {
}) })
}, },
getGoodsDataList() { getGoodsDataList() {
getGoodsDataList().then(response => { getGoodsDataList(2).then(response => {
this.serviceGoodsList = response.data this.serviceGoodsList = response.data
}) })
}, },

View File

@ -2,11 +2,12 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input <user-select
v-model="queryParams.uid" v-model="queryParams.uid"
placeholder="请输入用户" placeholder="请选择用户"
clearable user-type="1"
@keyup.enter.native="handleQuery" dialog-title="选择用户"
style="width: 200px;"
/> />
</el-form-item> </el-form-item>
<el-form-item label="商品id" prop="goodId"> <el-form-item label="商品id" prop="goodId">
@ -142,7 +143,12 @@
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="商品id" prop="goodId"> <el-form-item label="商品id" prop="goodId">
<el-input v-model="form.goodId" placeholder="请输入商品id" /> <el-input v-model="form.goodId" placeholder="请输入商品id" />

View File

@ -26,9 +26,13 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="商品" prop="productId"> <el-form-item label="商品" prop="productId">
<el-select v-model="queryParams.productId" placeholder="请选择商品" clearable filterable> <el-select v-model="queryParams.productId" placeholder="请选择商品" clearable filterable>
@ -215,12 +219,31 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
@change="handleUserSelectChange"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="商品" prop="productId"> <el-form-item label="商品" prop="productId">
<el-input v-model="form.productId" placeholder="请输入商品" /> <el-select
v-model="form.productId"
placeholder="请选择商品"
clearable
filterable
style="width: 100%"
>
<el-option
v-for="item in goodsDataList"
:key="item.id"
:label="item.title"
:value="item.id"
/>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -230,17 +253,38 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="总价" prop="totalPrice"> <el-form-item label="总价" prop="totalPrice">
<el-input v-model="form.totalPrice" placeholder="请输入总价" prefix-icon="el-icon-money" /> <el-input-number
v-model="form.totalPrice"
placeholder="请输入总价"
:min="0"
:precision="2"
:step="0.01"
style="width: 100%"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="支付金额" prop="payPrice"> <el-form-item label="支付金额" prop="payPrice">
<el-input v-model="form.payPrice" placeholder="请输入支付金额" prefix-icon="el-icon-money" /> <el-input-number
v-model="form.payPrice"
placeholder="请输入支付金额"
:min="0"
:precision="2"
:step="0.01"
style="width: 100%"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="抵扣金额" prop="deduction"> <el-form-item label="抵扣金额" prop="deduction">
<el-input v-model="form.deduction" placeholder="请输入抵扣金额" /> <el-input-number
v-model="form.deduction"
placeholder="请输入抵扣金额"
:min="0"
:precision="2"
:step="0.01"
style="width: 100%"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -315,25 +359,44 @@
</el-col> </el-col>
</template> </template>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="关联地址" prop="addressId"> <div class="address-section">
<el-input v-model="form.addressId" placeholder="请输入关联地址" /> <h4 style="margin: 0 0 15px 0; color: #409EFF; font-size: 16px;">📍 关联地址</h4>
</el-form-item> <el-form-item label="地址" prop="addressId" style="margin-bottom: 0;">
<el-select
v-model="form.addressId"
placeholder="请选择地址"
clearable
filterable
style="width: 100%"
:disabled="!form.uid || addressLoading"
:loading="addressLoading"
>
<el-option
v-for="item in userAddressList"
:key="item.id"
:label="item.addressName"
:value="item.id"
/>
</el-select>
<div v-if="!form.uid" class="tip-text info">
请先选择用户
</div>
<div v-else-if="userAddressList.length === 0 && !addressLoading" class="tip-text warning">
该用户暂无地址信息
</div>
<div v-else-if="addressLoading" class="tip-text info">
正在加载地址数据...
</div>
</el-form-item>
</div>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="mark"> <el-form-item label="备注" prop="mark">
<el-input v-model="form.mark" type="textarea" placeholder="请输入备注" /> <el-input v-model="form.mark" type="textarea" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="创建时间" prop="createdAt">
<el-date-picker clearable v-model="form.createdAt" type="date" value-format="yyyy-MM-dd" placeholder="请选择创建时间" style="width:100%" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="更新时间" prop="updatedAt">
<el-date-picker clearable v-model="form.updatedAt" type="date" value-format="yyyy-MM-dd" placeholder="请选择更新时间" style="width:100%" />
</el-form-item>
</el-col>
</el-row> </el-row>
<div class="dialog-footer" style="text-align:left;margin-top:20px;"> <div class="dialog-footer" style="text-align:left;margin-top:20px;">
<el-button @click="reset">重置</el-button> <el-button @click="reset">重置</el-button>
@ -346,7 +409,7 @@
</template> </template>
<script> <script>
import { listGoodsOrder, getGoodsOrder, delGoodsOrder, addGoodsOrder, updateGoodsOrder, getUserDataList, getGoodsDataList ,getSiteDeliveryList} from "@/api/system/GoodsOrder" import { listGoodsOrder, getGoodsOrder, delGoodsOrder, addGoodsOrder, updateGoodsOrder, getGoodsDataList ,getSiteDeliveryList,getUserAddressList,generateCode} from "@/api/system/GoodsOrder"
export default { export default {
name: "GoodsOrder", name: "GoodsOrder",
@ -368,7 +431,12 @@ export default {
// //
GoodsOrderList: [], GoodsOrderList: [],
userDataList: [],
userAddressList: [],
//
addressLoading: false,
// //
goodsDataList : [], goodsDataList : [],
@ -418,8 +486,13 @@ export default {
payenddate: null payenddate: null
//------------------ //------------------
}, },
// //
form: {}, form: {
type: 2,
totalPrice: 0,
payPrice: 0,
deduction: 0,
},
// //
rules: { rules: {
type: [ type: [
@ -501,7 +574,6 @@ export default {
}, },
created() { created() {
this.getList(); this.getList();
this.fetchUserDataList();
this.fetchGoodsDataList(); this.fetchGoodsDataList();
this.getdeliveryList(); this.getdeliveryList();
@ -525,7 +597,7 @@ export default {
reset() { reset() {
this.form = { this.form = {
id: null, id: null,
type: null, type: 2,
mainOrderId: null, mainOrderId: null,
orderId: null, orderId: null,
transactionId: null, transactionId: null,
@ -534,13 +606,13 @@ export default {
name: null, name: null,
phone: null, phone: null,
address: null, address: null,
num: null, num: 1,
totalPrice: null, totalPrice: 0,
goodPrice: null, goodPrice: 0,
servicePrice: null, servicePrice: 0,
payPrice: null, payPrice: 0,
deduction: null, deduction: 0,
postage: null, postage: 0,
payTime: null, payTime: null,
status: null, status: null,
deliveryId: null, deliveryId: null,
@ -553,6 +625,9 @@ export default {
updatedAt: null, updatedAt: null,
deletedAt: null deletedAt: null
} }
//
this.userAddressList = []
this.addressLoading = false
this.resetForm("form") this.resetForm("form")
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -592,8 +667,15 @@ export default {
this.single = selection.length!==1 this.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
//
generateCode(){
generateCode().then(response => {
this.form.orderId=response.msg;
})
},
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.generateCode()
this.reset() this.reset()
this.open = true this.open = true
this.title = "添加商品订单" this.title = "添加商品订单"
@ -604,6 +686,12 @@ export default {
const id = row.id || this.ids const id = row.id || this.ids
getGoodsOrder(id).then(response => { getGoodsOrder(id).then(response => {
this.form = response.data this.form = response.data
// ID
if (this.form.uid) {
this.getUserAddressList(this.form.uid)
}
this.open = true this.open = true
this.title = "修改商品订单" this.title = "修改商品订单"
}) })
@ -646,14 +734,22 @@ export default {
}, `GoodsOrder_${new Date().getTime()}.xlsx`) }, `GoodsOrder_${new Date().getTime()}.xlsx`)
}, },
fetchUserDataList() { // handleUserSelectChangehandleUserChange
getUserDataList("1").then(response => { handleUserSelectChange(userId) {
this.userDataList = response.data; //
}); this.form.addressId = null
if (userId) {
//
this.getUserAddressList(userId)
} else {
//
this.userAddressList = []
}
}, },
fetchGoodsDataList() { fetchGoodsDataList() {
getGoodsDataList().then(response => { getGoodsDataList(2).then(response => {
this.goodsDataList = response.data; this.goodsDataList = response.data;
}); });
}, },
@ -663,6 +759,34 @@ export default {
getSiteDeliveryList().then(response => { getSiteDeliveryList().then(response => {
this.deliveryList = response.data; this.deliveryList = response.data;
}); });
},
//
getUserAddressList(userId) {
if (!userId) {
this.userAddressList = []
return
}
this.addressLoading = true
// 使API
getUserAddressList(userId).then(response => {
this.userAddressList = response.rows || response.data || []
this.addressLoading = false
//
if (this.form.addressId && !this.userAddressList.find(item => item.id === this.form.addressId)) {
this.form.addressId = null
}
}).catch(error => {
console.error('获取用户地址列表失败:', error)
this.userAddressList = []
this.addressLoading = false
this.$modal.msgError('获取用户地址列表失败')
})
} }
}, },
watch: { watch: {
@ -688,11 +812,72 @@ export default {
/* 表单输入框字体变大,颜色分明 */ /* 表单输入框字体变大,颜色分明 */
.el-input__inner, .el-input__inner,
.el-select .el-input__inner, .el-select .el-input__inner,
.el-date-editor .el-input__inner { .el-date-editor .el-input__inner,
.el-input-number .el-input__inner {
font-size: 18px !important; font-size: 18px !important;
color: #222 !important; color: #222 !important;
background: #f8f8f8 !important; background: #f8f8f8 !important;
border: 1.5px solid #409EFF !important; border: 1.5px solid #409EFF !important;
border-radius: 6px;
transition: all 0.3s;
}
.el-input__inner:hover,
.el-select .el-input__inner:hover,
.el-date-editor .el-input__inner:hover,
.el-input-number .el-input__inner:hover {
border-color: #66b1ff !important;
}
.el-input__inner:focus,
.el-select .el-input__inner:focus,
.el-date-editor .el-input__inner:focus,
.el-input-number .el-input__inner:focus {
border-color: #409EFF !important;
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2) !important;
}
/* 数字输入框样式 */
.el-input-number {
width: 100%;
}
.el-input-number .el-input-number__increase,
.el-input-number .el-input-number__decrease {
background-color: #f8f8f8;
border-color: #409EFF;
color: #409EFF;
}
.el-input-number .el-input-number__increase:hover,
.el-input-number .el-input-number__decrease:hover {
background-color: #409EFF;
color: #fff;
}
/* 下拉选择框禁用状态样式 */
.el-select.is-disabled .el-input__inner {
background-color: #f5f7fa !important;
border-color: #e4e7ed !important;
color: #c0c4cc !important;
cursor: not-allowed;
}
/* 下拉选择项样式 */
.el-select-dropdown__item {
font-size: 16px !important;
color: #222 !important;
padding: 8px 20px;
transition: background-color 0.3s;
}
.el-select-dropdown__item:hover {
background-color: #f5f7fa;
}
.el-select-dropdown__item.selected {
color: #409EFF !important;
font-weight: bold;
} }
.el-form-item__label { .el-form-item__label {
@ -701,10 +886,7 @@ export default {
font-weight: bold; font-weight: bold;
} }
.el-select-dropdown__item { /* 移除重复的样式定义,已在上面定义过 */
font-size: 16px !important;
color: #222 !important;
}
.el-table th, .el-table td { .el-table th, .el-table td {
font-size: 16px !important; font-size: 16px !important;
@ -738,4 +920,43 @@ export default {
border-color: #389e0d !important; border-color: #389e0d !important;
box-shadow: 0 0 0 2px rgba(82, 196, 26, 0.2) !important; box-shadow: 0 0 0 2px rgba(82, 196, 26, 0.2) !important;
} }
/* 地址选择区域样式 */
.address-section {
border: 1.5px solid #e6f7ff;
border-radius: 8px;
padding: 15px;
margin: 10px 0;
background-color: #f0f9ff;
}
.address-section .el-form-item__label {
color: #409EFF !important;
font-weight: bold;
}
.address-section .el-select .el-input__inner {
border: 1.5px solid #409EFF !important;
background-color: #fff !important;
}
.address-section .el-select .el-input__inner:focus {
border-color: #1890ff !important;
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2) !important;
}
/* 提示信息样式 */
.tip-text {
font-size: 12px;
margin-top: 4px;
padding: 2px 0;
}
.tip-text.warning {
color: #F56C6C;
}
.tip-text.info {
color: #909399;
}
</style> </style>

View File

@ -19,9 +19,13 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="类型" prop="type"> <el-form-item label="类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类型" clearable> <el-select v-model="queryParams.type" placeholder="请选择类型" clearable>
@ -135,7 +139,12 @@
<el-input v-model="form.mark" placeholder="请输入描述" /> <el-input v-model="form.mark" placeholder="请输入描述" />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="积分值" prop="num"> <el-form-item label="积分值" prop="num">
<el-input v-model="form.num" placeholder="请输入积分值" /> <el-input v-model="form.num" placeholder="请输入积分值" />
@ -166,7 +175,7 @@
</template> </template>
<script> <script>
import { listIntegralLog, getIntegralLog, delIntegralLog, addIntegralLog, updateIntegralLog ,getUserDataList} from "@/api/system/IntegralLog" import { listIntegralLog, getIntegralLog, delIntegralLog, addIntegralLog, updateIntegralLog } from "@/api/system/IntegralLog"
import request from "@/utils/request" import request from "@/utils/request"
export default { export default {
@ -186,7 +195,7 @@ export default {
// //
total: 0, total: 0,
userDataList: [],
// //
IntegralLogList: [], IntegralLogList: [],
// //

View File

@ -10,9 +10,13 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in users" :key="item.userId" :label="item.userName" :value="item.userId" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="userName"> <el-form-item label="姓名" prop="userName">
<el-input <el-input
@ -160,9 +164,12 @@
<el-input v-model="form.orderId" placeholder="请输入订单号" /> <el-input v-model="form.orderId" placeholder="请输入订单号" />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="form.uid" placeholder="请选择用户" clearable filterable style="width: 100%"> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="form.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="userName"> <el-form-item label="姓名" prop="userName">
<el-input v-model="form.userName" placeholder="请输入姓名" /> <el-input v-model="form.userName" placeholder="请输入姓名" />
@ -256,7 +263,7 @@
</template> </template>
<script> <script>
import { listIntegralOrder, getIntegralOrder, delIntegralOrder, addIntegralOrder, updateIntegralOrder,getUserDataList,getIntegralProductList,getSiteDeliveryList } from "@/api/system/IntegralOrder" import { listIntegralOrder, getIntegralOrder, delIntegralOrder, addIntegralOrder, updateIntegralOrder,getIntegralProductList,getSiteDeliveryList } from "@/api/system/IntegralOrder"
import request from "@/utils/request" import request from "@/utils/request"
export default { export default {
@ -280,7 +287,7 @@ export default {
integralProductList: [], integralProductList: [],
userDataList: [],
// //
IntegralOrderList: [], IntegralOrderList: [],
// //
@ -367,9 +374,9 @@ export default {
created() { created() {
this.getList() this.getList()
this.getOptions() this.getOptions()
this.getuserDataList()
this.getIntegralProductList() this.getIntegralProductList()
this.getSiteDeliveryList() this.getSiteDeliveryList()
this.getUserAddressList()
}, },
methods: { methods: {
getOptions() { getOptions() {
@ -443,13 +450,15 @@ export default {
}) })
}, },
getUserAddressList(){
getuserDataList(){ getUserAddressList(this.form.uid).then(res => {
getUserDataList(1).then(res => { this.UserAddressList = res.data
this.userDataList = res.data
}) })
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset() this.reset()

View File

@ -109,9 +109,13 @@
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="商品" prop="productId"> <el-form-item label="商品" prop="productId">
<el-select v-model="queryParams.productId" placeholder="请选择商品" clearable filterable> <el-select v-model="queryParams.productId" placeholder="请选择商品" clearable filterable>
@ -119,9 +123,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="师傅" prop="workerId"> <el-form-item label="师傅" prop="workerId">
<el-select v-model="queryParams.workerId" placeholder="请选择师傅" clearable filterable> <user-select
<el-option v-for="item in userGongRenList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.workerId"
</el-select> placeholder="请选择师傅"
user-type="2"
dialog-title="选择师傅"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -345,26 +353,39 @@
<template v-if="form.createType === 1"> <template v-if="form.createType === 1">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="form.uid" placeholder="请选择用户" clearable filterable style="width: 100%"> <user-select
<el-option v-model="form.uid"
v-for="item in userDataList" placeholder="请选择用户"
:key="item.id" user-type="1"
:label="item.name" dialog-title="选择用户"
:value="item.id" @change="handleUserSelectChange"
/> />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="关联地址" prop="addressId"> <el-form-item label="关联地址" prop="addressId">
<el-select v-model="form.addressId" placeholder="请选择地址" clearable filterable style="width: 100%"> <el-select
v-model="form.addressId"
placeholder="请选择地址"
clearable
filterable
style="width: 100%"
:disabled="!form.uid || addressLoading"
:loading="addressLoading"
>
<el-option <el-option
v-for="item in addressList" v-for="item in addressList"
:key="item.id" :key="item.id"
:label="item.address" :label="item.addressName"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
<div v-if="!form.uid" style="color: #909399; font-size: 12px; margin-top: 4px;">
请先选择用户
</div>
<div v-else-if="addressList.length === 0 && !addressLoading" style="color: #F56C6C; font-size: 12px; margin-top: 4px;">
该用户暂无地址信息
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
</template> </template>
@ -493,14 +514,12 @@
<template v-if="form.jsonStatus === 1"> <template v-if="form.jsonStatus === 1">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="师傅" prop="orderLog.workerId"> <el-form-item label="师傅" prop="orderLog.workerId">
<el-select v-model="form.orderLog.workerId" placeholder="请选择师傅" clearable filterable style="width: 100%"> <user-select
<el-option v-model="form.orderLog.workerId"
v-for="item in userGongRenList" placeholder="请选择师傅"
:key="item.id" user-type="2"
:label="item.name" dialog-title="选择师傅"
:value="item.id" />
/>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -799,14 +818,13 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="师傅" prop="orderLog.workerId"> <el-form-item label="师傅" prop="orderLog.workerId">
<el-select v-model="form.orderLog.workerId" placeholder="请选择师傅" clearable filterable style="width: 100%" @change="handleCancelData"> <user-select
<el-option v-model="form.orderLog.workerId"
v-for="item in userGongRenList" placeholder="请选择师傅"
:key="item.id" user-type="2"
:label="item.name" dialog-title="选择师傅"
:value="item.id" @change="handleCancelDataWithWorker"
/> />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -1006,8 +1024,20 @@
<script> <script>
import { listOrder, getOrder, delOrder, addOrder, updateOrder,getUserDataList,getGoodsDataList,selectQuoteCraftList,generateCode,selectQuoteMaterialList,selectBaseProjectList} from "@/api/system/Order" import {
import { getuserAddressList } from "@/api/system/UserAddress" listOrder,
getOrder,
delOrder,
addOrder,
updateOrder,
getGoodsDataList,
selectQuoteCraftList,
generateCode,
selectQuoteMaterialList,
selectBaseProjectList,
getuserAddressList,
getUserAddressList
} from "@/api/system/Order"
import CallRecord from './components/CallRecord' import CallRecord from './components/CallRecord'
import AudioRecord from './components/AudioRecord' import AudioRecord from './components/AudioRecord'
import ReceiveRecord from './components/ReceiveRecord' import ReceiveRecord from './components/ReceiveRecord'
@ -1047,15 +1077,14 @@ export default {
baseProjectList: [], baseProjectList: [],
userDataList: [],
userGongRenList: [],
// //
OrderList: [], OrderList: [],
goodsDataList : [], goodsDataList : [],
// //
addressList: [], addressList: [],
//
addressLoading: false,
// //
title: "", title: "",
// //
@ -1296,12 +1325,12 @@ export default {
}, },
created() { created() {
this.getList() this.getList()
this.getUserDataList()
this.getuserGongRenList()
this.getGoodsDataListList(); this.getGoodsDataListList();
this.getAddressList(); // getAddressList
this.getQuoteCraftList() this.getQuoteCraftList()
this.getQuoteMaterialList() this.getQuoteMaterialList()
//
}, },
methods: { methods: {
/** 查询服务订单列表 */ /** 查询服务订单列表 */
@ -1371,6 +1400,9 @@ export default {
cancelReason: null, // cancelReason: null, //
timeoutDuration: null, // timeoutDuration: null, //
} }
//
this.addressList = []
this.addressLoading = false
this.resetForm("form") this.resetForm("form")
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -1501,6 +1533,11 @@ export default {
getOrder(id).then(response => { getOrder(id).then(response => {
this.form = response.data this.form = response.data
// ID
if (this.form.uid) {
this.getAddressList(this.form.uid)
}
// //
if (this.form.makeTime && typeof this.form.makeTime === 'number') { if (this.form.makeTime && typeof this.form.makeTime === 'number') {
this.form.makeTime = this.timestampToDate(this.form.makeTime) this.form.makeTime = this.timestampToDate(this.form.makeTime)
@ -1711,30 +1748,65 @@ export default {
} }
}, },
getUserDataList () {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
getuserGongRenList () {
getUserDataList("2").then(response => {
this.userGongRenList = response.data
})
},
getGoodsDataListList () { getGoodsDataListList () {
getGoodsDataList().then(response => { getGoodsDataList(1).then(response => {
this.goodsDataList = response.data this.goodsDataList = response.data
}) })
}, },
// //
getAddressList() { getAddressList(userId) {
getuserAddressList().then(response => { if (!userId) {
this.addressList = response.rows || [] this.addressList = []
return
}
this.addressLoading = true
// 使API
getUserAddressList(userId).then(response => {
this.addressList = response.rows || response.data || []
this.addressLoading = false
//
if (this.form.addressId && !this.addressList.find(item => item.id === this.form.addressId)) {
this.form.addressId = null
}
}).catch(error => {
console.error('获取用户地址列表失败:', error)
this.addressList = []
this.addressLoading = false
this.$modal.msgError('获取用户地址列表失败')
}) })
}, },
// (UserSelectchange)
handleUserSelectChange(user) {
//
this.form.addressId = null
if (user && user.id) {
//
this.getAddressList(user.id)
} else {
//
this.addressList = []
}
},
//
handleCancelDataWithWorker(user) {
if (user && user.id) {
this.form.orderLog.workerId = user.id
} else {
this.form.orderLog.workerId = null
}
this.handleCancelData()
},
/** 显示记录详情 */ /** 显示记录详情 */
showRecordDetails(row, type) { showRecordDetails(row, type) {
this.currentOrder = row this.currentOrder = row

View File

@ -26,11 +26,12 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input <user-select
v-model="queryParams.uid" v-model="queryParams.uid"
placeholder="请输入用户" placeholder="请选择用户"
clearable user-type="1"
@keyup.enter.native="handleQuery" dialog-title="选择用户"
style="width: 200px;"
/> />
</el-form-item> </el-form-item>
<el-form-item label="评分" prop="num"> <el-form-item label="评分" prop="num">
@ -181,7 +182,12 @@
<el-input v-model="form.productId" placeholder="请输入商品ID" /> <el-input v-model="form.productId" placeholder="请输入商品ID" />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="图片" prop="images"> <el-form-item label="图片" prop="images">
<el-input v-model="form.images" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.images" type="textarea" placeholder="请输入内容" />

View File

@ -2,14 +2,13 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" filterable placeholder="请选择用户" clearable> <user-select
<el-option v-model="queryParams.uid"
v-for="user in userDataList" placeholder="请选择用户"
:key="user.id" user-type="1"
:label="user.name" dialog-title="选择用户"
:value="user.id" style="width: 200px;"
></el-option> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="电话" prop="phone"> <el-form-item label="电话" prop="phone">
<el-input <el-input
@ -76,7 +75,12 @@
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="订单ID" prop="oid"> <el-form-item label="订单ID" prop="oid">
<el-input v-model="form.oid" placeholder="请输入订单ID" /> <el-input v-model="form.oid" placeholder="请输入订单ID" />
@ -116,7 +120,7 @@
</template> </template>
<script> <script>
import { listOrderRework, getOrderRework, delOrderRework, addOrderRework, updateOrderRework ,getUserDataList} from "@/api/system/OrderRework" import { listOrderRework, getOrderRework, delOrderRework, addOrderRework, updateOrderRework } from "@/api/system/OrderRework"
export default { export default {
name: "OrderRework", name: "OrderRework",
@ -135,7 +139,7 @@ export default {
showSearch: true, showSearch: true,
// //
total: 0, total: 0,
userDataList: [],
// OrderRework // OrderRework
OrderReworkList: [], OrderReworkList: [],
// //
@ -179,7 +183,6 @@ export default {
}, },
created() { created() {
this.getList() this.getList()
this.getUserDataList();
}, },
methods: { methods: {
/** 查询OrderRework列表 */ /** 查询OrderRework列表 */
@ -227,11 +230,7 @@ export default {
this.single = selection.length!==1 this.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
getUserDataList () {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset() this.reset()

View File

@ -11,14 +11,13 @@
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" filterable placeholder="请选择用户" clearable> <user-select
<el-option v-model="queryParams.uid"
v-for="user in userDataList" placeholder="请选择用户"
:key="user.id" user-type="1"
:label="user.name" dialog-title="选择用户"
:value="user.id" style="width: 200px;"
></el-option> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -83,7 +82,12 @@
<el-input v-model="form.orderId" placeholder="请输入订单号" /> <el-input v-model="form.orderId" placeholder="请输入订单号" />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户" /> <user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="金额" prop="price"> <el-form-item label="金额" prop="price">
<el-input v-model="form.price" placeholder="请输入金额" /> <el-input v-model="form.price" placeholder="请输入金额" />
@ -125,7 +129,7 @@
</template> </template>
<script> <script>
import { listPayMoneyLog, getPayMoneyLog, delPayMoneyLog, addPayMoneyLog, updatePayMoneyLog,getUserDataList } from "@/api/system/PayMoneyLog" import { listPayMoneyLog, getPayMoneyLog, delPayMoneyLog, addPayMoneyLog, updatePayMoneyLog } from "@/api/system/PayMoneyLog"
export default { export default {
name: "PayMoneyLog", name: "PayMoneyLog",
@ -144,7 +148,7 @@ export default {
// //
total: 0, total: 0,
userDataList: [],
// //
PayMoneyLogList: [], PayMoneyLogList: [],
// //
@ -189,7 +193,6 @@ export default {
}, },
created() { created() {
this.getList() this.getList()
this.getUserDataList()
}, },
methods: { methods: {
/** 查询支付记录列表 */ /** 查询支付记录列表 */
@ -238,11 +241,7 @@ export default {
this.multiple = !selection.length this.multiple = !selection.length
}, },
getUserDataList () {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset() this.reset()

View File

@ -302,7 +302,7 @@ export default {
}) })
}, },
getTypeList() { getTypeList() {
getGoodsDataList().then(response => { getGoodsDataList(1).then(response => {
this.typeDataList = response.data; this.typeDataList = response.data;
}) })
}, },

View File

@ -2,9 +2,13 @@
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="收货人" prop="name"> <el-form-item label="收货人" prop="name">
<el-input <el-input
@ -141,9 +145,12 @@
<el-input v-model="form.id" placeholder="自动生成" :disabled="true" /> <el-input v-model="form.id" placeholder="自动生成" :disabled="true" />
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="form.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="form.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="收货人" prop="name"> <el-form-item label="收货人" prop="name">
<el-input v-model="form.name" placeholder="请输入收货人" /> <el-input v-model="form.name" placeholder="请输入收货人" />
@ -191,7 +198,7 @@
</template> </template>
<script> <script>
import { listUserAddress, getUserAddress, delUserAddress, addUserAddress, updateUserAddress,getUserDataList } from "@/api/system/UserAddress" import { listUserAddress, getUserAddress, delUserAddress, addUserAddress, updateUserAddress } from "@/api/system/UserAddress"
export default { export default {
name: "UserAddress", name: "UserAddress",
@ -209,7 +216,7 @@ export default {
// //
showSearch: true, showSearch: true,
// //
userDataList: [],
total: 0, total: 0,
// //
UserAddressList: [], UserAddressList: [],
@ -258,7 +265,6 @@ export default {
}, },
created() { created() {
this.getList() this.getList()
this.getuserDataList()
}, },
methods: { methods: {
/** 查询用户收货地址列表 */ /** 查询用户收货地址列表 */
@ -318,11 +324,7 @@ export default {
this.single = selection.length!==1 this.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
getuserDataList(){
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset() this.reset()

View File

@ -2,9 +2,12 @@
<el-dialog :title="title" :visible.sync="visible" width="50%" append-to-body> <el-dialog :title="title" :visible.sync="visible" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="form.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="form.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="name"> <el-form-item label="姓名" prop="name">
<el-input v-model="form.name" placeholder="请输入姓名" /> <el-input v-model="form.name" placeholder="请输入姓名" />
@ -77,7 +80,7 @@
</template> </template>
<script> <script>
import { getUserDataList } from "@/api/system/WorkerApply"
export default { export default {
name: "WorkerApplyEdit", name: "WorkerApplyEdit",
@ -140,7 +143,7 @@ export default {
{ required: true, message: "接单地区不能为空", trigger: "change" } { required: true, message: "接单地区不能为空", trigger: "change" }
] ]
}, },
userDataList: [],
areaOptions: [ areaOptions: [
{ id: 1, name: '未央区' }, { id: 1, name: '未央区' },
{ id: 2, name: '莲湖区' }, { id: 2, name: '莲湖区' },
@ -168,19 +171,10 @@ export default {
} }
}, },
immediate: true immediate: true
},
visible(val) {
if (val) {
this.getUserList()
}
} }
}, },
methods: { methods: {
getUserList() {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
// //
handleAreaChange(value) { handleAreaChange(value) {
if (value && value.length > 0) { if (value && value.length > 0) {

View File

@ -3,9 +3,13 @@
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="name"> <el-form-item label="姓名" prop="name">
<el-input <el-input
@ -154,7 +158,7 @@
</template> </template>
<script> <script>
import { listWorkerApply, getWorkerApply, delWorkerApply, addWorkerApply, updateWorkerApply, getUserDataList } from "@/api/system/WorkerApply" import { listWorkerApply, getWorkerApply, delWorkerApply, addWorkerApply, updateWorkerApply } from "@/api/system/WorkerApply"
import WorkerApplyEdit from './WorkerApplyEdit.vue' import WorkerApplyEdit from './WorkerApplyEdit.vue'
export default { export default {
@ -175,8 +179,7 @@ export default {
showSearch: true, showSearch: true,
// //
total: 0, total: 0,
//
userDataList: [],
// //
WorkerApplyList: [], WorkerApplyList: [],
// //

View File

@ -1,10 +1,14 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="师傅" prop="uid">
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable> <user-select
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" /> v-model="queryParams.uid"
</el-select> placeholder="请选择师傅"
user-type="2"
dialog-title="选择师傅"
style="width: 200px;"
/>
</el-form-item> </el-form-item>
<el-form-item label="签到日期" prop="time"> <el-form-item label="签到日期" prop="time">
<el-date-picker clearable <el-date-picker clearable
@ -90,7 +94,7 @@
</template> </template>
<script> <script>
import { listWorkerSign, getWorkerSign, delWorkerSign, addWorkerSign, updateWorkerSign,getUserDataList } from "@/api/system/WorkerSign" import { listWorkerSign, getWorkerSign, delWorkerSign, addWorkerSign, updateWorkerSign } from "@/api/system/WorkerSign"
export default { export default {
name: "WorkerSign", name: "WorkerSign",
@ -109,7 +113,7 @@ export default {
// //
total: 0, total: 0,
userDataList: [],
// //
WorkerSignList: [], WorkerSignList: [],
// //
@ -140,7 +144,6 @@ export default {
}, },
created() { created() {
this.getList() this.getList()
this.getuserDataList();
}, },
methods: { methods: {
/** 查询师傅签到记录列表 */ /** 查询师傅签到记录列表 */
@ -184,11 +187,7 @@ export default {
this.single = selection.length!==1 this.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
getuserDataList(){
getUserDataList("2").then(response => {
this.userDataList = response.data
})
},
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset() this.reset()

View File

@ -3,14 +3,13 @@
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid"> <el-form-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" filterable placeholder="请选择用户" clearable> <user-select
<el-option v-model="queryParams.uid"
v-for="user in userDataList" placeholder="请选择用户"
:key="user.id" user-type="1"
:label="user.name" dialog-title="选择用户"
:value="user.id" style="width: 200px;"
></el-option> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="金额" prop="priceRange"> <el-form-item label="金额" prop="priceRange">
@ -217,7 +216,7 @@
</template> </template>
<script> <script>
import { listTransfer, getTransfer, delTransfer, addTransfer, updateTransfer,getUserDataList} from "@/api/system/transfer" import { listTransfer, getTransfer, delTransfer, addTransfer, updateTransfer} from "@/api/system/transfer"
export default { export default {
name: "Transfer", name: "Transfer",
dicts: ['money_status'], dicts: ['money_status'],
@ -236,7 +235,7 @@ export default {
// //
total: 0, total: 0,
userDataList: [],
// wechat_transfer // wechat_transfer
transferList: [], transferList: [],
// //
@ -284,7 +283,6 @@ export default {
}, },
created() { created() {
this.getList() this.getList()
this.getUserDataList()
}, },
methods: { methods: {
/** 查询wechat_transfer列表 */ /** 查询wechat_transfer列表 */
@ -358,11 +356,7 @@ export default {
}) })
}, },
getUserDataList () {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {

160
替换完成总结.md Normal file
View File

@ -0,0 +1,160 @@
# 用户选择组件替换完成总结
## 已完成替换的页面列表
### 1. GoodsOrder - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户选择下拉框
- 移除userDataList数据属性
- 移除fetchUserDataList方法
- 移除getUserDataList导入
- 添加handleUserSelectChange方法
### 2. IntegralOrder - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户选择下拉框
- 移除userDataList数据属性
- 移除getuserDataList方法
- 移除getUserDataList导入
### 3. WorkerSign - ✅ 已完成
- 替换查询表单中的师傅选择下拉框user-type="2"
- 移除userDataList数据属性
- 移除getuserDataList方法
- 移除getUserDataList导入
### 4. UserAddress - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户选择下拉框
- 移除userDataList数据属性
- 移除getuserDataList方法
- 移除getUserDataList导入
### 5. transfer - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 移除userDataList数据属性
- 移除getUserDataList方法
- 移除getUserDataList导入
### 6. PayMoneyLog - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户输入框为用户选择组件
- 移除userDataList数据属性
- 移除getUserDataList方法
- 移除getUserDataList导入
### 7. OrderRework - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户输入框为用户选择组件
- 移除userDataList数据属性
- 移除getUserDataList方法
- 移除getUserDataList导入
### 8. OrderComment - ✅ 已完成
- 替换查询表单中的用户输入框为用户选择组件
- 替换添加/修改表单中的用户输入框为用户选择组件
### 9. IntegralLog - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户输入框为用户选择组件
- 移除userDataList数据属性
- 移除getUserDataList导入
### 10. GoodsCart - ✅ 已完成
- 替换查询表单中的用户输入框为用户选择组件
- 替换添加/修改表单中的用户输入框为用户选择组件
### 11. CouponUser - ✅ 已完成
- 替换查询表单中的用户输入框为用户选择组件
- 替换添加/修改表单中的用户输入框为用户选择组件
### 12. Cooperate - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 替换添加/修改表单中的用户选择下拉框
- 移除getUserDataList导入
### 13. WorkerApply - ✅ 已完成
- 替换查询表单中的用户选择下拉框
- 移除userDataList数据属性
- 移除getUserDataList导入
### 14. WorkerApplyEdit - ✅ 已完成
- 替换表单中的用户选择下拉框
- 移除userDataList数据属性
- 移除getUserList方法
- 移除getUserDataList导入
## 替换统计
- **总计页面数:** 14个页面
- **完成替换:** 14个页面 ✅
- **完成率:** 100%
## 替换内容说明
### 组件特性
- **组件名称:** `user-select`
- **支持类型:**
- `user-type="1"` - 普通用户
- `user-type="2"` - 师傅用户
- **功能特性:**
- 弹窗式分页选择
- 支持搜索(姓名、电话、状态)
- 直接点击选择
- 响应式设计
- 清空选择功能
### 替换模式
#### 1. 查询表单替换模式
```vue
<!-- 原来 -->
<el-select v-model="queryParams.uid" placeholder="请选择用户" clearable filterable>
<el-option v-for="item in userDataList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<!-- 替换后 -->
<user-select
v-model="queryParams.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
```
#### 2. 表单输入框替换模式
```vue
<!-- 原来 -->
<el-input v-model="form.uid" placeholder="请输入用户" />
<!-- 替换后 -->
<user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
```
#### 3. JavaScript清理
- 移除 `userDataList` 数据属性
- 移除 `getUserDataList`、`getuserDataList`、`fetchUserDataList` 等方法
- 移除相关API导入
- 添加用户选择变化处理方法(如需要)
## 性能优化效果
通过这次替换,实现了以下优化:
1. **按需加载:** 用户数据仅在需要时加载,不在页面初始化时全量加载
2. **分页显示:** 大量用户数据分页显示避免DOM性能问题
3. **搜索功能:** 支持服务端搜索,快速定位目标用户
4. **统一体验:** 所有页面使用统一的用户选择体验
5. **代码复用:** 减少重复代码,便于维护
## 注意事项
1. 所有页面已成功注册UserSelect组件在main.js中全局注册
2. 组件支持clearable、disabled等常用属性
3. 师傅选择使用user-type="2"普通用户使用user-type="1"
4. 组件内部处理了用户选择的所有逻辑包括API调用和分页