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 javax.servlet.http.HttpServletResponse;
import com.ruoyi.system.domain.Order;
import com.ruoyi.system.domain.ServiceGoods;
import com.ruoyi.system.domain.Users;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.service.IServiceGoodsService;
import com.ruoyi.system.service.IUserAddressService;
import com.ruoyi.system.service.IUsersService;
import org.springframework.security.access.prepost.PreAuthorize;
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.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.GoodsOrder;
import com.ruoyi.system.service.IGoodsOrderService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
@ -42,7 +40,9 @@ public class GoodsOrderController extends BaseController
@Autowired
private IServiceGoodsService serviceGoodsService;
@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')")
@Log(title = "商品订单", businessType = BusinessType.INSERT)
@PostMapping
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));
}
}
/**
* 修改商品订单

View File

@ -120,10 +120,12 @@ public class QuoteTypeController extends BaseController
* 获取项目报价--工艺分类详细信息
*/
@PreAuthorize("@ss.hasPermi('system:QuoteType:query')")
@GetMapping(value = "/goodsDataList")
public AjaxResult goodsDataList()
@GetMapping(value = "/goodsDataList/{type}")
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')")
@GetMapping(value = "/getuserAddressList")
public AjaxResult getuserAddressList()
@GetMapping(value = "/getuserAddressList/{id}")
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({
url: '/system/QuoteType/goodsDataList',
url: '/system/QuoteType/goodsDataList/'+type,
method: 'get'
})
}

View File

