|
|
|
@ -1,29 +1,31 @@
|
|
|
|
<template>
|
|
|
|
<template>
|
|
|
|
<view class="page">
|
|
|
|
<view class="page">
|
|
|
|
|
|
|
|
|
|
|
|
<view class="oinfo">
|
|
|
|
<view class="oinfo">
|
|
|
|
|
|
|
|
|
|
|
|
<view class="yycon scell" v-if="item">
|
|
|
|
<view class="yycon scell" v-if="item">
|
|
|
|
<view class="oitem">
|
|
|
|
<view class="oitem">
|
|
|
|
|
|
|
|
|
|
|
|
<view class="otop">
|
|
|
|
<view class="otop">
|
|
|
|
<view class="hleft">
|
|
|
|
<view class="hleft">
|
|
|
|
{{item.courseName}}
|
|
|
|
{{item.courseName}}
|
|
|
|
|
|
|
|
<uni-rate :size="20" :readonly="true" :value="item.star" :max="item.star"/>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="hright">
|
|
|
|
<view class="hright">
|
|
|
|
{{item.startTime+'-'+item.endTime}}
|
|
|
|
{{formatTime(item.startTime)+'-'+formatTime(item.endTime)}}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
<view class="oscon">
|
|
|
|
<view class="oscon">
|
|
|
|
<view class="osimg imgload">
|
|
|
|
<view class="osimg imgload">
|
|
|
|
<image class="osimg" v-if="item.pic" :src="getimgRemoteFile(item.pic)" mode="aspectFill"></image>
|
|
|
|
<image class="osimg" v-if="item.pic" :src="getimgRemoteFile(item.pic)" mode="aspectFill"></image>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="osname">
|
|
|
|
<view class="osname">
|
|
|
|
<view class="oscell">
|
|
|
|
<view class="oscell">
|
|
|
|
|
|
|
|
{{item.courseTypeName}}
|
|
|
|
<view v-if="item.courseTypeName=='团课'" class="txtbg">{{item.courseTypeName}}</view>
|
|
|
|
<view v-if="item.courseTypeName=='团课'" class="txtbg">{{item.courseTypeName}}</view>
|
|
|
|
<view v-else-if="item.courseTypeName" class="txtbg1">{{item.courseTypeName}}</view>
|
|
|
|
<view v-else-if="item.courseTypeName" class="txtbg1">{{item.courseTypeName}}</view>
|
|
|
|
<uni-rate :size="20" :readonly="true" :value="item.star" :max="item.star"/>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="oscell" v-if="item.storeName">
|
|
|
|
<view class="oscell" v-if="item.storeName">
|
|
|
|
<uni-icons type="shop" size="18" color="#00A99A"></uni-icons>
|
|
|
|
<uni-icons type="shop" size="18" color="#00A99A"></uni-icons>
|
|
|
|
@ -49,24 +51,34 @@
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="oscell" v-if="item.lessCnt">
|
|
|
|
<view class="oscell" v-if="item.lessCnt">
|
|
|
|
<uni-icons type="staff" size="18" color="#00A99A"></uni-icons>
|
|
|
|
<uni-icons type="staff" size="18" color="#00A99A"></uni-icons>
|
|
|
|
<view class="ntxt" >预约人数{{item.lessCnt}}人</view>
|
|
|
|
<view class="ntxt" >满{{item.lessCnt}}人开课</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<view class="oscell" v-if="item.claTimeStatus">
|
|
|
|
|
|
|
|
<uni-icons type="wallet" size="18" color="#00A99A"></uni-icons>
|
|
|
|
|
|
|
|
<view class="ntxt" v-if="item.claTimeStatus=='1'"> 未上课 </view>
|
|
|
|
|
|
|
|
<view class="ntxt" v-else>已确认上课 </view>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="rcpm">
|
|
|
|
<view class="rcpm" >
|
|
|
|
<button type="primary" class="orderbtn" @click="gotoorder">确认上课</button>
|
|
|
|
<button type="primary" class="orderbtn" v-if="item.claTimeStatus=='1'" @click="gotoorder">确认上课</button>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 信息 -->
|
|
|
|
<!-- 信息 -->
|
|
|
|
<view class="yycon tcon">
|
|
|
|
<view class="yycon tcon">
|
|
|
|
<view class="stitle">学员名单</view>
|
|
|
|
<view class="stitle">学员名单</view>
|
|
|
|
|
|
|
|
<view class="batch-bar" v-if="checkableList.length > 0">
|
|
|
|
|
|
|
|
<view class="batch-tip">可签到 {{ checkableList.length }} 人</view>
|
|
|
|
|
|
|
|
<button class="batch-btn" @click="openBatch">批量签到</button>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
<view class="hcon">
|
|
|
|
<view class="hcon">
|
|
|
|
<view class="hcell">学员姓名</view>
|
|
|
|
<view class="hcell">学员姓名</view>
|
|
|
|
<view class="hcell">性别</view>
|
|
|
|
<view class="hcell">性别</view>
|
|
|
|
<view class="hcell">电话</view>
|
|
|
|
<view class="hcell">电话</view>
|
|
|
|
<view class="hcell">预约状态</view>
|
|
|
|
<view class="hcell">预约状态</view>
|
|
|
|
|
|
|
|
<view class="hcell">是否签到</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="stcell" v-if="studentlist.length>0">
|
|
|
|
<view class="stcell" v-if="studentlist.length>0">
|
|
|
|
<view v-for="(item, index) in studentlist" :key="index" class="oitem">
|
|
|
|
<view v-for="(item, index) in studentlist" :key="index" class="oitem">
|
|
|
|
@ -74,7 +86,7 @@
|
|
|
|
{{item.studentName}}
|
|
|
|
{{item.studentName}}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="ocell">
|
|
|
|
<view class="ocell">
|
|
|
|
{{item.sex=1?'女':(item.sex=2?'男':'未知')}}
|
|
|
|
{{item.sex==2?'男':(item.sex==1?'女':'未知')}}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="ocell">
|
|
|
|
<view class="ocell">
|
|
|
|
{{item.phone}}
|
|
|
|
{{item.phone}}
|
|
|
|
@ -82,16 +94,69 @@
|
|
|
|
<view class="ocell">
|
|
|
|
<view class="ocell">
|
|
|
|
{{ retstr(item.bookStatus)}}
|
|
|
|
{{ retstr(item.bookStatus)}}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<view class="ocell">
|
|
|
|
|
|
|
|
{{ item.checkIn=='1'?'已签到':'未签到'}}
|
|
|
|
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<uni-load-more v-if="studentlist.length<1" iconType="circle" :status="loadStatus" />
|
|
|
|
<uni-load-more v-if="studentlist.length<1" iconType="circle" :status="loadStatus" />
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<!-- 批量签到弹窗 -->
|
|
|
|
|
|
|
|
<view class="batch-mask" v-if="batchVisible" @click="closeBatch">
|
|
|
|
|
|
|
|
<view class="batch-dialog" @click.stop>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<view class="bd-title">批量签到</view>
|
|
|
|
|
|
|
|
<view class="bd-sub">已选 {{ selectedIds.length }} / {{ checkableList.length }} 人</view>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 全选 -->
|
|
|
|
|
|
|
|
<view class="bd-all" @click="toggleAll">
|
|
|
|
|
|
|
|
<view class="cb" :class="{ checked: isAllSelected }">
|
|
|
|
|
|
|
|
<text v-if="isAllSelected" class="cb-icon">✓</text>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<view class="bd-info">
|
|
|
|
|
|
|
|
<view class="bd-name">全选</view>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 可签到名单 -->
|
|
|
|
|
|
|
|
<scroll-view scroll-y class="bd-list">
|
|
|
|
|
|
|
|
<view
|
|
|
|
|
|
|
|
v-for="stu in checkableList"
|
|
|
|
|
|
|
|
:key="getBookId(stu)"
|
|
|
|
|
|
|
|
class="bd-item"
|
|
|
|
|
|
|
|
@click="toggleOne(stu)"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<view class="cb" :class="{ checked: isChecked(stu) }">
|
|
|
|
|
|
|
|
<text v-if="isChecked(stu)" class="cb-icon">✓</text>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<view class="bd-info">
|
|
|
|
|
|
|
|
<view class="bd-name">{{ stu.studentName }}</view>
|
|
|
|
|
|
|
|
<view class="bd-meta">{{ stu.phone }} · {{ retstr(stu.bookStatus) }}</view>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<view v-if="checkableList.length === 0" class="bd-empty">暂无可签到学员</view>
|
|
|
|
|
|
|
|
</scroll-view>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<view class="bd-btns">
|
|
|
|
|
|
|
|
<button class="bd-cancel" @click="closeBatch">取消</button>
|
|
|
|
|
|
|
|
<button
|
|
|
|
|
|
|
|
class="bd-confirm"
|
|
|
|
|
|
|
|
:disabled="selectedIds.length === 0 || submitting"
|
|
|
|
|
|
|
|
@click="doBatchCheckIn"
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
{{ submitting ? '提交中...' : '确认签到(' + selectedIds.length + ')' }}
|
|
|
|
|
|
|
|
</button>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 是否登录 -->
|
|
|
|
<!-- 是否登录 -->
|
|
|
|
<openlogin ref="loginId" @getPhoneNumber="getPhoneNumber"></openlogin>
|
|
|
|
<openlogin ref="loginId" @getPhoneNumber="getPhoneNumber"></openlogin>
|
|
|
|
|
|
|
|
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
@ -150,9 +215,24 @@
|
|
|
|
name3:"年卡",
|
|
|
|
name3:"年卡",
|
|
|
|
name4:"3390",
|
|
|
|
name4:"3390",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
]
|
|
|
|
],
|
|
|
|
|
|
|
|
batchVisible: false, // 弹窗开关
|
|
|
|
|
|
|
|
selectedIds: [], // 已勾选的 bookId
|
|
|
|
|
|
|
|
submitting: false // 防重复提交
|
|
|
|
};
|
|
|
|
};
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
|
|
|
|
// 可签到数据:bookStatus ∈ [0,1,2] 且 checkIn === 0
|
|
|
|
|
|
|
|
checkableList() {
|
|
|
|
|
|
|
|
return (this.studentlist || []).filter(stu => this.isCheckable(stu));
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
// 是否全选
|
|
|
|
|
|
|
|
isAllSelected() {
|
|
|
|
|
|
|
|
return this.checkableList.length > 0 &&
|
|
|
|
|
|
|
|
this.selectedIds.length === this.checkableList.length;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
onLoad(options) {
|
|
|
|
onLoad(options) {
|
|
|
|
// 课程详情
|
|
|
|
// 课程详情
|
|
|
|
if(options.id){
|
|
|
|
if(options.id){
|
|
|
|
@ -173,11 +253,19 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
methods: {
|
|
|
|
|
|
|
|
formatTime(timeStr) {
|
|
|
|
|
|
|
|
// 假设 timeStr 格式为 "HH:MM:SS"
|
|
|
|
|
|
|
|
return timeStr.slice(0, 5); // 取前5位 "HH:MM"
|
|
|
|
|
|
|
|
},
|
|
|
|
retstr(val){
|
|
|
|
retstr(val){
|
|
|
|
// 描述:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4->已完成/待评价;
|
|
|
|
// 描述:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4->已完成/待评价;
|
|
|
|
if(val=='0'){
|
|
|
|
if(val=='0'){
|
|
|
|
return '预约中';
|
|
|
|
return '预约中';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (val == '1')
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return '教练确认';
|
|
|
|
|
|
|
|
}
|
|
|
|
else if(val=='2'){
|
|
|
|
else if(val=='2'){
|
|
|
|
return '待上课 ';
|
|
|
|
return '待上课 ';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -242,15 +330,18 @@
|
|
|
|
uni.showLoading({
|
|
|
|
uni.showLoading({
|
|
|
|
title: '数据加载中...'
|
|
|
|
title: '数据加载中...'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
const {data: res} = await uni.$http.post('/api/my/courseTimeDetail', {courseTimeId:this.id});
|
|
|
|
try {
|
|
|
|
if(res&&res.data){
|
|
|
|
const { data: res } = await uni.$http.post('/api/my/courseTimeDetail', { courseTimeId: this.id });
|
|
|
|
var data=res.data;
|
|
|
|
if (res && res.data) {
|
|
|
|
// 信息
|
|
|
|
var data = res.data;
|
|
|
|
this.item=data.courseDetail;
|
|
|
|
this.item = data.courseDetail;
|
|
|
|
this.studentlist=data.studentList;
|
|
|
|
this.studentlist = data.studentList;
|
|
|
|
this.loadStatus='noMore';
|
|
|
|
this.loadStatus = 'noMore';
|
|
|
|
this.$forceUpdate();
|
|
|
|
this.$forceUpdate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
uni.hideLoading(); // ← 关键
|
|
|
|
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
gotoorder(){
|
|
|
|
gotoorder(){
|
|
|
|
var that = this;
|
|
|
|
var that = this;
|
|
|
|
@ -271,7 +362,7 @@
|
|
|
|
async orderdodo(){
|
|
|
|
async orderdodo(){
|
|
|
|
var param={
|
|
|
|
var param={
|
|
|
|
"courseTimeId": this.item.courseTimeId,
|
|
|
|
"courseTimeId": this.item.courseTimeId,
|
|
|
|
"startTime": this.item.startTime,
|
|
|
|
"startTime": this.item.startTime,
|
|
|
|
"endTime": this.item.endTime
|
|
|
|
"endTime": this.item.endTime
|
|
|
|
};
|
|
|
|
};
|
|
|
|
uni.showToast({
|
|
|
|
uni.showToast({
|
|
|
|
@ -280,7 +371,8 @@
|
|
|
|
duration: 2000
|
|
|
|
duration: 2000
|
|
|
|
});
|
|
|
|
});
|
|
|
|
const {data: res} = await uni.$http.post('/api/my/confirmClass', param);
|
|
|
|
const {data: res} = await uni.$http.post('/api/my/confirmClass', param);
|
|
|
|
if(res.msg=="successed"){
|
|
|
|
console.log(res)
|
|
|
|
|
|
|
|
if(res.success=="true"){
|
|
|
|
uni.showToast({
|
|
|
|
uni.showToast({
|
|
|
|
title: '已确定上课!',
|
|
|
|
title: '已确定上课!',
|
|
|
|
icon: 'success',
|
|
|
|
icon: 'success',
|
|
|
|
@ -295,14 +387,115 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
else{
|
|
|
|
uni.showToast({
|
|
|
|
uni.showToast({
|
|
|
|
title: res.msg? res.msg:'确定上课失败!',
|
|
|
|
title: res.message? res.message:'确定上课失败!',
|
|
|
|
icon: 'error',
|
|
|
|
icon: 'none',
|
|
|
|
duration: 2000
|
|
|
|
duration: 2000
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
// 取预约记录主键(兼容 bookId / id 两种字段名)
|
|
|
|
|
|
|
|
getBookId(stu) {
|
|
|
|
|
|
|
|
return stu.bookId || stu.id;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 是否可签到
|
|
|
|
|
|
|
|
isCheckable(stu) {
|
|
|
|
|
|
|
|
if (!stu) return false;
|
|
|
|
|
|
|
|
const rawStatus = stu.bookStatus;
|
|
|
|
|
|
|
|
if (rawStatus === null || rawStatus === undefined || rawStatus === '') return false;
|
|
|
|
|
|
|
|
const status = Number(rawStatus);
|
|
|
|
|
|
|
|
const checkIn = Number(stu.checkIn === null || stu.checkIn === undefined || stu.checkIn === '' ? 0 : stu.checkIn);
|
|
|
|
|
|
|
|
return [0, 1, 2].includes(status) && checkIn === 0;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 是否已勾选
|
|
|
|
|
|
|
|
isChecked(stu) {
|
|
|
|
|
|
|
|
return this.selectedIds.includes(this.getBookId(stu));
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 打开弹窗(默认全选)
|
|
|
|
|
|
|
|
openBatch() {
|
|
|
|
|
|
|
|
if (this.checkableList.length === 0) {
|
|
|
|
|
|
|
|
uni.showToast({ title: '暂无可签到学员', icon: 'none' });
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
this.selectedIds = this.checkableList.map(stu => this.getBookId(stu));
|
|
|
|
|
|
|
|
this.batchVisible = true;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 关闭弹窗
|
|
|
|
|
|
|
|
closeBatch() {
|
|
|
|
|
|
|
|
if (this.submitting) return;
|
|
|
|
|
|
|
|
this.batchVisible = false;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 全选/取消全选
|
|
|
|
|
|
|
|
toggleAll() {
|
|
|
|
|
|
|
|
if (this.isAllSelected) {
|
|
|
|
|
|
|
|
this.selectedIds = [];
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
this.selectedIds = this.checkableList.map(stu => this.getBookId(stu));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 单选切换
|
|
|
|
|
|
|
|
toggleOne(stu) {
|
|
|
|
|
|
|
|
const id = this.getBookId(stu);
|
|
|
|
|
|
|
|
const idx = this.selectedIds.indexOf(id);
|
|
|
|
|
|
|
|
if (idx > -1) {
|
|
|
|
|
|
|
|
this.selectedIds.splice(idx, 1);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
this.selectedIds.push(id);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 提交批量签到
|
|
|
|
|
|
|
|
async doBatchCheckIn() {
|
|
|
|
|
|
|
|
if (this.submitting) return;
|
|
|
|
|
|
|
|
if (this.selectedIds.length === 0) {
|
|
|
|
|
|
|
|
uni.showToast({ title: '请至少勾选一名学员', icon: 'none' });
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const submitCount = this.selectedIds.length;
|
|
|
|
|
|
|
|
const bookIds = this.selectedIds.slice();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.submitting = true;
|
|
|
|
|
|
|
|
uni.showLoading({ title: '提交中...', mask: true });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
const { data: res } = await uni.$http.post('/api/my/batchCheckIn', {
|
|
|
|
|
|
|
|
bookIds: bookIds
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (res && (res.success === true || res.success === 'true')) {
|
|
|
|
|
|
|
|
this.batchVisible = false;
|
|
|
|
|
|
|
|
this.selectedIds = [];
|
|
|
|
|
|
|
|
myCache('courserefresh', 1);
|
|
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
|
|
title: `已签到 ${submitCount} 人`.trim() || '签到成功',
|
|
|
|
|
|
|
|
icon: 'success',
|
|
|
|
|
|
|
|
duration: 2000
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
// 刷新名单
|
|
|
|
|
|
|
|
await this.getinfo();
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
|
|
title: (res && res.msg) ? res.msg : '批量签到失败!',
|
|
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
|
|
duration: 2500
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
uni.showToast({ title: '签到请求异常,请稍后重试', icon: 'none', duration: 2500 });
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
uni.hideLoading();
|
|
|
|
|
|
|
|
this.submitting = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
@ -385,7 +578,7 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.oscon{
|
|
|
|
.oscon{
|
|
|
|
background-color: #f3fafa;
|
|
|
|
background-color: #f3fafa;
|
|
|
|
border-radius: 16rpx;
|
|
|
|
border-radius: 16rpx;
|
|
|
|
@ -426,7 +619,7 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.oinfo{
|
|
|
|
.oinfo{
|
|
|
|
padding:20rpx;
|
|
|
|
padding:20rpx;
|
|
|
|
position: relative;
|
|
|
|
position: relative;
|
|
|
|
@ -439,7 +632,7 @@
|
|
|
|
padding: 20rpx 20rpx;
|
|
|
|
padding: 20rpx 20rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tcon{
|
|
|
|
.tcon{
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
flex-direction: column;
|
|
|
|
@ -466,14 +659,14 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.red{
|
|
|
|
.red{
|
|
|
|
color:#ff3d0e;
|
|
|
|
color:#ff3d0e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.green{
|
|
|
|
.green{
|
|
|
|
color:#00cd00;
|
|
|
|
color:#00cd00;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
::v-deep.uni-radio-input-checked{
|
|
|
|
::v-deep.uni-radio-input-checked{
|
|
|
|
background-color: #00A99A !important;
|
|
|
|
background-color: #00A99A !important;
|
|
|
|
border-color: #00A99A !important;
|
|
|
|
border-color: #00A99A !important;
|
|
|
|
@ -483,7 +676,7 @@
|
|
|
|
::v-deep.uni-radio-input-checked::before{
|
|
|
|
::v-deep.uni-radio-input-checked::before{
|
|
|
|
display: none!important;
|
|
|
|
display: none!important;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.scell{
|
|
|
|
.scell{
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
@ -586,7 +779,7 @@
|
|
|
|
font-size: 26rpx;
|
|
|
|
font-size: 26rpx;
|
|
|
|
color: #333;
|
|
|
|
color: #333;
|
|
|
|
margin-right: 10rpx;
|
|
|
|
margin-right: 10rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.txtbg3{
|
|
|
|
.txtbg3{
|
|
|
|
padding: 2rpx 15rpx;
|
|
|
|
padding: 2rpx 15rpx;
|
|
|
|
border-radius: 30rpx;
|
|
|
|
border-radius: 30rpx;
|
|
|
|
@ -670,6 +863,149 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===== 批量签到入口 ===== */
|
|
|
|
|
|
|
|
.batch-bar {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
|
|
padding: 0 10rpx 16rpx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.batch-tip {
|
|
|
|
|
|
|
|
font-size: 24rpx;
|
|
|
|
|
|
|
|
color: #999;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.batch-btn {
|
|
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
|
|
height: 64rpx;
|
|
|
|
|
|
|
|
line-height: 64rpx;
|
|
|
|
|
|
|
|
padding: 0 30rpx;
|
|
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
background-color: #00A99A !important;
|
|
|
|
|
|
|
|
border-radius: 32rpx;
|
|
|
|
|
|
|
|
border: none;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.batch-btn::after {
|
|
|
|
|
|
|
|
border: none !important;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ===== 批量签到弹窗 ===== */
|
|
|
|
|
|
|
|
.batch-mask {
|
|
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
|
|
top: 0;
|
|
|
|
|
|
|
|
right: 0;
|
|
|
|
|
|
|
|
bottom: 0;
|
|
|
|
|
|
|
|
background: rgba(0, 0, 0, 0.5);
|
|
|
|
|
|
|
|
z-index: 999;
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.batch-dialog {
|
|
|
|
|
|
|
|
width: 640rpx;
|
|
|
|
|
|
|
|
max-height: 72vh;
|
|
|
|
|
|
|
|
background: #fff;
|
|
|
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-title {
|
|
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
|
|
color: #000;
|
|
|
|
|
|
|
|
padding: 30rpx 0 8rpx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-sub {
|
|
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
font-size: 24rpx;
|
|
|
|
|
|
|
|
color: #999;
|
|
|
|
|
|
|
|
padding-bottom: 16rpx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-all,
|
|
|
|
|
|
|
|
.bd-item {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
padding: 22rpx 30rpx;
|
|
|
|
|
|
|
|
border-top: 1rpx solid #f2f2f2;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.cb {
|
|
|
|
|
|
|
|
width: 40rpx;
|
|
|
|
|
|
|
|
height: 40rpx;
|
|
|
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
|
|
|
border: 2rpx solid #c8c8c8;
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
|
|
margin-right: 20rpx;
|
|
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.cb.checked {
|
|
|
|
|
|
|
|
background: #00A99A;
|
|
|
|
|
|
|
|
border-color: #00A99A;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.cb-icon {
|
|
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
font-size: 22rpx;
|
|
|
|
|
|
|
|
line-height: 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-list {
|
|
|
|
|
|
|
|
max-height: 460rpx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-info {
|
|
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-name {
|
|
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
|
|
color: #333;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-meta {
|
|
|
|
|
|
|
|
font-size: 24rpx;
|
|
|
|
|
|
|
|
color: #999;
|
|
|
|
|
|
|
|
margin-top: 6rpx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-empty {
|
|
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
|
|
|
color: #999;
|
|
|
|
|
|
|
|
padding: 80rpx 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-btns {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
padding: 20rpx 30rpx 30rpx;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-cancel {
|
|
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
margin: 0 20rpx 0 0;
|
|
|
|
|
|
|
|
height: 80rpx;
|
|
|
|
|
|
|
|
line-height: 80rpx;
|
|
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
|
|
color: #666;
|
|
|
|
|
|
|
|
background: #f5f5f5 !important;
|
|
|
|
|
|
|
|
border-radius: 40rpx;
|
|
|
|
|
|
|
|
border: none;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-confirm {
|
|
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
|
|
height: 80rpx;
|
|
|
|
|
|
|
|
line-height: 80rpx;
|
|
|
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
background: #00A99A !important;
|
|
|
|
|
|
|
|
border-radius: 40rpx;
|
|
|
|
|
|
|
|
border: none;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-cancel::after,
|
|
|
|
|
|
|
|
.bd-confirm::after {
|
|
|
|
|
|
|
|
border: none !important;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.bd-confirm[disabled] {
|
|
|
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|
|