| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 | 
							- <template>
 
-     <view class="filtrate-box">
 
-         <view :style="{ position: 'absolute', zIndex: index }">
 
-             <u-transition :show="show">
 
-                 <view class="shade" catchtouchmove="true" @touchmove.stop.prevent="() => { }" @click="changeShow">
 
-                     <view @click.stop="">
 
-                         <scroll-view :style="{ maxHeight: tovw(maxHeight) }" class="scroll-view" scroll-y>
 
-                             <block v-for="(item, index) in list" :key="item.key">
 
-                                 <block v-if="item.type == 'dateRange'">
 
-                                     <view class="date-label">
 
-                                         {{ item.title || '时间区间' }}
 
-                                     </view>
 
-                                     <view class="date-box">
 
-                                         <scroll-view :scroll-x="true">
 
-                                             <view class="options">
 
-                                                 <view class="item" hover-class="navigator-hover"
 
-                                                     :class="item.day == 1 ? 'active' : ''" @click="fast(1, index)">
 
-                                                     今天
 
-                                                 </view>
 
-                                                 <view class="item" hover-class="navigator-hover"
 
-                                                     :class="item.day == 7 ? 'active' : ''" @click="fast(7, index)">
 
-                                                     7天
 
-                                                 </view>
 
-                                                 <view class="item" hover-class="navigator-hover"
 
-                                                     :class="item.day == 30 ? 'active' : ''" @click="fast(30, index)">
 
-                                                     30天
 
-                                                 </view>
 
-                                                 <view style="width: 10px;" />
 
-                                                 <u-number-box :value="item.day || 1" @change="valChange($event, index)" />
 
-                                             </view>
 
-                                         </scroll-view>
 
-                                         <view class="row" style="margin-top: 20px">
 
-                                             <picker mode="date" class="date-box"
 
-                                                 :style="{ color: item.begindate ? '#333' : '#ddd' }" :value="item.begindate"
 
-                                                 data-name="begindate" :end="enddate" @change="onDateChange($event, index)">
 
-                                                 {{ item.begindate || '开始日期' }}
 
-                                             </picker>
 
-                                             <view style="padding: 0 10px;">
 
-                                                 -
 
-                                             </view>
 
-                                             <picker mode="date" class="date-box"
 
-                                                 :style="{ color: item.enddate ? '#333' : '#ddd' }" :value="item.enddate"
 
-                                                 data-name="enddate" @change="onDateChange($event, index)" :start="enddate">
 
-                                                 {{ item.enddate || '结束日期' }}
 
-                                             </picker>
 
-                                         </view>
 
-                                     </view>
 
-                                 </block>
 
-                                 <group v-else :ref="'group' + index" :item="item" :rowIndex="index" @onChange="onChange" />
 
-                             </block>
 
-                         </scroll-view>
 
-                         <view class="but-box">
 
-                             <view class="reset" hover-class="navigator-hover" @click="onReset">
 
-                                 重置
 
-                             </view>
 
-                             <view class="confirm" hover-class="navigator-hover" @click="onConfirm">
 
-                                 确定
 
-                             </view>
 
-                         </view>
 
-                     </view>
 
-                 </view>
 
-             </u-transition>
 
-         </view>
 
-     </view>
 
- </template>
 
- <script>
 
- import group from "./filtrate-group.vue"
 