@ -16,12 +16,33 @@ export function getGoodsOrder(id) {
method: 'get'
})
}
export function getGoodsDataList() {
export function getGoodsDataList(type) {
return request({
url: '/system/QuoteType/goodsDataList',
url: '/system/QuoteType/goodsDataList/'+type,
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() {
return request({

View File

@ -50,12 +50,29 @@ export function getReceiveRecords(orderId) {
method: 'get'
})
}
export function getGoodsDataList() {
export function getGoodsDataList(type) {
return request({
url: '/system/QuoteType/goodsDataList',
url: '/system/QuoteType/goodsDataList/'+type,
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) {
return request({

View File

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

View File

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

View File

@ -19,6 +19,8 @@ $--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec;
$--border-color-base:#c1c1c1;
/* icon font path, required */
$--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 BeautyWrapper from '@/components/BeautyWrapper'
// 用户选择组件
import UserSelect from '@/components/UserSelect'
import sku from '@/components/Sku/sku'
@ -62,6 +64,7 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview)
Vue.component('BeautyWrapper', BeautyWrapper)
Vue.component('UserSelect', UserSelect)
Vue.component('Sku', sku)
Vue.use(directive)

View File

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

View File

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

View File

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

View File

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

View File

@ -26,9 +26,13 @@
/>
</el-form-item>
<el-form-item label="用户" prop="uid">
<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;"
/>
</el-form-item>
<el-form-item label="商品" prop="productId">
<el-select v-model="queryParams.productId" placeholder="请选择商品" clearable filterable>
@ -215,12 +219,31 @@
</el-col>
<el-col :span="24">
<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-col>
<el-col :span="24">
<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-col>
<el-col :span="24">
@ -230,17 +253,38 @@
</el-col>
<el-col :span="24">
<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-col>
<el-col :span="24">
<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-col>
<el-col :span="24">
<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-col>
<el-col :span="24">
@ -315,25 +359,44 @@
</el-col>
</template>
<el-col :span="24">
<el-form-item label="关联地址" prop="addressId">
<el-input v-model="form.addressId" placeholder="请输入关联地址" />
</el-form-item>
<div class="address-section">
<h4 style="margin: 0 0 15px 0; color: #409EFF; font-size: 16px;">📍 关联地址</h4>
<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 :span="24">
<el-form-item label="备注" prop="mark">
<el-input v-model="form.mark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</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>
<div class="dialog-footer" style="text-align:left;margin-top:20px;">
<el-button @click="reset">重置</el-button>
@ -346,7 +409,7 @@
</template>
<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 {
name: "GoodsOrder",
@ -368,7 +431,12 @@ export default {
//
GoodsOrderList: [],
userDataList: [],
userAddressList: [],
//
addressLoading: false,
//
goodsDataList : [],
@ -418,8 +486,13 @@ export default {
payenddate: null
//------------------
},
//
form: {},
//
form: {
type: 2,
totalPrice: 0,
payPrice: 0,
deduction: 0,
},
//
rules: {
type: [
@ -501,7 +574,6 @@ export default {
},
created() {
this.getList();
this.fetchUserDataList();
this.fetchGoodsDataList();
this.getdeliveryList();
@ -525,7 +597,7 @@ export default {
reset() {
this.form = {
id: null,
type: null,
type: 2,
mainOrderId: null,
orderId: null,
transactionId: null,
@ -534,13 +606,13 @@ export default {
name: null,
phone: null,
address: null,
num: null,
totalPrice: null,
goodPrice: null,
servicePrice: null,
payPrice: null,
deduction: null,
postage: null,
num: 1,
totalPrice: 0,
goodPrice: 0,
servicePrice: 0,
payPrice: 0,
deduction: 0,
postage: 0,
payTime: null,
status: null,
deliveryId: null,
@ -553,6 +625,9 @@ export default {
updatedAt: null,
deletedAt: null
}
//
this.userAddressList = []
this.addressLoading = false
this.resetForm("form")
},
/** 搜索按钮操作 */
@ -592,8 +667,15 @@ export default {
this.single = selection.length!==1
this.multiple = !selection.length
},
//
generateCode(){
generateCode().then(response => {
this.form.orderId=response.msg;
})
},
/** 新增按钮操作 */
handleAdd() {
this.generateCode()
this.reset()
this.open = true
this.title = "添加商品订单"
@ -604,6 +686,12 @@ export default {
const id = row.id || this.ids
getGoodsOrder(id).then(response => {
this.form = response.data
// ID
if (this.form.uid) {
this.getUserAddressList(this.form.uid)
}
this.open = true
this.title = "修改商品订单"
})
@ -646,14 +734,22 @@ export default {
}, `GoodsOrder_${new Date().getTime()}.xlsx`)
},
fetchUserDataList() {
getUserDataList("1").then(response => {
this.userDataList = response.data;
});
// handleUserSelectChangehandleUserChange
handleUserSelectChange(userId) {
//
this.form.addressId = null
if (userId) {
//
this.getUserAddressList(userId)
} else {
//
this.userAddressList = []
}
},
fetchGoodsDataList() {
getGoodsDataList().then(response => {
getGoodsDataList(2).then(response => {
this.goodsDataList = response.data;
});
},
@ -663,6 +759,34 @@ export default {
getSiteDeliveryList().then(response => {
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: {
@ -688,11 +812,72 @@ export default {
/* 表单输入框字体变大,颜色分明 */
.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;
color: #222 !important;
background: #f8f8f8 !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 {
@ -701,10 +886,7 @@ export default {
font-weight: bold;
}
.el-select-dropdown__item {
font-size: 16px !important;
color: #222 !important;
}
/* 移除重复的样式定义,已在上面定义过 */
.el-table th, .el-table td {
font-size: 16px !important;
@ -738,4 +920,43 @@ export default {
border-color: #389e0d !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>

View File

@ -19,9 +19,13 @@
/>
</el-form-item>
<el-form-item label="用户" prop="uid">
<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;"
/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类型" clearable>
@ -135,7 +139,12 @@
<el-input v-model="form.mark" placeholder="请输入描述" />
</el-form-item>
<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 label="积分值" prop="num">
<el-input v-model="form.num" placeholder="请输入积分值" />
@ -166,7 +175,7 @@
</template>
<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"
export default {
@ -186,7 +195,7 @@ export default {
//
total: 0,
userDataList: [],
//
IntegralLogList: [],
//

View File

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

View File

@ -109,9 +109,13 @@
</el-form-item>
<el-form-item label="用户" prop="uid">
<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;"
/>
</el-form-item>
<el-form-item label="商品" prop="productId">
<el-select v-model="queryParams.productId" placeholder="请选择商品" clearable filterable>
@ -119,9 +123,13 @@
</el-select>
</el-form-item>
<el-form-item label="师傅" prop="workerId">
<el-select v-model="queryParams.workerId" placeholder="请选择师傅" clearable filterable>
<el-option v-for="item in userGongRenList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
<user-select
v-model="queryParams.workerId"
placeholder="请选择师傅"
user-type="2"
dialog-title="选择师傅"
style="width: 200px;"
/>
</el-form-item>
<el-form-item>
@ -345,26 +353,39 @@
<template v-if="form.createType === 1">
<el-col :span="24">
<el-form-item label="用户" prop="uid">
<el-select v-model="form.uid" placeholder="请选择用户" clearable filterable style="width: 100%">
<el-option
v-for="item in userDataList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<user-select
v-model="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
@change="handleUserSelectChange"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<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
v-for="item in addressList"
:key="item.id"
:label="item.address"
:label="item.addressName"
:value="item.id"
/>
</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-col>
</template>
@ -493,14 +514,12 @@
<template v-if="form.jsonStatus === 1">
<el-col :span="24">
<el-form-item label="师傅" prop="orderLog.workerId">
<el-select v-model="form.orderLog.workerId" placeholder="请选择师傅" clearable filterable style="width: 100%">
<el-option
v-for="item in userGongRenList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<user-select
v-model="form.orderLog.workerId"
placeholder="请选择师傅"
user-type="2"
dialog-title="选择师傅"
/>
</el-form-item>
</el-col>
@ -799,14 +818,13 @@
</el-col>
<el-col :span="24">
<el-form-item label="师傅" prop="orderLog.workerId">
<el-select v-model="form.orderLog.workerId" placeholder="请选择师傅" clearable filterable style="width: 100%" @change="handleCancelData">
<el-option
v-for="item in userGongRenList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<user-select
v-model="form.orderLog.workerId"
placeholder="请选择师傅"
user-type="2"
dialog-title="选择师傅"
@change="handleCancelDataWithWorker"
/>
</el-form-item>
</el-col>
<el-col :span="24">
@ -1006,8 +1024,20 @@
<script>
import { listOrder, getOrder, delOrder, addOrder, updateOrder,getUserDataList,getGoodsDataList,selectQuoteCraftList,generateCode,selectQuoteMaterialList,selectBaseProjectList} from "@/api/system/Order"
import { getuserAddressList } from "@/api/system/UserAddress"
import {
listOrder,
getOrder,
delOrder,
addOrder,
updateOrder,
getGoodsDataList,
selectQuoteCraftList,
generateCode,
selectQuoteMaterialList,
selectBaseProjectList,
getuserAddressList,
getUserAddressList
} from "@/api/system/Order"
import CallRecord from './components/CallRecord'
import AudioRecord from './components/AudioRecord'
import ReceiveRecord from './components/ReceiveRecord'
@ -1047,15 +1077,14 @@ export default {
baseProjectList: [],
userDataList: [],
userGongRenList: [],
//
OrderList: [],
goodsDataList : [],
//
addressList: [],
//
addressLoading: false,
//
title: "",
//
@ -1296,12 +1325,12 @@ export default {
},
created() {
this.getList()
this.getUserDataList()
this.getuserGongRenList()
this.getGoodsDataListList();
this.getAddressList();
// getAddressList
this.getQuoteCraftList()
this.getQuoteMaterialList()
//
},
methods: {
/** 查询服务订单列表 */
@ -1371,6 +1400,9 @@ export default {
cancelReason: null, //
timeoutDuration: null, //
}
//
this.addressList = []
this.addressLoading = false
this.resetForm("form")
},
/** 搜索按钮操作 */
@ -1501,6 +1533,11 @@ export default {
getOrder(id).then(response => {
this.form = response.data
// ID
if (this.form.uid) {
this.getAddressList(this.form.uid)
}
//
if (this.form.makeTime && typeof this.form.makeTime === 'number') {
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 () {
getGoodsDataList().then(response => {
getGoodsDataList(1).then(response => {
this.goodsDataList = response.data
})
},
//
getAddressList() {
getuserAddressList().then(response => {
this.addressList = response.rows || []
getAddressList(userId) {
if (!userId) {
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) {
this.currentOrder = row

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,9 +2,12 @@
<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-item label="用户" prop="uid">
<el-select v-model="form.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="form.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
/>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" placeholder="请输入姓名" />
@ -77,7 +80,7 @@
</template>
<script>
import { getUserDataList } from "@/api/system/WorkerApply"
export default {
name: "WorkerApplyEdit",
@ -140,7 +143,7 @@ export default {
{ required: true, message: "接单地区不能为空", trigger: "change" }
]
},
userDataList: [],
areaOptions: [
{ id: 1, name: '未央区' },
{ id: 2, name: '莲湖区' },
@ -168,19 +171,10 @@ export default {
}
},
immediate: true
},
visible(val) {
if (val) {
this.getUserList()
}
}
},
methods: {
getUserList() {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
//
handleAreaChange(value) {
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-item label="用户" prop="uid">
<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;"
/>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input
@ -154,7 +158,7 @@
</template>
<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'
export default {
@ -175,8 +179,7 @@ export default {
showSearch: true,
//
total: 0,
//
userDataList: [],
//
WorkerApplyList: [],
//

View File

@ -1,10 +1,14 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户" prop="uid">
<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>
<el-form-item label="师傅" prop="uid">
<user-select
v-model="queryParams.uid"
placeholder="请选择师傅"
user-type="2"
dialog-title="选择师傅"
style="width: 200px;"
/>
</el-form-item>
<el-form-item label="签到日期" prop="time">
<el-date-picker clearable
@ -90,7 +94,7 @@
</template>
<script>
import { listWorkerSign, getWorkerSign, delWorkerSign, addWorkerSign, updateWorkerSign,getUserDataList } from "@/api/system/WorkerSign"
import { listWorkerSign, getWorkerSign, delWorkerSign, addWorkerSign, updateWorkerSign } from "@/api/system/WorkerSign"
export default {
name: "WorkerSign",
@ -109,7 +113,7 @@ export default {
//
total: 0,
userDataList: [],
//
WorkerSignList: [],
//
@ -140,7 +144,6 @@ export default {
},
created() {
this.getList()
this.getuserDataList();
},
methods: {
/** 查询师傅签到记录列表 */
@ -184,11 +187,7 @@ export default {
this.single = selection.length!==1
this.multiple = !selection.length
},
getuserDataList(){
getUserDataList("2").then(response => {
this.userDataList = response.data
})
},
/** 新增按钮操作 */
handleAdd() {
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-item label="用户" prop="uid">
<el-select v-model="queryParams.uid" filterable placeholder="请选择用户" clearable>
<el-option
v-for="user in userDataList"
:key="user.id"
:label="user.name"
:value="user.id"
></el-option>
</el-select>
<user-select
v-model="queryParams.uid"
placeholder="请选择用户"
user-type="1"
dialog-title="选择用户"
style="width: 200px;"
/>
</el-form-item>
<el-form-item label="金额" prop="priceRange">
@ -217,7 +216,7 @@
</template>
<script>
import { listTransfer, getTransfer, delTransfer, addTransfer, updateTransfer,getUserDataList} from "@/api/system/transfer"
import { listTransfer, getTransfer, delTransfer, addTransfer, updateTransfer} from "@/api/system/transfer"
export default {
name: "Transfer",
dicts: ['money_status'],
@ -236,7 +235,7 @@ export default {
//
total: 0,
userDataList: [],
// wechat_transfer
transferList: [],
//
@ -284,7 +283,6 @@ export default {
},
created() {
this.getList()
this.getUserDataList()
},
methods: {
/** 查询wechat_transfer列表 */
@ -358,11 +356,7 @@ export default {
})
},
getUserDataList () {
getUserDataList("1").then(response => {
this.userDataList = response.data
})
},
/** 提交按钮 */
submitForm() {
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调用和分页