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.
 
 
 
 
 

702 lines
18 KiB

<template>
<view class="timing-page">
<!-- <store-name></store-name> -->
<view class="t-title">{{switchInfo.hardware_name}}定时</view>
<view class="t-box">
<view class="info-list">
<view class="il-switch">
<text class="">时间动作</text>
<view class="" @click="tapSwitch">
<view class="un-select" v-if="!on"></view>
<image v-else class="" src="../../../../static/images/icon/retail/choose.png" mode=""></image>
</view>
<view class="" @click="tapSwitch">关
<view class="un-select" v-if="on"></view>
<image v-else src="../../../../static/images/icon/retail/choose.png" mode=""></image>
</view>
</view>
<view class="il-select">
<text class="">时间类型</text>
<picker @change="bindPickerChangeSingle" :value="sIndex" :range="singleArr">
<view class="il-input">
<text>{{singleArr[sIndex]}}</text><image src="../../../../static/images/icon/arrow_b2.png" mode=""></image>
</view>
</picker>
</view>
<view class="il-select-week" v-if="sIndex==0">
<block v-for="(e,i) in weekArrSelect" :key="i">
<view class="" :class="e?'active':''" @click="clickWeekTab(i)">星期{{weekArrCN[i]}}</view>
</block>
</view>
<block v-if="sIndex==1">
<view class="il-select" >
<text class="">具体日期</text>
<!-- <picker @change="bindPickerChangeDay" :value="dIndex" :range="dayArr"> -->
<view class="il-input" @click="padConfig.show = true">
<text>请点击选择</text><image src="../../../../static/images/icon/arrow_b2.png" mode=""></image>
</view>
<!-- </picker> -->
</view>
<view class="il-select-week">
<block v-for="(e,i) in dayArrSelect" :key="i">
<view v-if="e" class="" :class="e?'active':''" @click="">{{i+1}} 号</view>
</block>
</view>
</block>
<view class="il-select-double" v-if="sIndex==2">
<text class="">具体时间段</text>
<view class="il-input">
<picker mode="date" :value="startTime" :start="startDate" :end="endDate" @change="bindTimeChangeStart">
<text>{{startTime?startTime+'起':'请选择开始时间'}}</text>
</picker>
<view class="">至</view>
<picker mode="date" :value="endTime" :start="startDate" :end="endDate" @change="bindTimeChangeEnd">
<text>{{endTime?endTime+"止":"请选择结束时间"}}</text>
</picker>
</view>
</view>
<view class="il-select">
<text class="">时间点</text>
<picker mode="time" :value="time" start="00:00" end="23:59" @change="bindTimeChange">
<view class="il-input">
<text>{{time}}</text><image src="../../../../static/images/icon/arrow_b2.png" mode=""></image>
</view>
</picker>
</view>
</view>
<view class="save-btn" @click="saveAdd">保存</view>
<view class="bottom-tips">保存后发布后将会以最新的定时更新到欧轩智能中控,设备首页<text>定时列表</text>可查看最新发布</view>
</view>
<!-- 日期天多选选择弹框 -->
<view class="voice_control_pad" v-if="padConfig.show" @touchmove.stop.prevent="(()=>{})">
<view class="cover_bg" @click.stop="padConfig.show=false" @touchmove.stop.prevent="(()=>{})"></view>
<view class="v_box" >
<scroll-view scroll-y="true" >
<view class="il-select-week">
<block v-for="(e,i) in dayArrSelect" :key="i">
<view class="" :class="e?'active':''" @click.stop="clickDaysTab(i)">{{i+1}} </view>
</block>
</view>
</scroll-view>
<view class="v_btns">
<view class="voice_btn btn_green" @click="padConfig.show=false">确认</view>
</view>
</view>
</view>
</view>
</template>
<script>
import util from '../../../../utils/util';
import store_name from '../../components/store_name/store_name';
import deviceServer from '../../js/device_server';
import deviceApi from '../../js/device_api';
const rootPage = '/subpackage/device'
const tabArr = [{
id: 0,
name: '全部',
path: ``,
on: true
},
];
const weekArrCN = ["日", "一", "二","三","四","五","六"];
import {
mapState
} from 'vuex'
export default {
components: {
'store-name': store_name
},
computed: {
...mapState({
storeList: state => state.device.storeList,
curStoreInfo: state => state.device.curStoreInfo,
}),
isDel() {
return (item) => {
return item[2] == "删除" ? "true" : ""
}
},
startDate() {
return this.getDate('start');
},
endDate() {
return this.getDate('end');
}
},
data() {
const currentDate = this.getDate({
format: true
})
const dayArrSelect = (()=>{
let days = []
for(var i=1;i<=31;i++){
days.push(false)
}
return days
})()
return {
switchInfo:"",//上层页面的选择信息
on:false,
singleArr:["星期","具体日期","具体时间段"],
sIndex:0,
dayArrSelect:dayArrSelect,//31天 选择
dIndex:0,
weekArrCN,
weekArrSelect:[false,false,false,false,false,false,false],
date: currentDate,
time: '00:00-',
startTime:"",
endTime:"",
padConfig:{
show:false,
data:[]
},
reqData:{//定时请求中控参数 调用sendPacket时传递参数 switchData->postData->reqData(最终请求数据)
"device": "00-10-7a-0f-6d-7a",
"delay": 1,
"data": {
"name": "set-time-select",
"value": {
"data": "传入设置的json格式字符串,例如:{\"time_arrow_id\":\"c8c39f5c-8dd4-11eb-9aad-4e965989bbce\",\"group\":\"RPIO\",\"type\":\"DAY_OF_WEEK\",\"day_of_week\":[0,1,2,3,6,5,4],\"day_of_month\":null,\"date_slice\":[{\"start\":\"\",\"end\":\"\"}],\"times_on_day\":[\"10:13:00-10:13:10\"],\"expand_tags\":null,\"expand_value\":{\"main\":{\"name\":\"set-rpio\",\"title\":\"测试中控照明9\",\"value\":{\"id\":\"9\",\"status\":\"high\"}}},\"weights\":0,\"extension\":null}"
}
}
},
postData:{//定时参数消息结构 reqData.data.value
"time_arrow_id": "", //不用填 留空
"group": "RPIO", //照明,风扇,空调固定值,其它不确定
"type": "DAY_OF_WEEK", //DAY_OF_WEEK/DAY_OF_MONTH/DATE_SLICE , 对应 周,月,单独时间.
"day_of_week": [
],
"day_of_month": null, //数组
"date_slice": [
{
"start": "",
"end": ""
}
],
"times_on_day": [//时间点
// "10:13:00-10:13:10" //后台要求,10s期间
],
"expand_tags": null,
"expand_value": {
"main": { //中控指令
"name": "set-rpio",
"title": "",
"value": {
"id": "",//设备id
"status": "high" //low:开, high:关
}
}
},
"weights": 0,//权重
"extension": null
},
switchData:"",//开关请求中控参数 postData.expand_value.main
}
},
async onLoad(option) {
this.handleOpts(option);
},
onShow() {
// this.updateList() //更新中控信息
},
watch: {
curStoreInfo(newVal, oldVal){
// this.infoArr.length = 1
// this.updateList()
}
},
methods: {
//处理参数
handleOpts(option){
let switchInfo = JSON.parse(decodeURIComponent(option.switchInfo));
this.switchInfo = switchInfo //该选择控制设备的所有数据 (目前只使用了hardware_name)
this.switchData = switchInfo.switchData //开关关联数据
//去掉店铺切换功能
// try {
// util.showLoad();
// let _brandInfo = await this.$store.dispatch('getBrandInfo');
// await this.$store.dispatch('getStoreList');
// util.hideLoad();
// } catch (err) {
// util.hideLoad();
// }
},
//点击保存按钮
saveAdd(){ //switchData(开关命令数据)->postData(后台定时接口数据)->reqData(组成最终小程序端中控定时数据)
let {switchData,postData,reqData,curStoreInfo,sIndex,time,getWeekRes,getMonthDaysRes,getSliceRes,getDayTimeRes,sendDataToVC} = this;
// ["星期","具体日期","具体时间段"],
if(sIndex==0)postData.day_of_week = getWeekRes(); //
if(sIndex==1)postData.day_of_month = getMonthDaysRes(); //当月的多选某天
if(sIndex==2)postData.date_slice = getSliceRes(); //
if(time=="00:00-") return util.showNone("请先选择定时时间点!")
postData.times_on_day = getDayTimeRes(); //时间点,固定要传
switchData.data.title = `${this.switchInfo.hardware_name}-${this.singleArr[this.sIndex]}定时`;
postData.expand_value.main = switchData.data;
reqData.device = switchData.device
reqData.data.value.data = JSON.stringify(postData)
console.log("reqData:",JSON.stringify(reqData));
uni.showModal({
content: `确认要设置${curStoreInfo.venue_name}中 [ ${this.switchInfo.hardware_name} ] 的[ ${this.singleArr[this.sIndex]} ]计划任务 ?`,
success(res) {
console.log("确认执行", res.confirm)
if(res.confirm){
sendDataToVC();
}
},
})
},
getWeekRes(){
console.log(this.weekArrSelect);
let res = []
this.weekArrSelect.forEach((e,i)=>{
if(e)res.push(i)
})
return res
},
getMonthDaysRes(){
let res = []
this.dayArrSelect.forEach((e,i)=>{
if(e)res.push(i+1)
})
return res
},
getSliceRes(){
let res = [],{startTime,endTime} = this;
if(startTime&&endTime){
res.push({
"start": startTime,
"end": endTime
})
}else{
res.push({
"start": "",
"end": ""
})
}
return res
},
getDayTimeRes(){
let res = []
res.push( `${this.time}:00-${this.time}:10`)
return res
},
tapSwitch(){ //开关切换
this.on = !this.on
this.switchData.data.value.status = this.on? "low":"high";
this.switchData.data.value.o = this.on? "low":"high";
},
clickWeekTab(index) {
if(this.weekArrSelect[index]) {
this.$set(this.weekArrSelect,index,false)
}else{
this.$set(this.weekArrSelect,index,true)
}
},
clickDaysTab(index) {
if(this.dayArrSelect[index]) {
this.$set(this.dayArrSelect,index,false)
}else{
this.$set(this.dayArrSelect,index,true)
}
},
bindPickerChangeSingle(e){
console.log('bindPickerChangeSingle,携带值为', e.target.value)
this.sIndex = e.target.value
// DAY_OF_WEEK/DAY_OF_MONTH/DATE_SLICE
this.postData.type = ['DAY_OF_WEEK','DAY_OF_MONTH','DATE_SLICE'][e.target.value]
this.resetPostData();
},
resetPostData(){ //重置选择数据为原始状态
let _reset = {
"day_of_week": [
],
"day_of_month": null, //数组
"date_slice": [{
"start": "",
"end": ""
}
],}
for(var i in _reset){
console.log("重置:",i);
this.postData[i] = _reset[i]
}
},
bindTimeChange(e){ //时间选择
this.time = e.target.value
},
bindTimeChangeStart(e){ //日期选择
if(new Date(this.endTime)-new Date(e.target.value)<0) return util.showNone("开始时间异常")
this.startTime = e.target.value
},
bindTimeChangeEnd(e){ //日期选择
if(new Date(e.target.value)-new Date(this.startTime)<0) return util.showNone("结束时间异常")
this.endTime = e.target.value
},
bindPickerChangeDay(e){ //月选择
console.log('bindPickerChangeDay携带值为', e.target.value)
this.dIndex = e.target.value
},
//删除计划任务
delItem(e,i) {
let that = this
let delData = {
"device": this.curStoreInfo.device_name,
"delay": 1,
"data": {
"name": "delete-time-select",
"value": {
"uuid": e[3]
}
}
}
uni.showModal({
content: `确认要删除: ${e[0]}的计划任务 ?`,
success(res) {
console.log("确认删除", res.confirm)
if(res.confirm){
that.operateReq({
data: delData,
succFun: (res) => {
that.updateList()
},
isTip:true
})
}
},
})
},
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === 'start') {
year = year - 0;
} else if (type === 'end') {
year = year + 10;//限制可选10年内
}
month = month > 9 ? month : '0' + month;;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
async sendDataToVC() {
let that = this
let timingData = {
}
timingData = this.reqData
this.operateReq({
data: timingData,
succFun: (res) => {
console.log("操作结果:",res);
if(res=="ok"){
let timing_list = "/subpackage/device/pages/timing/timing_list"
util.routeTo(`${timing_list}`, 'nT');
}
},
isTip:true
})
},
goBack() {
uni.navigateBack({
delta: 1
})
},
// 操作接口请求
operateReq({
data,
succFun,
isTip = false,
isLoad = true,
}) {
let that = this
if (isLoad) util.showLoad();
deviceServer.post({
url: deviceApi.ouxuanac,
data: data,
isDefaultGet: false,
})
.then(res => {
if (isLoad) util.hideLoad();
if (res.data.code == 0) {
if (isTip) util.showNone(res.data.message || '操作成功!');
succFun(res.data.data)
} else {
if (isTip) util.showNone(res.data.message || '操作失败!');
}
})
.catch(err => {
if (isLoad) util.hideLoad()
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.timing-page {
.t-title {
font-size: 44rpx;
color: #1A1A1A;
font-weight: 900;
margin: 60rpx auto 72rpx 40rpx;
}
.t-box {
height: 500rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
width: 100%;
.info-list {
margin-bottom: 50rpx;
padding: 50rpx 30rpx;
width: 700rpx;
height: auto;
background: #FFFFFF;
border-radius: 10rpx;
font-size: 32rpx;
.il-switch{
width: 580rpx;
@include centerFlex(space-between);
> view{
@include centerFlex(center);
image{
margin-left: 20rpx;
width: 40rpx;height: 40rpx;
}
.un-select{
margin-left: 20rpx;
background-color: white;
width: 40rpx;height: 40rpx;
border-radius: 50%;
border: 2rpx solid lightgray;
}
}
}
.il-select{
margin-top: 50rpx;
width: 100%;
@include centerFlex(space-between);
.il-input {
@include centerFlex(space-between);
padding: 20rpx;
margin-left: 20rpx;
width: 480rpx;
height: 96rpx;
background: #FFFFFF;
border: 2rpx solid #D8D8D8;
border-radius: 10rpx;
text{
color: #9C9C9F;
}
image{
width: 28rpx;
height: 28rpx;
transform: rotate(90deg);
}
}
}
.il-select-double{
margin-top: 50rpx;
width: 100%;
@include centerFlex(flex-start);
align-items: flex-start;
flex-direction: column;
.il-input {
@include centerFlex(space-between);
padding: 20rpx;
margin-top: 20rpx;
width: 648rpx;
height: 96rpx;
background: #FFFFFF;
border: 2rpx solid #D8D8D8;
border-radius: 10rpx;
text{
color: #9C9C9F;
}
> view{
padding: 0 10rpx;
}
}
}
.il-select-week{
width: 100%;
height: auto;
@include centerFlex(flex-start);
flex-wrap: wrap;
> view{
@include centerFlex(center);
width: 160rpx;
height: 88rpx;
border: 2rpx solid #979797;
border-radius: 6rpx;
color: #979797;
margin-left: 40rpx;
margin-top: 40rpx;
}
.active{
background: rgba(0,152,116,0.12);
border: 2rpx solid #009874;color: #009874;
}
}
}
}
}
// 底部css
.save-btn{
width: 700rpx;
height: 110rpx;
text-align: center;
line-height: 110rpx;
background: #009874;
border-radius: 10px;
color: white;
}
.bottom-tips{
font-size: 28rpx;
color: #1A1A1A;
text{
color: #009874;
}
margin: 40rpx;
}
//弹窗选择
.voice_control_pad {
position: fixed;
top: 0;
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
z-index: 1;
.cover_bg {
position: fixed;
top: 0;
background: rgba($color: #000000, $alpha: .3);
z-index: 2;
width: 100%;
height: 100%;
}
.v_box {
z-index: 3;
width: 630rpx;
background-color: white;
border-radius: 10rpx;
scroll-view{
margin-top: 30rpx;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
border-radius: 5rpx;
flex-wrap: wrap;
width: 100%;
height: 700rpx;
border-bottom: 1rpx solid #F2F2F7;
.il-select-week{
width: 100%;
height: auto;
@include centerFlex(flex-start);
flex-wrap: wrap;
> view{
@include centerFlex(center);
width: 160rpx;
height: 88rpx;
border: 2rpx solid #979797;
border-radius: 6rpx;
color: #979797;
margin-left: 40rpx;
margin-top: 40rpx;
}
.active{
background: rgba(0,152,116,0.12);
border: 2rpx solid #009874;color: #009874;
}
}
}
.voice_btn {
width: 392rpx;
height: 112rpx;
background: #009874;
border-radius: 5rpx;
text-align: center;
line-height: 112rpx;
color: white;
font-size: 32rpx;
}
.btn_active {
color: black;
background-color: rgba($color: #000000, $alpha: .4);
}
.btn_white {
width: 204rpx;
height: 88rpx;
background-color: white;
color: #009874;
border: 1rpx solid #009874;
line-height: 88rpx;
}
.btn_green {
width: 204rpx;
height: 88rpx;
background-color: #009874;
color: white;
line-height: 88rpx;
}
.v_btns {
width: 100%;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
margin: 50rpx 0;
}
}
}
</style>