- export default {
 
-     components: { group },
 
-     props: {
 
-         zIndex: {
 
-             type: [String, Number],
 
-             default: 9
 
-         },
 
-         filtrateList: {
 
-             type: Array,
 
-             default: [{
 
-                 title: "",//组名称
 
-                 key: 'id',//提交时返回的Key
 
-                 showKey: "",//显示的key
 
-                 selected: "",//选择时选择的字段
 
-                 isAll: false,//true 返回整个对象 false 返回selected选中的value
 
-                 value: "",//提交时选中的value
 
-                 defaultVal: "",//默认值
 
-                 rang: "",//选择的范围
 
-                 interrupt: false,//中断
 
-             }]
 
-         },
 
-         onFiltration: {
 
-             type: Function
 
-         },
 
-         onInterrupt: {
 
-             type: Function
 
-         }
 
-     },
 
-     watch: {
 
-         filtrateList: {
 
-             handler: function (newVal) {
 
-                 if (newVal) {
 
-                     this.list = JSON.parse(JSON.stringify(newVal));
 
-                 }
 
-             },
 
-             immediate: true,
 
-         }
 
-     },
 
-     data() {
 
-         return {
 
-             show: false,
 
-             maxHeight: 0,
 
-             index: -99,
 
-             list: [],
 
-         }
 
-     },
 
-     methods: {
 
-         changeShow() {
 
-             this.show = !this.show;
 
-             if (this.show) {
 
-                 this.index = this.zIndex
 
-                 setTimeout(this.setHeight, 10);
 
-             } else {
 
-                 setTimeout(() => { this.index = -99 }, 150)
 
-             }
 
-         },
 
-         setHeight() {
 
-             this.getHeight(".filtrate-box", this).then(res => {
 
-                 this.maxHeight = res - 300;
 
-             });
 
-         },
 
-         onChange(option, index) {
 
-             let item = this.list[index];
 
-             this.$set(item, 'value', item.selected ? option[item.selected] : option);
 
-             try {
 
-                 if (item.isAll) item.selectObj = option;
 
-             } catch (error) { }
 
-             this.$set(this.list, index, item);
 
-             if (item.interrupt) this.$emit("onInterrupt", { item, index, option })
 
-         },
 
-         onReset() {
 
-             this.list = JSON.parse(JSON.stringify(this.filtrateList));
 
-         },
 
-         fast(num, index) {
 
-             return new Promise((resolve) => {
 
-                 let now = new Date().getTime() - 0,
 
-                     end = now + 86400000,
 
-                     beg = end - (num * 86400000);
 
-                 this.list[index].begindate = this.formatTime(new Date(beg)).split(' ')[0];
 
-                 this.list[index].enddate = this.formatTime(new Date(end)).split(' ')[0];
 
-                 this.list[index].day = num;
 
-                 resolve()
 
-             })
 
-         },
 
-         valChange(e, index) {
 
-             this.fast(e.value, index)
 
-         },
 
-         onDateChange(e, index) {
 
-             this[e.target.dataset.name] = e.detail.value;
 
-             let item = this.list[index];
 
-             if (item.begindate && item.enddate) {
 
-                 let end = new Date(item.enddate).getTime(),
 
-                     beg = new Date(item.begindate).getTime();
 
-                 item.day = (end - beg) / 86400000;
 
-             }
 
-             this.list[index] = item;
 
-         },
 
-         onConfirm() {
 
-             let obj = {};
 
-             this.list.forEach(v => {
 
-                 if (v.type == "dateRange") {
 
-                     obj[v.key] = {
 
-                         begindate: v.begindate,
 
-                         enddate: v.enddate,
 
-                     };
 
-                 } else {
 
-                     if (v.value || v.defaultVal) {
 
-                         if (v.isAll) {
 
-                             obj[v.key] = v.rang.find(s => s[v.selected] == v.value) || v.rang.find(s => s[v.selected] == v.defaultVal);
 
-                         } else {
 
-                             obj[v.key] = v.value || v.defaultVal;
 
-                         }
 
-                     } else {
 
-                         obj[v.key] = '';
 
-                     }
 
-                 }
 
-             })
 
-             this.$emit("onFiltration", obj)
 
-             this.changeShow();
 
-         },
 
-     },
 
- }
 
- </script>
 
- <style lang="scss">
 
- .filtrate-box {
 
-     position: relative;
 
-     .scroll-view {
 
-         width: 100vw;
 
-         background: #fff;
 
-     }
 
-     .but-box {
 
-         display: flex;
 
-         justify-content: space-between;
 
-         width: 100vw;
 
-         padding: 10px;
 
-         background: #fff;
 
-         box-sizing: border-box;
 
-         .reset {
 
-             width: 82px;
 
-             height: 45px;
 
-             line-height: 45px;
 
-             text-align: center;
 
-             background: #FFFFFF;
 
-             border-radius: 5px;
 
-             border: 1px solid #999999;
 
-         }
 
-         .confirm {
 
-             width: 263px;
 
-             height: 45px;
 
-             text-align: center;
 
-             line-height: 45px;
 
-             background: #C30D23;
 
-             border-radius: 5px;
 
-             font-size: 16px;
 
-             color: #FFFFFF;
 
-         }
 
-     }
 
-     .shade {
 
-         position: absolute;
 
-         top: 0;
 
-         width: 100vw;
 
-         height: 9999px;
 
-         background: rgba($color: #000000, $alpha: .7);
 
-     }
 
- }
 
- .date-label {
 
-     line-height: 22px;
 
-     font-family: PingFang SC, PingFang SC;
 
-     font-weight: bold;
 
-     font-size: 16px;
 
-     color: #333333;
 
-     padding: 10px;
 
- }
 
- .date-box {
 
-     .active {
 
-         background: #C30D23 !important;
 
-         color: #FFFFFF !important;
 
-     }
 
-     .options {
 
-         display: flex;
 
-         .item {
 
-             display: flex;
 
-             align-items: center;
 
-             justify-content: center;
 
-             background: #F5F5F5;
 
-             border-radius: 4px;
 
-             margin-left: 10px;
 
-             font-size: 14px;
 
-             color: #333333;
 
-             overflow: hidden;
 
-             box-sizing: border-box;
 
-             padding: 6px 12px;
 
-             flex-shrink: 0;
 
-         }
 
-         /deep/ .u-number-box__minus,
 
-         /deep/.u-number-box__input,
 
-         /deep/.u-number-box__plus {
 
-             height: 30px !important;
 
-         }
 
-         /deep/ .u-number-box__input {
 
-             width: 35px !important;
 
-         }
 
-     }
 
-     .row {
 
-         display: flex;
 
-         align-items: center;
 
-         font-size: 14px;
 
-         color: #646566;
 
-         padding: 10px;
 
-         padding-top: 0;
 
-         border-bottom: 1px solid #ddd;
 
-         box-sizing: border-box;
 
-         .date-box {
 
-             flex: 1;
 
-             height: 35px;
 
-             line-height: 35px;
 
-             background: #FFFFFF;
 
-             border-radius: 4px;
 
-             border: 1px solid #CCCCCC;
 
-             font-size: 14px;
 
-             padding-left: 10px;
 
-         }
 
-     }
 
- }
 
- </style>
 
 
  |