mrr.sj.front/pages/shop/staff/selectSyr.vue

336 lines
7.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<custom-navbar title="选择员工" :leftImg="'/static/images/whiteBack.png'" :showUser="true"
backgroundColor="linear-gradient( 134deg, #F52540 0%, #FF4767 100%)"
titleColor="#fff" borderBottom="none"></custom-navbar>
<searchBox placeholder="输入员工名/手机号" v-model="queryData.str_val" :showAdd="false" @confirm="search"
@search="search">
</searchBox>
<!-- Tab 内容区域 -->
<div class="tab-nav">
<div v-for="tab in tabs" :key="tab.id" class="tab-item" :class="{ active: queryData.state === tab.id }"
@click="switchTab(tab.id)">
{{ tab.name }}
</div>
</div>
<CommonList ref="groupRef" apiUrl="/sj/sryservers" @load-success="loadSuccess"
:listScrollHeight="`calc(100vh - ${statusBarHeight + 302}rpx)`">
<template #listData="{ list }">
<view class="syr-list">
<view class="syr-item flex-row-center" v-for="(item, index) in syrList" :key="index" @click="goDetail(item)">
<view @click.stop="changeType(item)">
<image src="/static/images/shop/pintuan/radioYes.png" mode="aspectFill"
class="syr-card-left__img" v-if="item.isSelect"></image>
<view class="syr-card-left" v-else>
</view>
</view>
<view class="syr-item-right flex-row-start">
<image :src="item.head_photo" class="item-right-photo"></image>
<view class="item-right-texts">
<view class="item-right-text1">{{ item.name }}</view>
<view class="item-right-text2">绑定时间:{{ item.bind_time }}</view>
</view>
</view>
</view>
</view>
</template>
<!-- 空数据状态 -->
<template #empty>
<noData></noData>
</template>
</CommonList>
<view class="container-footer">
<view class="container-footer-tip">{{ queryData.state==2?"批量选择员工后,进行批量分配操作":"批量选择员工后,进行批量取消操作" }}</view>
<view class="container-button flex-row-center-center" @click="makesyr">
{{ queryData.state==2?"批量分配":"批量取消" }}
</view>
</view>
</view>
</template>
<script>
import request from "@/utils/request";
import searchBox from "./components/search-box.vue";
import CommonList from "@/components/common/CommonList.vue";
export default {
components: {
searchBox,
CommonList,
},
data() {
return {
syrList: [],
isSubmit: false,
queryData: {
state: 2,
str_val: "",
},
userInfo: {},
statusBarHeight: 0,
tabs: [{
id: 2,
name: "未分配",
},
{
id: 1,
name: "已分配",
},
],
};
},
async onLoad(options) {
if (options.server_id) {
this.queryData.server_id = Number(options.server_id);
}
let type = 3;
let result = await request.post("/user/getuser", {
type,
});
this.userInfo = result.data;
this.queryData.sjid = this.userInfo.id;
this.statusBarHeight = this.getRpxStatusBarHeight();
this.$nextTick(() => {
this.search();
});
},
// 核心新增计算属性实时筛选选中的id
computed: {
selectedIds() {
// 筛选出isSelect为true的项提取id组成数组
return this.syrList.filter(item => item.isSelect).map(item => item.syr_id);
}
},
methods: {
goDetail(item) {
uni.navigateTo({
url: `/pages/shop/staff/staffDetail?syrid=${item.syr_id}`,
});
},
loadSuccess(res) {
this.syrList = res.list
},
search() {
this.$refs.groupRef.manualRefresh(this.queryData);
},
// 切换 Tab 的方法
switchTab(tabId) {
this.queryData.state = tabId;
this.$nextTick(() => {
this.search();
});
},
changeType(item) {
// 先获取当前isSelect值初始为undefined取反为true
const newIsSelect = !item.isSelect;
// 用$set添加/修改响应式属性
this.$set(item, 'isSelect', newIsSelect);
// item.name = item.isSelect
},
makesyr() {
if (this.isSubmit) {
return
}
if (this.selectedIds.length == 0) {
uni.showToast({
title: "请选择手艺人",
icon: 'none',
duration: 2000
});
}
this.isSubmit = true
request
.post("/sj/makesyr", {
sjid: this.userInfo.id,
server_id: this.queryData.server_id,
syr_arr: this.selectedIds,
type: this.queryData.state == 2 ? 1 : 2
})
.then((res) => {
if (res.code == 200) {
uni.showToast({
title: this.queryData.state == 2 ? "分配成功" : "取消成功",
icon: 'none',
duration: 2000
});
this.$nextTick(() => {
this.search();
});
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
}
}).catch(err => {
uni.showToast({
title: '网络异常,请稍后重试',
icon: 'none',
duration: 2000
});
}).finally(() => {
this.isSubmit = false
});
}
},
};
</script>
<style lang="less">
page {
background: linear-gradient(to top, #fff, #F5F5F5);
}
.container {
.tab-nav {
display: flex;
justify-content: space-between;
padding: 0 91rpx;
background: #fff;
.tab-item {
padding: 30rpx 0rpx 30rpx 0rpx;
cursor: pointer;
font-weight: 500;
font-size: 32rpx;
color: #333333;
line-height: 45rpx;
text-align: left;
font-style: normal;
/* 预先设置透明边框防止切换时布局跳动 */
&.active {
color: #FF4767;
font-weight: 500;
position: relative;
&:after {
content: "";
position: absolute;
bottom: 17rpx; // 定位在底部边框的下方
left: 50%;
transform: translateX(-50%); // 水平居中
/* 激活时显示红色边框 */
width: 34rpx;
height: 6rpx;
background: linear-gradient(306deg, #FF4767 0%, #fc563b 100%);
border-radius: 3rpx;
}
}
}
}
.syr-list {
.syr-item {
margin: 20rpx;
padding: 20rpx 30rpx;
background: #FFFFFF;
border-radius: 20rpx;
.syr-card-left {
width: 32rpx;
height: 32rpx;
border: 4rpx solid #CDCFD2;
border-radius: 40rpx;
margin-right: 30rpx;
}
.syr-card-left__img {
width: 40rpx;
height: 40rpx;
margin-right: 30rpx;
}
.syr-item-right {
.item-right-photo {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.item-right-texts {
flex: 1;
.item-right-text1 {
margin-top: 8rpx;
font-weight: 500;
font-size: 28rpx;
color: #333333;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
.item-right-text2 {
margin-top: 8rpx;
font-weight: 400;
font-size: 26rpx;
color: #999999;
line-height: 37rpx;
text-align: left;
font-style: normal;
}
}
}
}
}
}
.container-footer {
position: fixed;
bottom: 20rpx;
left: 0rpx;
right: 0;
.container-footer-tip {
font-weight: 400;
font-size: 28rpx;
color: #666666;
line-height: 40rpx;
text-align: center;
font-style: normal;
margin-bottom: 20rpx;
}
.container-button {
margin: 0 20rpx;
width: 710rpx;
height: 98rpx;
background: #FF4767;
border-radius: 49rpx;
font-weight: 400;
font-size: 38rpx;
color: #ffffff;
text-align: left;
font-style: normal;
}
}
.common-list {
border-radius: 30rpx 30rpx 0rpx 0rpx !important;
background: #f5f5f5 !important;
padding-bottom: 0 !important;
}
::v-deep .list-container {
padding: 0 !important;
}
::v-deep .load-tips {
padding-bottom: 200rpx !important;
}
::v-deep .list-scroll {
margin-top: 0 !important;
}
</style>