uni-events-helper-wx
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

543 lines
14 KiB

<template>
<view class="content flex_col flex_start">
<view class="head flex_row flex_around" v-if="!!showHeader">
<view class="tap-btn" :class="[getTabClass(e)]" @click="clickHead(i)" v-for="(e,i) in headDate" :key="i">
{{e.name}}
</view>
</view>
<view class="item flex_col flex_start_y bg-white item_head_name">
<view class="title flex_row flex_start">
<view class="text-m text-left">{{match_name}}</view>
<!-- <view class="bandage"></view> -->
</view>
</view>
<!--schedule item -->
<block v-if="headIndex==0">
<view class="item flex_col flex_start_y bg-white " v-for="(i,k) in pageList" :key="k">
<!-- <view class="title flex_row flex_start">
<view class="text-m text-left">{{match_name}}</view>
</view> -->
<view class="info flex_row flex_between">
<view class="time">{{i.schedule_start_date}}</view>
<view class="type">{{i.schedule_name}}</view>
</view>
<view class="card flex_row flex_between" v-for="(u,ukey) in i.son_list">
<view class="persion flex_row">
<image class="" :src="u.member_img" :key="ukey" mode=""></image>
<text>{{u.member_name}}</text>
</view>
<view class="btn-box flex_row">
<view class="btn state-0 flex_row" v-if="u.is_set_score" @click="openGrade(i,u)">已打分</view>
<view class="btn state-1 flex_row" v-else @click="openGrade(i,u)">打分</view>
<view class="btn state-2 flex_row" @click="openGradeRank(i,u)">数据</view>
</view>
</view>
</view>
</block>
<!--match item -->
<block v-if="headIndex==1">
<view class="item flex_col flex_start_y bg-white ">
<!-- <view class="title flex_row flex_start">
<view class="text-m text-left">{{match_name}}</view>
<view class="bandage"></view>
</view> -->
<!-- <view class="info flex_row flex_between">
<view class="time">{{i.schedule_start_date}}</view>
<view class="type">{{i.schedule_name}}</view>
</view> -->
<view class="card flex_row flex_between" v-for="(u,ukey) in pageList" :key="ukey">
<view class="persion flex_row">
<image class="" :src="u.member_img" :key="ukey" mode=""></image>
<text>{{u.member_name}}</text>
</view>
<view class="btn-box flex_row">
<view class="btn state-0 flex_row" v-if="u.is_set_score" @click="openGrade(u,u)">已打分</view>
<view class="btn state-1 flex_row" v-else @click="openGrade(u,u)">打分</view>
<view class="btn state-2 flex_row" @click="openGradeRank(u,u)">数据</view>
</view>
</view>
</view>
</block>
<!-- 无数据 -->
<no-data :txt="no_data_txt_arr[headIndex]" v-if="pageList.length==0"></no-data>
<!-- 弹出交互 uview popup有bug,废弃重写-->
<!-- <u-popup :show="showGrade" @close="close" @open="open" mode="center" :closeOnClickOverlay="true" :closeable="true" :round="10">
<view class="grade flex_col flex_start" >
<text class="g-title">赛事打分</text>
<text class="g-txt">李静分数录入</text>
<input type="text" value="" placeholder="请录入分数" />
<view class="g-tip">请输入成员该赛程最终得分,非累计</view>
<view class="g-btn flex_row">保存</view>
</view>
</u-popup> -->
<!-- 打分弹出 -->
<view class="overlay flex_col" v-if="showGrade">
<view class="grade flex_col flex_start" >
<image class="g-close" src="../../static/images/event/event_close.png" mode="" @click="closeGrade()"></image>
<text class="g-title">赛事打分</text>
<text class="g-txt">{{gradeData.user.member_name||""}}分数录入</text>
<input type="number " class="" v-model="gradeData.score" value="" placeholder="请录入分数" placeholder-class="place-style"/>
<view class="g-tip">请输入成员该赛程最终得分,非累计</view>
<view class="g-btn flex_row" @click="saveGrade()">保存</view>
</view>
</view>
<!-- 赛事数据录入弹出 -->
<view class="overlay flex_col" v-if="showGradeRank">
<view class="grade grade-more flex_col flex_start" >
<image class="g-close" src="../../static/images/event/event_close.png" mode="" @click="closeGradeRank()"></image>
<text class="g-title">{{match_name}}数据</text>
<text class="g-txt">{{gradeDataRank.user.member_name}}分数录入</text>
<view class="g-input-box flex_col">
<scroll-view scroll-y="true" class="scroll-Y">
<view class="b-item flex_row flex_between" v-for="(si,sk) in gradeDataRank.list" :key="sk">
<text>{{si.rank_param_name}}</text>
<input type="number" value="" v-model="si.val" placeholder="请录入数据" placeholder-class="place-style"/>
</view>
</scroll-view>
<!-- <view class="b-item flex_row">
<text>助攻</text>
<input type="number" value="" placeholder="请录入数据" placeholder-class="place-style"/>
</view>
<view class="b-item flex_row">
<text>场次</text>
<input type="number" value="" placeholder="请录入数据" placeholder-class="place-style"/>
</view> -->
</view>
<view class="g-tip">数据录入会累计到用户原有数据中</view>
<view class="g-btn flex_row" @click="saveRank()">保存</view>
</view>
</view>
</view>
</template>
<script>
import {schedule_matchList,schedule_scoreSave,
scoreSave,scoreMemberList,
rankOcondList,rankSave} from "../../nxTemp/apis/userAPI.js"
export default {
data() {
return {
showGrade:false,//赛事个人打分弹窗
showGradeRank:false,//赛事数据弹窗
showHeader:true,//是否显示头部导航
headIndex:0,//
headDate:[{name:'赛程打分'},{name:'赛事打分'}],
postData:{//请求数据
page:1,
page_size:10,
match_id:"",
// brand_id:""
},
listLoadFinished:false,//是否已加载全部列表
listTotal:0,//列表总长
match_name:"",//赛程名称(赛程,赛事一同使用)
pageList:[],
gradeData:{//打分弹窗数据
user:"",
score:""
},
gradeDataRank:{//入围数据录入
user:"",
score:"",
list:""
},
brand_id:"",
no_data_txt_arr:["暂无赛程安排~","暂无人员参加~"]
};
},
computed:{
},
onLoad(opts) {
console.log(8888,opts);
this.setOnloadOpts(opts)
this.updatePage()
},
onUnload() {
this.resetPostData()
},
onPullDownRefresh(){
console.log("onPullDownRefresh");
},
onReachBottom(){
console.log("onReachBottom");
this.updatePage()
},
methods: {
//更新页面列表
updatePage() {
if(this.listLoadFinished)return console.log("已加载完毕")
getPostAPI(this)(this.postData).then(res => {
this.match_name = res.match_name
this.pageList.push(...res.list)
checkListLoadFinished(res,this);
}).catch(e=>{
this.$tools.showNone(e.errMsg)
})
function getPostAPI(that){
return [schedule_matchList,scoreMemberList][that.headIndex]
// return [schedule_matchList,matchList][that.headIndex]
}
//检测是否完成加载
function checkListLoadFinished(res,that){
if(that.pageList.length == res.total)that.listLoadFinished = true
else that.postData.page++
}
function getFilterList(list){
return list
}
},
//预留
getFilteredItem(item){
return Promise.resolve({}=item)
},
//重置请求参数
setOnloadOpts(opts){
console.log("onLoad:",opts);
opts.showHeader = JSON.parse(opts.showHeader)
this.postData.match_id = opts.match_id||""
this.headIndex = opts.showHeader?0:1;// 一定有赛事打分, 但不一定有赛程
this.showHeader = opts.showHeader
// this.postData.brand_id = opts.brand_id||""
this.brand_id = opts.brand_id||""
},
resetPostData(){
// this.postData = {
// page:1,
// page_size:10,
// match_id:""
// }
this.postData.page = 1;
this.pageList = [];
this.listLoadFinished = false;
},
saveGrade() {//保存分数
let {score} = this.gradeData
score = parseFloat(score)
let {order_no,schedule_son_id} = this.gradeData.user
let {id:schedule_id} = this.gradeData.item
if(score<=0)return this.$tools.showNone("请输入分数");
getPostAPI(this)(getPostData(this)).then(res => {
this.$tools.showNone("已保存");
this.closeGrade()
}).catch(e=>{
this.$tools.showNone(e.errMsg)
this.closeGrade()
})
function getPostAPI(that){
return [schedule_scoreSave,scoreSave][that.headIndex]
}
function getPostData(that){
let {brand_id} = that
return [{order_no,schedule_son_id,schedule_id,score},{order_no,score,brand_id}][that.headIndex]
}
},
openGrade(item,user) {
this.showGrade = true
this.gradeData.user = user
this.gradeData.score = user.score?user.score:"" //测试要求回显
if(this.gradeData.score==0||this.gradeData.score=="0") this.gradeData.score="" //测试要求不显示0分
this.gradeData.item = item
console.log('open',item,JSON.stringify(user));
},
closeGrade() {
this.showGrade = false
this.resetPostData()
this.updatePage()
console.log('closeGrade');
},
async openGradeRank(item,user) {
this.gradeDataRank.user = user
// this.gradeDataRank.score = user.score //测试要求回显
this.gradeDataRank.score = ""
this.gradeDataRank.item = item
let res = await this.updateRankList()
this.showGradeRank = true
console.log('openGradeRank',res);
},
closeGradeRank() {
this.showGradeRank = false
// this.resetPostData()
// this.updatePage()
console.log('closeGradeRank');
},
saveRank(){
let {order_no} = this.gradeDataRank.user
let {brand_id} = this
brand_id = parseInt(brand_id)
let rank_data = getRankData(this)
if(!checkData(rank_data)) return this.$tools.showNone("请输入合适的分数")
rankSave({
order_no,brand_id,rank_data
}).then(res => {
this.$tools.showNone("保存成功")
this.closeGradeRank()
}).catch(e=>{
this.$tools.showNone(e.errMsg)
})
function getRankData(that){
return that.gradeDataRank.list.map((item)=>{
let {id,val} = item
val = parseFloat(val)
return {id,val}
})
}
function checkData(list){
return list.some((e)=>{ //按测试要求,与后台管理同步,只验证一项为必填
return parseFloat(e.val)>0
})
}
},
updateRankList(){
let {order_no} = this.gradeDataRank.user
let {brand_id} = this
return rankOcondList({
order_no,brand_id
}).then(res => {
console.log("updateRankList:",res);
// this.gradeDataRank.list = res.list
this.gradeDataRank.list = res.list.map(e=>{
e.val = ""
return e
})
}).catch(e=>{
this.$tools.showNone(e.errMsg)
})
},
getTabClass(item){
let {headDate,headIndex} = this
return headDate[headIndex].name==item.name?'active':''
},
clickHead(index){
this.headIndex = index
console.log("click index: ",index);
this.resetPostData();
this.updatePage();
},
jumpPage(){
this.$Router.push({name:"login"})
},
}
}
</script>
<style lang="less" scoped>
.content{
.head{
width: 100%;
height: 112rpx;
background-color: white;
.tap-btn{
font-size: 36rpx;
color: #333333;
font-weight: 700;
width: 200rpx;
height: 72rpx;
text-align: center;
line-height: 72rpx;
}
.active{
color: white;
background: #009874;
border-radius: 36rpx;
}
}
.item{
color: #333333;
position: relative;
margin-bottom: 24rpx;
// border-radius: 10rpx;
width: 750rpx;
// height: 124rpx;
.title{
font-size: 36rpx;
color: #333333;
// margin-bottom: 10rpx;
font-weight: 700;
height: 116rpx;
width: 100%;
padding-left: 60rpx;
border-bottom: 1rpx solid #f2f2f7;
}
.info{
font-weight: 700;
font-size: 32rpx;
color: #333333;
height: 96rpx;
width: 100%;
padding: 26rpx 24rpx 26rpx 60rpx;
border-bottom: 1rpx solid #f2f2f7;
}
.card{
height: 188rpx;
width: 100%;
padding: 40rpx 24rpx 40rpx 50rpx;
border-bottom: 1rpx solid #f2f2f7;
.persion{
> image{
width: 108rpx;
height: 108rpx;
}
> text{
font-size: 32rpx;
color: #333333;
margin-left: 24rpx;
}
}
.btn-box{
.btn{
margin-left: 20rpx;
width: 132rpx;
height: 60rpx;
background: #FF873D;
border-radius: 6rpx;
color: white;
}
.state-0{
background-color: #36C990;
}
.state-1{
background-color: #009874;
}
.state-2{
background-color: #FF873D;
}
}
}
.bandage{
width: 16rpx;
height: 16rpx;
// position: absolute;
// right: 60rpx;
background: #EA5061;
border-radius: 50%;
font-size: 24rpx;
color: white;
text-align: center;
line-height: 34rpx;
margin-top: -16rpx;
margin-left: 10rpx;
}
}
.item_head_name{
margin-top: 24rpx;
margin-bottom: 0rpx;
}
}
.overlay{
position: fixed;
height: 100vh;
width: 100%;
background: rgba(0,0,0,0.6);
z-index: 90;
.grade{
z-index: 999;
width: 620rpx;
// height: 600rpx;
background: #FFFFFF;
padding: 50rpx;
border-radius: 10rpx;
.g-close{
align-self: flex-end;
width: 32rpx;
height: 32rpx;
}
.g-title{
margin-top: 20rpx;
font-size: 32rpx;
color: #333333;
font-weight: 700;
}
.g-txt{
margin: 58rpx auto 12rpx auto;
font-size: 28rpx;
color: #333333;
}
input{
width: 456rpx;
height: 88rpx;
background: #FFFFFF;
border: 2rpx solid #D8D8D8;
border-radius: 10rpx;
padding:0 20rpx;
}
.g-tip{
align-self: flex-start;
font-size: 24rpx;
color: #9A9A9D;
margin-top: 10rpx;
margin-bottom: 52rpx;
margin-left: 32rpx;
}
.g-btn{
width: 240rpx;
height: 88rpx;
background: #009874;
border-radius: 10rpx;
font-size: 32rpx;
color: #FFFFFF;
font-weight: 700;
margin-bottom: 34rpx;
}
}
.grade-more{
padding-left:72rpx;
padding-right: 80rpx;
.g-input-box{
.scroll-Y{
height: 300rpx;
}
.b-item{
// width: 100%;
width: 450rpx;
margin-top: 20rpx;
> text{
font-size: 28rpx;
color: #9C9C9F;
padding-right: 20rpx;
}
input {
// width: 184rpx;
width: 300rpx;
}
}
}
.g-tip{
margin-left: 12rpx;
}
}
.place-style{
font-size: 28rpx;
color: #9A9A9D;
// text-align: center;
// line-height: 88rpx;
}
}
</style>