zouling 1 年之前
父節點
當前提交
5fc1da92e4
共有 45 個文件被更改,包括 7486 次插入437 次删除
  1. 1 1
      a/code.vue
  2. 16 0
      api/common.js
  3. 8 1
      api/mine/mine.js
  4. 1 0
      api/mine/register.js
  5. 183 0
      api/mine/work.js
  6. 30 66
      components/order/list.vue
  7. 14 29
      components/toptab/tab.vue
  8. 148 0
      components/wait/list.vue
  9. 1 1
      config.js
  10. 63 1
      pages.json
  11. 147 53
      pages/index/index.vue
  12. 127 0
      pages/index/notice.vue
  13. 89 0
      pages/index/noticedetail.vue
  14. 28 13
      pages/mine/index.vue
  15. 1 1
      pages/order/come.vue
  16. 2 2
      pages/order/list.vue
  17. 1 1
      pages/order/staffcode.vue
  18. 14 17
      pages/video/index.vue
  19. 3 2
      static/style.css
  20. 5 1
      store/getters.js
  21. 31 2
      store/modules/user.js
  22. 48 0
      utils/common.js
  23. 4 0
      utils/constant.js
  24. 1 1
      utils/storage.js
  25. 124 0
      work/components/ba-tree-picker/README.md
  26. 658 0
      work/components/ba-tree-picker/ba-tree-pickerfixed.vue
  27. 768 0
      work/components/lunc-calendar/calendar.js
  28. 935 0
      work/components/lunc-calendar/foodlunc-calendar.vue
  29. 940 0
      work/components/lunc-calendar/lunc-calendar.vue
  30. 126 0
      work/components/lunc-calendar/readme.md
  31. 108 0
      work/components/w-select/readme.md
  32. 579 0
      work/components/w-select/w-select.vue
  33. 392 0
      work/components/yuyue/list.vue
  34. 23 15
      work/pages/record/clockin.vue
  35. 44 91
      work/pages/record/detail.vue
  36. 184 0
      work/pages/record/visitor.vue
  37. 121 75
      work/pages/yyorder/eat.vue
  38. 260 0
      work/pages/yyorder/eatlist.vue
  39. 254 0
      work/pages/yyorder/eatlistday.vue
  40. 256 0
      work/pages/yyorder/limit.vue
  41. 337 0
      work/pages/yyorder/limitdetail.vue
  42. 147 64
      work/pages/yyorder/meeting.vue
  43. 264 0
      work/pages/yyorder/meetlist.vue
  44. 二進制
      work/static/yuy/day.png
  45. 二進制
      work/static/yuy/del.png

+ 1 - 1
a/code.vue

@@ -148,7 +148,7 @@
 					this.adrlist = res.data.map(v => {
 						return {
 							dictLabel: v.dictLabel,
-							dictValue: Number(v.dictValue)
+							dictValue: v.dictValue
 						}
 					})
 				}

+ 16 - 0
api/common.js

@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+// 系统通知-列表 system:notice:list
+export function getNoticeList(data) {
+  return request({
+    'url': '/system/notice/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// 系统通知-详情 system:notice:query
+export function getNoticeDet(data) {
+  return request({
+    'url': '/system/notice/'+data,
+    'method': 'get',
+  })
+}

+ 8 - 1
api/mine/mine.js

@@ -36,5 +36,12 @@ export function getDeptdetFn(data) {
     'method': 'get',
   })
 }
-
+//部门
+export function getDeptFn(data) {
+  return request({
+    url: '/system/user/deptTree',
+    method: 'get',
+	'data':data
+  })
+}
 

+ 1 - 0
api/mine/register.js

@@ -38,6 +38,7 @@ export function getconfigKeyFn(data) {
 
 
 
+
 
 
 // // 流程发起时获取下一节点

+ 183 - 0
api/mine/work.js

@@ -0,0 +1,183 @@
+import request from '@/utils/request'
+// 列表-会议室 system:room:list
+export function getRoomList(data) {
+  return request({
+    'url': '/conference/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// 列表-会议室不分页 system:room:listNoPage
+export function getRoomNoList(data) {
+  return request({
+    'url': '/conference/listNoPage',
+    'method': 'get',
+	'data':data
+  })
+}
+// 列表-会议室预约 system:order:list
+export function getRoomyyList(data) {
+  return request({
+    'url': '/conferenceOrder/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// -新增-会议室预约 system:order:add
+export function getRoomyyAdd(data) {
+  return request({
+    'url': '/conferenceOrder',
+    'method': 'post',
+	'data':data
+  })
+}
+// 修改-会议室预约 system:order:edit
+export function getRoomyyPut(data) {
+  return request({
+    'url': '/conferenceOrder/put',
+    'method': 'post',
+	'data':data
+  })
+}
+// 删除-会议室预约 system:order:remove
+export function getRoomyyDel(data) {
+  return request({
+    'url': '/conferenceOrder/delete/'+data,
+    'method': 'get',
+  })
+}
+
+// 详情-会议室预约 system:order:query
+export function getRoomyyDetail(data) {
+  return request({
+    'url': '/conferenceOrder/'+data,
+    'method': 'get',
+  })
+}
+
+// 列表-订餐 system:food:list
+export function getFoodList(data) {
+  return request({
+    'url': '/food/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// -新增-订餐 system:food:add
+export function getFoodAdd(data) {
+  return request({
+    'url': '/food',
+    'method': 'post',
+	'data':data
+  })
+}
+// 修改-订餐 system:food:edit
+export function getFoodPut(data) {
+  return request({
+    'url': '/food/put',
+    'method': 'post',
+	'data':data
+  })
+}
+// 删除-订餐 system:food:remove
+export function getFoodDel(data) {
+  return request({
+    'url': '/food/delete/'+data,
+    'method': 'get',
+  })
+}
+
+// 详情-订餐 system:food:query
+export function getFoodDetail(data) {
+  return request({
+    'url': '/food/'+data,
+    'method': 'get',
+  })
+}
+// 日历-订餐 system:food:list
+export function getFoodRiLi(data) {
+  return request({
+    'url': '/food/riLi',
+    'method': 'get',
+	'data':data
+  })
+}
+// 打卡记录-列表 system:clock:list
+export function getClockList(data) {
+  return request({
+    'url': '/system/clock/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// 打卡记录-详情 system:clock:query
+export function getClockDetail(data) {
+  return request({
+    'url': '/system/clock/'+data,
+    'method': 'get',
+  })
+}
+// 打卡记录-日历 system:clock:rl
+export function getClockRl(data) {
+  return request({
+    'url': '/system/clock/rl',
+    'method': 'get',
+	'data':data
+  })
+}
+
+// 访问信息-列表 system:record:list
+export function getRecordList(data) {
+  return request({
+    'url': '/system/record/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// 访问信息-删除 system:record:list
+export function getRecordDel(data) {
+  return request({
+    'url': '/system/record/delete/'+data,
+    'method': 'get',
+  })
+}
+
+// 查询人员信息列表system:management:list
+export function getManagementList(data) {
+  return request({
+    'url': '/system/management/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// -新增人员信息 system:management:add
+export function getManagementAdd(data) {
+  return request({
+    'url': '/system/management',
+    'method': 'post',
+	'data':data
+  })
+}
+// 修改人员信息 system:management:edit
+export function getManagementPut(data) {
+  return request({
+    'url': '/system/management/put',
+    'method': 'post',
+	'data':data
+  })
+}
+// 删除人员信息 system:management:remove
+export function getManagementDel(data) {
+  return request({
+    'url': '/system/management/delete/'+data,
+    'method': 'get',
+  })
+}
+
+// 查询人员信息 system:management:query
+export function getManagementDetail(data) {
+  return request({
+    'url': '/system/management/'+data,
+    'method': 'get',
+  })
+}

+ 30 - 66
components/order/list.vue

@@ -38,49 +38,15 @@
 			</view>
 		</block>
 		<!-- 视频 -->
-		<block v-if="type=='video'">
-			<view class="ylist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<image :src="ysta" class="ystaimg" v-if="ite.visitType==3"></image>
-				<image :src="ystb" class="ystaimg" v-if="ite.visitType==2"></image>
-				<view class="ytop flexc">
-					<view class="tit">{{ite.visitName.charAt(0)}}</view>
-					<view class="cent">
-						<view class="ctit">{{ite.visitName}}提交的预约来访申请</view>
-						<view class="ctime">提交时间:{{ite.createTime}}</view>
-					</view>
-					<view class="right" v-if="ite.visitType==1">
-						<image :src="ybg"></image>
-						<view>待审核</view>
-					</view>
-				</view>
-				<view class="ybox">
-					<view class="yblist mw50"><text>预约日期</text>{{ite.visitDate}}</view>
-					<view class="yblist mw50"><text>预约时间</text>{{ite.visitTime}}</view>
-					<view class="yblist mw50"><text>手机号码</text>{{ite.visitPhone}}</view>
-					<view class="yblist mw50"><text>人 数</text>{{ite.visitNum}}</view>
-					<view class="yblist mw50"><text>来访地点</text>{{kaType(ite.appointmentSite,adrlist)}}</view>
-					<view class="yblist mw50"><text>来访事由</text>{{ite.visitReason}}</view>
-				</view>
-				<view class="ybtn">
-					<view class="ybtns btn1" @click.stop="getDelFn(ite.reservatId)">删除</view>
-					<view class="flex1"></view>
-					<block v-if="ite.visitType==1">
-						<view class="ybtns btn2" @click.stop="gettypeFn(2,ite.reservatId)">拒绝</view>
-						<view class="ybtns btn3" @click.stop="gettypeFn(3,ite.reservatId)">同意</view>
-					</block>
-					
-				</view>
-			</view>
-		</block>
 		<!-- 打卡记录 -->
 		<block v-if="type=='record'">
-			<view class="ylist rlist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
+			<view class="ylist rlist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.clockId)">
 				<view class="rtop mb15 flexcj">
 					<view class="rlistl flexc">
 						<image :src="time"></image>
-						<view>07-18 / 星期四</view>
+						<view>{{ite.recordTime}} / {{ite.week}}</view>
 					</view>
-					<view class="right" v-if="ite.visitType==1">
+					<view class="right" v-if="ite.type=='N'">
 						<image :src="ybga"></image>
 						<view>缺卡</view>
 						<!-- <view>迟到</view> -->
@@ -92,8 +58,14 @@
 						<view class="rboxb">
 							<view class="tit">上班08:30</view>
 							<view class="time flexc">
-								<image :src="chose"></image>
-								08:21已打卡
+								<block v-if="ite.workingTime">
+									<image :src="chose"></image>
+									{{ite.workingTime}}已打卡
+								</block>
+								<block v-else>
+									<image :src="close"></image>
+									未打卡
+								</block>
 							</view>
 						</view>
 					</view>
@@ -102,39 +74,21 @@
 						<view class="rboxb">
 							<view class="tit">下班17:30</view>
 							<view class="time flexc">
-								<image :src="close"></image>
-								缺卡
-								<!-- 未打卡 -->
+								<block v-if="ite.dutyTime">
+									<image :src="chose"></image>
+									{{ite.dutyTime}}已打卡
+								</block>
+								<block v-else>
+									<image :src="close"></image>
+									未打卡
+								</block>
+								<!-- 缺卡 -->
 							</view>
 						</view>
 					</view>
 				</view>
 			</view>
 		</block>
-		<!-- 打卡列表 -->
-		<block v-if="type=='clock'">
-			<view class="ylist rlist" style="padding-top: 12rpx;" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="ytop flexc">
-					<view class="tit">{{ite.visitName.charAt(0)}}</view>
-					<view class="cent">
-						<view class="ctit">{{ite.visitName}}的打卡记录</view>
-						<view class="ctime">最新打卡:{{ite.createTime}}</view>
-					</view>
-					<view class="rights" v-if="ite.visitType==1">
-						<image :src="ybga"></image>
-						<view>缺卡</view>
-						<!-- <view>迟到</view> -->
-					</view>
-				</view>
-				<view class="ybox">
-					<view class="yblist mw50 line"><text>上班打卡</text>08:31已打卡
-						<view class="tip">迟到</view>
-					</view>
-					<view class="yblist mw50"><text>下班打卡</text>17:31已打卡
-					</view>
-				</view>
-			</view>
-		</block>
 		<view class="shax" v-if="wtdt">{{wtdt}}</view>
 	</view>
 	<block v-else>
@@ -280,6 +234,7 @@ font-size: 34rpx;color: #FFFFFF;margin-right: 18rpx;text-align: center;line-heig
 		color: #FFFFFF;position: absolute;left: 0;top: 0;right: 0;bottom: 0;text-align: center;padding-left: 20rpx;box-sizing: border-box;line-height: 38rpx;}
 		}
 	}
+	.ytit{font-weight: bold;font-size: 28rpx;color: #161616;flex: 1;}
 	.ybox{padding: 0rpx 24rpx 24rpx 16rpx;display: flex;flex-wrap: wrap;
 		.yblist{display: flex;font-size: 24rpx;font-weight: 500;color: #161616;padding: 6rpx 0 6rpx 8rpx;line-height: 40rpx;position: relative;
 			text{font-weight: normal;color: #aaa;flex: 0 0 auto;width: 100rpx;text-align-last: justify;margin-right: 12rpx;}
@@ -293,6 +248,15 @@ font-size: 34rpx;color: #FFFFFF;margin-right: 18rpx;text-align: center;line-heig
 				
 			}
 		}
+		.listsm{padding: 28rpx 10rpx 2rpx 0;width: 100%;border-top: 2rpx solid #DADADA;
+			.tit{margin-right: 8rpx;flex: 0 0 auto;min-width:110rpx;text-align-last: justify;margin-right: 20rpx;color: #aaa;}
+			.line{margin-right: 8rpx;color: #aaaaaa;flex: 0 0 auto;}
+			.txt{font-size: 26rpx;color: #161616;margin-bottom: 16rpx;display: flex;padding-left: 10rpx;}
+			.flexcw{
+				display: flex;align-items: center;flex-wrap: wrap;
+				.txt{min-width: 50%;}
+			}
+		}
 	}
 	.ybtn{border-top: 2rpx solid #DADADA;padding: 20rpx 18rpx;display: flex;align-items: center;
 		.ybtns{width: 130rpx;border-radius: 6rpx;height: 52rpx;font-weight: 500;font-size: 26rpx;display: flex;align-items: center;justify-content: center;box-sizing: border-box;flex: 0 0 auto;

+ 14 - 29
components/toptab/tab.vue

@@ -3,24 +3,19 @@
 		<block v-for="(ite,idx) in tablist" :key='idx'>
 			<block v-if='ite.limt'>
 				<view class="tit" :style="'height:'+height+'rpx'" :class="tabidx==ite.val?'act':''" @click="getTab(ite.val)" v-if="checkPermi([ite.limt])">
-					<view class="f16 fw mb6 tits" >{{ite.tit}}</view>
-					<view class="f500 f14 txt" v-if="ite.txt||ite.txt==0">{{ite.txt}}</view>
-					<image :src="tapline" class="line"></image>
+					{{ite.tit}}
 				</view>
 			</block>
 			<block v-else>
 				<view class="tit" :style="'height:'+height+'rpx'" :class="tabidx==ite.val?'act':''" @click="getTab(ite.val)" >
-					<view class="f16 fw mb6 tits" >{{ite.tit}}</view>
-					<view class="f500 f14 txt" v-if="ite.txt||ite.txt==0">{{ite.txt}}</view>
-					<image :src="tapline" class="line"></image>
-				</view>
-				
+					{{ite.tit}}
+				</view>	
 			</block>
 		</block>
 		<!-- 切换按钮 -->
-		<view :style="'height:'+height+'rpx'" class="chebox" @click="getroleFn" v-if="checkPermi(['register:teacher:list'])&&tabbtn">
+		<!-- <view :style="'height:'+height+'rpx'" class="chebox" @click="getroleFn" v-if="checkPermi(['register:teacher:list'])&&tabbtn">
 			<image :src="micone"></image>
-		</view>
+		</view> -->
 	</view>
 </template>
 
@@ -47,17 +42,15 @@
 				}
 			},
 			tabidx:{
-				type: Number,
+				type: [String,Number],
 				default () {
-					return 0
+					return ''
 				}
 			}
 		},
 		data(){
 			return{
 				// :0,
-				tapline:require("@/static/images/hline.png"), 
-				micone:require("@/static/images/micone.png"),
 			}
 		},
 		mounted() {
@@ -78,22 +71,14 @@
 
 <style lang="scss">
 	.listtopb{
-		background-color: #ffffff;
-		 .tit{flex: 1;display: flex;flex-direction: column;justify-content: center;position: relative;
-			view{text-align: center;}
-			.tits{color: #AAAAAA ;}
-			.txt{color: #aaaaaa;}
-			.line{width: 40rpx;height: 12rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: 6rpx;display: none;}
-		 &.act{
-			 // &::after{content: '';width: 100rpx;height: 6rpx;background:#FE5706 ;position: absolute;left: 50%;margin-left: -50rpx;bottom: 0;}
-			.tits{color: #161616;}
-			.txt{color: #FE5706;}
-			.line{display: block;}
+		background-color:#00A9F0;
+		 .tit{flex: 1;display: flex;justify-content: center;position: relative;font-weight: 500;align-items: center;
+font-size: 26rpx;
+color: #FFFFFF;
+			&.act{font-weight: bold;font-size: 30rpx;
+			 &::after{content: '';width: 30rpx;height: 10rpx;background:#FFFFFF;position: absolute;left: 50%;margin-left: -10rpx;bottom: 16rpx;border-radius: 4rpx;}
+			
 			}
 		 }
-		.chebox{width: 96rpx;background: #FFFFFF;
-box-shadow: -10rpx 0rpx 10rpx 0rpx rgba(196,191,191,0.22);display: flex;align-items: center;justify-content: center;
-			image{width: 30rpx;height: 26rpx;}
-		}
 	}
 </style>

+ 148 - 0
components/wait/list.vue

@@ -0,0 +1,148 @@
+<template>
+  <view>
+	<view v-if="datalist.length>0">
+	<!-- 代办提醒 -->
+		<block v-if="type=='dbtx'">
+			<view class="watlist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite)">
+				<view class="tit flex1 over">{{ite.remindTitle}}</view>
+				<view class="txt flex0">{{ite.remindTime}}</view>
+			</view>
+		</block>
+		<!-- 系统通知 -->
+		<block v-if="type=='xxtz'">
+			<view class="cards" v-for="(ite,idx) in datalist" :key="idx" @click="getDetail(ite.noticeId)">
+				<view class="top flexc">
+					<view class="cir bga"></view>
+					<view class="tit">系统通知</view>
+					<view class="time">{{ite.createTime}}</view>
+				</view>
+				<view class="ctxt">
+					<view>{{ite.noticeContent}}</view>
+					<view class="tzhu">{{ite.noticeTitle}}</view>
+				</view>
+			</view>
+			<view class="shax" v-if="wtdt">{{wtdt}}</view>
+		</block>
+		<!-- 代办通知 -->
+		<block v-if="type=='dbtz'">
+			<view class="cards" v-for="(ite,idx) in datalist" :key="idx" @click="getDetail(ite.remindId)">
+				<view class="top flexc">
+					<view class="cir bgb"></view>
+					<view class="tit">待办通知</view>
+					<view class="time">{{ite.remindTime}}</view>
+				</view>
+				<view class="ctxt">
+					<view>
+						{{ite.remindContent}}
+						<!-- 您有<text class="cof6">1</text>条来自【潜山弘立新型建材有限公司】的申报信 息,请您前往审核。 -->
+					</view>
+					<view class="tzhu">祝您生活愉快!</view>
+				</view>
+			</view>
+			<view class="shax" v-if="wtdt">{{wtdt}}</view>
+		</block>
+		
+	</view>
+	<block v-else>
+		<no-data></no-data>
+	</block>
+  </view>
+</template>
+
+<script>
+	import { selectDictValue } from '@/utils/common.js';
+	import noData from "@/components/nodata/nodata.vue"
+  export default {
+	props:{
+		datalist: {
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		wtdt:{
+			type: String,
+			default () {
+				return ''
+			}
+		},
+		type:{
+			type: [String,Number],
+			default () {
+				return ''
+			}
+		},
+	},
+	components:{
+		noData
+	},
+	data(){
+		return{
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		kaType(data, list) {
+			return selectDictValue(list, data);
+		},
+		getDelFn(id){
+			var that=this;
+			uni.showModal({
+				title: '确认删除',
+				content: "是否确认删除该预约",
+				cancelText: '取消',
+				confirmText: '确认',
+				success: function(res) {
+					if (res.confirm) {
+						that.$emit("getDelFn",id)
+					} else if (res.cancel) {
+						// console.log('用户点击取消');
+					}
+				}
+			});
+		},
+		getDetail(e){
+			this.$emit('getDetail',e)
+		},
+		typeFn(data){
+			if(data){
+				var newArr=[]
+				var astr=data.split('-')
+				astr.forEach(ite=>{
+					var a=ite.substring(0,5);
+					newArr.push(a)
+				})
+				return newArr.join('-')
+			}else{
+				return ''
+			}
+			
+			
+		},
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.watlist{display: flex;align-items: center;padding: 20rpx 34rpx;
+	.tit{font-weight: 500;font-size: 28rpx;color: #222327;line-height: 40rpx;}
+	.txt{font-weight: 500;font-size: 24rpx;color: #AAAAAA;margin-left: 20rpx;}
+}
+.cards{width: 702rpx;background: #FFFFFF;border-radius: 10rpx;margin: 0 auto 24rpx;
+	.top{padding: 26rpx 34rpx;
+		.cir{width: 20rpx;height: 20rpx;flex: 0 0 auto;margin-right: 20rpx;border-radius: 20rpx;
+			&.bga{background: #28C529;}
+			&.bgb{background: #FF6969;}
+		}
+		.tit{flex: 1;font-weight: bold;font-size: 26rpx;color: #343434;line-height: 36rpx;}
+		.time{font-weight: 500;font-size: 26rpx;flex: 0 0 auto;margin-right: 20rpx;color: #222327;}
+	}
+	.ctxt{font-weight: 500;font-size: 26rpx;color: #666666;border-top: 2rpx solid #E5E5E5;padding: 34rpx;
+		view{line-height: 36rpx;}
+		.tzhu{margin-top: 28rpx;}
+	}
+
+}
+</style>

+ 1 - 1
config.js

@@ -3,7 +3,7 @@ module.exports = {
   // baseUrl: 'https://vue.ruoyi.vip/prod-api',
   // baseUrl: 'https://lyyy.qs163.cn/prod-api',
   baseUrl: 'http://192.168.101.168:8065',
-  // baseUrl: 'http://192.168.101.11:8089',
+  // baseUrl: 'http://192.168.101.245:8065',
   // baseUrlimg: 'http://114.99.127.243:2001',
   Clientid:'428a8310cd442757ae699df5d894f051',//
  // https://xygl.cnzxy.cn h5链接地址

+ 63 - 1
pages.json

@@ -125,7 +125,27 @@
       "navigationBarTitleText": "我的",
 	  "navigationStyle": "custom"
     }
-  }, 
+  },
+   {
+     "path": "pages/index/notice",
+     "style": {
+       "navigationBarTitleText": "消息",
+       "navigationBarBackgroundColor": "#00A9F0",
+   	"navigationBarTextStyle": "white",
+   	"h5":{
+   		"titleNView":false
+   		}
+     }},
+     {
+       "path": "pages/index/noticedetail",
+       "style": {
+         "navigationBarTitleText": "消息详情",
+         "navigationBarBackgroundColor": "#00A9F0",
+     	"navigationBarTextStyle": "white",
+     	"h5":{
+     		"titleNView":false
+     		}
+       }},
   {
     "path": "pages/mine/avatar/index",
     "style": {
@@ -193,6 +213,20 @@
 					"navigationStyle": "custom"
 				}
 			},
+			{
+				"path": "pages/yyorder/eatlist",
+				"style": {
+					"navigationBarTitleText": "我的就餐预订",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "pages/yyorder/eatlistday",
+				"style": {
+					"navigationBarTitleText": "我的就餐预订",
+					"navigationStyle": "custom"
+				}
+			},
 			{
 				"path": "pages/yyorder/meeting",
 				"style": {
@@ -200,6 +234,27 @@
 					"navigationStyle": "custom"
 				}
 			},
+			{
+				"path": "pages/yyorder/meetlist",
+				"style": {
+					"navigationBarTitleText": "我的会议预订",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "pages/yyorder/limit",
+				"style": {
+					"navigationBarTitleText": "人员权限",
+					"navigationStyle": "custom"
+				}
+			},
+			{
+				"path": "pages/yyorder/limitdetail",
+				"style": {
+					"navigationBarTitleText": "人员权限",
+					"navigationStyle": "custom"
+				}
+			},
 			{
 				"path": "pages/record/clockin",
 				"style": {
@@ -213,6 +268,13 @@
 					"navigationBarTitleText": "打卡记录",
 					"navigationStyle": "custom"
 				}
+			},
+			{
+				"path": "pages/record/visitor",
+				"style": {
+					"navigationBarTitleText": "访客记录",
+					"navigationStyle": "custom"
+				}
 			}
 		]
   	}

+ 147 - 53
pages/index/index.vue

@@ -16,9 +16,9 @@
 				<view class="yqtopr">
 					<view class="flexc mb4">
 						<image class="wimg" :src="weathericon"></image>
-						<view class="txt ml6">7月18日</view>
+						<view class="txt ml6">{{daytime}}</view>
 					</view>
-					<view class="txt">农历六月十三</view>
+					<view class="txt">{{lunar}}</view>
 				</view>
 			</view>
 			<!-- 卡片 -->
@@ -26,9 +26,9 @@
 				<view class="yqctop flexcj">
 					<view class="yqctopl flexc">
 						<image :src="headimg"></image>
-						<view class="over">何小西</view>
+						<view class="over">{{name}}</view>
 					</view>
-					<view class="yqctopr flexcc">
+					<view class="yqctopr flexcc" @click="getNoticeFn">
 						<image :src="newsimg"></image>
 						<view class="tit">消息</view>
 						<view class="cir"></view>
@@ -36,31 +36,31 @@
 				</view>
 				<view class="pdlr2">
 					<view class="yqcbox">
-						<view class="yqcba" @click="getClockFn">
+						<view class="yqcba" v-if="checkPermi(['system:clock:list'])" @click="getClockFn">
 							<view class="aimg"><image :src="htabaimg" class="imga"></image></view>
 							<view class="atit">打卡记录</view>
 						</view>
-						<view class="yqcba" @click="getMeetFn">
+						<view class="yqcba" v-if="checkPermi(['system:order:add'])" @click="getMeetFn">
 							<view class="aimg"><image :src="htabbimg" class="imgb"></image></view>
 							<view class="atit">会议预订</view>
 						</view>
-						<view class="yqcba" @click="getEatFn">
+						<view class="yqcba" v-if="checkPermi(['system:food:add'])" @click="getEatFn">
 							<view class="aimg"><image :src="htabcimg" class="imgc"></image></view>
 							<view class="atit">订餐预订</view>
 						</view>
-						<view class="yqcba">
+						<!-- <view class="yqcba">
 							<view class="aimg"><image :src="htabdimg" class="imgd"></image></view>
 							<view class="atit">访客预约</view>
-						</view>
-						<view class="yqcba">
+						</view> -->
+						<view class="yqcba" v-if="checkPermi(['system:reservat:list'])" @click="getMoreFn">
 							<view class="aimg"><image :src="htabeimg" class="imge"></image></view>
 							<view class="atit">预约管理</view>
 						</view>
-						<view class="yqcba">
+						<view class="yqcba" v-if="checkPermi(['system:management:list'])" @click="getLimitFn">
 							<view class="aimg"><image :src="htabfimg" class="imgf"></image></view>
 							<view class="atit">访客管理</view>
 						</view>
-						<view class="yqcba">
+						<view class="yqcba" v-if="checkPermi(['system:record:list'])" @click="getVistotFn">
 							<view class="aimg"><image :src="htabgimg" class="imgg"></image></view>
 							<view class="atit">访客记录</view>
 						</view>
@@ -143,26 +143,26 @@
 					</view>
 				</view>
 			</view>
-			<!-- 管理员 -->
-			<view class="yylists">
+			<!-- 普通用户 -->
+			<view class="yylists" v-if="!checkRole(['manager'])">
 				<view class="yyltab flexcj">
-					<view class="left flexc">待审批列表<image :src="listline"></image></view>
-					<view class="right" @click="getMoreFn">查看更多 >></view>
+					<view class="left flexc">本周打卡记录<image :src="listline"></image></view>
+					<view class="right" @click="getmClockFn">查看更多 >></view>
 				</view>
 				<!-- 列表 -->
 				<view>
-					<y-list type='order' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :adrlist="adrlist" @getDelFn="getDelFn" @gettypeFn="gettypeFn"></y-list>
+					<y-list type='record' :datalist="list" :wtdt="wtdt" @getDetail='getClockDetailFn' :adrlist="adrlist" @getDelFn="getDelFn" @gettypeFn="gettypeFn"></y-list>
 				</view>
 			</view>
-			<!-- 普通用户 -->
-			<view class="yylists">
+			<!-- 管理员 -->
+			<view class="yylists" v-else>
 				<view class="yyltab flexcj">
-					<view class="left flexc">本周打卡记录<image :src="listline"></image></view>
+					<view class="left flexc">待审批列表<image :src="listline"></image></view>
 					<view class="right" @click="getMoreFn">查看更多 >></view>
 				</view>
 				<!-- 列表 -->
 				<view>
-					<y-list type='record' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :adrlist="adrlist" @getDelFn="getDelFn" @gettypeFn="gettypeFn"></y-list>
+					<y-list type='order' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :adrlist="adrlist" @getDelFn="getDelFn" @gettypeFn="gettypeFn"></y-list>
 				</view>
 			</view>
 		</view>
@@ -179,6 +179,8 @@
 	let { calendar } = require("@/components/lunc-calendar/calendar.js");
 	import {getReservatcountl,getReservatList,getReservatDel,getReservatSh} from "@/api/mine/order.js"
 	import {getDictionaryFn} from "@/api/mine/register.js"
+	import {getNoticeList} from "@/api/common.js"
+	import {getClockList} from "@/api/mine/work.js"
 	import footers from '@/components/footer/footer.vue'
   export default {
 	components:{notice,yList,footers},
@@ -215,10 +217,8 @@
 			city:'',
 			weather:'',
 			temperature:'',
-			list:[{visitType:1,visitName:'王一',createTime:"2024-01-20 17:12:38",visitDate:"2024-01-21",
-			visitTime:'10:00 - 11:00',visitPhone:'18956988888',visitNum:'1',appointmentSite:"总经理办公室",visitReason:'会议'
-			}],
-			noticelist:[{noticeTitle:'您今日还未订餐喔,请立即前往预订…',createTime:'07-17'},{noticeTitle:'您今日还未订餐喔,请立即前往预订…',createTime:'07-17'}],
+			list:[],
+			noticelist:[],
 			adrlist:[],
 			pageSize: 10,
 			pageNum: 1,
@@ -230,7 +230,11 @@
 			daytime:'',
 			lunar:'',
 			weathericon:require("@/static/images/weather/weaionf.png"),
-			
+			userId:this.$store.state.user.userId,
+			name:this.$store.state.user.name,
+			startDate:'',
+			endDate:'',
+			kaTime:'',
 		}
 	},
 	onPageScroll(e) {
@@ -252,6 +256,7 @@
 				this.marTop=692-Number(this.nvaHeight*2)-16;
 			}
 		})
+		this.getNoticeList()
 		return
 		uni.$on('refreshdatalist',(e) => {
 			this.reachflag=false;
@@ -262,8 +267,9 @@
 		})
 		
 		this.init()
+		this.getNoticeList()
 		// this.getcount()
-		this.getDataFn()
+		
 		uni.getSystemInfo({
 			success: (e) => {
 				this.stubarHeight=Number(e.statusBarHeight);
@@ -279,6 +285,7 @@
 	onShow() {
 		var that=this;
 		this.time();
+		this.getWeeksDay()
 		// #ifndef H5
 		self.getLocation(function(res){
 			if(res==-1){
@@ -323,6 +330,9 @@
 		getNoticeDet(e){
 			// this.$tab.navigateTo("/pages/index/noticedetail?type=xttz&id="+e)
 		},
+		getNoticeFn(e){
+			this.$tab.navigateTo("/pages/index/notice")
+		},
 		//打卡记录
 		getClockFn(){
 			this.$tab.navigateTo("/work/pages/record/clockin")
@@ -335,6 +345,14 @@
 		getMeetFn(){
 			this.$tab.navigateTo("/work/pages/yyorder/meeting")
 		},
+		//访客记录
+		getVistotFn(){
+			this.$tab.navigateTo("/work/pages/record/visitor")
+		},
+		// 访客管理
+		getLimitFn(){
+			this.$tab.navigateTo("/work/pages/yyorder/limit")
+		},
 		init(){
 			// 记录来源
 			getDictionaryFn('jluly').then(res=>{
@@ -342,15 +360,26 @@
 					this.adrlist = res.data.map(v => {
 						return {
 							dictLabel: v.dictLabel,
-							dictValue: Number(v.dictValue)
+							dictValue: v.dictValue
 						}
 					})
 				}
 			})
 		},
+		getNoticeList(){
+			getNoticeList().then(res=>{
+				if(res.code==200){
+					this.noticelist=res.rows
+				}
+			})
+		},
 		getMoreFn(){
 			this.$tab.navigateTo("/pages/order/list")
 		},
+		// 打卡记录
+		getmMoreFn(){
+			this.$tab.navigateTo("/pages/order/list")
+		},
 		getDelFn(id){
 			var that=this;
 			getReservatDel(id).then(res=>{
@@ -398,19 +427,44 @@
 			var d = date.getDate();
 			let lunar = calendar.solar2lunar(y, m, d); //农历
 			this.lunar=lunar.IMonthCn+lunar.IDayCn;
-			this.daytime=m+'月'+d+"日";
+			this.daytime=(m < 10 ? ('0' + m) : m)+'月'+(d < 10 ? ('0' + d) : d)+"日";
 			// var h = date.getHours();
 			// var min = date.getMinutes();
 			// var s = date.getSeconds();
 			// var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
 			// var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
-			// var yearStr = y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d)
+			var yearStr = y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d)
 			// var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
 			// 	'0' + s) : s);
-			// this.kaTime = yearStr + ' ' + timeStr;
+			this.kaTime = yearStr
+		},
+		getWeeksDay(){
+			var date = new Date();
+			var y = date.getFullYear();
+			var m = date.getMonth();
+			var d = date.getDate();
+			var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
+			var startDate,endDate
+			if(week==0){
+				startDate=new Date(y,m,d-week-6)
+				endDate=new Date(y,m,d-week)
+			}else{
+				startDate=new Date(y,m,d-week+1)
+				endDate=new Date(y,m,d-week+7)
+			}
+			this.startDate=this.formatDate(startDate)
+			this.endDate=this.formatDate(endDate)
+			this.getDataFn()
+			// console.log(this.formatDate(startDate),this.formatDate(endDate))
+		},
+		formatDate(date){
+			const year = date.getFullYear();
+			const month = ('0' + (date.getMonth() + 1)).slice(-2);
+			const day = ('0' + date.getDate()).slice(-2);
+		 
+			return year + '-' + month + '-' + day;
 		},
 		getcount(){
-			
 			getReservatcountl().then(res=>{
 				if(res.code==200){
 					this.conuntinfo=res.data
@@ -422,37 +476,77 @@
 		getDetail(data){
 			this.$tab.navigateTo('/pages/order/staffcode?type=look&id='+data)
 		},
+		getClockDetailFn(){
+			var obj={
+				userId:this.userId,
+				recordTime:this.kaTime
+			}
+			this.$tab.navigateTo('/work/pages/record/detail?data='+encodeURIComponent(JSON.stringify(obj)))
+		},
 		getDataFn(){
 			var params={
 				pageSize:this.pageSize,
 				pageNum: this.pageNum,
-				// visitType:3
+				visitType:1
 			}
-			getReservatList(params).then(res=>{
-				if(res.code==200){
-					if (res.rows.length < this.pageSize) {
-						this.reachflag = false
-						this.wtdt = '到底了~';
-					} else {
-						var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
-						if (num < res.total) {
-							this.reachflag = true
-							this.wtdt = '上拉加载更多'
-						} else {
+			
+			if(!checkRole(['manager'])){
+				// 个人
+				params.userId=this.userId;
+				params.startTime=this.startDate;
+				params.endTime=this.endDate;
+				getClockList(params).then(res=>{
+					if (res.code == 200) {
+						if (res.rows.length < this.pageSize) {
 							this.reachflag = false
 							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
+								1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = '上拉加载更多'
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
 						}
-					}
-					if (this.pageNum == 1) {
-						this.list = res.rows;
 					} else {
-						this.list = this.list.concat(res.rows)
+						this.$toast(res.msg)
 					}
-				}else{
-					this.$toast(res.msg)
-				}
-			}) 
-			
+				})
+			}else{
+				// 管理员
+				getReservatList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = '上拉加载更多'
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				}) 
+			}	
 		},
 	},
 	

+ 127 - 0
pages/index/notice.vue

@@ -0,0 +1,127 @@
+<template>
+	<view class="notice" :style="tabidx=='dbtz'?'padding-top:188rpx;':'padding-top:100rpx;'">
+		<view class="pfixed" style="background: transparent;">
+			<tab-list :tablist="tzlxlist" :height="height" :tabidx="tabidx" @getCheck="getCheck"></tab-list>
+		</view>
+		<view class="mt12">
+			<wait-list type='xxtz' :datalist="list" :wtdt="wtdt"  @getDetail="getDetail"></wait-list>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import {getNoticeList} from "@/api/common.js"
+	import {getDictionaryFn} from "@/api/mine/register.js"
+	import waitList from "@/components/wait/list.vue"
+	import tabList from '@/components/toptab/tab.vue'
+	export default{
+		components:{tabList,waitList},
+		data(){
+			return{
+				tzlxlist:[],
+				tabidx:'',
+				height:100,
+				scroflag:false,
+				list:[],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				userId:this.$store.state.user.userId,
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			// var listTop=Number(this.listTop)-Number(this.nvaHeight)
+			if(scrollTop>2){
+				this.scroflag=true
+			}else{
+				this.scroflag=false
+			}
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		onLoad(e) {
+			if(e.type){
+				this.tabidx=e.type
+			}
+			this.init();
+		},
+		methods:{
+			checkPermi, checkRole,
+			init(){
+				// 通知类型
+				getDictionaryFn('sys_notice_type').then(res=>{
+					if(res.code==200){
+						if(res.data&&res.data.length>0){
+							this.tabidx=res.data[0].dictValue;
+							this.getDataFn()
+							this.tzlxlist = res.data.map(v => {
+								return {
+									tit: v.dictLabel,
+									val: v.dictValue
+								}
+							})
+						}
+					}
+				})
+			},
+			getCheck(val){
+				this.tabidx=val;
+				this.getrefreshData()
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getDetail(e){
+				this.$tab.navigateTo("/pages/index/noticedetail?type="+this.tabidx+'&id='+e)
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.notice /deep/	uni-picker{flex: 1;}
+
+</style>

+ 89 - 0
pages/index/noticedetail.vue

@@ -0,0 +1,89 @@
+<template>
+	<view class="detail">
+		<view class="detbox">
+			<view class="detboxa">
+				<!-- <view class="tit ffz txc">{{title}}</view> -->
+				<view class="txt">{{noticeTitle}}</view>
+				<view class="time"><block v-if="createTime">发布时间: {{createTime}}</block></view>
+				<view class="dbox">
+					<rich-text :nodes="infoContent"></rich-text>
+				</view>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+		import {getNoticeDet} from "@/api/common.js"
+	import config from '@/config'
+	const baseUrlimg=config.baseUrl
+	export default{
+		components:{},
+		data(){
+			return{
+				// newsid:'',
+				// datainfo:'',
+				// title:"新闻资讯",
+				infoContent:'',
+				id:'',
+				ptype:'',
+				noticeTitle:'',
+				createTime:'',
+			}
+		},
+		onLoad(e) {
+			this.id=e.id;
+			this.ptype=e.type;
+			this.getNewsDetail(e.id)
+		},
+		methods:{
+			getNewsDetail(id){
+				getNoticeDet(id).then(res=>{
+					if(res.code==200){
+						this.noticeTitle=res.data.noticeTitle;
+						this.createTime=res.data.createTime;
+						if(res.data.noticeContent){
+							this.infoContent=this.formatRichText(res.data.noticeContent);
+						}
+					}
+				})
+				
+			},
+			//解析富文本方法
+			formatRichText(html) {
+					let newContent = html.replace(/<img[^>]*>/gi, function(match, capture) {
+						match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '').replace(/style=""/gi, '');
+						match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
+						match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
+						return match;
+					});
+					newContent = newContent.replace(/style="[^"]+"/gi, function(match, capture) {
+						match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi, 'max-width:100%;');
+						return match;
+					});
+					newContent = newContent.replace(/<br[^>]*\/>/gi, '');
+					newContent = newContent.replace(/\<img src="/gi,
+						'<img style="max-width:100%;height:auto;display:block;margin:10rpx auto;" src="' +baseUrlimg);
+					return newContent;
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.detail{height: 100vh;display: flex;flex-direction: column;background-color: #ffffff;
+	.detbox{flex: 1;padding-top: 20rpx;overflow: auto;z-index: 2;
+		.detboxa{border-radius: 30rpx 30rpx 0 0; background-color: #ffffff;padding:36rpx 24rpx;
+			.tit{font-size: 32rpx;color: #321E1E;margin-bottom: 44rpx;}
+			.txt{font-size: 30rpx;font-weight: bold;color: #321E1E;line-height: 48rpx;padding: 0 22rpx;margin-bottom: 20rpx;}
+			.time{padding: 0 22rpx;font-size: 24rpx;font-weight: 500;color: #AAAAAA;margin-bottom: 36rpx;}
+			.dbox{border-top:2rpx solid #E6E6E6;padding: 40rpx 22rpx;
+				view{
+					text-indent: 2rem;font-size: 26rpx;color: #321F1B;line-height: 48rpx;
+				}
+			}
+		}
+	}
+}
+</style>

+ 28 - 13
pages/mine/index.vue

@@ -24,48 +24,48 @@
 				<image  @click.stop="handleToAvatar" :src="avatarimg" class="limg" mode="aspectFill"></image>
 			</view>
 			<view class="conts flexc">
-				<view class="contn">
+				<view class="contn" v-if="checkPermi(['system:reservat:sh'])" @click="handleToYy">
 					<view class="img">
 						<image :src="listimga" class="imga"></image>
 					</view>
 					<view class="ctit">待我审批</view>
 				</view>
-				<view class="contn">
+				<view class="contn" v-if="checkPermi(['system:reservat:list'])" @click="handleToYy">
 					<view class="img">
 						<image :src="listimgb" class="imgb"></image>
 					</view>
 					<view class="ctit">预约管理</view>
 				</view>
-				<view class="contn">
+				<!-- <view class="contn">
 					<view class="img">
 						<image :src="listimgc" class="imgc"></image>
 					</view>
 					<view class="ctit">访客管理</view>	
-				</view>
+				</view> -->
 			</view>
 			<view class="mbgbox">
-				<view class="flexc mine_list" @click="handleToMysb" v-if="checkPermi(['system:application:add'])&&checkPermi(['system:registered:user'])">
+				<view class="flexc mine_list" @click="handleToMyhy" v-if="checkPermi(['system:order:list'])">
 					<view class="limg">
 						<image :src="listimgd" class="imga"></image>
 					</view>
-					<view class="tit flex1">会议预订</view>
+					<view class="tit flex1">我的会议预约</view>
 					<image :src="rimg" class="rimg"></image>
 				</view>
-				<view class="flexc mine_list" @click="handleToMysb" v-if="checkPermi(['system:application:list'])&&checkPermi(['system:registered:user'])">
+				<view class="flexc mine_list" @click="handleToMyjc" v-if="checkPermi(['system:food:list'])">
 					<view class="limg">
 						<image :src="listimge" class="imgb"></image>
 					</view>
-					<view class="tit flex1">订餐预订</view>
+					<view class="tit flex1">我的订餐记录</view>
 					<image :src="rimg" class="rimg"></image>
 				</view>
-				<view class="flexc mine_list" @click="handleToMysb" v-if="checkPermi(['system:remind:list'])">
+				<view class="flexc mine_list" v-if="checkPermi(['system:reservat:add'])" @click="handleToAddYy" >
 					<view class="limg">
 						<image :src="listimgf" class="imgc"></image>
 					</view>
 					<view class="tit flex1">访客预约</view>
 					<image :src="rimg" class="rimg"></image>
 				</view>
-				<view class="flexc mine_list" @click="handleToSetting" v-if="checkPermi(['enterprise:enterprise:list'])">
+				<view class="flexc mine_list" @click="handleToSetting">
 					<view class="limg">
 						<image :src="listimgg" class="imga"></image>
 					</view>
@@ -75,7 +75,7 @@
 				
 				<view class="flexc mine_list"@click="onlineWgt">
 					<view class="limg">
-						<image :src="listimgh" class="imgd"></image>
+						<image :src="listimgi" class="imga"></image>
 					</view>
 					<view class="tit flex1">版本号</view>
 					 <view  class="txt">{{wgtcode}}</view>
@@ -85,7 +85,7 @@
 				<!-- #endif -->
 				<view class="flexc mine_list" @click="handleLogout">
 					<view class="limg">
-						<image :src="listimgi" class="imga"></image>
+						<image :src="listimgh" class="imgd"></image>
 					</view>
 					<view class="tit flex1">退出登录</view>
 					<image :src="rimg" class="rimg"></image>
@@ -199,7 +199,22 @@
 					}
 				}).exec();
 			},
-
+			// 待我审批
+			handleToYy(){
+				this.$tab.navigateTo("/pages/order/list")
+			},
+			//访客预约
+			handleToAddYy(){
+				this.$tab.navigateTo("/pages/order/come")
+			},
+			//我的会议
+			handleToMyhy(){
+				this.$tab.navigateTo("/work/pages/yyorder/meetlist")
+			},
+			//我的就餐
+			handleToMyjc(){
+				this.$tab.navigateTo("/work/pages/yyorder/eatlist")
+			},
 			//我的申报
 			handleToMysb(){
 				// this.$tab.navigateTo("/work/pages/business/list?from=my&type=0")

+ 1 - 1
pages/order/come.vue

@@ -268,7 +268,7 @@
 					this.adrlist = res.data.map(v => {
 						return {
 							dictLabel: v.dictLabel,
-							dictValue: Number(v.dictValue)
+							dictValue: v.dictValue
 						}
 					})
 				}

+ 2 - 2
pages/order/list.vue

@@ -9,7 +9,7 @@
 				<!-- 列表 -->
 				<scroll-view scroll-y class="yylists"  lower-threshold="40" @scrolltolower="reach_btn">
 					<view class="mt12">
-						<y-list type='1' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :adrlist="adrlist" @getDelFn="getDelFn" @gettypeFn="gettypeFn"></y-list>
+						<y-list type='order' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :adrlist="adrlist" @getDelFn="getDelFn" @gettypeFn="gettypeFn"></y-list>
 					</view>
 				</scroll-view>
 		</view>
@@ -85,7 +85,7 @@
 					this.adrlist = res.data.map(v => {
 						return {
 							dictLabel: v.dictLabel,
-							dictValue: Number(v.dictValue)
+							dictValue: v.dictValue
 						}
 					})
 				}

+ 1 - 1
pages/order/staffcode.vue

@@ -157,7 +157,7 @@
 					this.adrlist = res.data.map(v => {
 						return {
 							dictLabel: v.dictLabel,
-							dictValue: Number(v.dictValue)
+							dictValue: v.dictValue
 						}
 					})
 				}

+ 14 - 17
pages/video/index.vue

@@ -114,15 +114,7 @@
 			resetimg:require('@/static/images/order/reset.png'),
 			wresetimg:require('@/static/images/order/wreset.png'),
 			backgroundColor: "transparent",
-			list:[{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-				{exit:'南大门',time:'16:26:37'},{exit:'北大门',time:'16:26:38'},
-			],
+			list:[],
 			pageSize: 10,
 			pageNum: 1,
 			reachflag: false,
@@ -185,8 +177,11 @@
 	},
 	onUnload() {
 		uni.$off('refreshdatalist')
+		// #ifdef H5
+		this.flv_destroy();
+		// #endif
+		
 	},
-
 	onShow() {
 	},
 	mounted() {
@@ -270,12 +265,14 @@
 		    this.player.pause();
 		},
 		flv_destroy() {
+			console.log(23)
 		    //停止
-		    this.player.pause();
-		    this.player.unload();
-		    this.player.detachMediaElement();
-		    this.player.destroy();
-		    this.player = null;
+		    this.flvPlayer.pause();
+		    this.flvPlayer.unload();
+		    this.flvPlayer.detachMediaElement();
+		    this.flvPlayer.destroy();
+		    this.flvPlayer = null;
+			this.player=null;
 		},
 		flv_seekto() {
 		    // 复制其他人的  我还没用这个
@@ -343,7 +340,7 @@
 			getCameraList(params).then(res=>{
 				if(res.code==200){
 					var data=res.data.data;
-					if(data.list&&data.list.length>0){
+					if(data&&data.list&&data.list.length>0){
 						this.adrlist =data.list;
 						this.address=data.list[0].name;
 						this.indexCode=data.list[0].indexCode;
@@ -368,7 +365,7 @@
 		getDataFn(){
 			var params={
 				pageSize:this.pageSize,
-				pageNo: this.pageNum,
+				pageNum: this.pageNum,
 				// visitType:3
 			}
 			getCameraList(params).then(res=>{

+ 3 - 2
static/style.css

@@ -155,7 +155,8 @@ color: #FFFFFF;display: flex;align-items: center;justify-content: center;}
 
 .yybox{width: 100%;height: 100vh;box-sizing: border-box;display: flex;flex-direction: column;background-color: #F5F5F5;}
 .yydet{flex: 1;overflow: auto;z-index: 2;position: relative;display: flex;flex-direction: column;}
-
-
+.yyfbtn{width: 100%;height: 90rpx;background: #0391fd;font-size: 28rpx;font-weight: 500;color: #FFFFFF;
+	position: fixed;left: 0;right: 0;bottom: 0;
+}
 
 /* 新写的end */

+ 5 - 1
store/getters.js

@@ -5,6 +5,10 @@ const getters = {
   roles: state => state.user.roles,
   permissions: state => state.user.permissions,
   wgtcode:state => state.user.wgtcode,
-  autologin:state => state.user.autologin
+  autologin:state => state.user.autologin,
+  deptId:state=>state.user.deptId,
+  deptName: state => state.user.deptName,
+  userId:state=>state.user.userId,
+  phonenumber: state => state.user.phonenumber,
 }
 export default getters

+ 31 - 2
store/modules/user.js

@@ -14,7 +14,11 @@ const user = {
     roles: storage.get(constant.roles),
     permissions: storage.get(constant.permissions),
 	wgtcode:storage.get(constant.wgtcode),
-	autologin:storage.get(constant.autologin)
+	autologin:storage.get(constant.autologin),
+	deptId: storage.get(constant.deptId),
+	deptName: storage.get(constant.deptName),
+	userId: storage.get(constant.userId),
+	phonenumber: storage.get(constant.phonenumber),
   },
 
   mutations: {
@@ -45,6 +49,22 @@ const user = {
 	  state.autologin = autologin
 	  storage.set(constant.autologin, autologin)
 	},
+	SET_DEPID: (state, deptId) => {
+	  state.deptId = deptId
+	  storage.set(constant.deptId, deptId)
+	},
+	SET_DEPTNAME: (state, deptName) => {
+	  state.deptName = deptName
+	  storage.set(constant.deptName, deptName)
+	},
+	SET_USERID: (state, userId) => {
+	  state.userId = userId
+	  storage.set(constant.userId, userId) 
+	},
+	SET_PHONENUMBER: (state, phonenumber) => {
+	  state.phonenumber = phonenumber
+	  storage.set(constant.phonenumber, phonenumber)
+	},
   },
 
   actions: {
@@ -100,7 +120,12 @@ const user = {
           const user = res.user
           const avatar = (user == null || user.avatar == "" || user.avatar == null) ? require("@/static/images/profile.jpg") : baseUrl + user.avatar
           const username = (user == null || user.userName == "" || user.userName == null) ? "" : user.userName
-          if (res.roles && res.roles.length > 0) {
+          const deptId = (user == null || user.deptId == "" || user.deptId == null) ? "" : user.deptId
+          const deptName = (user == null ||user.dept==null|| user.dept == ""||user.dept.deptName == "" || user.dept.deptName == null) ? "" : user.dept.deptName
+          const userId = (user == null || user.userId == "" || user.userId == null) ? "" : user.userId
+          const phonenumber = (user == null || user.phonenumber == "" || user.phonenumber == null) ? "" : user.phonenumber
+          
+		  if (res.roles && res.roles.length > 0) {
             commit('SET_ROLES', res.roles)
             commit('SET_PERMISSIONS', res.permissions)
           } else {
@@ -108,6 +133,10 @@ const user = {
           }
           commit('SET_NAME', username)
           commit('SET_AVATAR', avatar)
+		  commit('SET_DEPID', deptId)
+		  commit('SET_DEPTNAME', deptName)
+		  commit('SET_USERID', userId)
+		  commit('SET_PHONENUMBER', phonenumber)
           resolve(res)
         }).catch(error => {
           reject(error)

+ 48 - 0
utils/common.js

@@ -37,6 +37,54 @@ export function selectDictValue(datas, value) {
 	})
 	return actions.join('');
 }
+export function selectDictLabel(datas, value) {
+	var actions = [];
+	Object.keys(datas).some((key) => {
+		if (datas[key].dictLabel == ('' + value)) {
+			actions.push(datas[key].dictValue);
+			return true;
+		}
+	})
+	return actions.join('');
+}
+export function selectValueKey(datas, value) {
+	var actions = [];
+	var idx=0;
+	Object.keys(datas).some((key) => {
+		if (datas[key].value == ('' + value)) {
+			idx=key;
+			actions.push(datas[key].label);
+			return true;
+		}
+	})
+	var newObj={
+		actions:actions.join(''),
+		key:idx
+	}
+	return newObj
+}
+export function selectValue(datas, value) {
+	var actions = [];
+	var idx=0;
+	Object.keys(datas).some((key) => {
+		if (datas[key].value == ('' + value)) {
+			actions.push(datas[key].label);
+			return true;
+		}
+	})
+	return actions.join('')
+}
+export function selectValuetext(datas, value) {
+	var actions = [];
+	var idx=0;
+	Object.keys(datas).some((key) => {
+		if (datas[key].value == ('' + value)) {
+			actions.push(datas[key].text);
+			return true;
+		}
+	})
+	return actions.join('')
+}
 /**
 * 参数处理
 * @param params 参数

+ 4 - 0
utils/constant.js

@@ -6,6 +6,10 @@ const constant = {
    scorknow: 'vuex_scorknow',
    autologin:'vuex_autologin',
    wgtcode:'vuex_wgtcode',
+   userId: 'vuex_userId',
+   phonenumber:'vuex_phonenumber',
+   deptId: 'vuex_deptId',
+   deptName: 'vuex_deptName',
  }
 
  export default constant

+ 1 - 1
utils/storage.js

@@ -4,7 +4,7 @@ import constant from './constant'
 let storageKey = 'storage_data'
 
 // 存储节点变量名
-let storageNodeKeys = [constant.autologin,constant.scorknow,constant.avatar, constant.name, constant.roles, constant.permissions,constant.wgtcode]
+let storageNodeKeys = [constant.autologin,constant.scorknow,constant.avatar, constant.name, constant.roles, constant.permissions,constant.wgtcode,constant.deptId,constant.deptName,constant.userId,constant.phonenumber,]
 
 const storage = {
   set: function(key, value) {

+ 124 - 0
work/components/ba-tree-picker/README.md

@@ -0,0 +1,124 @@
+## 树形层级选择器
+### 简介
+为统一样式而生,树形层级选择器,picker弹窗形式的,样式和比例参照uniapp的picker和uni-data-picker组件
+* 支持单选、多选、父级选择,当然也支持单层选择
+* 支持Object对象属性自定义映射
+* 支持显示全部选中、部分选中、未选中三种状态
+* 支持快速自定义简单样式(分割线、按钮、标题、对齐等),深入样式可复写css
+
+### 使用方法
+在 `script` 中引入组件
+``` javascript
+	import baTreePicker from "@/components/ba-tree-picker/ba-tree-picker.vue"
+	export default {
+		components: {
+			baTreePicker
+		}
+```
+在 `template` 中使用组件
+``` javascript
+	<ba-tree-picker ref="treePicker" :multiple='false' @select-change="selectChange" title="选择城市"
+		:localdata="listData" valueKey="value" textKey="label" childrenKey="children" />
+```
+在 `script` 中定义打开方法,和选择监听
+``` javascript
+		methods: {
+			// 显示选择器
+			showPicker() {
+				this.$refs.treePicker._show();
+			},
+			//监听选择(ids为数组)
+			selectChange(ids, names) {
+				console.log(ids, names)
+			}
+		}
+```
+在 `template` 中调用打开
+``` javascript
+	<view @click="showPicker">调用选择器</view>
+```
+
+### 属性
+|属性名|类型|默认值|说明|
+|:-|:-:|:--:|-:|
+|localdata|Array|[]|源数据,目前支持tree结构,后续会考虑支持扁平化结构|
+|valueKey|String|id|指定 Object 中 key 的值作为节点数据id|
+|textKey|String|name|指定 Object 中 key 的值作为节点显示内容|
+|childrenKey|String|children|指定 Object 中 key 的值作为节点子集|
+|multiple|Boolean|false|是否多选,默认单选|
+|selectParent|Boolean|true|是否可以选父级,默认可以|
+|title|String| |标题|
+|titleColor|String||标题颜色|
+|confirmColor|String|#0055ff|确定按钮颜色|
+|cancelColor|String|#757575|取消按钮颜色|
+|switchColor|String|#666|节点切换图标颜色|
+|border|Boolean|false|是否有分割线,默认无|
+
+
+
+###  数据格式
+
+注意:必须有id、name(id可通过valueKey来配置为其它键值,如value)字段,且唯一
+
+``` json
+[
+    {
+        id: 1,
+        name: '公司1',
+        children: [{
+            id: 11,
+            name: '研发部',
+            children: [{
+                id: 111,
+                name: '张三',
+                
+            },{
+                id: 112,
+                name: '李四',
+                
+            }]
+        },{
+            id: 12,
+            name: '综合部',
+            
+        } ]
+    },
+    {
+        id: 2,
+        name: '公司2',
+        children: [{
+            id: 21,
+            name: '研发部',
+            
+        },{
+            id: 22,
+            name: '综合部',
+            
+        },{
+            id: 23,
+            name: '财务部',
+            
+        }, ]
+    },
+    {
+        id: 3,
+        name: '公司3'
+    },
+    {
+        id: 4,
+        name: '公司4',
+        children: [{
+            id: 41,
+            name: '研发部',
+            
+        }]
+    }
+]
+```
+</details>
+
+### 方法
+|方法名|参数|默认值|说明|
+|:-|:-:|:--:|-:|
+|_show()| | |显示选择器|
+|_hide()| | |隐藏选择器|

+ 658 - 0
work/components/ba-tree-picker/ba-tree-pickerfixed.vue

@@ -0,0 +1,658 @@
+<!-- 树形层级选择器-->
+<!-- 1、支持单选、多选 -->
+<template>
+	<view>
+		<view class="tree-cover" :class="{'show':showDialog}" @tap="_cancel"></view>
+		<view class="tree-dialog" :class="{'show':showDialog}">
+			<view class="tree-bar">
+				<view class="tree-bar-cancel" :style="{'color':cancelColor}" hover-class="hover-c" @tap="_cancel">取消
+				</view>
+				<view class="tree-bar-title" :style="{'color':titleColor}">{{title}}</view>
+				<view class="tree-bar-confirm" :style="{'color':confirmColor}" hover-class="hover-c" @tap="_confirm">确定
+					<!-- {{multiple?'确定':''}} -->
+				</view>
+			</view>
+			<view class="tree-view">
+				<scroll-view class="tree-list" :scroll-y="true">
+					<block v-for="(item, index) in treeList" :key="index">
+						<view class="tree-item" :style="[{
+							paddingLeft: item.level*30 + 'rpx'
+						}]" :class="{
+							itemBorder: border === true,
+							show: item.isShow
+						}">
+							<view class="item-label">
+								<view class="item-icon flexcc" @tap.stop="_onItemSwitch(item, index)">
+									<view v-if="!item.isLastLevel&&item.isShowChild" class="switch-on"
+										:style="{'border-left-color':switchColor}">
+									</view>
+									<view v-else-if="!item.isLastLevel&&!item.isShowChild" class="switch-off"
+										:style="{'border-top-color':switchColor}">
+									</view>
+									<view v-else class="item-last-dot" :style="{'border-top-color':switchColor}">
+									</view>
+								</view>
+								<view class="flexc uni-inline-item" @tap.stop="_onItemSelect(item, index)">
+									
+									<view class="item-check" v-if="selectParent?true:item.isLastLevel">
+										<view class="item-check-yes" v-if="item.checkStatus==1"
+											:class="{'radio':!multiple}" :style="{'border-color':confirmColor}">
+											<view class="item-check-yes-part"
+												:style="{'background-color':confirmColor}">
+											</view>
+										</view>
+										<view class="item-check-yes" v-else-if="item.checkStatus==2"
+											:class="{'radio':!multiple}" :style="{'border-color':confirmColor}">
+											<view class="item-check-yes-all" :style="{'background-color':confirmColor}">
+											</view>
+										</view>
+										<view class="item-check-no" v-else :class="{'radio':!multiple}"
+											:style="{'border-color':confirmColor}"></view>
+									</view>
+									<view class="item-name"> {{item.name+(item.childCount?"("+item.childCount+")":'')}}</view>
+								</view>
+							</view>
+
+						</view>
+					</block>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		emits: ['select-change'],
+		name: "ba-tree-picker",
+		props: {
+			valueKey: {
+				type: String,
+				default: 'id'
+			},
+			textKey: {
+				type: String,
+				default: 'name'
+			},
+			childrenKey: {
+				type: String,
+				default: 'children'
+			},
+			localdata: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			localTreeList: { //在已经格式化好的数据
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			selectedData: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			deptType:{
+				type: String,
+				default: ''
+			},
+			multiple: { // 是否可以多选
+				type: Boolean,
+				default: true
+			},
+			selectParent: { //是否可以选父级
+				type: Boolean,
+				default: true
+			},
+			confirmColor: { // 确定按钮颜色
+				type: String,
+				default: '' // #FE5706
+			},
+			cancelColor: { // 取消按钮颜色
+				type: String,
+				default: '' // #757575
+			},
+			titleColor: { // 标题颜色
+				type: String,
+				default: '' //
+			},
+			switchColor: { // 节点切换图标颜色
+				type: String,
+				default: '' // #666
+			},
+			border: { // 是否有分割线
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				showDialog: false,
+				treeList: []
+			}
+		},
+		computed: {},
+		methods: {
+			_show() {
+				this.showDialog = true
+			},
+			_hide() {
+				this.showDialog = false
+			},
+			_cancel() {
+				this._hide()
+				this.$emit("cancel", '');
+			},
+			_confirm() { //多选
+				var that=this;
+				let selectedList = []; //如果子集全部选中,只返回父级 id
+				let selectedNames;
+				let currentLevel = -1;
+				this.treeList.forEach((item, index) => {
+					// console.log(item,1)
+					if (currentLevel >= 0 && item.level > currentLevel) {
+
+					} else {
+						
+						if (item.checkStatus === 2) {
+							// 判断有无子元素
+							currentLevel = item.level;
+							if(item.children&&item.children.length){
+								var children=item.children;
+								
+								children.forEach(ite=>{
+									var obj={
+										deptId:ite.id,
+										deptName:ite.label,
+										deptType:that.deptType
+									}
+									selectedList.push(obj);
+								})
+							}else{
+								var obj={
+									deptId:item.id,
+									deptName:item.name,
+									deptType:that.deptType
+								}
+								selectedList.push(obj);
+							}
+							
+							// selectedNames = selectedNames ? selectedNames + ' / ' + item.name : item.name;
+						} else {
+							currentLevel = -1;
+						}
+					}
+				})
+				this._hide()
+				// this.$emit("select-change", selectedList, selectedNames);
+				this.$emit("select-change", selectedList);
+			},
+			//格式化原数据(原数据为tree结构)
+			_formatTreeData(list = [], level = 0, parentItem, isShowChild = true) {
+				let nextIndex = 0;
+				let parentId = -1;
+				let initCheckStatus = 0;
+				if (parentItem) {
+					nextIndex = this.treeList.findIndex(item => item.id === parentItem.id) + 1;
+					parentId = parentItem.id;
+					if (!this.multiple) { //单选
+						initCheckStatus = 0;
+					} else
+						initCheckStatus = parentItem.checkStatus == 2 ? 2 : 0;
+				}
+				list.forEach(item => {
+					let isLastLevel = true;
+					if (item && item[this.childrenKey]) {
+						let children = item[this.childrenKey];
+						if (Array.isArray(children) && children.length > 0) {
+							isLastLevel = false;
+						}
+					}
+					let itemT = {
+						id: item[this.valueKey],
+						name: item[this.textKey],
+						level,
+						isLastLevel,
+						isShow: isShowChild,
+						isShowChild: false,
+						checkStatus: initCheckStatus,
+						orCheckStatus: 0,
+						parentId,
+						children: item[this.childrenKey],
+						childCount: item[this.childrenKey] ? item[this.childrenKey].length : 0,
+						childCheckCount: 0,
+						childCheckPCount: 0
+					};
+					if (this.selectedData.indexOf(itemT.id) >= 0) {
+						itemT.checkStatus = 2;
+						itemT.orCheckStatus = 2;
+						itemT.childCheckCount = itemT.children ? itemT.children.length : 0;
+						this._onItemParentSelect(itemT, nextIndex);
+					}
+
+					this.treeList.splice(nextIndex, 0, itemT);
+					nextIndex++;
+				})
+				//console.log(this.treeList);
+			},
+			// 节点打开、关闭切换
+			_onItemSwitch(item, index) {
+				// console.log(item)
+				//console.log('_itemSwitch')
+				if (item.isLastLevel === true) {
+					return;
+				}
+				item.isShowChild = !item.isShowChild;
+				if (item.children) {
+					this._formatTreeData(item.children, item.level + 1, item);
+					item.children = undefined;
+				} else {
+					this._onItemChildSwitch(item, index);
+				}
+			},
+			_onItemChildSwitch(item, index) {
+				//console.log('_onItemChildSwitch')
+				const firstChildIndex = index + 1;
+				if (firstChildIndex > 0)
+					for (var i = firstChildIndex; i < this.treeList.length; i++) {
+						let itemChild = this.treeList[i];
+						if (itemChild.level > item.level) {
+							if (item.isShowChild) {
+								if (itemChild.parentId === item.id) {
+									itemChild.isShow = item.isShowChild;
+									if (!itemChild.isShow) {
+										itemChild.isShowChild = false;
+									}
+								}
+							} else {
+								itemChild.isShow = item.isShowChild;
+								itemChild.isShowChild = false;
+							}
+						} else {
+							return;
+						}
+					}
+			},
+			// 节点选中、取消选中
+			_onItemSelect(item, index) {
+				//console.log('_onItemSelect')
+				//console.log(item)
+				if (!this.multiple) { //单选
+					item.checkStatus = item.checkStatus == 0 ? 2 : 0;
+
+					this.treeList.forEach((v, i) => {
+						if (i != index) {
+							this.treeList[i].checkStatus = 0
+						} else {
+							this.treeList[i].checkStatus = 2
+						}
+					})
+
+					let selectedList = [];
+					let selectedNames;
+					selectedList.push(item.id);
+					selectedNames = item.name;
+					// this._hide()
+					this.$emit("select-change", selectedList, selectedNames);
+					return
+				}
+
+				let oldCheckStatus = item.checkStatus;
+				switch (oldCheckStatus) {
+					case 0:
+						item.checkStatus = 2;
+						item.childCheckCount = item.childCount;
+						item.childCheckPCount = 0;
+						break;
+					case 1:
+					case 2:
+						item.checkStatus = 0;
+						item.childCheckCount = 0;
+						item.childCheckPCount = 0;
+						break;
+					default:
+						break;
+				}
+				//子节点 全部选中
+				this._onItemChildSelect(item, index);
+				//父节点 选中状态变化
+				this._onItemParentSelect(item, index, oldCheckStatus);
+				// 选择返回
+				// this._confirm()
+				// this.$emit("select-change", selectedList, selectedNames);
+			},
+			_onItemChildSelect(item, index) {
+				//console.log('_onItemChildSelect')
+				let allChildCount = 0;
+				if (item.childCount && item.childCount > 0) {
+					index++;
+					while (index < this.treeList.length && this.treeList[index].level > item.level) {
+						let itemChild = this.treeList[index];
+						itemChild.checkStatus = item.checkStatus;
+						if (itemChild.checkStatus == 2) {
+							itemChild.childCheckCount = itemChild.childCount;
+							itemChild.childCheckPCount = 0;
+						} else if (itemChild.checkStatus == 0) {
+							itemChild.childCheckCount = 0;
+							itemChild.childCheckPCount = 0;
+						}
+						// console.log('>>>>index:', index, 'item:', itemChild.name, '  status:', itemChild
+						// 	.checkStatus)
+						index++;
+					}
+				}
+			},
+			_onItemParentSelect(item, index, oldCheckStatus) {
+				//console.log('_onItemParentSelect')
+				//console.log(item)
+				const parentIndex = this.treeList.findIndex(itemP => itemP.id == item.parentId);
+				//console.log('parentIndex:' + parentIndex)
+				if (parentIndex >= 0) {
+					let itemParent = this.treeList[parentIndex];
+					let count = itemParent.childCheckCount;
+					let oldCheckStatusParent = itemParent.checkStatus;
+
+					if (oldCheckStatus == 1) {
+						itemParent.childCheckPCount -= 1;
+					} else if (oldCheckStatus == 2) {
+						itemParent.childCheckCount -= 1;
+					}
+					if (item.checkStatus == 1) {
+						itemParent.childCheckPCount += 1;
+					} else if (item.checkStatus == 2) {
+						itemParent.childCheckCount += 1;
+					}
+
+					if (itemParent.childCheckCount <= 0 && itemParent.childCheckPCount <= 0) {
+						itemParent.childCheckCount = 0;
+						itemParent.childCheckPCount = 0;
+						itemParent.checkStatus = 0;
+					} else if (itemParent.childCheckCount >= itemParent.childCount) {
+						itemParent.childCheckCount = itemParent.childCount;
+						itemParent.childCheckPCount = 0;
+						itemParent.checkStatus = 2;
+					} else {
+						itemParent.checkStatus = 1;
+					}
+					//console.log('itemParent:', itemParent)
+					this._onItemParentSelect(itemParent, parentIndex, oldCheckStatusParent);
+				}
+			},
+			// 重置数据
+			_reTreeList() {
+				this.treeList.forEach((v, i) => {
+					this.treeList[i].checkStatus = v.orCheckStatus
+				})
+			},
+			_initTree() {
+				this.treeList = [];
+				this._formatTreeData(this.localdata);
+			}
+		},
+		watch: {
+			localdata() {
+				this._initTree();
+			},
+			localTreeList() {
+				this.treeList = this.localTreeList;
+			}
+		},
+		mounted() {
+			this._initTree();
+		}
+	}
+</script>
+
+<style scoped>
+	.tree-cover {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		z-index: 100;
+		background-color: rgba(0, 0, 0, .4);
+		opacity: 0;
+		transition: all 0.3s ease;
+		visibility: hidden;
+	}
+
+	.tree-cover.show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tree-dialog {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		background-color: #fff;
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		z-index: 100002;
+		top: 20%;
+		transition: all 0.3s ease;
+		transform: translateY(100%);
+	}
+
+	.tree-dialog.show {
+		transform: translateY(0);
+	}
+
+	.tree-bar {
+		/* background-color: #fff; */
+		height: 90rpx;
+		padding-left: 25rpx;
+		padding-right: 25rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		box-sizing: border-box;
+		border-bottom-width: 1rpx !important;
+		border-bottom-style: solid;
+		border-bottom-color: #f5f5f5;
+		font-size: 32rpx;
+		color: #757575;
+		line-height: 1;
+	}
+
+	.tree-bar-confirm {
+		color: #FE5706;
+		padding: 15rpx;
+	}
+
+	.tree-bar-title {}
+
+	.tree-bar-cancel {
+		color: #757575;
+		padding: 15rpx;
+	}
+
+	.tree-view {
+		flex: 1;
+		padding: 20rpx;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		overflow: hidden;
+		height: 100%;
+	}
+
+	.tree-list {
+		flex: 1;
+		height: 100%;
+		overflow: hidden;
+	}
+
+	.tree-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		line-height: 1;
+		height: 0;
+		opacity: 0;
+		transition: 0.2s;
+		overflow: hidden;
+	}
+
+	.tree-item.show {
+		height: 90rpx;
+		opacity: 1;
+	}
+
+	.tree-item.showchild:before {
+		transform: rotate(90deg);
+	}
+
+	.tree-item.last:before {
+		opacity: 0;
+	}
+
+	.switch-on {
+		width: 0;
+		height: 0;
+		border-left: 16rpx solid transparent;
+		border-right: 16rpx solid transparent;
+		border-top: 20rpx solid #666;
+	}
+
+	.switch-off {
+		width: 0;
+		height: 0;
+		border-bottom: 16rpx solid transparent;
+		border-top: 16rpx solid transparent;
+		border-left: 20rpx solid #666;
+	}
+
+	.item-last-dot {
+		position: absolute;
+		width: 12rpx;
+		height: 12rpx;
+		border-radius: 100%;
+		background: #666;
+	}
+
+	.item-icon {
+		width: 26rpx;
+		height: 30rpx;
+		margin-right: 8rpx;
+		padding-right: 20rpx;
+		padding-left: 20rpx;
+	}
+
+	.item-label {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		height: 100%;
+		line-height: 1.2;
+	}
+
+	.item-name {
+		flex: 1;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		/* width: 450rpx; */
+		font-size: 34rpx;
+		font-weight: bold;
+		line-height: 1;
+	}
+
+	.item-check {
+		width: 40px;
+		height: 40px;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.item-check-yes,
+	.item-check-no {
+		width: 32rpx;
+		height: 32rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		border-top-width: 1rpx;
+		border-left-width: 1rpx;
+		border-bottom-width: 1rpx;
+		border-right-width: 1rpx;
+		border-style: solid;
+		border-color: #FE5706;
+		border-radius: 8rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		box-sizing: border-box;
+		 /* background-color: #FE5706; */
+	}
+	.item-check-yes{
+		border: none;
+		background-color: #FE5706;
+	}
+
+	.item-check-yes-part {
+		width: 24rpx;
+		height: 6rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		background-color: #ffffff;
+	}
+
+	.item-check-yes-all {
+		margin-bottom: 5px;
+		border: 2px solid #ffffff;
+		border-left: 0;
+		border-top: 0;
+		height: 12px;
+		width: 6px;
+		transform-origin: center;
+		/* #ifndef APP-NVUE */
+		transition: all 0.3s;
+		/* #endif */
+		transform: rotate(45deg);
+		/* border: none;
+		background-color: #FE5706; */
+	}
+
+	.item-check .radio {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.item-check .radio .item-check-yes-b {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.hover-c {
+		opacity: 0.6;
+	}
+
+	.itemBorder {
+		border-bottom: 1px solid #e5e5e5;
+	}
+</style>

+ 768 - 0
work/components/lunc-calendar/calendar.js

@@ -0,0 +1,768 @@
+/**
+ * @1900-2100区间内的公历、农历互转
+ * @charset UTF-8
+ * @Author  Jea杨(JJonline@JJonline.Cn)
+ * @Time    2014-7-21
+ * @Time    2016-8-13 Fixed 2033hex、Attribution Annals
+ * @Time    2016-9-25 Fixed lunar LeapMonth Param Bug
+ * @Time    2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+ * @Version 1.0.3
+ * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+ * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+ */
+export var calendar = {
+
+	/**
+	 * 农历1900-2100的润大小信息表
+	 * @Array Of Property
+	 * @return Hex
+	 */
+	lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0,
+		0x055d2, //1900-1909
+		0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, //1910-1919
+		0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, //1920-1929
+		0x06566, 0x0d4a0, 0x0ea50, 0x16a95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, //1930-1939
+		0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, //1940-1949
+		0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, //1950-1959
+		0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, //1960-1969
+		0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, //1970-1979
+		0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, //1980-1989
+		0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, //1990-1999
+		0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, //2000-2009
+		0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, //2010-2019
+		0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
+		0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
+		0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, //2040-2049
+		/**Add By JJonline@JJonline.Cn**/
+		0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, //2050-2059
+		0x092e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, //2060-2069
+		0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, //2070-2079
+		0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, //2080-2089
+		0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, //2090-2099
+		0x0d520
+	], //2100
+
+	/**
+	 * 公历每个月份的天数普通表
+	 * @Array Of Property
+	 * @return Number
+	 */
+	solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+
+	/**
+	 * 天干地支之天干速查表
+	 * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+	 * @return Cn string
+	 */
+	Gan: ["\u7532", "\u4e59", "\u4e19", "\u4e01", "\u620a", "\u5df1", "\u5e9a", "\u8f9b", "\u58ec", "\u7678"],
+
+	/**
+	 * 天干地支之地支速查表
+	 * @Array Of Property
+	 * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+	 * @return Cn string
+	 */
+	Zhi: ["\u5b50", "\u4e11", "\u5bc5", "\u536f", "\u8fb0", "\u5df3", "\u5348", "\u672a", "\u7533", "\u9149",
+		"\u620c",
+		"\u4ea5"
+	],
+
+	/**
+	 * 天干地支之地支速查表<=>生肖
+	 * @Array Of Property
+	 * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+	 * @return Cn string
+	 */
+	Animals: ["\u9f20", "\u725b", "\u864e", "\u5154", "\u9f99", "\u86c7", "\u9a6c", "\u7f8a", "\u7334", "\u9e21",
+		"\u72d7", "\u732a"
+	],
+
+	/**
+	 * 阳历节日
+	 */
+	festival: {
+		'1-1': {
+			title: '元旦'
+		},
+		'2-14': {
+			title: '情人节'
+		},
+		'3-8': {
+			title: '妇女节'
+		},
+		'3-12': {
+			title: '植树节'
+		},
+		'4-1': {
+			title: '愚人节'
+		},
+		'4-5': {
+			title: '清明节'
+		},
+		'5-1': {
+			title: '劳动节'
+		},
+		'5-4': {
+			title: '青年节'
+		},
+		'5-12': {
+			title: '护士节'
+		},
+		'6-1': {
+			title: '儿童节'
+		},
+		'7-1': {
+			title: '建党节'
+		},
+		'8-1': {
+			title: '建军节'
+		},
+		'9-10': {
+			title: '教师节'
+		},
+		'10-1': {
+			title: '国庆节'
+		},
+		'12-24': {
+			title: '平安夜'
+		},
+		'12-25': {
+			title: '圣诞节'
+		},
+	},
+
+	/**
+	 * 农历节日
+	 */
+	lfestival: {
+		'12-30': {
+			title: '除夕'
+		},
+		'1-1': {
+			title: '春节'
+		},
+		'1-15': {
+			title: '元宵节'
+		},
+		'2-2': {
+			title: '龙抬头'
+		},
+		'5-5': {
+			title: '端午节'
+		},
+		'7-7': {
+			title: '七夕节'
+		},
+		'7-15': {
+			title: '中元节'
+		},
+		'8-15': {
+			title: '中秋节'
+		},
+		'9-9': {
+			title: '重阳节'
+		},
+		'10-1': {
+			title: '寒衣节'
+		},
+		'10-15': {
+			title: '下元节'
+		},
+		'12-8': {
+			title: '腊八节'
+		},
+		'12-23': {
+			title: '北方小年'
+		},
+		'12-24': {
+			title: '南方小年'
+		},
+	},
+
+	/**
+	 * 返回默认定义的阳历节日
+	 */
+	getFestival() {
+		return this.festival
+	},
+
+	/**
+	 * 返回默认定义的内容里节日
+	 */
+	getLunarFestival() {
+		return this.lfestival
+	},
+
+	/**
+	 * 
+	 * @param {Object} 按照festival的格式输入数据,设置阳历节日
+	 */
+	setFestival(param = {}) {
+		this.festival = param
+	},
+
+	/**
+	 * 
+	 * @param {Object} 按照lfestival的格式输入数据,设置农历节日
+	 */
+	setLunarFestival(param = {}) {
+		this.lfestival = param
+	},
+
+	/**
+	 * 24节气速查表
+	 * @Array Of Property
+	 * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+	 * @return Cn string
+	 */
+	solarTerm: ["\u5c0f\u5bd2", "\u5927\u5bd2", "\u7acb\u6625", "\u96e8\u6c34", "\u60ca\u86f0", "\u6625\u5206",
+		"\u6e05\u660e", "\u8c37\u96e8", "\u7acb\u590f", "\u5c0f\u6ee1", "\u8292\u79cd", "\u590f\u81f3",
+		"\u5c0f\u6691",
+		"\u5927\u6691", "\u7acb\u79cb", "\u5904\u6691", "\u767d\u9732", "\u79cb\u5206", "\u5bd2\u9732",
+		"\u971c\u964d",
+		"\u7acb\u51ac", "\u5c0f\u96ea", "\u5927\u96ea", "\u51ac\u81f3"
+	],
+
+	/**
+	 * 1900-2100各年的24节气日期速查表
+	 * @Array Of Property
+	 * @return 0x string For splice
+	 */
+	sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c3598082c95f8c965cc920f',
+		'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+		'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+		'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+		'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+		'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+		'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+		'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+		'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+		'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+		'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+		'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+		'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+		'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+		'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+		'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+		'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+		'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+		'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+		'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'
+	],
+
+	/**
+	 * 数字转中文速查表
+	 * @Array Of Property
+	 * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+	 * @return Cn string
+	 */
+	nStr1: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d",
+		"\u5341"
+	],
+
+	/**
+	 * 日期转农历称呼速查表
+	 * @Array Of Property
+	 * @trans ['初','十','廿','卅']
+	 * @return Cn string
+	 */
+	nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"],
+
+	/**
+	 * 月份转农历称呼速查表
+	 * @Array Of Property
+	 * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+	 * @return Cn string
+	 */
+	nStr3: ["\u6b63", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341",
+		"\u51ac",
+		"\u814a"
+	],
+
+	/**
+	 * 返回农历y年一整年的总天数
+	 * @param lunar Year
+	 * @return Number
+	 * @eg:var count = calendar.lYearDays(1987) ;//count=387
+	 */
+	lYearDays: function(y) {
+		var i, sum = 348;
+		for (i = 0x8000; i > 0x8; i >>= 1) {
+			sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0;
+		}
+		return (sum + this.leapDays(y));
+	},
+
+	/**
+	 * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+	 * @param lunar Year
+	 * @return Number (0-12)
+	 * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+	 */
+	leapMonth: function(y) { //闰字编码 \u95f0
+		return (this.lunarInfo[y - 1900] & 0xf);
+	},
+
+	/**
+	 * 返回农历y年闰月的天数 若该年没有闰月则返回0
+	 * @param lunar Year
+	 * @return Number (0、29、30)
+	 * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+	 */
+	leapDays: function(y) {
+		if (this.leapMonth(y)) {
+			return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
+		}
+		return (0);
+	},
+
+	/**
+	 * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+	 * @param lunar Year
+	 * @return Number (-1、29、30)
+	 * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+	 */
+	monthDays: function(y, m) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //月份参数从1至12,参数错误返回-1
+		return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
+	},
+
+	/**
+	 * 返回公历(!)y年m月的天数
+	 * @param solar Year
+	 * @return Number (-1、28、29、30、31)
+	 * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+	 */
+	solarDays: function(y, m) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		var ms = m - 1;
+		if (ms == 1) { //2月份的闰平规律测算后确认返回28或29
+			return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28);
+		} else {
+			return (this.solarMonth[ms]);
+		}
+	},
+
+	/**
+	 * 农历年份转换为干支纪年
+	 * @param  lYear 农历年的年份数
+	 * @return Cn string
+	 */
+	toGanZhiYear: function(lYear) {
+		var ganKey = (lYear - 3) % 10;
+		var zhiKey = (lYear - 3) % 12;
+		if (ganKey == 0) ganKey = 10; //如果余数为0则为最后一个天干
+		if (zhiKey == 0) zhiKey = 12; //如果余数为0则为最后一个地支
+		return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1];
+
+	},
+
+	/**
+	 * 公历月、日判断所属星座
+	 * @param  cMonth [description]
+	 * @param  cDay [description]
+	 * @return Cn string
+	 */
+	toAstro: function(cMonth, cDay) {
+		var s =
+			"\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf";
+		var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];
+		return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7"; //座
+	},
+
+	/**
+	 * 传入offset偏移量返回干支
+	 * @param offset 相对甲子的偏移量
+	 * @return Cn string
+	 */
+	toGanZhi: function(offset) {
+		return this.Gan[offset % 10] + this.Zhi[offset % 12];
+	},
+
+	/**
+	 * 传入公历(!)y年获得该年第n个节气的公历日期
+	 * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+	 * @return day Number
+	 * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+	 */
+	getTerm: function(y, n) {
+		if (y < 1900 || y > 2100) {
+			return -1;
+		}
+		if (n < 1 || n > 24) {
+			return -1;
+		}
+		var _table = this.sTermInfo[y - 1900];
+		var _info = [
+			parseInt('0x' + _table.substr(0, 5)).toString(),
+			parseInt('0x' + _table.substr(5, 5)).toString(),
+			parseInt('0x' + _table.substr(10, 5)).toString(),
+			parseInt('0x' + _table.substr(15, 5)).toString(),
+			parseInt('0x' + _table.substr(20, 5)).toString(),
+			parseInt('0x' + _table.substr(25, 5)).toString()
+		];
+		var _calday = [
+			_info[0].substr(0, 1),
+			_info[0].substr(1, 2),
+			_info[0].substr(3, 1),
+			_info[0].substr(4, 2),
+
+			_info[1].substr(0, 1),
+			_info[1].substr(1, 2),
+			_info[1].substr(3, 1),
+			_info[1].substr(4, 2),
+
+			_info[2].substr(0, 1),
+			_info[2].substr(1, 2),
+			_info[2].substr(3, 1),
+			_info[2].substr(4, 2),
+
+			_info[3].substr(0, 1),
+			_info[3].substr(1, 2),
+			_info[3].substr(3, 1),
+			_info[3].substr(4, 2),
+
+			_info[4].substr(0, 1),
+			_info[4].substr(1, 2),
+			_info[4].substr(3, 1),
+			_info[4].substr(4, 2),
+
+			_info[5].substr(0, 1),
+			_info[5].substr(1, 2),
+			_info[5].substr(3, 1),
+			_info[5].substr(4, 2),
+		];
+		return parseInt(_calday[n - 1]);
+	},
+
+	/**
+	 * 传入农历数字月份返回汉语通俗表示法
+	 * @param lunar month
+	 * @return Cn string
+	 * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+	 */
+	toChinaMonth: function(m) { // 月 => \u6708
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		var s = this.nStr3[m - 1];
+		s += "\u6708"; //加上月字
+		return s;
+	},
+
+	/**
+	 * 传入农历日期数字返回汉字表示法
+	 * @param lunar day
+	 * @return Cn string
+	 * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+	 */
+	toChinaDay: function(d) { //日 => \u65e5
+		var s;
+		switch (d) {
+			case 10:
+				s = '\u521d\u5341';
+				break;
+			case 20:
+				s = '\u4e8c\u5341';
+				break;
+			case 30:
+				s = '\u4e09\u5341';
+				break;
+			default:
+				s = this.nStr2[Math.floor(d / 10)];
+				s += this.nStr1[d % 10];
+		}
+		return (s);
+	},
+
+	/**
+	 * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+	 * @param y year
+	 * @return Cn string
+	 * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+	 */
+	getAnimal: function(y) {
+		return this.Animals[(y - 4) % 12]
+	},
+
+	/**
+	 * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+	 * @param y  solar year
+	 * @param m  solar month
+	 * @param d  solar day
+	 * @return JSON object
+	 * @eg:console.log(calendar.solar2lunar(1987,11,01));
+	 */
+	solar2lunar: function(y, m, d) { //参数区间1900.1.31~2100.12.31
+		y = parseInt(y)
+		m = parseInt(m)
+		d = parseInt(d)
+		//年份限定、上限
+		if (y < 1900 || y > 2100) {
+			return -1; // undefined转换为数字变为NaN
+		}
+		//公历传参最下限
+		if (y == 1900 && m == 1 && d < 31) {
+			return -1;
+		}
+		//未传参  获得当天
+		if (!y) {
+			var objDate = new Date();
+		} else {
+			var objDate = new Date(y, parseInt(m) - 1, d)
+		}
+		var i, leap = 0,
+			temp = 0;
+		//修正ymd参数
+		var y = objDate.getFullYear(),
+			m = objDate.getMonth() + 1,
+			d = objDate.getDate();
+		var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0,
+				31)) /
+			86400000;
+		for (i = 1900; i < 2101 && offset > 0; i++) {
+			temp = this.lYearDays(i);
+			offset -= temp;
+		}
+		if (offset < 0) {
+			offset += temp;
+			i--;
+		}
+
+		//是否今天
+		var isTodayObj = new Date(),
+			isToday = false;
+		if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+			isToday = true;
+		}
+		//星期几
+		var nWeek = objDate.getDay(),
+			cWeek = this.nStr1[nWeek];
+		//数字表示周几顺应天朝周一开始的惯例
+		if (nWeek == 0) {
+			nWeek = 7;
+		}
+		//农历年
+		var year = i;
+		var leap = this.leapMonth(i); //闰哪个月
+		var isLeap = false;
+
+		//效验闰月
+		for (i = 1; i < 13 && offset > 0; i++) {
+			//闰月
+			if (leap > 0 && i == (leap + 1) && isLeap == false) {
+				--i;
+				isLeap = true;
+				temp = this.leapDays(year); //计算农历闰月天数
+			} else {
+				temp = this.monthDays(year, i); //计算农历普通月天数
+			}
+			//解除闰月
+			if (isLeap == true && i == (leap + 1)) {
+				isLeap = false;
+			}
+			offset -= temp;
+		}
+		// 闰月导致数组下标重叠取反
+		if (offset == 0 && leap > 0 && i == leap + 1) {
+			if (isLeap) {
+				isLeap = false;
+			} else {
+				isLeap = true;
+				--i;
+			}
+		}
+		if (offset < 0) {
+			offset += temp;
+			--i;
+		}
+		//农历月
+		var month = i;
+		//农历日
+		var day = offset + 1;
+		//天干地支处理
+		var sm = m - 1;
+		var gzY = this.toGanZhiYear(year);
+
+		// 当月的两个节气
+		// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+		var firstNode = this.getTerm(y, (m * 2 - 1)); //返回当月「节」为几日开始
+		var secondNode = this.getTerm(y, (m * 2)); //返回当月「节」为几日开始
+
+		// 依据12节气修正干支月
+		var gzM = this.toGanZhi((y - 1900) * 12 + m + 11);
+		if (d >= firstNode) {
+			gzM = this.toGanZhi((y - 1900) * 12 + m + 12);
+		}
+
+		//传入的日期的节气与否
+		var isTerm = false;
+		var Term = null;
+		if (firstNode == d) {
+			isTerm = true;
+			Term = this.solarTerm[m * 2 - 2];
+		}
+		if (secondNode == d) {
+			isTerm = true;
+			Term = this.solarTerm[m * 2 - 1];
+		}
+		//日柱 当月一日与 1900/1/1 相差天数
+		var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
+		var gzD = this.toGanZhi(dayCyclical + d - 1);
+		//该日期所属的星座
+		var astro = this.toAstro(m, d);
+
+		var solarDate = y + '-' + m + '-' + d
+		var lunarDate = year + '-' + month + '-' + day
+
+		var festival = this.festival
+		var lfestival = this.lfestival
+
+		var festivalDate = m + '-' + d
+		var lunarFestivalDate = month + '-' + day
+
+		return {
+			// date: solarDate,
+			// lunarDate: lunarDate,
+			festival: festival[festivalDate] ? festival[festivalDate].title : null,
+			lunarFestival: lfestival[lunarFestivalDate] ? lfestival[lunarFestivalDate].title : null,
+			'lYear': year,
+			'lMonth': month,
+			'lDay': day,
+			'Animal': this.getAnimal(year),
+			'IMonthCn': (isLeap ? "\u95f0" : '') + this.toChinaMonth(month),
+			'IDayCn': this.toChinaDay(day),
+			// 'cYear': y,
+			// 'cMonth': m,
+			// 'cDay': d,
+			'gzYear': gzY,
+			'gzMonth': gzM,
+			'gzDay': gzD,
+			// 'isToday': isToday,
+			// 'isLeap': isLeap,
+			// 'nWeek': nWeek,
+			// 'ncWeek': "\u661f\u671f" + cWeek,
+			// 'isTerm': isTerm,
+			'Term': Term,
+			'astro': astro
+		};
+	},
+
+	/**
+	 * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+	 * @param y  lunar year
+	 * @param m  lunar month
+	 * @param d  lunar day
+	 * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+	 * @return JSON object
+	 * @eg:console.log(calendar.lunar2solar(1987,9,10));
+	 */
+	lunar2solar: function(y, m, d, isLeapMonth) { //参数区间1900.1.31~2100.12.1
+		y = parseInt(y)
+		m = parseInt(m)
+		d = parseInt(d)
+		var isLeapMonth = !!isLeapMonth;
+		var leapOffset = 0;
+		var leapMonth = this.leapMonth(y);
+		var leapDay = this.leapDays(y);
+		if (isLeapMonth && (leapMonth != m)) {
+			return -1;
+		} //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+		if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) {
+			return -1;
+		} //超出了最大极限值
+		var day = this.monthDays(y, m);
+		var _day = day;
+		//bugFix 2016-9-25
+		//if month is leap, _day use leapDays method
+		if (isLeapMonth) {
+			_day = this.leapDays(y, m);
+		}
+		if (y < 1900 || y > 2100 || d > _day) {
+			return -1;
+		} //参数合法性效验
+
+		//计算农历的时间差
+		var offset = 0;
+		for (var i = 1900; i < y; i++) {
+			offset += this.lYearDays(i);
+		}
+		var leap = 0,
+			isAdd = false;
+		for (var i = 1; i < m; i++) {
+			leap = this.leapMonth(y);
+			if (!isAdd) { //处理闰月
+				if (leap <= i && leap > 0) {
+					offset += this.leapDays(y);
+					isAdd = true;
+				}
+			}
+			offset += this.monthDays(y, i);
+		}
+		//转换闰月农历 需补充该年闰月的前一个月的时差
+		if (isLeapMonth) {
+			offset += day;
+		}
+		//1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+		var stmap = Date.UTC(1900, 1, 30, 0, 0, 0);
+		var calObj = new Date((offset + d - 31) * 86400000 + stmap);
+		var cY = calObj.getUTCFullYear();
+		var cM = calObj.getUTCMonth() + 1;
+		var cD = calObj.getUTCDate();
+
+		return this.solar2lunar(cY, cM, cD);
+	}
+};
+export default calendar;

+ 935 - 0
work/components/lunc-calendar/foodlunc-calendar.vue

@@ -0,0 +1,935 @@
+<template>
+	<view class="lunc-calendar">
+		<!-- 头部上下月按钮及月份 -->
+		<view class="header">
+			<!-- <text class="day_tit" >选择日期</text> -->
+			<!-- <text class="head-icon head-pre-month nocheck"  v-if="showChangeBtn&&!isshowPrev"></text> -->
+			<!-- <text class="head-icon head-pre-month" v-if="showChangeBtn&&isshowPrev" @click="changeMonthOrWeek('prev')"></text> -->
+			<text class="head-icon head-pre-month" v-if="showChangeBtn" @click="changeMonthOrWeek('prev')"></text>
+			<text class="head-month">{{selDate.year+'年'+(selDate.month<10?'0'+selDate.month:selDate.month)+'月'}}</text>
+			<text class="head-icon head-next-month" v-if="showChangeBtn" @click="changeMonthOrWeek('next')"></text>
+			<text class="go-to-today" v-if="showToday" @click="goToday">今天</text>
+		</view>
+		<!-- 星期 -->
+		<view class="week-area" :class="firstDayOfWeek=='sunday'?'week-tit':''">
+			<text class="week-font" v-for="(item, index) in weekArr" :key="index ">{{ getWeekType + '' + item }}</text>
+		</view>
+		<!-- 日历 -->
+		<swiper class="calendar-data" :current="shrinkType?tranCurrent:tranIndex" circular :duration="tranDuration"
+			@change="swiperChange" @animationfinish="swiperEndChange" :style="{height:shrinkType?'112rpx':'682rpx'}">
+			<swiper-item class="swiper-item swiper-prev-item" v-for="(a, i) in getAllData" :key="i">
+				<text class="month-bg" v-if="showMonthBg">{{ getMontBg }}</text>
+				<view class="month-days" :class="[shrinkType?'item-week':'']">
+					<view class="week-days" v-for="(b, j) in a" :key="j">
+						<view class="day" v-for="(c, k) in b" :key="k" @click="clickDay(c)">
+							<!-- 之前日期不可约 c.isBefore?'day-infoa':''-->
+							<view class="day-info" :class="[c.dayClass, getIsSelDay(c)&&'is-sel', c.dayType!='normal'&&'un-month',
+							]">
+								<text class="day-solar">{{ c.day }}</text>
+								<template v-if="c.sign&&c.sign.length">
+									<view class="cirs">
+										<view class="cir" :class="c.sign[0].am=='未预约'?'bga':''"></view>
+										<view class="cir" :class="c.sign[0].pm=='未预约'?'bga':''"></view>
+									</view>
+								</template>
+							</view>
+						</view>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<!-- 收缩按钮 -->
+		<view class="shrink" v-if="showShrink" @click="changeShrink">
+			<image :src="upimg" class="shrink-img" :class="[shrinkType?'shrink-open':'shrink-close']"></image>
+			<!-- <text class="shrink-btn" ></text> -->
+		</view>
+	</view>
+</template>
+<script>
+	let { calendar } = require("./calendar.js");
+	/**
+	 * @property {Boolean} showLunar = [true|false] 是否显示农历,默认false
+	 * @property {Boolean} showMonthBg = [true|false] 是否显示月份背景,默认true
+	 * @property {Boolean} showChangeBtn = [true|false] 是否显示上月下月箭头按钮,默认true
+	 * @property {String} firstDayOfWeek = [monday|sunday] 周几为每周的第一天,默认monday
+	 *  @value monday 每周从周一开始(默认)
+	 *  @value sunday 每周从周日开始
+	 * @property {String} weekType = [''|周|星期] 星期的前缀;如周一周二或星期一星期二,为空则只显示一、二等;不用预设值时可自定义前缀,填的值即为星期前缀;默认周
+	 *  @value '' 星期显示:只显示一、二等
+	 *  @value 周 星期显示:周一、周二等(默认)
+	 *  @value 星期 星期显示:星期一、星期二等
+	 * @property {Boolean} weekend = [true|false] 周末标红(周六周日日期用红色字体),默认true
+	 * @property {Boolean} showShrink = [true|false] 是否显示收缩按钮,可显示一周的日期,默认false
+	 * @property {String} shrinkState = [week|month] 收缩状态,默认month
+	 *  @value week 默认打开显示周数据(收起状态)
+	 *  @value month 默认打开显示月数据(展开状态)
+	 * @property {Array} signList 标记数组,若当前有多个标记,则显示最后一个,期待格式[{date: '2021-09-10', title: '生日', info: '八月初四张三生日'}]
+	 * @event {Function()} dayChange 点击日期触发事件,返回参数e={year,month,day,week,date,lunar,daySign},详情参数见文档
+	 * @event {Function()} monthChange 切换月份触发事件,返回参数e={year,month,type},详情参数见文档
+	 * @event {Function()} shrinkClick 收缩和展开时触发事件,返回参数e=week|month
+	 */
+	export default {
+		name: 'LuncCalendar',
+		props: {
+			//是否显示农历
+			showLunar: {
+				type: Boolean,
+				default: false
+			},
+			//是否显示月份背景
+			showMonthBg: {
+				type: Boolean,
+				default: true
+			},
+			//是否显示上月下月按钮
+			showChangeBtn: {
+				type: Boolean,
+				default: true
+			},
+			//每周的周几为第一天
+			firstDayOfWeek: {
+				type: String,
+				default: 'monday'
+			},
+			//每周的周几为第一天
+			weekType: {
+				type: String,
+				default: '周'
+			},
+			//周末标红
+			weekend: {
+				type: Boolean,
+				default: true
+			},
+			//是否可收缩,收起来后以周显示
+			showShrink: {
+				type: Boolean,
+				default: false
+			},
+			// 默认打开状态(收起或展开)
+			shrinkState:{
+				type: String,
+				default: 'month'
+			},
+			//标记
+			signList: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 周几不可约
+			configWeek:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 节假日预约
+			configHoliday:{
+				type: String,
+				default () {
+					return 'Y'
+				}
+			},
+		},
+		data() {
+			return {
+				upimg:require("@/static/images/order/comes/up.png"),
+				weekArr: ['一', '二', '三', '四', '五', '六', '日'], //星期数组
+				today: {}, //今天日期 -> year, month, day
+				selDate: {}, //选中日期信息 -> year, month, day
+
+				allMonthList: [], // 月份数据 -> [[[周],[周]],[月],[月]]
+				tranIndex: 1, // 月份轮播所在位置
+				allWeekList: [], // 周月份数据 -> [[[周]],[月],[月]]
+				tranCurrent: 1, // 周轮播所在位置
+				tranDuration: 300, //轮播时间(单位毫秒)
+
+				signArr: this.signList, // 标记列表
+				showToday: false, //显示回到今天(非当月才显示)
+				isshowPrev:false,//切换当月的上一个月
+				shrinkType: false, // 收缩状态,true:收起(显示周),false展开(显示月)
+				deterChange: true, // 防止切换月份过快
+			}
+		},
+		created() {
+			let nd = new Date();
+			this.today = {
+				year: nd.getFullYear(),
+				month: nd.getMonth() + 1,
+				day: nd.getDate()
+			}
+			if (this.firstDayOfWeek == "sunday") this.weekArr = ['日', '一', '二', '三', '四', '五', '六'];
+			this.initDate();
+		},
+		watch: {
+			signList(nList, oList){
+				this.signArr = nList;
+				this.setSignList();
+			}
+		},
+		computed: {
+			getAllData() { // 切换周或月时,展示的数据不同
+				return this.shrinkType ? this.allWeekList : this.allMonthList;
+			},
+			getMontBg() { // 获取当前月背景
+				let monthBg = this.selDate.month;
+				return !this.shrinkType ? (monthBg < 10 ? '0' + monthBg : monthBg) : '';
+			},
+			getIsSelDay(c) { // 判断是否是选中日期
+				return (d) => {
+					let { year, month, day } = this.selDate;
+					if(year == d.year && month == d.month && day == d.day){
+						this.$emit('getIsSelDayFn',d)
+					}
+					return year == d.year && month == d.month && day == d.day
+				}
+			},
+			getWeekType(){
+				let weekType = this.weekType;
+				if(weekType && weekType != "true" && weekType != "''" && weekType != '""'){
+					return weekType
+				}else{
+					return ''
+				}
+			}
+		},
+		methods: {
+			initDate() { // 初始化日期
+				this.selDate = JSON.parse(JSON.stringify(this.today));
+				let monthList = this.getMonthData(this.selDate); // 获取当月数据
+				let prevMonthList = this.getMonthData(this.getMonthDate(this.selDate, -1)); // 上月数据
+				let nextMonthList = this.getMonthData(this.getMonthDate(this.selDate)); // 下月数据
+				this.allMonthList = [prevMonthList, monthList, nextMonthList]
+				this.tranIndex = 1;
+				if(this.shrinkState == "week" && !this.shrinkType) this.changeShrink();
+			},
+			/**
+			 * 根据指定日期获取当月的数据
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 */
+			getMonthData(date) {
+				const { year, month, day } = date; //指定的日期
+				let maxDay = new Date(year, month, 0).getDate(); //当前月最大日期
+				let firstWeek = new Date(year + "/" + month + "/1").getDay(); //月份1号的星期数
+				if (this.firstDayOfWeek == "monday") firstWeek = firstWeek - 1 < 0 ? 6 : firstWeek - 1;
+				let list = [];
+				//每月显示42天,6周,每周7天
+				for (var i = 0; i < 42; i++) {
+					let dayInfo = {}; // 每天的详细信息
+					if (i < firstWeek) { //指定月份上月的最后几天
+						let { year, month } = this.getMonthDate(date, -1);
+						let preMaxDay = new Date(year, month, 0).getDate(); //上月最大日期
+						let day = preMaxDay - firstWeek + i + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'prev');
+					} else if (i > maxDay + firstWeek - 1) { //指定月份下月的前几天
+						let { year, month } = this.getMonthDate(date);
+						let day = i - maxDay - firstWeek + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'next');
+					} else {
+						let day = i - firstWeek + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'normal');
+					}
+					if (i % 7 == 0) list.push(new Array());
+					list[list.length - 1].push(dayInfo);
+				}
+				return list;
+			},
+			/**
+			 * 获取指定日期的详细信息,包括农历节假日等
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 * @param {String} dayType = [prev|next|normal] 日期类型,上月|下月|当前月
+			 */
+			getDayInfo(date, dayType) {
+				const { year, month, day } = date;
+				let isToday = false; //是否今天
+				let isBefore=false;//是否今天之前
+				if (year == this.today.year && month == this.today.month && day == this.today.day) isToday = true;
+				if(year==this.today.year&&month == this.today.month && day < this.today.day) isBefore=true;
+				
+				let week = new Date(year + "/" + month + "/" + day).getDay(); //星期数
+				let lunar = calendar.solar2lunar(year, month, day); //农历
+				let dayLunar = lunar.IDayCn == '初一' ? lunar.IMonthCn + lunar.IDayCn : lunar.IDayCn;
+				if (lunar.festival) dayLunar = lunar.festival; // 阳历节日
+				else if (lunar.lunarFestival) dayLunar = lunar.lunarFestival; // 农历节日
+				else if (lunar.Term) dayLunar = lunar.Term; // 节气
+				let holidayArr = ["元旦", "春节", "清明节", "劳动节", "端午节", "中秋节", "国庆节"];
+				let isHoliday = false;
+				if (holidayArr.indexOf(dayLunar) != -1) isHoliday = true;
+				let dayInfo = {
+					date: year + "-" + month + "-" + day,
+					year, month, day, week,
+					lunar, // 农历
+					dayLunar, // 显示的农历
+					isToday, // 是否是今日
+					isBefore,//是否今天之前
+					isHoliday, // 是否是节假日
+					dayType, // 日期类型,上月、下月或当前月
+					sign: this.getSignByDate(date)
+				}
+				let dayClass = this.getDayClass(dayInfo);
+				dayInfo["dayClass"] = dayClass;
+				return dayInfo;
+			},
+			/**
+			 * 根据日期详细信息添加对应的class
+			 * @param {Object} dayInfo 日期详情
+			 */
+			getDayClass(dayInfo) {
+				let dClass = "";
+				if (dayInfo.isToday) dClass += ' is-today'; // 今天日期
+				if (dayInfo.isHoliday) dClass += ' is-holiday'; // 法定假日
+				if (this.weekend && (dayInfo.week == 0 || dayInfo.week == 6)) dClass += ' week-end'; // 周末标红
+				return dClass;
+			},
+			/**
+			 * 根据日期获取日期对应的事件
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 */
+			getSignByDate(date) {
+				const { year, month, day } = date;
+				let dayDateS = new Date(year + "/" + month + "/" + day + " 00:00:00").getTime();
+				let dayDateE = new Date(year + "/" + month + "/" + day + " 23:59:59").getTime();
+				let daySign = [];
+				this.signArr.map(sign => {
+					let signDate = sign.date.replace(/-/g, '/');
+					let signTimes = new Date(sign.date).getTime();
+					if (signTimes >= dayDateS && signTimes <= dayDateE) daySign.push(sign)
+				})
+				return daySign;
+			},
+
+			/**
+			 * 获取月份数据
+			 * @param {String} type=[pre|next]
+			 */
+			getOtherData(type) {
+				let nowMont = this.getMonthDate(this.selDate, type == 'prev' ? -1 : 1); // 获取当前月份
+				this.selDate = nowMont; // 切换月份后设置选中的日期
+				let monthData = this.getMonthData(this.getMonthDate(nowMont, type == 'prev' ? -1 : 1));
+				// 获取上月或下月轮播所在位置
+				let current = this.getTranIndex().prevNum;
+				if (type == "next") current = this.getTranIndex().nextNum;
+				this.allMonthList.splice(current, 1, monthData);
+				this.judgeShowToday();
+				this.returnMonthChange(type);
+			},
+			/**
+			 * 获取周数据
+			 * @param {String} type=[pre|next]
+			 */
+			getOtherWeekData(type) {
+				let oldSel = this.selDate; // 原选中的日期
+				let newSel = this.getDateByDateAndDay(oldSel, type == 'prev' ? -7 : 7); // 获取7天前或后的日期
+				if (oldSel.month != newSel.month) { // 跨月,先设置跨月后的月历
+					// 设置月轮播位置
+					let current = this.getTranIndex("month").prevNum;
+					if (type == "next") current = this.getTranIndex("month").nextNum;
+					this.tranIndex = current;
+					this.getOtherData(type);
+				}
+				this.selDate = newSel;
+				this.getWeekData(type);
+				this.judgeShowToday();
+			},
+
+			// 从月历中获取周数据,切换周后获取上周或下周数据
+			getWeekData(type) {
+				const { prevNum: prevIndex, nowNum: nowIndex, nextNum: nextIndex } = this.getTranIndex("month");
+				const { prevNum: prevCurrent, nowNum: nowCurrent, nextNum: nextCurrent } = this.getTranIndex("week");
+				const { year: selYear, month: selMonth, day: selDay } = this.selDate;
+				let sDate = selYear + "-" + selMonth + "-" + selDay
+				let prevMonthList = this.allMonthList[prevIndex];
+				let nowMonthList = this.allMonthList[nowIndex];
+				let nextMonthList = this.allMonthList[nextIndex];
+				for (let i = 0; i < nowMonthList.length; i++) {
+					for (let j = 0; j < nowMonthList[i].length; j++) {
+						if (sDate == nowMonthList[i][j].date) {
+							this.returnDayChange(nowMonthList[i][j]); // 返回选中的日期
+							if (type == "next") {
+								this.allWeekList.splice(nextCurrent, 1, [nowMonthList[i + 1]]);
+								if (i == 5) this.allWeekList.splice(nextCurrent, 1, [nextMonthList[1]]);
+							} else {
+								this.allWeekList.splice(prevCurrent, 1, [nowMonthList[i - 1]]);
+								if (i == 0) {
+									for (let k = prevMonthList.length - 1; k >= 0; k--) {
+										if (prevMonthList[k][6].dayType == "normal") {
+											this.allWeekList.splice(prevCurrent, 1, [prevMonthList[k]]);
+											break;
+										}
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+			},
+			// 根据月份数据获取周数据,相当初始化周数据
+			getAllWeekData() {
+				const { prevNum, nowNum, nextNum } = this.getTranIndex("month");
+				const { year: selYear, month: selMonth, day: selDay } = this.selDate;
+				let sDate = selYear + "-" + selMonth + "-" + selDay; // 选中的日期
+				let allWeekList = [[],[],[]];
+				let prevMonthList = this.allMonthList[prevNum];
+				let nowMonthList = this.allMonthList[nowNum];
+				let nextMonthList = this.allMonthList[nextNum];
+				for (let i = 0; i < nowMonthList.length; i++) {
+					for (let j = 0; j < nowMonthList[i].length; j++) {
+						if (sDate == nowMonthList[i][j].date) {
+							allWeekList[0][0] = nowMonthList[i - 1];
+							allWeekList[1][0] = nowMonthList[i];
+							allWeekList[2][0] = nowMonthList[i + 1];
+							if (i == 5) {
+								allWeekList[2][0] = nextMonthList[1];
+							} else if (i == 0) {
+								for (let k = prevMonthList.length - 1; k >= 0; k--) {
+									if (prevMonthList[k][6].dayType == "normal") {
+										allWeekList[0][0] = prevMonthList[k];
+										break;
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+				this.allWeekList = allWeekList;
+			},
+			// 滑动切换结束
+			swiperEndChange() {
+				this.tranDuration = 300;
+			},
+			// 滑动切换月份或周
+			swiperChange(e) {
+				let current = e.detail.current;
+				let oldIndex = this.shrinkType ? this.tranCurrent : this.tranIndex;
+				let type = (oldIndex - current == -1 || oldIndex - current == 2) ? 'next' : 'prev';
+				if (this.shrinkType) {
+					this.tranCurrent = current;
+					if (current != oldIndex) this.getOtherWeekData(type);
+				} else {
+					this.tranIndex = current;
+					if (current != oldIndex) this.getOtherData(type);
+				}
+			},
+			// 点击切换月份或周(上月下月切换或上周下周切换)type = [prev|next] 切换类型
+			changeMonthOrWeek(type) {
+				if (!this.deterChange) return;
+				this.deterChange = false;
+				setTimeout(_ => {
+					this.deterChange = true;
+				}, 400); // 防止点击过快
+				this.tranDuration = 300;
+				let tranType = this.shrinkType ? 'week' : 'month';
+				let current = this.getTranIndex(tranType).prevNum;
+				if (type == "next") current = this.getTranIndex(tranType).nextNum;
+				if (tranType == "week") {
+					this.tranCurrent = current; 
+					this.getOtherWeekData(type);
+				} else {
+					this.tranIndex = current;
+					this.getOtherData(type);
+				}
+			},
+			// 点击收缩按钮,切换显示月份或显示周
+			changeShrink() {
+				this.shrinkType = !this.shrinkType;
+				if (this.tranDuration != 0) this.tranDuration = 0;
+				if (this.shrinkType) {
+					this.tranCurrent = 1;
+					this.getAllWeekData();
+				}
+				this.returnShrinkChange();
+				this.judgeShowToday();
+			},
+			// 点击回到今天
+			goToday() {
+				if (this.tranDuration != 0) this.tranDuration = 0;
+				let oldDate = JSON.parse(JSON.stringify(this.selDate));
+				this.initDate();
+				if (this.shrinkType) {
+					this.tranCurrent = 1;
+					this.getAllWeekData();
+					let today = this.today;
+					// 判断是否需要触发改变月份事件
+					if(oldDate.year != today.year || oldDate.month != today.month){
+						this.returnMonthChange("today");
+					}else{
+						this.returnDayChange(this.today);
+					}
+				} else {
+					this.returnMonthChange("today"); // 事件
+				}
+				this.judgeShowToday();
+			},
+			// 点击日期
+			clickDay(dayInfo) {
+				// var isweek=this.configWeek.indexOf(dayInfo.week)
+				// if(dayInfo.sign && dayInfo.sign.length > 0&&dayInfo.sign[0].title!='可预约'||dayInfo.sign.length==0||isweek!=-1||dayInfo.isHoliday&&this.configHoliday=='N'){
+				// 	return
+				// }
+				// if(dayInfo.isBefore){
+				// 	return
+				// }
+				
+				let { year, month, day } = this.selDate;
+				if (day == dayInfo.day && month == dayInfo.month && year == dayInfo.year) return;
+				let oldSel = JSON.parse(JSON.stringify(this.selDate));
+				this.selDate.day = dayInfo.day;
+				if (oldSel.month != dayInfo.month) {
+					if (!this.shrinkType) {
+						this.changeMonthOrWeek(dayInfo.dayType);
+						return;
+					} else {
+						this.selDate.year = dayInfo.year;
+						this.selDate.month = dayInfo.month;
+						let nowSel = JSON.parse(JSON.stringify(this.selDate));
+						let type = "nowNum"
+						if (nowSel.year > oldSel.year || (nowSel.year === oldSel.year && nowSel.month > oldSel.month)){
+							type = "nextNum"
+						} else if (nowSel.year < oldSel.year || (nowSel.year === oldSel.year && nowSel.month < oldSel.month)){
+							type = "prevNum"
+						}
+						this.tranIndex = this.getTranIndex("month")[type];
+						let monthData = this.getMonthData(this.getMonthDate(this.selDate, type == 'prevNum' ? -1 : 1));
+						let current = this.getTranIndex("month")[type];
+						this.allMonthList.splice(current, 1, monthData); // 设置上月或下月数据
+					}
+					this.returnMonthChange(dayInfo.dayType);
+				} else {
+					this.returnDayChange(dayInfo);
+				}
+			},
+			// 判断是否需要显示回到今天(非本月或本周时显示)
+			judgeShowToday() {
+				const { year, month, day } = this.today;
+				const { year: selYeat, month: selMonth, day: selDay } = this.selDate;
+				if (this.shrinkType) { // 显示的周
+					let selTimes = new Date(selYeat, selMonth - 1, selDay).getTime(); // 选中日期的时间戳
+					let week = new Date(year, month - 1, day).getDay(); // 今天星期
+					let firstWD = this.getDateByDateAndDay(this.today, -week + (this.firstDayOfWeek == "monday" ? 1 : 0));
+					let lastWD = this.getDateByDateAndDay(this.today, 6 - week + (this.firstDayOfWeek == "monday" ? 1 : 0));
+					let firstTimes = new Date(firstWD.year, firstWD.month - 1, firstWD.day).getTime();
+					let lastTimes = new Date(lastWD.year, lastWD.month - 1, lastWD.day).getTime();
+					if (selTimes > lastTimes || selTimes < firstTimes) this.showToday = true;
+					else this.showToday = false;
+					if(selTimes > lastTimes) this.isshowPrev=true;
+					else this.isshowPrev=false;
+				} else {
+					if (year != selYeat || month != selMonth) this.showToday = true;
+					else this.showToday = false;
+					// 判断是并不是当前月上一个月
+					if(Number(selYeat)>Number(year)||Number(selMonth)>Number(month)) this.isshowPrev=true;
+					else this.isshowPrev=false;
+				}
+			},
+
+			// 重新设置标记
+			setSignList() {
+				this.allMonthList.map(month => {
+					month.map(week => {
+						week.map(day => {
+							day.sign = this.getSignByDate({ year: day.year, month: day.month, day: day.day })
+						})
+					})
+				})
+			},
+			/**
+			 * 添加标记
+			 * @param {Array} list 需要添加的标记
+			 */
+			addSignList(list) {
+				let signArr = this.signArr.concat(list);
+				this.signArr = signArr;
+				this.setSignList();
+			},
+			/**
+			 * 删除标记
+			 * 根据date和title共同判断是否删除
+			 * @param {Array} list 需要删除的标记
+			 */
+			deleteSignList(list) {
+				let signArr = this.signArr;
+				signArr = signArr.filter(s => {
+					if (list.find(l => l.date == s.date && l.title == s.title)) return false
+					else return true;
+				})
+				this.signArr = signArr;
+				this.setSignList();
+			},
+			/**
+			 * 事件 - 设置返回日期
+			 * @param {Object} dayInfo 日期详情
+			 */
+			returnDayChange(dayInfo) {
+				let { year, month, day } = dayInfo;
+				let dayDate = year + "-" + (month < 10 ? '0' + month : month) + "-" + (day < 10 ? '0' + day : day)
+				let returnData = {
+					date: dayDate,
+					year: year,
+					month: month,
+					day: day,
+					week: dayInfo.week,
+					daySign: dayInfo.sign
+				}
+				if (this.showLunar) returnData["lunar"] = dayInfo.lunar;
+				this.$emit("dayChange", returnData);
+			},
+			/**
+			 * 事件 - 设置返回月份
+			 * @param {String} type 类型
+			 */
+			returnMonthChange(type) {
+				let selDate = this.selDate.year + "-" + this.selDate.month + "-" + this.selDate.day;
+				let monthList = this.allMonthList.flat().flat(); // 二维转一维
+				let dayInfo = monthList.find(day => day.date == selDate);
+				this.returnDayChange(dayInfo)
+				this.$emit("monthChange", {
+					year: dayInfo.year,
+					month: dayInfo.month,
+					type: type
+				});
+			},
+			/**
+			 * 事件 - 返回收缩状态
+			 */
+			returnShrinkChange() {
+				let type = this.shrinkType ? 'week' : 'month'
+				this.$emit("shrinkClick", type);
+			},
+			/**
+			 * 获取上一个或下一个轮播位置
+			 * @param {String} type = [month|week] 轮播类型,月轮播(tranIndex),周轮播(tranCurrent)
+			 * @returns {Object} {prevNum, nowNum, nextNum}
+			 */
+			getTranIndex(type = 'month') {
+				let current = this.tranIndex;
+				if (type == "week") current = this.tranCurrent;
+				let prevNum = current - 1 < 0 ? 2 : current - 1;
+				let nowNum = current;
+				let nextNum = current + 1 > 2 ? 0 : current + 1;
+				return { prevNum, nowNum, nextNum }
+			},
+			/**
+			 * 根据日期获取几天后的日期
+			 * @param {Object} date = {year, month, day} 当前日期
+			 * @param {Number} day 当前日期的几天前或几天后(负数)
+			 * @returns {Object} {year, month, day}
+			 */
+			getDateByDateAndDay(date, num) {
+				let dTime = new Date(date.year + "/" + date.month + "/" + date.day).getTime() + num * 24 * 60 * 60 * 1000;
+				let nd = new Date(dTime);
+				return {
+					year: nd.getFullYear(),
+					month: nd.getMonth() + 1,
+					day: nd.getDate()
+				}
+			},
+			/**
+			 * 获取几个月前或后的日期
+			 * @param {Object} date = {year, month, day} 当前日期
+			 * @param {Number} num 当前日期的num月前或后,默认1月后(下月)
+			 * @returns {Object} {year, month, day}
+			 */
+			getMonthDate(date, num = 1) {
+				let nextMonth = date.month + num;
+				let diffYear = parseInt(Math.abs(nextMonth) / 12);
+				let year = date.year;
+				let month = nextMonth;
+				if (nextMonth > 12) {
+					year = date.year + diffYear;
+					month = nextMonth % 12;
+				} else if (nextMonth < 1) {
+					year = date.year - (diffYear + 1);
+					month = nextMonth + 12 * (diffYear + 1);
+				}
+				let monthMaxDay = new Date(year, month, 0).getDate(); // 月份最大日期
+				let day = date.day > monthMaxDay ? monthMaxDay : date.day;
+				return { year, month, day }
+			},
+		}
+	}
+</script>
+<style lang="scss">
+.cirs{
+	display: flex;align-items: center;margin-top: 12rpx;
+	.cir{width: 8rpx;height: 8rpx;background: #0391FD;border-radius: 50%;margin: 0 3rpx;
+		&.bga{background-color: #DADADA;}
+		&.bgb{background-color: #F87C29;}
+	}
+}
+
+	.lunc-calendar {
+		background-color: #FFF;
+
+		// 头部
+		.header {
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+			position: relative;
+			height: 88rpx;
+			line-height: 88rpx;
+			border-bottom: 2rpx solid $com-cd3;
+
+			.head-month {
+				font-size: 30rpx;
+				padding: 0 40rpx;
+				font-weight: bold;
+			}
+			.day_tit{
+				position: absolute;
+				left: 0rpx;
+				top: 26rpx;
+				font-size: 30rpx;
+				line-height: 36rpx;
+				color:  #161616;
+				text-align: center;
+				font-weight: bold;
+			}
+			.go-to-today {
+				position: absolute;
+				right: 16rpx;
+				top: 26rpx;
+				font-size: 24rpx;
+				line-height: 36rpx;
+				color: $com-cd3;
+				text-align: center;
+				width: 80rpx;
+				height: 36rpx;
+				border: 2rpx solid $com-cd3;
+				border-radius: 18rpx;
+				box-sizing: border-box;
+			}
+
+			.head-icon {
+				content: '';
+				display: flex;
+				width: 22rpx;
+				height: 22rpx;
+				border-top: 2rpx solid $com-cd3;
+				border-left: 2rpx solid $com-cd3;
+			}
+
+			.head-icon.head-pre-month {
+				transform: rotate(-45deg);
+			}
+
+			.head-icon.head-next-month {
+				transform: rotate(135deg);
+			}
+			.head-icon.nocheck {
+				border-top: 2rpx solid #aaaaaa;
+				border-left: 2rpx solid #aaaaaa;
+			}
+		}
+
+		// 星期
+		.week-area {
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			// border-bottom: 1px solid #EEE;
+			padding: 16rpx 0;
+			// margin: 0 10rpx;
+
+			.week-font {
+				flex: 1;
+				text-align: center;
+				color: #161616;
+				font-size: 30rpx;
+				font-weight: bold;
+			}
+			&.week-tit{
+				.week-font:first-child{color: #aaaaaa;}
+				.week-font:last-child{color: #aaaaaa;}
+			}
+		}
+
+		// 日历
+		.calendar-data {
+			// transition: all 300ms;
+
+			.swiper-item {
+				position: relative;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				flex-direction: row;
+
+				.month-bg {
+					position: absolute;
+					font-size: 460rpx;
+					color: #EEE;
+					font-weight: bold;
+					opacity: 0.4;
+					z-index: -1;
+				}
+
+				.month-days {
+					flex: 1;
+					// margin-top: 10rpx;
+					position: relative;
+
+					.week-days {
+						display: flex;
+						flex-direction: row;
+						padding-top: 10rpx;
+						margin-bottom: 20rpx;
+						.day {
+							flex: 1;
+							width: 14.28%;
+							text-align: center;
+							// height: 84rpx;
+							height: 76rpx;
+							color: #000;
+							/* #ifndef APP-NVUE */
+							padding: 0 6rpx;
+							/* #endif */
+							// box-sizing: border-box;
+							display: flex;
+
+							.day-info {
+								flex: 1;
+								display: flex;
+								flex-direction: column;
+								justify-content: flex-start;
+								align-items: center;
+								position: relative;
+								
+								.day-solar {
+									display: flex;
+									font-size: 30rpx;
+									line-height: 76rpx;
+									width: calc(100% - 4rpx);
+									// height: 50rpx;
+									// padding-top: 10rpx;
+									border-radius: 16rpx 16rpx 0 0;
+									color: #161616;
+									box-sizing: border-box;
+									// background:#ffffff;
+									display: block;
+									// font-weight: bold;
+								}
+
+								.day-lunar,
+								.day-sign {
+									color: #161616;
+									font-size: 24rpx;
+									line-height: 24rpx;
+									transform: scale(0.8);
+									white-space: nowrap;
+									margin-top: 6rpx;
+								}
+
+								.day-sign {
+									color: #161616 !important;
+								}
+
+								.day-tag {
+									content: "";
+									position: absolute;
+									top: 8rpx;
+									right: 8rpx;
+									width: 10rpx;
+									height: 10rpx;
+									border-radius: 6rpx;
+									background-color: #F75858;
+								}
+							}
+							// 非当月日期
+							.day-info.un-month {
+								opacity: 0.25;
+								transition: opacity 300ms;
+							}
+
+							// 今天日期
+							.is-today .day-solar,
+							.is-today .day-sign,
+							.is-today .day-lunar {
+								color: $com-cd3;
+							}
+
+							// 周末
+							.week-end .day-solar {
+								// color: #FF9595;
+							}
+
+							// 法定假日
+							.is-holiday .day-solar,
+							.is-holiday .day-sign,
+							.is-holiday .day-lunar {
+								color: #161616 !important;
+							}
+							//不能预约的日期
+							.day-infoa,{
+								.day-solar{color: #AAAAAA !important;}
+								.day-sign{color: #AAAAAA !important;}
+								.day-lunar{color: #AAAAAA !important;}
+							}
+							// .is-holiday{
+							// 	.day-solar{color: #AAAAAA !important;}
+							// 	.day-sign{color: #AAAAAA !important;}
+							// }
+							// 当前选中的日期
+							.is-sel {
+								background-color: $com-cd3;
+								border-radius: 16rpx;
+								.day-solar{color: #ffffff !important}
+								.day-sign{color: #ffffff !important;}
+							}
+						}
+					}
+
+					// .week-days.week-hide {
+					// 	display: none;
+					// }
+				}
+
+				.item-week {
+					.un-month {
+						opacity: 1 !important;
+					}
+				}
+			}
+		}
+
+		// 收缩按钮
+		.shrink {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 60rpx;
+			// border-top: 1px solid #DDD;
+			.shrink-img{width: 32rpx;height: 18rpx;}
+			/* #ifndef APP-NVUE */
+			.shrink-btn {
+				width: 32rpx;
+				height: 32rpx;
+				background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAMhJREFUOE/dky8LAkEQxd9w0WjV72KxWXfggmAyWWzXxHbNYjIJhoOZarvid9FqNB4jCyes3h9OLghu3fceb36zS+h5qKcf/xYgIisAayJKnHMa8lFVZ2YpgB0z7193FQYisgCwAXA3s8QLicgbhwC2zHwMgxshBkFeXzE2Nvh2rW8NsiybRFE0ZuZTXZCIzIuiuMZxfKltICJTAAciegDwIM9eqKozAKmZDQAsmTlvHSGY/1YKR00cWl9iGYRP8p220BXm7//CE8WyQBHBXZb9AAAAAElFTkSuQmCC);
+			}
+			.shrink-close {
+				transform: rotate(180deg);
+			}
+			/* #endif */
+			/* #ifdef APP-NVUE */
+			.shrink-btn{
+				content: '';
+				display: flex;
+				width: 18rpx;
+				height: 18rpx;
+				border-top: 2rpx solid #606266;
+				border-left: 2rpx solid #606266;
+				transform: rotate(-135deg);
+			}
+
+			.shrink-close {
+				transform: rotate(45deg);
+			}
+			/* #endif */
+		}
+	}
+</style>

+ 940 - 0
work/components/lunc-calendar/lunc-calendar.vue

@@ -0,0 +1,940 @@
+<template>
+	<view class="lunc-calendar">
+		<!-- 头部上下月按钮及月份 -->
+		<view class="header">
+			<!-- <text class="day_tit" >选择日期</text> -->
+			<!-- <text class="head-icon head-pre-month nocheck"  v-if="showChangeBtn&&!isshowPrev"></text> -->
+			<!-- <text class="head-icon head-pre-month" v-if="showChangeBtn&&isshowPrev" @click="changeMonthOrWeek('prev')"></text> -->
+			<text class="head-icon head-pre-month" v-if="showChangeBtn" @click="changeMonthOrWeek('prev')"></text>
+			<text class="head-month">{{selDate.year+'年'+(selDate.month<10?'0'+selDate.month:selDate.month)+'月'}}</text>
+			<text class="head-icon head-next-month" v-if="showChangeBtn" @click="changeMonthOrWeek('next')"></text>
+			<text class="go-to-today" v-if="showToday" @click="goToday">今天</text>
+		</view>
+		<!-- 星期 -->
+		<view class="week-area" :class="firstDayOfWeek=='sunday'?'week-tit':''">
+			<text class="week-font" v-for="(item, index) in weekArr" :key="index ">{{ getWeekType + '' + item }}</text>
+		</view>
+		<!-- 日历 -->
+		<swiper class="calendar-data" :current="shrinkType?tranCurrent:tranIndex" circular :duration="tranDuration"
+			@change="swiperChange" @animationfinish="swiperEndChange" :style="{height:shrinkType?'112rpx':'682rpx'}">
+			<swiper-item class="swiper-item swiper-prev-item" v-for="(a, i) in getAllData" :key="i">
+				<text class="month-bg" v-if="showMonthBg">{{ getMontBg }}</text>
+				<view class="month-days" :class="[shrinkType?'item-week':'']">
+					<view class="week-days" v-for="(b, j) in a" :key="j">
+						<view class="day" v-for="(c, k) in b" :key="k" @click="clickDay(c)">
+							<!-- 之前日期不可约 c.isBefore?'day-infoa':''-->
+							<view class="day-info" :class="[c.dayClass, getIsSelDay(c)&&'is-sel', c.dayType!='normal'&&'un-month',
+							]">
+								<text class="day-solar">{{ c.day }}</text>
+								<template v-if="c.sign&&c.sign.length">
+									<view class="cirs">
+										<view class="cir bga" v-if="c.sign[0].amex=='2'&&c.sign[0].pmex=='2'"></view>
+										<view class="cir bga" v-else-if="c.sign[0].amex=='2'||c.sign[0].pmex=='2'"></view>
+										<view class="cir" v-else></view>
+										<!-- <block v-else>
+											<view class="cir" :class="c.sign[0].amex=='2'?'bgb':''"></view>
+											<view class="cir" :class="c.sign[0].pmex=='2'?'bgb':''"></view>
+										</block> -->
+									</view>
+								</template>
+							</view>
+						</view>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<!-- 收缩按钮 -->
+		<view class="shrink" v-if="showShrink" @click="changeShrink">
+			<image :src="upimg" class="shrink-img" :class="[shrinkType?'shrink-open':'shrink-close']"></image>
+			<!-- <text class="shrink-btn" ></text> -->
+		</view>
+	</view>
+</template>
+<script>
+	let { calendar } = require("./calendar.js");
+	/**
+	 * @property {Boolean} showLunar = [true|false] 是否显示农历,默认false
+	 * @property {Boolean} showMonthBg = [true|false] 是否显示月份背景,默认true
+	 * @property {Boolean} showChangeBtn = [true|false] 是否显示上月下月箭头按钮,默认true
+	 * @property {String} firstDayOfWeek = [monday|sunday] 周几为每周的第一天,默认monday
+	 *  @value monday 每周从周一开始(默认)
+	 *  @value sunday 每周从周日开始
+	 * @property {String} weekType = [''|周|星期] 星期的前缀;如周一周二或星期一星期二,为空则只显示一、二等;不用预设值时可自定义前缀,填的值即为星期前缀;默认周
+	 *  @value '' 星期显示:只显示一、二等
+	 *  @value 周 星期显示:周一、周二等(默认)
+	 *  @value 星期 星期显示:星期一、星期二等
+	 * @property {Boolean} weekend = [true|false] 周末标红(周六周日日期用红色字体),默认true
+	 * @property {Boolean} showShrink = [true|false] 是否显示收缩按钮,可显示一周的日期,默认false
+	 * @property {String} shrinkState = [week|month] 收缩状态,默认month
+	 *  @value week 默认打开显示周数据(收起状态)
+	 *  @value month 默认打开显示月数据(展开状态)
+	 * @property {Array} signList 标记数组,若当前有多个标记,则显示最后一个,期待格式[{date: '2021-09-10', title: '生日', info: '八月初四张三生日'}]
+	 * @event {Function()} dayChange 点击日期触发事件,返回参数e={year,month,day,week,date,lunar,daySign},详情参数见文档
+	 * @event {Function()} monthChange 切换月份触发事件,返回参数e={year,month,type},详情参数见文档
+	 * @event {Function()} shrinkClick 收缩和展开时触发事件,返回参数e=week|month
+	 */
+	export default {
+		name: 'LuncCalendar',
+		props: {
+			//是否显示农历
+			showLunar: {
+				type: Boolean,
+				default: false
+			},
+			//是否显示月份背景
+			showMonthBg: {
+				type: Boolean,
+				default: true
+			},
+			//是否显示上月下月按钮
+			showChangeBtn: {
+				type: Boolean,
+				default: true
+			},
+			//每周的周几为第一天
+			firstDayOfWeek: {
+				type: String,
+				default: 'monday'
+			},
+			//每周的周几为第一天
+			weekType: {
+				type: String,
+				default: '周'
+			},
+			//周末标红
+			weekend: {
+				type: Boolean,
+				default: true
+			},
+			//是否可收缩,收起来后以周显示
+			showShrink: {
+				type: Boolean,
+				default: false
+			},
+			// 默认打开状态(收起或展开)
+			shrinkState:{
+				type: String,
+				default: 'month'
+			},
+			//标记
+			signList: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 周几不可约
+			configWeek:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 节假日预约
+			configHoliday:{
+				type: String,
+				default () {
+					return 'Y'
+				}
+			},
+		},
+		data() {
+			return {
+				upimg:require("@/static/images/order/comes/up.png"),
+				weekArr: ['一', '二', '三', '四', '五', '六', '日'], //星期数组
+				today: {}, //今天日期 -> year, month, day
+				selDate: {}, //选中日期信息 -> year, month, day
+
+				allMonthList: [], // 月份数据 -> [[[周],[周]],[月],[月]]
+				tranIndex: 1, // 月份轮播所在位置
+				allWeekList: [], // 周月份数据 -> [[[周]],[月],[月]]
+				tranCurrent: 1, // 周轮播所在位置
+				tranDuration: 300, //轮播时间(单位毫秒)
+
+				signArr: this.signList, // 标记列表
+				showToday: false, //显示回到今天(非当月才显示)
+				isshowPrev:false,//切换当月的上一个月
+				shrinkType: false, // 收缩状态,true:收起(显示周),false展开(显示月)
+				deterChange: true, // 防止切换月份过快
+			}
+		},
+		created() {
+			let nd = new Date();
+			this.today = {
+				year: nd.getFullYear(),
+				month: nd.getMonth() + 1,
+				day: nd.getDate()
+			}
+			if (this.firstDayOfWeek == "sunday") this.weekArr = ['日', '一', '二', '三', '四', '五', '六'];
+			this.initDate();
+		},
+		watch: {
+			signList(nList, oList){
+				this.signArr = nList;
+				this.setSignList();
+			}
+		},
+		computed: {
+			getAllData() { // 切换周或月时,展示的数据不同
+				return this.shrinkType ? this.allWeekList : this.allMonthList;
+			},
+			getMontBg() { // 获取当前月背景
+				let monthBg = this.selDate.month;
+				return !this.shrinkType ? (monthBg < 10 ? '0' + monthBg : monthBg) : '';
+			},
+			getIsSelDay(c) { // 判断是否是选中日期
+				return (d) => {
+					let { year, month, day } = this.selDate;
+					if(year == d.year && month == d.month && day == d.day){
+						this.$emit('getIsSelDayFn',d)
+					}
+					return year == d.year && month == d.month && day == d.day
+				}
+			},
+			getWeekType(){
+				let weekType = this.weekType;
+				if(weekType && weekType != "true" && weekType != "''" && weekType != '""'){
+					return weekType
+				}else{
+					return ''
+				}
+			}
+		},
+		methods: {
+			initDate() { // 初始化日期
+				this.selDate = JSON.parse(JSON.stringify(this.today));
+				let monthList = this.getMonthData(this.selDate); // 获取当月数据
+				let prevMonthList = this.getMonthData(this.getMonthDate(this.selDate, -1)); // 上月数据
+				let nextMonthList = this.getMonthData(this.getMonthDate(this.selDate)); // 下月数据
+				this.allMonthList = [prevMonthList, monthList, nextMonthList]
+				this.tranIndex = 1;
+				if(this.shrinkState == "week" && !this.shrinkType) this.changeShrink();
+			},
+			/**
+			 * 根据指定日期获取当月的数据
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 */
+			getMonthData(date) {
+				const { year, month, day } = date; //指定的日期
+				let maxDay = new Date(year, month, 0).getDate(); //当前月最大日期
+				let firstWeek = new Date(year + "/" + month + "/1").getDay(); //月份1号的星期数
+				if (this.firstDayOfWeek == "monday") firstWeek = firstWeek - 1 < 0 ? 6 : firstWeek - 1;
+				let list = [];
+				//每月显示42天,6周,每周7天
+				for (var i = 0; i < 42; i++) {
+					let dayInfo = {}; // 每天的详细信息
+					if (i < firstWeek) { //指定月份上月的最后几天
+						let { year, month } = this.getMonthDate(date, -1);
+						let preMaxDay = new Date(year, month, 0).getDate(); //上月最大日期
+						let day = preMaxDay - firstWeek + i + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'prev');
+					} else if (i > maxDay + firstWeek - 1) { //指定月份下月的前几天
+						let { year, month } = this.getMonthDate(date);
+						let day = i - maxDay - firstWeek + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'next');
+					} else {
+						let day = i - firstWeek + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'normal');
+					}
+					if (i % 7 == 0) list.push(new Array());
+					list[list.length - 1].push(dayInfo);
+				}
+				return list;
+			},
+			/**
+			 * 获取指定日期的详细信息,包括农历节假日等
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 * @param {String} dayType = [prev|next|normal] 日期类型,上月|下月|当前月
+			 */
+			getDayInfo(date, dayType) {
+				const { year, month, day } = date;
+				let isToday = false; //是否今天
+				let isBefore=false;//是否今天之前
+				if (year == this.today.year && month == this.today.month && day == this.today.day) isToday = true;
+				if(year==this.today.year&&month == this.today.month && day < this.today.day) isBefore=true;
+				
+				let week = new Date(year + "/" + month + "/" + day).getDay(); //星期数
+				let lunar = calendar.solar2lunar(year, month, day); //农历
+				let dayLunar = lunar.IDayCn == '初一' ? lunar.IMonthCn + lunar.IDayCn : lunar.IDayCn;
+				if (lunar.festival) dayLunar = lunar.festival; // 阳历节日
+				else if (lunar.lunarFestival) dayLunar = lunar.lunarFestival; // 农历节日
+				else if (lunar.Term) dayLunar = lunar.Term; // 节气
+				let holidayArr = ["元旦", "春节", "清明节", "劳动节", "端午节", "中秋节", "国庆节"];
+				let isHoliday = false;
+				if (holidayArr.indexOf(dayLunar) != -1) isHoliday = true;
+				let dayInfo = {
+					date: year + "-" + month + "-" + day,
+					year, month, day, week,
+					lunar, // 农历
+					dayLunar, // 显示的农历
+					isToday, // 是否是今日
+					isBefore,//是否今天之前
+					isHoliday, // 是否是节假日
+					dayType, // 日期类型,上月、下月或当前月
+					sign: this.getSignByDate(date)
+				}
+				let dayClass = this.getDayClass(dayInfo);
+				dayInfo["dayClass"] = dayClass;
+				return dayInfo;
+			},
+			/**
+			 * 根据日期详细信息添加对应的class
+			 * @param {Object} dayInfo 日期详情
+			 */
+			getDayClass(dayInfo) {
+				let dClass = "";
+				if (dayInfo.isToday) dClass += ' is-today'; // 今天日期
+				if (dayInfo.isHoliday) dClass += ' is-holiday'; // 法定假日
+				if (this.weekend && (dayInfo.week == 0 || dayInfo.week == 6)) dClass += ' week-end'; // 周末标红
+				return dClass;
+			},
+			/**
+			 * 根据日期获取日期对应的事件
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 */
+			getSignByDate(date) {
+				const { year, month, day } = date;
+				let dayDateS = new Date(year + "/" + month + "/" + day + " 00:00:00").getTime();
+				let dayDateE = new Date(year + "/" + month + "/" + day + " 23:59:59").getTime();
+				let daySign = [];
+				this.signArr.map(sign => {
+					let signDate = sign.date.replace(/-/g, '/');
+					let signTimes = new Date(sign.date).getTime();
+					if (signTimes >= dayDateS && signTimes <= dayDateE) daySign.push(sign)
+				})
+				return daySign;
+			},
+
+			/**
+			 * 获取月份数据
+			 * @param {String} type=[pre|next]
+			 */
+			getOtherData(type) {
+				let nowMont = this.getMonthDate(this.selDate, type == 'prev' ? -1 : 1); // 获取当前月份
+				this.selDate = nowMont; // 切换月份后设置选中的日期
+				let monthData = this.getMonthData(this.getMonthDate(nowMont, type == 'prev' ? -1 : 1));
+				// 获取上月或下月轮播所在位置
+				let current = this.getTranIndex().prevNum;
+				if (type == "next") current = this.getTranIndex().nextNum;
+				this.allMonthList.splice(current, 1, monthData);
+				this.judgeShowToday();
+				this.returnMonthChange(type);
+			},
+			/**
+			 * 获取周数据
+			 * @param {String} type=[pre|next]
+			 */
+			getOtherWeekData(type) {
+				let oldSel = this.selDate; // 原选中的日期
+				let newSel = this.getDateByDateAndDay(oldSel, type == 'prev' ? -7 : 7); // 获取7天前或后的日期
+				if (oldSel.month != newSel.month) { // 跨月,先设置跨月后的月历
+					// 设置月轮播位置
+					let current = this.getTranIndex("month").prevNum;
+					if (type == "next") current = this.getTranIndex("month").nextNum;
+					this.tranIndex = current;
+					this.getOtherData(type);
+				}
+				this.selDate = newSel;
+				this.getWeekData(type);
+				this.judgeShowToday();
+			},
+
+			// 从月历中获取周数据,切换周后获取上周或下周数据
+			getWeekData(type) {
+				const { prevNum: prevIndex, nowNum: nowIndex, nextNum: nextIndex } = this.getTranIndex("month");
+				const { prevNum: prevCurrent, nowNum: nowCurrent, nextNum: nextCurrent } = this.getTranIndex("week");
+				const { year: selYear, month: selMonth, day: selDay } = this.selDate;
+				let sDate = selYear + "-" + selMonth + "-" + selDay
+				let prevMonthList = this.allMonthList[prevIndex];
+				let nowMonthList = this.allMonthList[nowIndex];
+				let nextMonthList = this.allMonthList[nextIndex];
+				for (let i = 0; i < nowMonthList.length; i++) {
+					for (let j = 0; j < nowMonthList[i].length; j++) {
+						if (sDate == nowMonthList[i][j].date) {
+							this.returnDayChange(nowMonthList[i][j]); // 返回选中的日期
+							if (type == "next") {
+								this.allWeekList.splice(nextCurrent, 1, [nowMonthList[i + 1]]);
+								if (i == 5) this.allWeekList.splice(nextCurrent, 1, [nextMonthList[1]]);
+							} else {
+								this.allWeekList.splice(prevCurrent, 1, [nowMonthList[i - 1]]);
+								if (i == 0) {
+									for (let k = prevMonthList.length - 1; k >= 0; k--) {
+										if (prevMonthList[k][6].dayType == "normal") {
+											this.allWeekList.splice(prevCurrent, 1, [prevMonthList[k]]);
+											break;
+										}
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+			},
+			// 根据月份数据获取周数据,相当初始化周数据
+			getAllWeekData() {
+				const { prevNum, nowNum, nextNum } = this.getTranIndex("month");
+				const { year: selYear, month: selMonth, day: selDay } = this.selDate;
+				let sDate = selYear + "-" + selMonth + "-" + selDay; // 选中的日期
+				let allWeekList = [[],[],[]];
+				let prevMonthList = this.allMonthList[prevNum];
+				let nowMonthList = this.allMonthList[nowNum];
+				let nextMonthList = this.allMonthList[nextNum];
+				for (let i = 0; i < nowMonthList.length; i++) {
+					for (let j = 0; j < nowMonthList[i].length; j++) {
+						if (sDate == nowMonthList[i][j].date) {
+							allWeekList[0][0] = nowMonthList[i - 1];
+							allWeekList[1][0] = nowMonthList[i];
+							allWeekList[2][0] = nowMonthList[i + 1];
+							if (i == 5) {
+								allWeekList[2][0] = nextMonthList[1];
+							} else if (i == 0) {
+								for (let k = prevMonthList.length - 1; k >= 0; k--) {
+									if (prevMonthList[k][6].dayType == "normal") {
+										allWeekList[0][0] = prevMonthList[k];
+										break;
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+				this.allWeekList = allWeekList;
+			},
+			// 滑动切换结束
+			swiperEndChange() {
+				this.tranDuration = 300;
+			},
+			// 滑动切换月份或周
+			swiperChange(e) {
+				let current = e.detail.current;
+				let oldIndex = this.shrinkType ? this.tranCurrent : this.tranIndex;
+				let type = (oldIndex - current == -1 || oldIndex - current == 2) ? 'next' : 'prev';
+				if (this.shrinkType) {
+					this.tranCurrent = current;
+					if (current != oldIndex) this.getOtherWeekData(type);
+				} else {
+					this.tranIndex = current;
+					if (current != oldIndex) this.getOtherData(type);
+				}
+			},
+			// 点击切换月份或周(上月下月切换或上周下周切换)type = [prev|next] 切换类型
+			changeMonthOrWeek(type) {
+				if (!this.deterChange) return;
+				this.deterChange = false;
+				setTimeout(_ => {
+					this.deterChange = true;
+				}, 400); // 防止点击过快
+				this.tranDuration = 300;
+				let tranType = this.shrinkType ? 'week' : 'month';
+				let current = this.getTranIndex(tranType).prevNum;
+				if (type == "next") current = this.getTranIndex(tranType).nextNum;
+				if (tranType == "week") {
+					this.tranCurrent = current; 
+					this.getOtherWeekData(type);
+				} else {
+					this.tranIndex = current;
+					this.getOtherData(type);
+				}
+			},
+			// 点击收缩按钮,切换显示月份或显示周
+			changeShrink() {
+				this.shrinkType = !this.shrinkType;
+				if (this.tranDuration != 0) this.tranDuration = 0;
+				if (this.shrinkType) {
+					this.tranCurrent = 1;
+					this.getAllWeekData();
+				}
+				this.returnShrinkChange();
+				this.judgeShowToday();
+			},
+			// 点击回到今天
+			goToday() {
+				if (this.tranDuration != 0) this.tranDuration = 0;
+				let oldDate = JSON.parse(JSON.stringify(this.selDate));
+				this.initDate();
+				if (this.shrinkType) {
+					this.tranCurrent = 1;
+					this.getAllWeekData();
+					let today = this.today;
+					// 判断是否需要触发改变月份事件
+					if(oldDate.year != today.year || oldDate.month != today.month){
+						this.returnMonthChange("today");
+					}else{
+						this.returnDayChange(this.today);
+					}
+				} else {
+					this.returnMonthChange("today"); // 事件
+				}
+				this.judgeShowToday();
+			},
+			// 点击日期
+			clickDay(dayInfo) {
+				// var isweek=this.configWeek.indexOf(dayInfo.week)
+				// if(dayInfo.sign && dayInfo.sign.length > 0&&dayInfo.sign[0].title!='可预约'||dayInfo.sign.length==0||isweek!=-1||dayInfo.isHoliday&&this.configHoliday=='N'){
+				// 	return
+				// }
+				// if(dayInfo.isBefore){
+				// 	return
+				// }
+				
+				let { year, month, day } = this.selDate;
+				if (day == dayInfo.day && month == dayInfo.month && year == dayInfo.year) return;
+				let oldSel = JSON.parse(JSON.stringify(this.selDate));
+				this.selDate.day = dayInfo.day;
+				if (oldSel.month != dayInfo.month) {
+					if (!this.shrinkType) {
+						this.changeMonthOrWeek(dayInfo.dayType);
+						return;
+					} else {
+						this.selDate.year = dayInfo.year;
+						this.selDate.month = dayInfo.month;
+						let nowSel = JSON.parse(JSON.stringify(this.selDate));
+						let type = "nowNum"
+						if (nowSel.year > oldSel.year || (nowSel.year === oldSel.year && nowSel.month > oldSel.month)){
+							type = "nextNum"
+						} else if (nowSel.year < oldSel.year || (nowSel.year === oldSel.year && nowSel.month < oldSel.month)){
+							type = "prevNum"
+						}
+						this.tranIndex = this.getTranIndex("month")[type];
+						let monthData = this.getMonthData(this.getMonthDate(this.selDate, type == 'prevNum' ? -1 : 1));
+						let current = this.getTranIndex("month")[type];
+						this.allMonthList.splice(current, 1, monthData); // 设置上月或下月数据
+					}
+					this.returnMonthChange(dayInfo.dayType);
+				} else {
+					this.returnDayChange(dayInfo);
+				}
+			},
+			// 判断是否需要显示回到今天(非本月或本周时显示)
+			judgeShowToday() {
+				const { year, month, day } = this.today;
+				const { year: selYeat, month: selMonth, day: selDay } = this.selDate;
+				if (this.shrinkType) { // 显示的周
+					let selTimes = new Date(selYeat, selMonth - 1, selDay).getTime(); // 选中日期的时间戳
+					let week = new Date(year, month - 1, day).getDay(); // 今天星期
+					let firstWD = this.getDateByDateAndDay(this.today, -week + (this.firstDayOfWeek == "monday" ? 1 : 0));
+					let lastWD = this.getDateByDateAndDay(this.today, 6 - week + (this.firstDayOfWeek == "monday" ? 1 : 0));
+					let firstTimes = new Date(firstWD.year, firstWD.month - 1, firstWD.day).getTime();
+					let lastTimes = new Date(lastWD.year, lastWD.month - 1, lastWD.day).getTime();
+					if (selTimes > lastTimes || selTimes < firstTimes) this.showToday = true;
+					else this.showToday = false;
+					if(selTimes > lastTimes) this.isshowPrev=true;
+					else this.isshowPrev=false;
+				} else {
+					if (year != selYeat || month != selMonth) this.showToday = true;
+					else this.showToday = false;
+					// 判断是并不是当前月上一个月
+					if(Number(selYeat)>Number(year)||Number(selMonth)>Number(month)) this.isshowPrev=true;
+					else this.isshowPrev=false;
+				}
+			},
+
+			// 重新设置标记
+			setSignList() {
+				this.allMonthList.map(month => {
+					month.map(week => {
+						week.map(day => {
+							day.sign = this.getSignByDate({ year: day.year, month: day.month, day: day.day })
+						})
+					})
+				})
+			},
+			/**
+			 * 添加标记
+			 * @param {Array} list 需要添加的标记
+			 */
+			addSignList(list) {
+				let signArr = this.signArr.concat(list);
+				this.signArr = signArr;
+				this.setSignList();
+			},
+			/**
+			 * 删除标记
+			 * 根据date和title共同判断是否删除
+			 * @param {Array} list 需要删除的标记
+			 */
+			deleteSignList(list) {
+				let signArr = this.signArr;
+				signArr = signArr.filter(s => {
+					if (list.find(l => l.date == s.date && l.title == s.title)) return false
+					else return true;
+				})
+				this.signArr = signArr;
+				this.setSignList();
+			},
+			/**
+			 * 事件 - 设置返回日期
+			 * @param {Object} dayInfo 日期详情
+			 */
+			returnDayChange(dayInfo) {
+				let { year, month, day } = dayInfo;
+				let dayDate = year + "-" + (month < 10 ? '0' + month : month) + "-" + (day < 10 ? '0' + day : day)
+				let returnData = {
+					date: dayDate,
+					year: year,
+					month: month,
+					day: day,
+					week: dayInfo.week,
+					daySign: dayInfo.sign
+				}
+				if (this.showLunar) returnData["lunar"] = dayInfo.lunar;
+				this.$emit("dayChange", returnData);
+			},
+			/**
+			 * 事件 - 设置返回月份
+			 * @param {String} type 类型
+			 */
+			returnMonthChange(type) {
+				let selDate = this.selDate.year + "-" + this.selDate.month + "-" + this.selDate.day;
+				let monthList = this.allMonthList.flat().flat(); // 二维转一维
+				let dayInfo = monthList.find(day => day.date == selDate);
+				this.returnDayChange(dayInfo)
+				this.$emit("monthChange", {
+					year: dayInfo.year,
+					month: dayInfo.month,
+					type: type
+				});
+			},
+			/**
+			 * 事件 - 返回收缩状态
+			 */
+			returnShrinkChange() {
+				let type = this.shrinkType ? 'week' : 'month'
+				this.$emit("shrinkClick", type);
+			},
+			/**
+			 * 获取上一个或下一个轮播位置
+			 * @param {String} type = [month|week] 轮播类型,月轮播(tranIndex),周轮播(tranCurrent)
+			 * @returns {Object} {prevNum, nowNum, nextNum}
+			 */
+			getTranIndex(type = 'month') {
+				let current = this.tranIndex;
+				if (type == "week") current = this.tranCurrent;
+				let prevNum = current - 1 < 0 ? 2 : current - 1;
+				let nowNum = current;
+				let nextNum = current + 1 > 2 ? 0 : current + 1;
+				return { prevNum, nowNum, nextNum }
+			},
+			/**
+			 * 根据日期获取几天后的日期
+			 * @param {Object} date = {year, month, day} 当前日期
+			 * @param {Number} day 当前日期的几天前或几天后(负数)
+			 * @returns {Object} {year, month, day}
+			 */
+			getDateByDateAndDay(date, num) {
+				let dTime = new Date(date.year + "/" + date.month + "/" + date.day).getTime() + num * 24 * 60 * 60 * 1000;
+				let nd = new Date(dTime);
+				return {
+					year: nd.getFullYear(),
+					month: nd.getMonth() + 1,
+					day: nd.getDate()
+				}
+			},
+			/**
+			 * 获取几个月前或后的日期
+			 * @param {Object} date = {year, month, day} 当前日期
+			 * @param {Number} num 当前日期的num月前或后,默认1月后(下月)
+			 * @returns {Object} {year, month, day}
+			 */
+			getMonthDate(date, num = 1) {
+				let nextMonth = date.month + num;
+				let diffYear = parseInt(Math.abs(nextMonth) / 12);
+				let year = date.year;
+				let month = nextMonth;
+				if (nextMonth > 12) {
+					year = date.year + diffYear;
+					month = nextMonth % 12;
+				} else if (nextMonth < 1) {
+					year = date.year - (diffYear + 1);
+					month = nextMonth + 12 * (diffYear + 1);
+				}
+				let monthMaxDay = new Date(year, month, 0).getDate(); // 月份最大日期
+				let day = date.day > monthMaxDay ? monthMaxDay : date.day;
+				return { year, month, day }
+			},
+		}
+	}
+</script>
+<style lang="scss">
+.cirs{
+	display: flex;align-items: center;margin-top: 12rpx;
+	.cir{width: 8rpx;height: 8rpx;background: #0391FD;border-radius: 50%;margin: 0 3rpx;
+		&.bga{background-color: #DADADA;}
+		&.bgb{background-color: #F87C29;}
+	}
+}
+
+	.lunc-calendar {
+		background-color: #FFF;
+
+		// 头部
+		.header {
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+			position: relative;
+			height: 88rpx;
+			line-height: 88rpx;
+			border-bottom: 2rpx solid $com-cd3;
+
+			.head-month {
+				font-size: 30rpx;
+				padding: 0 40rpx;
+				font-weight: bold;
+			}
+			.day_tit{
+				position: absolute;
+				left: 0rpx;
+				top: 26rpx;
+				font-size: 30rpx;
+				line-height: 36rpx;
+				color:  #161616;
+				text-align: center;
+				font-weight: bold;
+			}
+			.go-to-today {
+				position: absolute;
+				right: 16rpx;
+				top: 26rpx;
+				font-size: 24rpx;
+				line-height: 36rpx;
+				color: $com-cd3;
+				text-align: center;
+				width: 80rpx;
+				height: 36rpx;
+				border: 2rpx solid $com-cd3;
+				border-radius: 18rpx;
+				box-sizing: border-box;
+			}
+
+			.head-icon {
+				content: '';
+				display: flex;
+				width: 22rpx;
+				height: 22rpx;
+				border-top: 2rpx solid $com-cd3;
+				border-left: 2rpx solid $com-cd3;
+			}
+
+			.head-icon.head-pre-month {
+				transform: rotate(-45deg);
+			}
+
+			.head-icon.head-next-month {
+				transform: rotate(135deg);
+			}
+			.head-icon.nocheck {
+				border-top: 2rpx solid #aaaaaa;
+				border-left: 2rpx solid #aaaaaa;
+			}
+		}
+
+		// 星期
+		.week-area {
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			// border-bottom: 1px solid #EEE;
+			padding: 16rpx 0;
+			// margin: 0 10rpx;
+
+			.week-font {
+				flex: 1;
+				text-align: center;
+				color: #161616;
+				font-size: 30rpx;
+				font-weight: bold;
+			}
+			&.week-tit{
+				.week-font:first-child{color: #aaaaaa;}
+				.week-font:last-child{color: #aaaaaa;}
+			}
+		}
+
+		// 日历
+		.calendar-data {
+			// transition: all 300ms;
+
+			.swiper-item {
+				position: relative;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				flex-direction: row;
+
+				.month-bg {
+					position: absolute;
+					font-size: 460rpx;
+					color: #EEE;
+					font-weight: bold;
+					opacity: 0.4;
+					z-index: -1;
+				}
+
+				.month-days {
+					flex: 1;
+					// margin-top: 10rpx;
+					position: relative;
+
+					.week-days {
+						display: flex;
+						flex-direction: row;
+						padding-top: 10rpx;
+						margin-bottom: 20rpx;
+						.day {
+							flex: 1;
+							width: 14.28%;
+							text-align: center;
+							// height: 84rpx;
+							height: 76rpx;
+							color: #000;
+							/* #ifndef APP-NVUE */
+							padding: 0 6rpx;
+							/* #endif */
+							// box-sizing: border-box;
+							display: flex;
+
+							.day-info {
+								flex: 1;
+								display: flex;
+								flex-direction: column;
+								justify-content: flex-start;
+								align-items: center;
+								position: relative;
+								
+								.day-solar {
+									display: flex;
+									font-size: 30rpx;
+									line-height: 76rpx;
+									width: calc(100% - 4rpx);
+									// height: 50rpx;
+									// padding-top: 10rpx;
+									border-radius: 16rpx 16rpx 0 0;
+									color: #161616;
+									box-sizing: border-box;
+									// background:#ffffff;
+									display: block;
+									// font-weight: bold;
+								}
+
+								.day-lunar,
+								.day-sign {
+									color: #161616;
+									font-size: 24rpx;
+									line-height: 24rpx;
+									transform: scale(0.8);
+									white-space: nowrap;
+									margin-top: 6rpx;
+								}
+
+								.day-sign {
+									color: #161616 !important;
+								}
+
+								.day-tag {
+									content: "";
+									position: absolute;
+									top: 8rpx;
+									right: 8rpx;
+									width: 10rpx;
+									height: 10rpx;
+									border-radius: 6rpx;
+									background-color: #F75858;
+								}
+							}
+							// 非当月日期
+							.day-info.un-month {
+								opacity: 0.25;
+								transition: opacity 300ms;
+							}
+
+							// 今天日期
+							.is-today .day-solar,
+							.is-today .day-sign,
+							.is-today .day-lunar {
+								color: $com-cd3;
+							}
+
+							// 周末
+							.week-end .day-solar {
+								// color: #FF9595;
+							}
+
+							// 法定假日
+							.is-holiday .day-solar,
+							.is-holiday .day-sign,
+							.is-holiday .day-lunar {
+								color: #161616 !important;
+							}
+							//不能预约的日期
+							.day-infoa,{
+								.day-solar{color: #AAAAAA !important;}
+								.day-sign{color: #AAAAAA !important;}
+								.day-lunar{color: #AAAAAA !important;}
+							}
+							// .is-holiday{
+							// 	.day-solar{color: #AAAAAA !important;}
+							// 	.day-sign{color: #AAAAAA !important;}
+							// }
+							// 当前选中的日期
+							.is-sel {
+								background-color: $com-cd3;
+								border-radius: 16rpx;
+								.day-solar{color: #ffffff !important}
+								.day-sign{color: #ffffff !important;}
+							}
+						}
+					}
+
+					// .week-days.week-hide {
+					// 	display: none;
+					// }
+				}
+
+				.item-week {
+					.un-month {
+						opacity: 1 !important;
+					}
+				}
+			}
+		}
+
+		// 收缩按钮
+		.shrink {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 60rpx;
+			// border-top: 1px solid #DDD;
+			.shrink-img{width: 32rpx;height: 18rpx;}
+			/* #ifndef APP-NVUE */
+			.shrink-btn {
+				width: 32rpx;
+				height: 32rpx;
+				background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAMhJREFUOE/dky8LAkEQxd9w0WjV72KxWXfggmAyWWzXxHbNYjIJhoOZarvid9FqNB4jCyes3h9OLghu3fceb36zS+h5qKcf/xYgIisAayJKnHMa8lFVZ2YpgB0z7193FQYisgCwAXA3s8QLicgbhwC2zHwMgxshBkFeXzE2Nvh2rW8NsiybRFE0ZuZTXZCIzIuiuMZxfKltICJTAAciegDwIM9eqKozAKmZDQAsmTlvHSGY/1YKR00cWl9iGYRP8p220BXm7//CE8WyQBHBXZb9AAAAAElFTkSuQmCC);
+			}
+			.shrink-close {
+				transform: rotate(180deg);
+			}
+			/* #endif */
+			/* #ifdef APP-NVUE */
+			.shrink-btn{
+				content: '';
+				display: flex;
+				width: 18rpx;
+				height: 18rpx;
+				border-top: 2rpx solid #606266;
+				border-left: 2rpx solid #606266;
+				transform: rotate(-135deg);
+			}
+
+			.shrink-close {
+				transform: rotate(45deg);
+			}
+			/* #endif */
+		}
+	}
+</style>

+ 126 - 0
work/components/lunc-calendar/readme.md

@@ -0,0 +1,126 @@
+## 日历组件
+### 简单介绍
+- 组件需要依赖 sass 插件 ,请自行安装;
+- 本组件依赖 uni-app内置组件`swiper`组件,请与`swiper`组件配合使用;
+- nvue页面中的`swiper`组件部分功能不支持,详情见[uni-app内置组件:swiper](https://uniapp.dcloud.net.cn/component/swiper.html)
+- 通过uni_modules引用组件,在页面template中即可直接使用,无需在页面中import和注册components;
+- 可设置显示收缩按钮,收缩后只显示一个星期的日期,展开后显示一个月的日期;可以通过触摸屏幕左右滑动切换月份或切换周;
+- 可根据需要选择是否显示农历日期,且会显示节日,如春节、端午、国庆、腊八节等;
+- 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js)
+- 欢迎大家下载使用,项目源码示例:[https://gitee.com/lunc9932/calendar](https://gitee.com/lunc9932/calendar)
+- 若有插件导入失败,重启编辑器;
+
+### API
+#### 属性说明
+| 属性名           | 类型     | 默认值   | 说明              |
+|-----------------|----------|----------|-----------------------|
+| showLunar       | Boolean  | false    | 是否显示农历             |
+| firstDayOfWeek  | String   | monday   | 周几为每周的第一天,可选值:monday / sunday<br>monday:每周从周一开始;sunday:每周从周日开始           |
+| showMonthBg     | Boolean  | true     | 是否显示月份背景               |
+| weekend         | Boolean  | true     | 周末标红(周六周日日期用红色字体)  |
+| shouChangeBtn   | Boolean  | true     | 是否显示上月下月箭头按钮      |
+| weekType        | Boolean  | 周       | 星期的前缀,如星期一星期二,或周一周二,也可以只显示一、二等      |
+| showShrink      | Boolean  | false    | 是否显示收缩按钮      |
+| shrinkState     | String   | month    | 默认显示周数据还是月数据(收起或展开),可选值:week / month<br>week:默认打开显示周数据(收起状态);month:默认打开显示月数据(展开状态)      |
+| signList        | Array    | []       | 标记数组,若同日期有多个标记,则显示最后一个<br>期待格式[{date: '2021-09-10', title: '生日', info: '八月初四张三生日'}]  |
+
+注意:
+1. 标记日期会在日期下方显示“title”内容,建议“title”内容不超过4个汉字;
+2. 农历日期、节日、标记日期,只会显示其一,优先级 标记 > 节日 > 农历日期;
+3. `showShrink`表示是否显示收缩按钮,并不是表示收起或展开状态;
+
+#### 方法说明
+| 方法名          | 说明        | 参数 |
+|-----------------|------------|--------|
+| addSignList     | 添加标记    | (Array:list),传入需要添加的标记数组,日期相同不会覆盖,只显示第一个出现的标记         |
+| deleteSignList  | 删除标记    | (Array:list),传入需要删除的标记数组,根据 date 和 title 同时判断进行删除         |
+
+方法使用:在组件上添加 `ref` 属性,在调用对应的方法:`this.$refs.calendar.addSignList([])` 即可,详情见下方的基本用法;<br>
+**原 setSignList() 方法已弃用;**
+
+
+#### 事件说明
+| 事件名        | 说明                | 返回值 |
+|---------------|--------------------|--------|
+| @dayChange    | 选中日期改变时触发,包括点击日期、切换月份和切换周都会改变选中日期 | dayInfo,详情见下方说明 |
+| @monthChange  | 切换月份时触发,包括点击切换月份按钮、选中日期时切换的月份等都会改变触发 | monthInfo,详情见下方说明 |
+| @shrinkClick   | 收缩和展开时触发事件 | 返回当前状态:week / month<br>week:当前显示的一个星期(收起);month:当前显示的一个月(展开) |
+
+#### @dayChange 返回值 dayInfo 说明
+| 值      | 类型    | 说明  |
+| ------- | ------ | ----- |
+| date    | String | 日期,格式“yyyy-MM-dd” |
+| year    | Number | 年    |
+| month   | Number | 月    |
+| day     | Number | 日    |
+| week    | Number | 星期几 |
+| daySign | Array  | 当前日期的标记,若没有则为空数组 |
+| lunar   | Object | 农历信息,包含农历日期、节日、生肖等;<br>只有属性 showLunar 设置为 true 时才会返回此值; |
+
+#### @monthChange 返回值 monthInfo 说明
+| 值    | 类型    | 说明  |
+| ----- | ------ | ----- |
+| year  | Number | 年    |
+| month | Number | 月    |
+| type  | String | 返回类型:today / pre / next<br>today:当前月份,pre:上个月,next:下个月 |
+
+
+### 基本用法
+在`template`中使用组件
+
+```
+<view class="content">
+  <view class="content-item">
+    <lunc-calendar ref="calendar" :showLunar="true" :showMonthBg="true" :showShrink="true" :signList="signList"
+      @dayChange="dayChange" weekType="星期" @monthChange="monthChange" @shrinkClick="shrinkClick">
+    <view class="operation">
+      <view class="button" @click="addSign">新增标记</view>
+      <view class="button" @click="updateSign">修改标记</view>
+    </view>
+  </view>
+  <view class="content-item">
+    <lunc-calendar :showShrink="true" shrinkState="week"></lunc-calendar>
+  </view>
+</view>
+```
+在`script`中使用
+
+```
+export default {
+  data() {
+    return {
+      signList: [{date: "2023-06-25",title: "生日",info: "张三生日"},
+        {date: "2023-06-19",title: "朋友聚会"}, 
+        {date: "2023-07-22",title: "纪念日"}, 
+        {date: "2023-04-11",title: "聚会"}, 
+        {date: "2023-07-23",title: "郊游"}, 
+        {date: "2023-08-19",title: "游玩"}],
+    }
+  },
+  methods: {
+    dayChange(dayInfo) { // 点击日期
+      console.log("点击日期", JSON.parse(JSON.stringify(dayInfo)));
+    },
+    monthChange(monthInfo) { // 切换月份
+      console.log("切换月份", JSON.parse(JSON.stringify(monthInfo)));
+    },
+    shrinkClick(type) {
+      console.log("当前状态", type);
+    },
+
+    addSign() { // 添加标记
+      let addList = [{date: "2023-06-28",title: "休息"}, 
+        {date: "2023-06-01",title: "上班"}];
+      // 调用 addSignList 方法,传入需要添加的标记数组
+      this.$refs.calendar.addSignList(addList);
+    },
+    deleteSign() { // 删除标记
+      let deleteList = [{date: "2023-06-01",title: "上班"}];
+      // 调用 deleteSignList 方法,传入需要删除的标记数组
+      this.$refs.calendar.deleteSignList(deleteList);
+    }
+  }
+}
+```
+
+

+ 108 - 0
work/components/w-select/readme.md

@@ -0,0 +1,108 @@
+#### props
+
+| 名称         | 类型    | 默认值   | 说明                                                   |
+| ------------ | ------- | -------- | ------------------------------------------------------ |
+| width        | string  | '200px'  | 选择框宽度                                             |
+| height       | string  | '30px'   | 选择框高度                                             |
+| bgColor      | string  | '#fff'   | 选择框背景颜色                                         |
+| defaultValue | string  | '请选择' | 默认显示的名称                                         |
+| valueName    | string  | 'label'  | 显示的内容字段名                                       |
+| keyName      | string  | 'value'  | 绑定的内容字段名                                       |
+| list         | array   | []       | 展示的内容列表                                         |
+| showClose    | boolean | true     | 是否显示删除按钮                                       |
+| multiple     | boolean | false    | 是否开启多选                                           |
+| filterable   | boolean | false    | 是否开启搜索功能,开启后直接输入值不选择也可以保存内容 |
+
+该组件默认下拉选择器是从底部弹出,当检测到底部高度不足时则会在上面弹出
+
+#### events
+
+| 事件名 | 说明                                         |
+| ------ | -------------------------------------------- |
+| change | 选择的内容改变时触发,返回的参数为列表的item |
+
+#### 基本使用
+
+绑定的值通过`v-model`绑定,如下面的`chooseValue`,需要获取item的值可以监听`@change`事件
+
+```vue
+<template>
+  <view class="login">
+    <w-select 
+      style="margin-left: 20rpx;" 
+      v-model='chooseValue' 
+      :list='list'
+      valueName='content' 
+      keyName="id"
+      @change='change'
+    >
+    </w-select>
+  </view>
+</template>
+<script>
+  export default {
+    data() {
+      return {
+        chooseValue: "",
+        list: [{
+          id: 1,
+          content: '张三'
+        }, {
+          id: 2,
+          content: '李四'
+        }, {
+          id: 3,
+          content: '王五'
+        }],
+      };
+    },
+    methods: {
+      change(e) {
+        console.log('chooseValue', this.chooseValue)
+      }
+    },
+  }
+</script>
+```
+
+#### 多选
+
+多选开启`multiple`属性,双向绑定的值必须为数组类型,在change事件中根据自己需求进行处理。
+
+```vue
+<template>
+    <w-select 
+      v-model='chooseValue' 
+      :list='list'
+      multiple
+      valueName='content' 
+      keyName="id"
+      @change='change'
+    >
+    </w-select>
+</template>
+<script>
+  export default {
+    data() {
+      return {
+        chooseValue: [],
+        list: [{
+          id: 1,
+          content: '张三'
+        }, {
+          id: 2,
+          content: '李四'
+        }, {
+          id: 3,
+          content: '王五'
+        }],
+      };
+    },
+    methods: {
+      change(e) {
+        console.log('chooseValue', this.chooseValue)
+      }
+    },
+  }
+</script>
+```

+ 579 - 0
work/components/w-select/w-select.vue

@@ -0,0 +1,579 @@
+<template>
+	<view
+	  class="w-select"
+	  id="wSelect"
+	  :style="{
+		'--select-wrap-width': width,
+		'--select-wrap-height': height,
+		'--select-bg-color': bgColor
+	  }"
+	>
+	  <view :class="isShow ? 'select-wrap-active' : ''" class="select-wrap" @click="changeShow">
+		<view v-if="multiple" class="select-content">
+		  <view class="select-content-item-default" v-if="multiSelectList.length === 0 && !filterable">
+			{{ defaultValue }}
+		  </view>
+		  <view class="select-content-item" v-if="multiSelectList.length > 0">
+			{{ multiSelectList[0][valueName] }}
+		  </view>
+		  <view class="select-content-item" v-if="multiSelectList.length > 1">
+			{{ multiLength }}
+		  </view>
+		</view>
+		<input
+		  v-if="!multiple || filterable"
+		  type="text"
+		  @input="inputChange"
+		  @blur="blurChange"
+		  :placeholder="multiple ? multiSelectList.length === 0 ? defaultValue : '' : defaultValue"
+		  :disabled="!filterable"
+		  :style="!filterable ? 'pointer-events: none' : ''"
+		  :value="inputData"
+		>
+		<!-- #ifdef VUE2 -->
+		<view
+		  @click.stop="refreshValue"
+		  class="close-icon"
+		  v-if="showClose && (multiple ? value.length > 0 : value)"
+		>
+		  <image :src="refreshUrl" mode="" />
+		</view>
+		<view
+		  v-if="value.length <= 0 || !showClose"
+		  :class="isShow ? 'w-select-arrow-up' : ''"
+		  class="w-select-arrow "
+		/>
+		<!-- #endif -->
+		<!-- #ifdef VUE3 -->
+		<view
+		  @click.stop="refreshValue"
+		  class="close-icon"
+		  v-if="showClose && (multiple ? modelValue.length > 0 : modelValue)"
+		>
+		  <image :src="refreshUrl" mode="" />
+		</view>
+		<view
+		  v-if="modelValue.length <= 0 || !showClose"
+		  :class="isShow ? 'w-select-arrow-up' : ''"
+		  class="w-select-arrow "
+		/>
+		<!-- #endif -->
+  
+		<scroll-view
+		  scroll-y
+		  v-show="optionsShow"
+		  :class="[
+			isShow
+			  ? showPosition === 'bottom'
+				? 'animation-bottom-in'
+				: 'animation-top-in'
+			  : showPosition === 'bottom'
+				? 'animation-bottom-out'
+				: 'animation-top-out',
+			showPosition === 'bottom'
+			  ? 'position-bottom'
+			  : 'position-top'
+		  ]"
+		  class="select-options"
+		>
+		  <!-- #ifdef VUE2 -->
+		  <view
+			@click.stop="handleClickItem(item)"
+			:class="
+			  multiple &&
+				multiSelectList.find(
+				  res => res[keyName] === item[keyName]
+				)
+				? 'item-active'
+				: value == item[keyName]
+				  ? 'item-active'
+				  : ''
+			"
+			v-for="item in filterList"
+			:key="item[keyName]"
+			class="select-option-item"
+		  >
+			{{ item[valueName] }}
+		  </view>
+		  <!-- #endif -->
+		  <!-- #ifdef VUE3 -->
+		  <view
+			@click.stop="handleClickItem(item)"
+			:class="
+			  multiple &&
+				multiSelectList.find(
+				  res => res[keyName] === item[keyName]
+				)
+				? 'item-active'
+				: modelValue == item[keyName]
+				  ? 'item-active'
+				  : ''
+			"
+			v-for="item in filterList"
+			:key="item[keyName]"
+			class="select-option-item"
+		  >
+			{{ item[valueName] }}
+		  </view>
+		  <!-- #endif -->
+  
+		  <view class="options-no-data" v-if="filterList.length < 1">
+			无匹配数据~
+		  </view>
+		</scroll-view>
+	  </view>
+	  <view v-if="isShow" @click="closeContentSelect" class="contentMask" />
+	</view>
+  </template>
+  
+  <script>
+  export default {
+	props: {
+	  width: {
+		type: String,
+		default: '200px'
+	  },
+	  height: {
+		type: String,
+		default: '30px'
+	  },
+	  bgColor: {
+		type: String,
+		default: '#fff'
+	  },
+	  // 是否多选
+	  multiple: {
+		type: Boolean,
+		default: false
+	  },
+	  // 是否可搜索
+	  filterable: {
+		type: Boolean,
+		default: false
+	  },
+	  // 是否显示关闭按钮
+	  showClose: {
+		type: Boolean,
+		default: false
+	  },
+	  // 渲染列表
+	  list: {
+		type: Array,
+		default: () => []
+	  },
+	  // #ifdef VUE3
+	  // 双向绑定的值
+	  modelValue: {
+		type: [Array, String, Number],
+		default: ''
+	  },
+	  // #endif
+	  // #ifdef VUE2
+	  // 双向绑定的值
+	  value: {
+		type: [Array, String, Number],
+		default: ''
+	  },
+	  // #endif
+	  // 默认显示的内容
+	  defaultValue: {
+		type: String,
+		default: '请选择'
+	  },
+	  // 显示的内容
+	  valueName: {
+		type: String,
+		default: 'label'
+	  },
+	  // 绑定的内容
+	  keyName: {
+		type: String,
+		default: 'value'
+	  },
+	  chosevalue:{
+	  		type: String,
+	  		default: '' 
+	  }
+	},
+	// #ifdef VUE3
+	emits: ['update:modelValue', 'change'],
+	// #endif
+	watch: {
+		chosevalue(newval){
+			if(newval&&!this.inputData){
+				this.inputData=newval
+			}
+		},
+	  list: {
+		immediate: true,
+		deep: true,
+		handler (news) {
+		  this.filterList = news
+		  const findItem = news.find(item => {
+			let isItem = ''
+			// #ifdef VUE3
+			if (item[this.keyName] === this.modelValue) {
+			  isItem = true
+			} else {
+			  isItem = false
+			}
+			// #endif
+  
+			// #ifdef VUE2
+			
+			if (item[this.keyName] === this.value) {
+			  isItem = true
+			} else {
+			  isItem = false
+			}
+			// #endif
+			return isItem
+		  })
+		  if (findItem) { 
+			this.inputData = findItem[this.valueName]
+		  }
+		}
+	  }
+	},
+	computed: {
+	  multiLength () {
+		const length = this.multiSelectList.length - 1
+		return '+' + length
+	  },
+	  bottomDistance () {
+		return (
+		  this.windowHeight - this.distanceTop - this.curHeight
+		) // 当前元素距离可视屏幕底部的距离
+	  }
+	},
+	data () {
+	  return {
+		inputData: '',
+		// #ifdef VUE3
+		multiSelectList: this.multiple ? this.modelValue : [],
+		// #endif
+		// #ifdef VUE2
+		multiSelectList: this.multiple ? this.value : [],
+		// #endif
+		isShow: false,
+		optionsShow: false,
+		windowHeight: null,
+		curHeight: null,
+		distanceTop: null,
+		showPosition: 'bottom',
+		filterList: [],
+		refreshUrl: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC4wMSIvPjxwYXRoIGQ9Ik0yNCA0NEMzNS4wNDU3IDQ0IDQ0IDM1LjA0NTcgNDQgMjRDNDQgMTIuOTU0MyAzNS4wNDU3IDQgMjQgNEMxMi45NTQzIDQgNCAxMi45NTQzIDQgMjRDNCAzNS4wNDU3IDEyLjk1NDMgNDQgMjQgNDRaIiBmaWxsPSJub25lIiBzdHJva2U9IiM3YzZlNmUiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0yOS42NTY5IDE4LjM0MzFMMTguMzQzMiAyOS42NTY4IiBzdHJva2U9IiM3YzZlNmUiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggZD0iTTE4LjM0MzIgMTguMzQzMUwyOS42NTY5IDI5LjY1NjgiIHN0cm9rZT0iIzdjNmU2ZSIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4='
+	  }
+	},
+	mounted () {
+	  this.$nextTick(() => {
+		const res = uni.getSystemInfoSync()
+		this.windowHeight = res.windowHeight // 当前设备屏幕高度
+		uni
+		  .createSelectorQuery()
+		  .in(this)
+		  .select('#wSelect')
+		  .boundingClientRect(data => {
+			this.distanceTop = data.top // 当前元素距离顶部的距离
+			this.curHeight = data.height
+		  })
+		  .exec()
+	  })
+	},
+	methods: {
+	  showPositon () {
+		this.showPosition = 'bottom'
+		if (this.bottomDistance < this.windowHeight / 3) {
+		  this.showPosition = 'top'
+		}
+	  },
+	  changeShow () {
+		this.isShow = !this.isShow
+		if (this.isShow === false) {
+		  this.filterList = this.list
+		  setTimeout(() => {
+			this.optionsShow = false
+		  }, 200)
+		} else {
+		  this.showPositon()
+		  this.optionsShow = this.isShow;
+		  // 重置列表
+		  this.filterList = this.list
+		}
+	  },
+	  closeContentSelect () {
+		this.isShow = false
+		setTimeout(() => {
+		  this.optionsShow = false
+		}, 200)
+	  },
+	  setValue (value = '') {
+		// #ifdef VUE3
+		this.$emit('update:modelValue', value)
+		// #endif
+  
+		// #ifdef VUE2
+		this.$emit('input', value)
+		// #endif
+	  },
+	  inputChange (e) {
+		const value = e.detail.value
+		if(this.multiple && this.filterable) {
+			this.inputData = value
+		}else {
+			// this.setValue(value)
+			this.inputData = value
+		}
+		
+		this.filterList = this.list.filter(item =>
+		  item[this.valueName].includes(value)
+		)
+	  },
+	  blurChange(e) {
+		const value = e.detail.value
+		this.inputData=this.chosevalue;
+		if(this.multiple && this.filterable && value) {
+			let curValue ={
+				[this.keyName]:value,
+				[this.valueName]:value
+			}
+			this.multiSelect(curValue)
+		}
+	  },
+	  refreshValue () {
+		this.setValue('')
+		this.inputData = ''
+		this.$emit('change', '')
+		this.filterList = this.list
+		if (this.multiple) {
+		  this.multiSelectList = []
+		}
+	  },
+	  handleClickItem (e) {
+		if (this.multiple) {
+		  this.multiSelect(e)
+		} else {
+		  this.setValue(e[this.keyName])
+		  this.inputData = e[this.valueName]
+		  this.$emit('change', e)
+		  this.changeShow()
+		}
+	  },
+	  multiSelect (item) {
+		const index = this.multiSelectList.findIndex(
+		  res => res[this.valueName] === item[this.valueName]
+		)
+		if (index > -1) {
+		  this.multiSelectList.splice(index, 1)
+		} else {
+		  this.multiSelectList.push(item)
+		}
+		this.inputData = ''
+		this.filterList = this.list
+		this.setValue(this.multiSelectList)
+		this.$emit('change', item)
+	  }
+	}
+  }
+  </script>
+  <style lang="scss" scoped>
+.select-wrap /deep/ .input-placeholder{font-size: 28rpx;color: #AAAAAA;}
+  .w-select {
+	--select-wrap-width: 200px;
+	--select-wrap-height: 30px;
+	--select-border-radius: 4px;
+	--select-border: 1px solid #dcdfe6;
+	--select-active-border: 1px solid #409eff;
+	--select-options-max-height: 150px;
+	--select-option-item-font-size: 14px;
+	--select-input-font-size: 14px;
+	--no-data-default-color: #999999;
+	--select-options-box-shadow: 0px 0px 12px rgb(0 0 0 / 12%);
+	--select-bg-color: #ffffff;
+	.select-wrap {
+	  position: relative;
+	  display: flex;
+	  justify-content: space-between;
+	  align-items: center;
+	  width: var(--select-wrap-width);
+	  height: var(--select-wrap-height);
+	  padding: 0 10rpx 0 20rpx;
+	  box-sizing:border-box;
+	// border: var(--select-border);
+	  border-radius: var(--select-border-radius);
+	  // background-color: var(--select-bg-color);
+	  transition: all 0.2s;
+	  // background-color: #EEEEEE;
+	  input {
+		padding: 0 2px;
+		width: 100%;
+		min-width: 0;
+		height: 100%;
+		font-size: var(--select-input-font-size);
+		flex: 1;
+		text-align: right;
+		font-size: 28rpx;
+	  }
+	  .select-content {
+		display: flex;
+		align-items: center;
+		font-size: var(--select-option-item-font-size);
+		.select-content-item {
+		  margin-left: 5px;
+		  padding: 2px 6px;
+		  border-radius: var(--select-border-radius);
+		  color: #aa93b1;
+		  background-color: #f4f4f5;
+		}
+		.select-content-item-default {
+		  margin-left: 5px;
+		  color: var(--no-data-default-color);
+		}
+	  }
+	  .close-icon {
+		position: absolute;
+		top: 50%;
+		right: 7px;
+		z-index: 1000;
+		width: 15px;
+		height: 15px;
+		transform: translateY(-50%);
+		image {
+		  width: 100%;
+		  height: 100%;
+		}
+	  }
+	  .position-bottom {
+		top: calc(var(--select-wrap-height) + 10px);
+	  }
+	  .position-top {
+		bottom: calc(var(--select-wrap-height) + 10px);
+	  }
+	  .select-options {
+		position: absolute;
+		right: 0;
+		left: 0;
+		z-index: 999;
+		overflow: scroll;
+		padding: 10px;
+		max-height: var(--select-options-max-height);
+		border-radius: var(--select-border-radius);
+		background-color: var(--select-bg-color);
+		box-shadow: var(--select-options-box-shadow);
+		.select-option-item {
+		  margin-bottom: 5px;
+		  padding: 5px;
+		  font-size: var(--select-option-item-font-size);
+		  transition: background-color 0.2s;
+		}
+		.item-active {
+		  font-weight: 700;
+		  color: #409eff;
+		  // background-color: #f5f7fa;
+		}
+		.options-no-data {
+		  font-size: var(--select-option-item-font-size);
+		  text-align: center;
+		  color: var(--no-data-default-color);
+		}
+	  }
+	  .w-select-arrow {
+		display: inline-block;
+		margin: 3px 10px 0;
+		width: 8px;
+		height: 8px;
+		border-top: 1px solid transparent;
+		border-right: 1px solid transparent;
+		border-bottom: 1px solid #999999;
+		border-left: 1px solid #999999;
+		transition: all 0.3s;
+		transform: translateY(-50%) rotate(-45deg);
+	  }
+	  .w-select-arrow-up {
+		transform: rotate(-225deg);
+	  }
+	}
+	.select-wrap-active {
+	  // border: var(--select-active-border);
+	}
+	.animation-bottom-in {
+	  animation-name: bottom-in;
+	  animation-duration: 0.4s;
+	  animation-timing-function: ease-out;
+	  animation-fill-mode: both;
+	}
+	.animation-bottom-out {
+	  animation-name: bottom-out;
+	  animation-duration: 0.2s;
+	  animation-timing-function: ease-out;
+	  animation-fill-mode: both;
+	}
+	.animation-top-in {
+	  animation-name: top-in;
+	  animation-duration: 0.4s;
+	  animation-timing-function: ease-out;
+	  animation-fill-mode: both;
+	}
+	.animation-top-out {
+	  animation-name: top-out;
+	  animation-duration: 0.2s;
+	  animation-timing-function: ease-out;
+	  animation-fill-mode: both;
+	}
+  
+	@keyframes bottom-in {
+	  0% {
+		opacity: 0;
+		transform: translateY(-15%);
+	  }
+	  100% {
+		opacity: 1;
+		transform: translateY(0);
+	  }
+	}
+  
+	@keyframes bottom-out {
+	  0% {
+		opacity: 1;
+		transform: translateY(0);
+	  }
+	  100% {
+		opacity: 0;
+		transform: translateY(-20%);
+	  }
+	}
+  
+	@keyframes top-in {
+	  0% {
+		opacity: 0;
+		transform: translateY(15%);
+	  }
+	  100% {
+		opacity: 1;
+		transform: translateY(0);
+	  }
+	}
+  
+	@keyframes top-out {
+	  0% {
+		opacity: 1;
+		transform: translateY(0);
+	  }
+	  100% {
+		opacity: 0;
+		transform: translateY(20%);
+	  }
+	}
+	.contentMask {
+	  position: fixed;
+	  top: 0;
+	  right: 0;
+	  bottom: 0;
+	  left: 0;
+	  z-index: 998;
+	  width: 100%;
+	  height: 100%;
+	}
+  }
+  </style>
+  

+ 392 - 0
work/components/yuyue/list.vue

@@ -0,0 +1,392 @@
+<template>
+  <view>
+	<view v-if="datalist.length>0">
+		<!-- 预约 -->
+		<block v-if="type=='order'">
+			<view class="ylist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
+				<image :src="ysta" class="ystaimg" v-if="ite.visitType==3"></image>
+				<image :src="ystb" class="ystaimg" v-if="ite.visitType==2"></image>
+				<view class="ytop flexc">
+					<view class="tit">{{ite.visitName.charAt(0)}}</view>
+					<view class="cent">
+						<view class="ctit">{{ite.visitName}}提交的预约来访申请</view>
+						<view class="ctime">提交时间:{{ite.createTime}}</view>
+					</view>
+					<view class="right" v-if="ite.visitType==1">
+						<image :src="ybga"></image>
+						<view>待审核</view>
+					</view>
+					
+				</view>
+				<view class="ybox">
+					<view class="yblist mw50"><text>预约日期</text>{{ite.visitDate}}</view>
+					<view class="yblist mw50"><text>预约时间</text>{{ite.visitTime}}</view>
+					<view class="yblist mw50"><text>手机号码</text>{{ite.visitPhone}}</view>
+					<view class="yblist mw50"><text>人 数</text>{{ite.visitNum}}</view>
+					<view class="yblist mw50"><text>来访地点</text>{{kaType(ite.appointmentSite,adrlist)}}</view>
+					<view class="yblist mw50"><text>来访事由</text>{{ite.visitReason}}</view>
+				</view>
+				<view class="ybtn">
+					<view class="ybtns btn1" @click.stop="getDelFn(ite.reservatId)">删除</view>
+					<view class="flex1"></view>
+					<block v-if="ite.visitType==1&&checkPermi(['system:reservat:sh'])">
+						<view class="ybtns btn2" @click.stop="gettypeFn(2,ite.reservatId)">拒绝</view>
+						<view class="ybtns btn3" @click.stop="gettypeFn(3,ite.reservatId)">同意</view>
+					</block>
+					
+				</view>
+			</view>
+		</block>
+		<!-- 访客记录 -->
+		<block v-if="type=='visitor'">
+			<view class="ylist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.recordId)">
+				<view class="ytop flexc">
+					<view class="tit" v-if="ite.recordName">{{ite.recordName.charAt(0)}}</view>
+					<view class="cent">
+						<view class="ctit">{{ite.recordName}}</view>
+					</view>
+				</view>
+				<view class="ybox">
+					<view class="yblist mw50"><text>出入时间</text>{{ite.recordDateTime}}</view>
+					<view class="yblist mw50"><text>人员类型</text>{{kaType(ite.recordType,fklist)}}</view>
+					<view class="yblist mw50"><text>手机号码</text>{{ite.recordPhone}}</view>
+					<view class="yblist mw50"><text>记录来源</text>{{kaType(ite.recordSource,adrlist)}}</view>
+				</view>
+				<view class="ybtn">
+					<view class="ybtns btn1"  @click.stop="getDelFn(ite.recordId)">删除</view>
+				</view>
+			</view>
+		</block>
+		<!-- 人员信息权限 -->
+		<block v-if="type=='limit'">
+			<view class="ylist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.personneId)">
+				<view class="ytop flexc">
+					<view class="tit" v-if="ite.personneName">{{ite.personneName.charAt(0)}}</view>
+					<view class="cent">
+						<view class="ctit">{{ite.personneName}}</view>
+					</view>
+				</view>
+				<view class="ybox">
+					<view class="yblist mw50"><text>手机号码</text>{{ite.personnePhone}}</view>
+					<view class="yblist mw50"><text>部门名称</text>{{ite.deptName}}</view>
+					<view class="yblist mw50"><text>门禁</text>{{statusFormats(ite.guard,mjlist)}}</view>
+					<view class="yblist mw50"><text>状态</text>{{ite.isEnable=='0'?'启用':'禁用'}}</view>
+				</view>
+				<view class="ybtn">
+					<view class="ybtns btn1"  @click.stop="getDelFn(ite.personneId)">删除</view>
+				</view>
+			</view>
+		</block>
+		<!-- 打卡列表 -->
+		<block v-if="type=='clock'">
+			<view class="ylist rlist" style="padding-top: 12rpx;" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite)">
+				<view class="ytop flexc">
+					<view class="tit" v-if="ite.userName">{{ite.userName.charAt(0)}}</view>
+					<view class="cent">
+						<view class="ctit">{{ite.userName}}的打卡记录</view>
+						<view class="ctime">最新打卡:{{ite.recordTime}}</view>
+					</view>
+					<view class="rights" v-if="ite.type=='N'">
+						<image :src="ybga"></image>
+						<view>缺卡</view>
+						<!-- <view>迟到</view> -->
+					</view>
+				</view>
+				<view class="ybox">
+					<view class="yblist mw50 line"><text>上班打卡</text>{{ite.workingTime}}
+						<!-- <view class="tip">迟到</view> -->
+					</view>
+					<view class="yblist mw50"><text>下班打卡</text>{{ite.dutyTime}}
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 会议记录 -->
+		<block v-if="type=='meetlist'">
+			<view class="ylist rlist" style="padding-top: 12rpx;" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.conferenceRoomOrderId)">
+				<view class="ytop flexc">
+					<view class="ytit">{{ite.conferenceName}}</view>
+					<!-- <view class="rights" v-if="ite.visitType==1">
+						<image :src="ybga"></image>
+						<view>已结束</view>
+						<view>迟到</view>
+					</view> -->
+				</view>
+				<view class="ybox">
+					<view class="listsm">
+						<view class="txt"><text class="tit">会议时间</text><text class="lh17">{{ite.startTime}} 至 {{ite.endTime}}</text></view>
+						<view class="txt"><text class="tit">会议室</text><text>{{ite.conferenceRoomName}}</text></view>
+						<view class="flexcj mb8">
+							<view class="txt" style="margin-bottom: 0;"><text class="tit">参会人数</text><text>{{ite.conferenceNumber}}人</text></view>
+							<view class="delbtn" v-if="checkPermi(['system:order:remove'])" @click.stop="getDelFn(ite.conferenceRoomOrderId)">
+								<image :src="delimg"></image>取消预约
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 就餐记录 -->
+		<block v-if="type=='eatlist'">
+			<view class="ylist rlist" style="padding-top: 12rpx;" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.orderFoodId)">
+				<view class="ytop flexc">
+					<view class="ytit">{{ite.orderFoodUser}}</view>
+				</view>
+				<view class="ybox">
+					<view class="listsm">
+						<view class="txt"><text class="tit">就餐时间</text><text class="lh17">{{ite.orderFoodTime}}</text></view>
+						<view class="flexcj mb8">
+							<view class="txt" style="margin-bottom: 0;"><text class="tit">就餐类型</text><text>{{kaType(ite.orderFoodType,jclxlist)}}</text></view>
+							<view class="delbtn" v-if="checkPermi(['system:food:remove'])" @click.stop="getDelFn(ite.orderFoodId)">
+								<image :src="delimg"></image>取消预约
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<view class="shax" v-if="wtdt">{{wtdt}}</view>
+	</view>
+	<block v-else>
+		<no-data></no-data>
+	</block>
+  </view>
+</template>
+
+<script>
+	import { selectDictValue } from '@/utils/common.js';
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import noData from "@/components/nodata/nodata.vue"
+  export default {
+	props:{
+		datalist: {
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		adrlist:{
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		fklist:{
+			type:Array,
+			default () {
+				return []
+			}
+		},
+		jclxlist:{
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		mjlist:{
+			type:Array,
+			default () {
+				return []
+			}
+		},
+		wtdt:{
+			type: String,
+			default () {
+				return ''
+			}
+		},
+		type:{
+			type: [String,Number],
+			default () {
+				return ''
+			}
+		},
+	},
+	components:{
+		noData
+	},
+	data(){
+		return{
+			time:require("@/static/images/home/time.png"), 
+			chose:require("@/static/images/home/chose.png"), 
+			close:require("@/static/images/home/close.png"), 
+			bgaimg:require("@/static/images/home/hbgg.png"), 
+			bgbimg:require("@/static/images/home/hbgh.png"), 
+			ybg:require("@/static/images/order/staff/ybg.png"), 
+			ybga:require("@/static/images/order/staff/ybga.png"), 
+			ysta:require("@/static/images/order/staff/ysta.png"), 
+			ystb:require("@/static/images/order/staff/ystb.png"), 
+			delimg:require("@/work/static/yuy/del.png")
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		checkPermi, checkRole,
+		kaType(data, list) {
+			return selectDictValue(list, data);
+		},
+		statusFormats(ite,list,type){//多选匹配
+			if(ite){
+				var actions = [];
+				list.forEach(s => {
+					if(ite.indexOf(s.dictValue)>-1){
+						actions.push(s.dictLabel);
+					}
+				})
+				return actions.join(',')
+			}else{
+				return ''
+			}	
+		},
+		getDelFn(id){
+			var that=this;
+			uni.showModal({
+				title: '确认删除',
+				content: "是否确认删除该预约",
+				cancelText: '取消',
+				confirmText: '确认',
+				success: function(res) {
+					if (res.confirm) {
+						that.$emit("getDelFn",id)
+					} else if (res.cancel) {
+						// console.log('用户点击取消');
+					}
+				}
+			});
+		},
+		gettypeFn(type,id){
+			var that=this;
+			var str="拒绝"
+			if(type==3){
+				str='同意'
+			}
+			uni.showModal({
+				title: '确认'+str,
+				content: "是否确认"+str+"该预约",
+				cancelText: '取消',
+				confirmText: '确认',
+				success: function(res) {
+					if (res.confirm) {
+						var newobj={
+							type:type,
+							id:id
+						}
+						that.$emit("gettypeFn",newobj)
+					} else if (res.cancel) {
+						// console.log('用户点击取消');
+					}
+				}
+			});
+		},
+		getDetail(e){
+			this.$emit('getDetail',e)
+		},
+		typeFn(data){
+			if(data){
+				var newArr=[]
+				var astr=data.split('-')
+				astr.forEach(ite=>{
+					var a=ite.substring(0,5);
+					newArr.push(a)
+				})
+				return newArr.join('-')
+			}else{
+				return ''
+			}
+			
+			
+		},
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+// 预约
+.ylist{background: #FFFFFF;border-radius: 14rpx;margin-bottom: 30rpx;position: relative;
+	.ystaimg{width: 140rpx;height: 140rpx;top: 22rpx;right: 22rpx;position: absolute;}
+	.ytop{padding: 16rpx 0 24rpx 16rpx;
+		.tit{width: 62rpx;height: 62rpx;background: #0391FD;border-radius: 6rpx;font-weight: 500;
+font-size: 34rpx;color: #FFFFFF;margin-right: 18rpx;text-align: center;line-height: 62rpx;flex: 0 0 auto;}
+		.cent{
+			flex: 1;
+			.ctit{font-weight: bold;font-size: 28rpx;color: #161616;margin-bottom: 6rpx;}
+			.ctime{font-weight: 500;font-size: 18rpx;color: #666666;}
+		}
+		.right{position: relative;flex: 0 0 auto;margin-left: 10rpx;
+			image{width: 144rpx;height: 56rpx;}
+			view{font-weight: 800;font-size: 22rpx;color: #FFFFFF;position: absolute;left: 0;top: 0;right: 0;bottom: 0;text-align: center;padding-left: 20rpx;box-sizing: border-box;line-height: 56rpx;}
+		}
+		.rights{position: relative;width: 96rpx;height: 38rpx;right: 0;top: 0;
+			image{width: 100%;height: 100%;}
+			view{font-weight: 500;font-size: 20rpx;
+		color: #FFFFFF;position: absolute;left: 0;top: 0;right: 0;bottom: 0;text-align: center;padding-left: 20rpx;box-sizing: border-box;line-height: 38rpx;}
+		}
+	}
+	.ytit{font-weight: bold;font-size: 28rpx;color: #161616;flex: 1;}
+	.ybox{padding: 0rpx 24rpx 24rpx 16rpx;display: flex;flex-wrap: wrap;
+		.yblist{display: flex;font-size: 24rpx;font-weight: 500;color: #161616;padding: 6rpx 0 6rpx 8rpx;line-height: 40rpx;position: relative;
+			text{font-weight: normal;color: #aaa;flex: 0 0 auto;width: 100rpx;text-align-last: justify;margin-right: 12rpx;}
+			.tip{border-radius: 12rpx;font-weight: 500;font-size: 16rpx;color: #F87C29;border: 2rpx solid #F87C29;height: 28rpx;box-sizing: border-box;
+				display: flex;align-items: center;padding: 0 8rpx;margin-left: 12rpx;flex: 0 0 auto;margin-top: 6rpx;
+			}
+			&.line{
+				&::after{
+					position: absolute;content: '';width: 2rpx;height: 30rpx;background: #CDCDCD;right: 0;top: 9rpx;
+				}
+				
+			}
+		}
+		.listsm{padding: 28rpx 10rpx 2rpx 0;width: 100%;border-top: 2rpx solid #DADADA;
+			.tit{margin-right: 8rpx;flex: 0 0 auto;min-width:110rpx;text-align-last: justify;margin-right: 20rpx;color: #aaa;}
+			.line{margin-right: 8rpx;color: #aaaaaa;flex: 0 0 auto;}
+			.txt{font-size: 26rpx;color: #161616;margin-bottom: 16rpx;display: flex;padding-left: 10rpx;}
+			.flexcw{
+				display: flex;align-items: center;flex-wrap: wrap;
+				.txt{min-width: 50%;}
+			}
+		}
+	}
+	.ybtn{border-top: 2rpx solid #DADADA;padding: 20rpx 18rpx;display: flex;align-items: center;
+		.ybtns{width: 130rpx;border-radius: 6rpx;height: 52rpx;font-weight: 500;font-size: 26rpx;display: flex;align-items: center;justify-content: center;box-sizing: border-box;flex: 0 0 auto;
+			&.btn1{border: 2rpx solid #FC3838;color: #FC3838;}
+			&.btn2{border: 2rpx solid #666666;color: #666666;}
+			&.btn3{background-color: #0391FD;color: #ffffff;margin-left: 22rpx;}
+		}
+	}
+	// 记录
+	&.rlist{padding-top:28rpx;
+		.rtop{position: relative;padding-left: 22rpx;
+			.rlistl{flex: 1;
+				image{width: 30rpx;height: 30rpx;margin-right: 18rpx;}
+				view{font-weight: bold;font-size: 28rpx;color: #161616;}
+			}
+			.right{position: relative;width: 96rpx;height: 38rpx;right: 0;top: 0;
+				image{width: 100%;height: 100%;}
+				view{font-weight: 500;font-size: 20rpx;
+color: #FFFFFF;position: absolute;left: 0;top: 0;right: 0;bottom: 0;text-align: center;padding-left: 20rpx;box-sizing: border-box;line-height: 38rpx;}
+			}
+		}
+		.ytop{padding-bottom: 18rpx;}
+		.ybox{padding-bottom: 14rpx;}
+		.rbox{padding: 0 22rpx 8rpx 22rpx;
+			.rboxa{width: 306rpx;height: 104rpx;position: relative;margin-bottom: 20rpx;
+				.rbg{width: 100%;height: 100%;}
+				.rboxb{box-sizing: border-box;padding:14rpx 0 16rpx 28rpx;
+					position: absolute;left: 0;top: 0;right: 0;bottom: 0;
+					.tit{font-weight: 500;font-size: 26rpx;color: #161616;margin-bottom: 10rpx;}
+					.time{font-weight: 500;font-size: 22rpx;color: #666666;
+						image{width: 18rpx;height: 18rpx;margin-right: 14rpx;flex: 0 0 auto;}
+					}
+				}
+			}
+		}
+		
+	}
+	.delbtn{font-weight: 500;font-size: 22rpx;color: #FF6969;display: flex;align-items: center;flex: 0 0 auto;
+		image{width: 28rpx;height: 26rpx;margin-right: 8rpx;}
+	}
+}
+
+</style>

+ 23 - 15
work/pages/record/clockin.vue

@@ -13,16 +13,16 @@
 				<view class="lbtab flexc">
 					<image :src="licoimg" class="limg"  @click='getResetFn'></image>
 					<view class="lbtabs flexc">
-						<picker class="pickbox" range-key='dictLabel' :value="adridx"	:range="adrlist" @change="bindTimeChangea">
+						<picker class="pickbox" range-key='dictLabel' 	:range="adrlist" @change="bindTimeChangea">
 							<view class="pickboxa">
-								<view class="tit overtwo" >{{day||'全部部门'}}</view>
+								<view class="tit overtwo" >{{deptName||'全部部门'}}</view>
 								<image :src="wupimg" class="hupimg"></image>
 							</view>
 						</picker>
-						<picker mode="date" class="pickbox"  :value="adridx"
+						<picker mode="date" class="pickbox"  
 							 @change="bindTimeChangea">
 							<view class="pickboxa">
-								<view class="tit" >{{day||'2024年07月'}}</view>
+								<view class="tit" >{{time||'2024年07月'}}</view>
 								<image :src="wupimg" class="hupimg"></image>
 							</view>
 						</picker>
@@ -42,7 +42,8 @@
 
 <script>
 	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
-	import yList from "@/components/order/list.vue"
+	import yList from "@/work/components/yuyue/list.vue"
+	import {getClockList} from "@/api/mine/work.js"
 	import {getDictionaryFn} from "@/api/mine/register.js"
 	export default {
 		components: {yList},
@@ -58,13 +59,15 @@
 				marTop: 0, //距离顶部的距离
 				stubarHeight: 0, //
 				title:'',
-				list:[{visitType:1,visitName:'王一',createTime:"2024-01-20 17:12:38",visitDate:"2024-01-21",
-				visitTime:'10:00 - 11:00',visitPhone:'18956988888',visitNum:'1',appointmentSite:"总经理办公室",visitReason:'会议'
-				}],
+				list:[],
 				pageSize: 10,
 				pageNum: 1,
 				reachflag: false,
 				wtdt:'',
+				userId:this.$store.state.user.userId,
+				deptName:'',
+				time:'',
+				adrlist:[],
 			}
 		},
 		onPageScroll(e) {
@@ -77,7 +80,7 @@
 		},
 		onLoad: function() {
 			this.init()
-			// this.getDataFn()
+			this.getDataFn()
 			uni.getSystemInfo({
 				success: (e) => {
 					this.stubarHeight = Number(e.statusBarHeight);
@@ -115,9 +118,12 @@
 					delta: 1
 				})
 			},
-			getDetail(data){
-				// this.$tab.navigateTo('/pages/order/staffcode?type=look&id='+data)
-				this.$tab.navigateTo('/work/pages/record/detail')
+			getDetail(ite){
+				var obj={
+					userId:ite.userId,
+					recordTime:ite.recordTime
+				}
+				this.$tab.navigateTo('/work/pages/record/detail?data='+encodeURIComponent(JSON.stringify(obj)))
 			},
 			bindTimeChangea(e){
 				var val=e.detail.value;
@@ -156,10 +162,12 @@
 			getDataFn() {
 				var params = {
 					pageSize: this.pageSize,
-					pageNo: this.pageNum,
-					// visitType:3
+					pageNum: this.pageNum,
+				}
+				if(!checkRole(['manager'])){
+					params.userId=this.userId
 				}
-				getCameraList(params).then(res => {
+				getClockList(params).then(res => {
 					if (res.code == 200) {
 						if (res.rows.length < this.pageSize) {
 							this.reachflag = false

+ 44 - 91
work/pages/record/detail.vue

@@ -9,10 +9,10 @@
 		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
 			<view class="ytbox">
 				<view class="ytop flexc">
-					<view class="tit">{{visitName.charAt(0)}}</view>
+					<view class="tit" v-if="dataobj.name">{{dataobj.name.charAt(0)}}</view>
 					<view class="cent">
-						<view class="ctit">{{visitName}}</view>
-						<view class="ctime">最新打卡:2024-07-18</view>
+						<view class="ctit">{{dataobj.name}}</view>
+						<view class="ctime">最新打卡:{{dataobj.time}}</view>
 					</view>
 				</view>
 				<!-- 日历 -->
@@ -21,7 +21,7 @@
 						@dayChange="dayChange" weekType="" @monthChange="monthChange" @getIsSelDayFn="getIsSelDayFn" @shrinkClick="shrinkClick">
 					</lunc-calendar>
 				</view>
-				<view class="tips">出勤统计:打卡2次,上下班时间:08:30-17:30</view>
+				<view class="tips">出勤统计:打卡2次,上下班时间:{{dataobj.workTime}}</view>
 				<!-- 步骤条 -->
 				<view class="mb16 plr18">
 					<view class="steps">
@@ -55,7 +55,8 @@
 <script>
 	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
 	import {getDictionaryFn} from "@/api/mine/register.js"
-	import luncCalendar from "@/components/lunc-calendar/lunc-calendar.vue"
+	import {getClockRl} from "@/api/mine/work.js"
+	import luncCalendar from "@/work/components/lunc-calendar/lunc-calendar.vue"
 	export default {
 		components: {luncCalendar},
 		data() {
@@ -64,6 +65,7 @@
 				navbg:require("@/static/images/navbg.png"),
 				backgroundColor: "transparent",
 				datainfo:{},
+				dataobj:{},
 				nvaHeight: 44,
 				marTop: 0, //距离顶部的距离
 				stubarHeight: 0, //
@@ -80,6 +82,8 @@
 				// changetime:'',//改变的日期
 				// timeday:'',//选择的日期
 				// visitDate:'',
+				userId:'',
+				recordTime:'',
 			}
 		},
 		onPageScroll(e) {
@@ -91,8 +95,12 @@
 			}
 		},
 		onLoad: function() {
-			this.init()
-			// this.getDataFn()
+			if(e.data){
+				var data=JSON.parse(decodeURIComponent(e.data))
+				this.userId=data.userId;
+				this.recordTime=data.recordTime;
+				this.getCalendarList()
+			}
 			uni.getSystemInfo({
 				success: (e) => {
 					this.stubarHeight = Number(e.statusBarHeight);
@@ -115,72 +123,32 @@
 				})
 			},
 			dayChange(e){
-				// if(e.daySign&&e.daySign.length){
-				// 	var daySign=e.daySign[0];
-				// 	this.amList=daySign.amList||[];
-				// 	this.pmList=daySign.pmList||[];
-				// 	if(this.reservatConfigType==1){
-				// 		this.timeList=this.amList;
-				// 	}else if(this.reservatConfigType==2){
-				// 		this.timeList=this.pmList;
-				// 	}
-				// 	this.timeid='';
-				// 	this.datainfo.visitDate=daySign.date;
-				// 	this.datainfo.visitTime='';
-				// }
+				if(e.daySign&&e.daySign.length){
+					var daySign=e.daySign[0];
+					this.datainfo=JSON.parse(JSON.stringify(daySign))
+				}
 			},
 			monthChange(e){
-				// var y=e.year;
-				// var m=e.month;
-				// if(y==this.year&&m==this.month){
-				// 	this.getCalendarList()
-				// 	this.changetime='';
-				// }else{
-				// 	var time=y + '-' + m + '-' + '01'
-				// 	this.changetime=time
-				// 	this.getCalendarList(time)
-				// }
+				var y=e.year;
+				var m=e.month;
+				if(y==this.year&&m==this.month){
+					this.getCalendarList()
+					this.changetime='';
+				}else{
+					var time=y + '-' + m + '-' + '01'
+					this.changetime=time
+					this.getCalendarList(time)
+				}
 			},
 			// 选中的日期
 			getIsSelDayFn(e){
-				// if(e.sign&&e.sign.length&&this.timeday!=e.date){
-				// 	this.timeday=e.date;
-				// 	if(this.configWeek.indexOf(e.week)!=-1 || e.isHoliday&&this.configHoliday=='N'){
-				// 		this.dayflag=false;
-				// 	}else{
-				// 		if(e.sign&&e.sign.length){
-				// 			var sign=JSON.parse(JSON.stringify(e.sign))
-				// 			var signes=JSON.parse(JSON.stringify(sign[0]));
-				// 			var amList=[],pmList=[];
-				// 			if(signes.amList){
-				// 				amList=JSON.parse(JSON.stringify(signes.amList))||[];
-				// 			}
-				// 			if(signes.pmList){
-				// 				pmList=JSON.parse(JSON.stringify(signes.pmList))||[];
-				// 			}
-				// 			this.jdryflag=true;
-				// 			if(this.timeType==1){
-				// 				this.timeList=amList;
-				// 			}else{
-				// 				this.timeList=pmList;
-				// 			}
-				// 			this.amList=amList
-				// 			this.pmList=pmList
-				// 			this.timeid='';
-				// 			var y=e.year;
-				// 			var m=e.month;
-				// 			var d=e.day;
-				// 			this.datainfo.visitDate=y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d);
-				// 			this.datainfo.visitTime='';
-				// 			if(signes.title=='可预约'){
-				// 				this.dayflag=true;
-				// 			}else{
-				// 				this.dayflag=false;
-				// 			}
-							
-				// 		}	
-				// 	}
-				// }
+				if(e.sign&&e.sign.length){
+					var date=e.sign[0].date;
+					if(date==this.recordTime){
+						var daySign=e.sign[0];
+						this.datainfo=JSON.parse(JSON.stringify(daySign))
+					}
+				}
 				
 			},
 			shrinkClick(e){
@@ -216,32 +184,17 @@
 				// 	}
 				// })
 			},
-			getDataFn() {
+			getCalendarList() {
 				var params = {
-					pageSize: this.pageSize,
-					pageNo: this.pageNum,
-					// visitType:3
+					userId: this.userId,
+					recordTime: this.recordTime,
 				}
-				getCameraList(params).then(res => {
+				getClockRl(params).then(res => {
 					if (res.code == 200) {
-						if (res.rows.length < this.pageSize) {
-							this.reachflag = false
-							this.wtdt = '到底了~';
-						} else {
-							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
-								1)
-							if (num < res.total) {
-								this.reachflag = true
-								this.wtdt = '上拉加载更多'
-							} else {
-								this.reachflag = false
-								this.wtdt = '到底了~';
-							}
-						}
-						if (this.pageNum == 1) {
-							this.list = res.rows;
-						} else {
-							this.list = this.list.concat(res.rows)
+						var data=res.data;
+						this.dataobj=res.data;
+						if(data.rlData&&data.rlData.length){
+							this.signList=data.rlData;
 						}
 					} else {
 						this.$toast(res.msg)

+ 184 - 0
work/pages/record/visitor.vue

@@ -0,0 +1,184 @@
+<template>
+	<view class="yybox">
+		<!-- <nav-bar navtit="预约信息" ></nav-bar> -->
+		<!-- 主体 -->
+		<view class="yydet">
+			<view class="yytab flexc">
+				<view :class="ite.val==tabval?'act':''" v-for="(ite,idx) in tablist" :key='idx' @click="getTab(ite.val)">{{ite.tit}}</view>
+			</view>
+				<!-- 列表 -->
+				<scroll-view scroll-y class="yylists"  lower-threshold="40" @scrolltolower="reach_btn">
+					<view class="mt12">
+						<y-list type='visitor' :datalist="list" :wtdt="wtdt" :fklist="fklist" @getDetail='getDetail' :adrlist="adrlist" @getDelFn="getDelFn"></y-list>
+					</view>
+				</scroll-view>
+		</view>
+	
+	</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import yList from "@/work/components/yuyue/list.vue"
+	import navBar from "@/components/toptab/navbar.vue"
+	import {getRecordList,getRecordDel} from "@/api/mine/work.js"
+	import {getDictionaryFn} from "@/api/mine/register.js"
+  export default {
+	components:{yList,navBar},
+	data(){
+		return{
+			navbg:require("@/static/images/navbg.png"),
+			headimg:require("@/static/images/order/staff/head.png"),
+			listline:require("@/static/images/order/staff/listline.png"),
+			backgroundColor: "transparent",
+			tabval:'-1',
+			tablist:[{tit:"全部",val:'-1'},],
+			list:[],
+			adrlist:[],
+			fklist:[],
+			wtdt:'',
+			pageSize: 10,
+			pageNum: 1,
+			reachflag: true,	
+		}
+	},
+	onPageScroll(e) {
+		var scrollTop = Number(e.scrollTop);
+		if (scrollTop > 0) {
+			this.backgroundColor = '#0491FD'
+		} else {
+			this.backgroundColor = 'transparent'
+		}
+	},
+	onLoad: function() {
+		uni.$on('refreshdatalist',(e) => {
+			this.reachflag=true;
+			this.pageNum=1;
+			this.list=[];
+			this.getDataFn();
+		})
+		this.init()
+		this.getDataFn()
+		
+	},
+	onUnload() {
+		uni.$off('refreshdatalist')
+	},
+	methods:{
+		checkPermi, checkRole,
+		reach_btn(){
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		getTab(val){
+			this.tabval=val;
+			this.reachflag=true;
+			this.pageNum=1;
+			this.list=[];
+			this.getDataFn();
+		},
+		init(){
+			// 记录来源
+			getDictionaryFn('jluly').then(res=>{
+				if(res.code==200){
+					this.adrlist=res.data.map(v => {
+						var obj={
+							tit: v.dictLabel,
+							val: v.dictValue
+						}
+						this.tablist.push(obj)
+						return {
+							dictLabel: v.dictLabel,
+							dictValue: v.dictValue
+						}
+					})
+				}
+			})
+			// 人员类型
+			getDictionaryFn('fange').then(res=>{
+				if(res.code==200){
+					this.fklist=res.data.map(v => {
+						return {
+							dictLabel: v.dictLabel,
+							dictValue: v.dictValue
+						}
+					})
+				}
+			})
+		},
+		getDelFn(id){
+			var that=this;
+			getRecordDel(id).then(res=>{
+				if(res.code==200){
+					that.$toast('删除成功')
+					setTimeout(function(){
+						that.reachflag=true;
+						that.pageNum=1;
+						that.list=[];
+						that.getDataFn();
+						// that.getcount();
+					},1500)
+					
+				}else{
+					that.$toast(res.msg)
+				}
+			})
+		},
+		getDetail(data){
+			this.$tab.navigateTo('/pages/order/staffcode?type=look&id='+data)
+		},
+		getDataFn(){
+			var params={
+				pageSize:this.pageSize,
+				pageNum: this.pageNum,
+			}
+			if(this.tabval=='-1'){
+				
+			}else{
+				params.recordSource=this.tabval
+			}
+			getRecordList(params).then(res=>{
+				if(res.code==200){
+					if (res.rows.length < this.pageSize) {
+						this.reachflag = false
+						this.wtdt = '到底了~';
+					} else {
+						var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+						if (num < res.total) {
+							this.reachflag = true
+							this.wtdt = '上拉加载更多'
+						} else {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						}
+					}
+					if (this.pageNum == 1) {
+						this.list = res.rows;
+					} else {
+						this.list = this.list.concat(res.rows)
+					}
+				}else{
+					this.$toast(res.msg)
+				}
+			}) 
+			
+		},
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.yytab{height: 80rpx;flex: 0 0 auto;background-color: #ffffff;
+	view{flex: 1;display: flex;align-items: center;justify-content: center;height: 80rpx;position: relative;color: #666;
+		&.act{color: $com-cd3;
+			&::after{content: '';width: 100rpx;height: 6rpx;background: $com-cd3;position: absolute;left: 50%;margin-left: -50rpx;bottom: 0;}
+		}
+	}
+}
+
+.yylists{width: 684rpx;margin: 0 auto 0;flex: 1;overflow: auto;}
+
+</style>

+ 121 - 75
work/pages/yyorder/eat.vue

@@ -12,34 +12,36 @@
 					<view class="ytsbox">
 						<view class="yttit">预订信息</view>
 						<view class="pt5">
-							<uni-forms-item label="就餐日期" name="appointmentSite">
-								<picker mode="date" class="pickbox" range-key='dictLabel'  :value="adridx"
+							<uni-forms-item label="就餐日期" name="orderFoodTime">
+								<picker mode="date" class="pickbox" 
 									 @change="bindTimeChangea">
 									<view class="flexc flex1">
-										<view class="flex1 " :class="day?'co16 fw5 f14':'coa f14'">
-											{{day||'请选择'}}</view>
+										<view class="flex1 " :class="datainfo.orderFoodTime?'co16 fw5 f14':'coa f14'">
+											{{datainfo.orderFoodTime||'请选择'}}</view>
 											<image :src="hupimg" class="hupimg"></image>
 									</view>
 								</picker>
 								
 							</uni-forms-item>
-							<uni-forms-item label="就餐类型"  name="appointmentSite">
-								<picker  class="pickbox" range-key='dictLabel' :value="adridx"
-									:range="adrlist" @change="bindTimeChangea">
+							<uni-forms-item label="就餐类型"  name="orderFoodType">
+								<picker  class="pickbox"  range-key='label' :value="jclxidx"
+									:range="jclxlist"  @change="bindTimeChangeb">
 									<view class="flexc flex1">
-										<view class="flex1 " :class="jclx?'co16 fw5 f14':'coa f14'">
-											{{jclx||'请选择'}}</view>
+										<!-- <view class="flex1 " :class="orderFoodType?'co16 fw5 f14':'coa f14'">
+											{{orderFoodType||'请选择'}}</view> -->
+										<view class="flex1 f14" v-if="datainfo.orderFoodType&&!jclx">{{statusFormat(datainfo.orderFoodType,jclxlist,'jclx')}}</view>
+										<view class="flex1 f14" v-else :class="jclx?'':'coa'">{{jclx||"请选择就餐类型"}}</view>
 											<image :src="hupimg" class="hupimg"></image>
 									</view>
 								</picker>
 							</uni-forms-item>
-							<uni-forms-item label="姓名" class="disable"  name="visitName">
-								<view class="intit">刘安宁</view>
+							<uni-forms-item label="姓名" class="disable"  name="orderFoodUser">
+								<view class="intit">{{datainfo.orderFoodUser}}</view>
 								<!-- <uni-easyinput :inputBorder="false" disabled v-model="datainfo.visitName" placeholder="请输入姓名">
 								</uni-easyinput> -->
 							</uni-forms-item>
-							<uni-forms-item label="部 门" class="disable"  name="visitPhone">
-								<view class="intit">人力行政部</view>
+							<uni-forms-item label="部 门" class="disable"  name="orderFoodDept">
+								<view class="intit">{{datainfo.orderFoodDept}}</view>
 								<!-- <uni-easyinput :inputBorder="false" disabled type="number" v-model="datainfo.visitPhone"
 									placeholder="请输入手机号码">
 								</uni-easyinput> -->
@@ -47,11 +49,8 @@
 						</view>
 						<view class="ybtn flexcc" @click="getSubmit">确认提交</view>
 						<view class="tips">* 为响应国家号召,请您视真实情况填写,珍惜粮食,适量定 餐,避免剩餐,减少浪费。</view>
-					</view>
-					
+					</view>	
 				</uni-forms>
-
-				
 			</view>
 		</view>
 	</view>
@@ -59,8 +58,9 @@
 
 <script>
 	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
-	import {getCameraList,getCameraVideo} from "@/api/mine/order.js"
+	import {getFoodAdd,getFoodPut,getFoodDetail} from "@/api/mine/work.js"
 	import {getDictionaryFn} from "@/api/mine/register.js"
+	import {selectValueKey} from "@/utils/common.js"
 	export default {
 		components: {},
 		data() {
@@ -68,14 +68,26 @@
 				hupimg:require("@/static/images/order/hup.png"),
 				navbg:require("@/static/images/navbg.png"),
 				backgroundColor: "transparent",
-				datainfo:{},
 				nvaHeight: 44,
 				marTop: 0, //距离顶部的距离
 				stubarHeight: 0, //
-				day:'',
+				datainfo:{
+					"orderFoodTime": "",//就餐时间
+					"orderFoodType": "",//1:午餐 2:晚餐
+					"orderFoodUser":"",//就餐人员名称
+					"orderFoodUserId":"",//就餐人员id(用户id)
+					"orderFoodDept":"",//就餐人员部门
+					"orderFoodDeptId":"",//就餐人员部门id
+				},
 				jclx:'',
-				adridx:'',
-				adrlist:[],
+				jclxidx:'',
+				jclxlist:[],
+				ptype:'add',
+				id:'',
+				name:this.$store.state.user.name,
+				userId:this.$store.state.user.userId,
+				deptId:this.$store.state.user.deptId,
+				deptName:this.$store.state.user.deptName,
 			}
 		},
 		onPageScroll(e) {
@@ -86,7 +98,21 @@
 				this.backgroundColor = 'transparent'
 			}
 		},
-		onLoad: function() {
+		onLoad: function(e) {
+			if(e.data){
+				var data=JSON.parse(decodeURIComponent(e.data))
+				if(data.type){
+					this.ptype=data.type;
+					this.id=data.id;
+					this.getDetail()
+				}
+			}else{
+				this.datainfo.orderFoodUser=this.name;
+				this.datainfo.orderFoodUserId=this.userId;
+				this.datainfo.orderFoodDept=this.deptName;
+				this.datainfo.orderFoodDeptId=this.deptId;
+			}
+			
 			this.init()
 			// this.getDataFn()
 			uni.getSystemInfo({
@@ -96,23 +122,11 @@
 					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
 				}
 			})
-			// 3c8cadac11af4f1298a2882addc8788d
-		},
-		onUnload() {
-			uni.$off('refreshdatalist')
 		},
-
 		onShow() {},
 		mounted() {
 			this.getHeightFn()
 		},
-		// 上拉触底加载更多触发事件
-		onReachBottom() {
-			if (this.reachflag) {
-				this.pageNum++
-				this.getDataFn()
-			}
-		},
 		methods: {
 			checkPermi,
 			checkRole,
@@ -121,9 +135,34 @@
 					delta: 1
 				})
 			},
+			statusFormat(ite,list,type) {
+				var aite=selectValueKey(list, ite);
+				if(type=='jclx'){
+					this.jclxidx=aite.key
+				}
+				return aite.actions;
+			},
+			init() {
+				// 就餐类型
+				getDictionaryFn('jiucan').then(res=>{
+					if(res.code==200){
+						this.jclxlist = res.data.map(v => {
+							return {
+								label: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+			},
 			bindTimeChangea(e){
 				var val=e.detail.value;
-				this.day=val
+				this.datainfo.orderFoodTime=val
+			},
+			bindTimeChangeb(e){
+				var val=e.detail.value;
+				this.datainfo.orderFoodType=this.jclxlist[val].value
+				this.jclx=this.jclxlist[val].label
 			},
 			getHeightFn() {
 				let query = uni.createSelectorQuery().in(this);
@@ -142,52 +181,59 @@
 					}
 				}).exec();
 			},
-			init() {
-				// 门卫
-				// getDictionaryFn('is_read').then(res=>{
-				// 	if(res.code==200){
-				// 		this.ydztlist = res.data.map(v => {
-				// 			return {
-				// 				label: v.dictLabel,
-				// 				value: v.dictValue
-				// 			}
-				// 		})
-				// 	}
-				// })
-			},
-			getDataFn() {
-				var params = {
-					pageSize: this.pageSize,
-					pageNo: this.pageNum,
-					// visitType:3
+			getSubmit() {
+				var that=this;
+				var params = JSON.parse(JSON.stringify(this.datainfo))
+				if(!params.orderFoodTime){
+					this.$toast("请选择就餐日期")
+					return
 				}
-				getCameraList(params).then(res => {
-					if (res.code == 200) {
-						if (res.rows.length < this.pageSize) {
-							this.reachflag = false
-							this.wtdt = '到底了~';
+				if(!this.jclx){
+					this.$toast("请选择就餐类型")
+					return
+				}
+				uni.showLoading({
+					title:"加载中"
+				})
+				if(this.ptype=='add'){
+					getFoodAdd(params).then(res => {
+						uni.hideLoading()
+						if (res.code == 200) {
+							this.$toast("预约成功")
+							setTimeout(function(){
+								uni.$emit('refreshfoodlist')
+								uni.navigateBack({
+									delta:1
+								})
+							},1200)
 						} else {
-							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
-								1)
-							if (num < res.total) {
-								this.reachflag = true
-								this.wtdt = '上拉加载更多'
-							} else {
-								this.reachflag = false
-								this.wtdt = '到底了~';
-							}
+							this.$toast(res.msg)
 						}
-						if (this.pageNum == 1) {
-							this.list = res.rows;
+					})
+				}else{
+					getFoodPut(params).then(res => {
+						uni.hideLoading()
+						if (res.code == 200) {
+							this.$toast("修改成功")
+							setTimeout(function(){
+								uni.$emit('refreshfoodlist')
+								uni.navigateBack({
+									delta:1
+								})
+							},1200)
 						} else {
-							this.list = this.list.concat(res.rows)
+							this.$toast(res.msg)
 						}
-					} else {
-						this.$toast(res.msg)
+					})
+				}
+			},
+			getDetail(){
+				getFoodDetail(this.id).then(res=>{
+					if(res.code==200){
+						this.datainfo=JSON.parse(JSON.stringify(res.data))
 					}
 				})
-
-			},
+			}
 		},
 
 	}

+ 260 - 0
work/pages/yyorder/eatlist.vue

@@ -0,0 +1,260 @@
+<template>
+	<view>
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff" left-icon="left" title="我的就餐预订" :background-color="backgroundColor"
+				:border="false" statusBar='true' fixed="true" @clickLeft='getBack'>
+			</uni-nav-bar>
+			<view class="plr16" :style="'background:'+backgroundColor">
+				<!-- <view class="search flexc mb4">
+					<image :src="serimg"></image>
+					<input placeholder="请输入人员姓名进行搜索" confirm-type="search" placeholder-style="color:#B9DCF7" v-model="title" @confirm="getConfirm"/>
+				</view> -->
+				<!-- 搜索 -->
+				<view class="lbtab flexc">
+					<image :src="licoimg" class="limg"  @click='getResetFn'></image>
+					<view class="lbtabs flexc">
+						<picker class="pickbox" range-key='dictLabel' 	:range="jclxlist" @change="bindTimeChangea">
+							<view class="pickboxa">
+								<view class="tit overtwo" >{{jclx||'就餐类型'}}</view>
+								<image :src="wupimg" class="hupimg"></image>
+							</view>
+						</picker>
+					</view>
+					<view @click="getDetailDay" class="daybtn flexc">
+						<image :src="dayimg"></image>
+						预约记录</view>
+				</view>
+			</view>
+			
+		</view>
+		<image :src="navbg" class="navbg"></image>
+		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
+			<!-- 列表 -->
+			<y-list type='eatlist' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :jclxlist="jclxlist" @getDelFn="getDelFn"></y-list>
+			<view class="yyfbtn flexcc" v-if="checkPermi(['system:food:add'])" @click="getAddFn">添加就餐预约</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import yList from "@/work/components/yuyue/list.vue"
+	import {getFoodList,getFoodDel} from "@/api/mine/work.js"
+	import {getDictionaryFn} from "@/api/mine/register.js"
+	export default {
+		components: {yList},
+		data() {
+			return {
+				wupimg:require("@/work/static/record/wup.png"),
+				serimg:require("@/work/static/record/search.png"),
+				licoimg:require("@/work/static/record/lico.png"),
+				navbg:require("@/static/images/navbg.png"),
+				dayimg:require("@/work/static/yuy/day.png"),
+				backgroundColor: "transparent",
+				datainfo:{},
+				nvaHeight: 44,
+				marTop: 0, //距离顶部的距离
+				stubarHeight: 0, //
+				title:'',
+				jclxlist:[],
+				list:[],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: false,
+				wtdt:'',
+				jclx:'',
+				orderFoodType:'',//就餐类型
+				userId:this.$store.state.user.userId,
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			if (scrollTop > 0) {
+				this.backgroundColor = '#0491FD'
+			} else {
+				this.backgroundColor = 'transparent'
+			}
+		},
+		onUnload() {
+			uni.$off('refreshfoodlist')
+		},
+		onLoad: function() {
+			uni.$on('refreshfoodlist',(e) => {
+				this.getConfirm()
+			})
+			this.init()
+			this.getDataFn()
+			uni.getSystemInfo({
+				success: (e) => {
+					this.stubarHeight = Number(e.statusBarHeight);
+					this.nvaHeight = Number(e.statusBarHeight) + 44;
+					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
+				}
+			})
+		},
+		onShow() {},
+		mounted() {
+			this.getHeightFn()
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			getConfirm(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getResetFn(){
+				// 重置
+				this.jclx='';
+				this.orderFoodType='';
+				this.title="";
+				this.getConfirm()
+			},
+			getBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			getDetail(id){
+				var obj={
+					id:id,
+					type:'edit'
+				}
+				this.$tab.navigateTo('/work/pages/yyorder/eat?data='+encodeURIComponent(JSON.stringify(obj)))
+			},
+			getDetailDay(){
+				this.$tab.navigateTo('/work/pages/yyorder/eatlistday')
+			},
+			getAddFn(){
+				this.$tab.navigateTo('/work/pages/yyorder/eat')
+			},
+			bindTimeChangea(e){
+				var val=e.detail.value;
+				this.jclx=this.jclxlist[val].dictLabel;
+				this.orderFoodType=this.jclxlist[val].dictValue;
+				this.getConfirm()
+			},
+			getHeightFn() {
+				let query = uni.createSelectorQuery().in(this);
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.navbox').boundingClientRect(data => {
+					var top = data.top < 0 ? -data.top : data.top;
+					var stubarHeight = Number(this.stubarHeight);
+					this.marTop = stubarHeight > 0 ? 692 - Number(data.height) * 2 : 692 - Number(data.height) *
+						2 + 40 //赋值,待会要用
+					if (top <= this.nvaHeight) {
+						const opacity = top / 100 // 计算透明度值
+						const color = `rgba(4, 145, 253, ${opacity})`
+						this.backgroundColor = color // 更新盒子背景颜色
+					} else {
+						this.backgroundColor = '#00A9F0'
+					}
+				}).exec();
+			},
+			init() {
+				// 就餐类型
+				getDictionaryFn('jiucan').then(res=>{
+					if(res.code==200){
+						this.jclxlist = res.data.map(v => {
+							return {
+								dictLabel: v.dictLabel,
+								dictValue: v.dictValue
+							}
+						})
+					}
+				})
+			},
+			getDelFn(id){
+				var that=this;
+				getFoodDel(id).then(res=>{
+					if(res.code==200){
+						this.$toast('删除成功')
+						setTimeout(function(){
+							that.getConfirm()
+						},1200)
+					}
+				})
+			},
+			getDataFn() {
+				var params = {
+					pageSize: this.pageSize,
+					pageNum: this.pageNum,
+					userId:this.userId
+				}
+				if(this.jclx){
+					params.orderFoodType=this.orderFoodType
+				}
+				if(this.title){
+					params.orderFoodUser=this.title
+				}
+				getFoodList(params).then(res => {
+					if (res.code == 200) {
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
+								1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = '上拉加载更多'
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					} else {
+						this.$toast(res.msg)
+					}
+				})
+
+			},
+		},
+
+	}
+</script>
+<style>
+/* 	page {
+		background: #ffffff;
+	} */
+</style>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 692rpx;}	
+.zxmain{position: relative;padding: 8rpx 32rpx 100rpx;box-sizing: border-box;}
+.search{padding: 0 52rpx;box-sizing: border-box;
+	width: 100%;height: 76rpx;background: rgba(40, 139, 214, 0.5);border-radius: 38rpx;
+	image{width: 24rpx;height: 24rpx;margin-right: 22rpx;flex: 0 0 auto;}
+	input{flex: 1;font-weight: 500;font-size: 22rpx;color: #FFFFFF;}
+}
+.daybtn{font-weight: 500;font-size: 26rpx;color: #FFFFFF;flex: 0 0 auto;
+	image{width: 30rpx;height: 30rpx;margin-right: 8rpx;}
+}
+.lbtab{padding-left:18rpx;
+	.limg{width: 24rpx;height: 24rpx;margin-right: 16rpx;flex:0 0 auto;}
+	.lbtabs{overflow: auto;flex-wrap: nowrap;flex:1;
+		.pickbox{text-align: right;font-weight: 500;font-size: 28rpx;color: #161616;min-height:88rpx;margin: 0 10rpx;
+			.pickboxa{justify-content: center;	
+				min-height: 88rpx;display: flex;align-items: center;	
+			}
+			.tit{font-weight: 500;font-size: 26rpx;color: #FFFFFF;}
+			.hupimg{width: 16rpx;height: 10rpx;margin-left: 26rpx;flex: 0 0 auto;}
+		}
+		
+	}
+}
+</style>

+ 254 - 0
work/pages/yyorder/eatlistday.vue

@@ -0,0 +1,254 @@
+<template>
+	<view>
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff" left-icon="left" title="我的订餐记录" :background-color="backgroundColor"
+				:border="false" statusBar='true' fixed="true" @clickLeft='getBack'>
+			</uni-nav-bar>
+		</view>
+		<image :src="navbg" class="navbg"></image>
+		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
+			<view class="ytbox">
+				<!-- <view class="ytop flexc">
+					<view class="tit">{{visitName.charAt(0)}}</view>
+					<view class="cent">
+						<view class="ctit">{{visitName}}</view>
+						<view class="ctime">最新打卡:2024-07-18</view>
+					</view>
+				</view> -->
+				<!-- 日历 -->
+				<view class="mb24">
+					<lunc-calendar ref="calendar" :showLunar="false" :configWeek="configWeek" :configHoliday="configHoliday" :firstDayOfWeek="firstDayOfWeek" :showMonthBg="false" :showShrink="true" :signList="signList"
+						@dayChange="dayChange" weekType="" @monthChange="monthChange" @getIsSelDayFn="getIsSelDayFn" @shrinkClick="shrinkClick">
+					</lunc-calendar>
+				</view>
+				<!-- 步骤条 -->
+				<view class="mb16 plr18">
+					<view class="steps">
+						<view class="cir"></view>
+						<view class="stepsa">
+							<view class="steptit">中餐预订</view>
+							<view class="steptxt">
+								<image :src="cirimg"></image>
+								<view>{{datainfo.am}}</view>
+							</view>
+						</view>
+					</view>
+					<view class="steps">
+						<view class="cir"></view>
+						<view class="stepsa">
+							<view class="steptit">晚餐预订</view>
+							<view class="steptxt">
+								<image :src="cirimg"></image>
+								<view>{{datainfo.pm}}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import {getDictionaryFn} from "@/api/mine/register.js"
+	import {getFoodRiLi} from "@/api/mine/work.js"
+	import luncCalendar from "@/work/components/lunc-calendar/foodlunc-calendar.vue"
+	export default {
+		components: {luncCalendar},
+		data() {
+			return {
+				cirimg:require("@/static/images/home/chose.png"),
+				navbg:require("@/static/images/navbg.png"),
+				backgroundColor: "transparent",
+				datainfo:{},
+				nvaHeight: 44,
+				marTop: 0, //距离顶部的距离
+				stubarHeight: 0, //
+				visitName:'林涵宇',
+				jclxlist:[],//就餐类型
+				kaTime:'',
+				
+				signList: [],
+				configWeek:[],
+				configHoliday:'Y',
+				firstDayOfWeek:'sunday',
+				// dayflag:false,
+				// month:'',
+				// year:'',
+				// kaTime:'',
+				changetime:'',//改变的日期
+				// timeday:'',//选择的日期
+				// visitDate:'',
+				userId:this.$store.state.user.userId,
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			if (scrollTop > 0) {
+				this.backgroundColor = '#0491FD'
+			} else {
+				this.backgroundColor = 'transparent'
+			}
+		},
+		onLoad: function() {
+			// this.init()
+			this.time()
+			this.getCalendarList()
+			uni.getSystemInfo({
+				success: (e) => {
+					this.stubarHeight = Number(e.statusBarHeight);
+					this.nvaHeight = Number(e.statusBarHeight) + 44;
+					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
+				}
+			})
+			// 3c8cadac11af4f1298a2882addc8788d
+		},
+		onShow() {},
+		mounted() {
+			this.getHeightFn()
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			getBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			time(){
+				var date = new Date();
+				var y = date.getFullYear();
+				var m = date.getMonth() + 1;
+				var d = date.getDate();
+				// var h = date.getHours();
+				// var min = date.getMinutes();
+				// var s = date.getSeconds();
+				// var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
+				// var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
+				var yearStr = y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d)
+				// var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
+				// 	'0' + s) : s);
+				this.year=y;
+				this.month=m < 10 ? ('0' + m) : m;
+				this.kaTime = yearStr
+			},
+			dayChange(e){
+				if(e.daySign&&e.daySign.length){
+					var daySign=e.daySign[0];
+					this.datainfo=JSON.parse(JSON.stringify(daySign))
+				}
+			},
+			monthChange(e){
+				var y=e.year;
+				var m=e.month;
+				if(y==this.year&&m==this.month){
+					this.getCalendarList()
+					this.changetime='';
+				}else{
+					var time=y + '-' + m + '-' + '01'
+					this.changetime=time
+					this.getCalendarList(time)
+				}
+			},
+			// 选中的日期
+			getIsSelDayFn(e){
+				if(e.sign&&e.sign.length){
+					var date=e.sign[0].date;
+					if(date==this.kaTime){
+						var daySign=e.sign[0];
+						this.datainfo=JSON.parse(JSON.stringify(daySign))
+					}
+				}	
+			},
+			shrinkClick(e){
+				console.log(e,3)
+			},
+			getHeightFn() {
+				let query = uni.createSelectorQuery().in(this);
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.navbox').boundingClientRect(data => {
+					var top = data.top < 0 ? -data.top : data.top;
+					var stubarHeight = Number(this.stubarHeight);
+					this.marTop = stubarHeight > 0 ? 692 - Number(data.height) * 2 : 692 - Number(data.height) *
+						2 + 40 //赋值,待会要用
+					if (top <= this.nvaHeight) {
+						const opacity = top / 100 // 计算透明度值
+						const color = `rgba(4, 145, 253, ${opacity})`
+						this.backgroundColor = color // 更新盒子背景颜色
+					} else {
+						this.backgroundColor = '#00A9F0'
+					}
+				}).exec();
+			},
+			init() {
+				// 就餐类型
+				getDictionaryFn('jiucan').then(res=>{
+					if(res.code==200){
+						this.jclxlist = res.data.map(v => {
+							return {
+								label: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+			},
+			getCalendarList(itime) {
+				var time=this.kaTime
+				if(itime){
+					time=itime
+				}
+				var params = {
+					orderFoodTime: time,
+				}
+				params.userId=this.userId;
+				getFoodRiLi(params).then(res => {
+					if (res.code == 200) {
+						this.signList=res.data;
+					} else {
+						this.$toast(res.msg)
+					}
+				})
+
+			},
+		},
+
+	}
+</script>
+<style>
+/* 	page {
+		background: #ffffff;
+	} */
+</style>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 692rpx;}	
+.zxmain{position: relative;padding: 20rpx 32rpx 40rpx;box-sizing: border-box;display: flex;}
+.ytbox{width: 684rpx;margin: 0 auto;padding-top: 24rpx;position: relative;flex: 1;overflow: auto;background-color: #ffffff;padding-bottom: 12rpx;border-radius: 14rpx;
+	.ytop{padding: 16rpx 0 24rpx 16rpx;
+		.tit{width: 62rpx;height: 62rpx;background: #0391FD;border-radius: 6rpx;font-weight: 500;
+	font-size: 34rpx;color: #FFFFFF;margin-right: 18rpx;text-align: center;line-height: 62rpx;flex: 0 0 auto;}
+		.cent{
+			flex: 1;
+			.ctit{font-weight: bold;font-size: 28rpx;color: #161616;margin-bottom: 6rpx;}
+			.ctime{font-weight: 500;font-size: 18rpx;color: #666666;}
+		}
+	}
+	.tips{font-weight: 500;font-size: 26rpx;color: #888888;padding-left: 34rpx;margin-bottom: 24rpx;}
+	// 步骤条
+	.steps{position: relative;display: flex;padding-bottom:40rpx;
+		&::after{
+			content: '';position: absolute;left:6rpx;top: 34rpx;bottom: 4rpx;background-color: #DADADA;width: 2rpx;
+		}
+		.cir{width: 14rpx;height: 14rpx;background: #AFAFAF;border-radius: 50%;flex: 0 0 auto;margin-right: 38rpx;margin-top: 13rpx;}
+		.stepsa{flex: 1;
+			.steptit{font-weight: bold;font-size: 28rpx;color: #161616;margin-bottom: 20rpx;}
+			.steptxt{display: flex;
+				image{width: 20rpx;height: 20rpx;margin-right: 14rpx;flex: 0 0 auto;margin-top: 7rpx;}
+				view{font-weight: bold;font-size: 26rpx;color: #888888;}
+			}
+		}
+	}
+}
+</style>

+ 256 - 0
work/pages/yyorder/limit.vue

@@ -0,0 +1,256 @@
+<template>
+	<view>
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff" left-icon="left" title="人员权限" :background-color="backgroundColor"
+				:border="false" statusBar='true' fixed="true" @clickLeft='getBack'>
+			</uni-nav-bar>
+			<view class="plr16" :style="'background:'+backgroundColor">
+				<!-- 搜索 -->
+				<view class="lbtab flexc">
+					<image :src="licoimg" class="limg"  @click='getResetFn'></image>
+					<view class="search flexc mb4">
+						<image :src="serimg"></image>
+						<input placeholder="请输入人员姓名进行搜索" confirm-type="search" placeholder-style="color:#B9DCF7" v-model="title" @confirm="getConfirm"/>
+					</view>
+					<!-- <view class="lbtabs flexc">
+						<picker class="pickbox" range-key='dictLabel' 	:range="jclxlist" @change="bindTimeChangea">
+							<view class="pickboxa">
+								<view class="tit overtwo" >{{jclx||'就餐类型'}}</view>
+								<image :src="wupimg" class="hupimg"></image>
+							</view>
+						</picker>
+					</view>
+					<view @click="getDetailDay" class="daybtn flexc">
+						<image :src="dayimg"></image>
+						预约记录</view> -->
+				</view>
+			</view>
+			
+		</view>
+		<image :src="navbg" class="navbg"></image>
+		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
+			<!-- 列表 -->
+			<y-list type='limit' :datalist="list" :wtdt="wtdt" @getDetail='getDetail' :mjlist="mjlist" @getDelFn="getDelFn"></y-list>
+			<view class="yyfbtn flexcc" v-if="checkPermi(['system:management:add'])" @click="getAddFn">添加人员</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import yList from "@/work/components/yuyue/list.vue"
+	import {getManagementList,getManagementDel} from "@/api/mine/work.js"
+	import {getDictionaryFn} from "@/api/mine/register.js"
+	export default {
+		components: {yList},
+		data() {
+			return {
+				wupimg:require("@/work/static/record/wup.png"),
+				serimg:require("@/work/static/record/search.png"),
+				licoimg:require("@/work/static/record/lico.png"),
+				navbg:require("@/static/images/navbg.png"),
+				dayimg:require("@/work/static/yuy/day.png"),
+				backgroundColor: "transparent",
+				datainfo:{},
+				nvaHeight: 44,
+				marTop: 0, //距离顶部的距离
+				stubarHeight: 0, //
+				title:'',
+				mjlist:[],
+				list:[],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: false,
+				wtdt:'',
+				jclx:'',
+				orderFoodType:'',//就餐类型
+				userId:this.$store.state.user.userId,
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			if (scrollTop > 0) {
+				this.backgroundColor = '#0491FD'
+			} else {
+				this.backgroundColor = 'transparent'
+			}
+		},
+		onUnload() {
+			uni.$off('refreshfoodlist')
+		},
+		onLoad: function() {
+			uni.$on('refreshfoodlist',(e) => {
+				this.getConfirm()
+			})
+			this.init()
+			this.getDataFn()
+			uni.getSystemInfo({
+				success: (e) => {
+					this.stubarHeight = Number(e.statusBarHeight);
+					this.nvaHeight = Number(e.statusBarHeight) + 44;
+					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
+				}
+			})
+		},
+		onShow() {},
+		mounted() {
+			this.getHeightFn()
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			getConfirm(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getResetFn(){
+				// 重置
+				this.jclx='';
+				this.orderFoodType='';
+				this.title="";
+				this.getConfirm()
+			},
+			getBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			getDetail(id){
+				var obj={
+					id:id,
+					type:'edit'
+				}
+				this.$tab.navigateTo('/work/pages/yyorder/eat?data='+encodeURIComponent(JSON.stringify(obj)))
+			},
+			getDetailDay(){
+				this.$tab.navigateTo('/work/pages/yyorder/eatlistday')
+			},
+			getAddFn(){
+				this.$tab.navigateTo('/work/pages/yyorder/limitdetail')
+			},
+			bindTimeChangea(e){
+				var val=e.detail.value;
+				this.jclx=this.jclxlist[val].dictLabel;
+				this.orderFoodType=this.jclxlist[val].dictValue;
+				this.getConfirm()
+			},
+			getHeightFn() {
+				let query = uni.createSelectorQuery().in(this);
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.navbox').boundingClientRect(data => {
+					var top = data.top < 0 ? -data.top : data.top;
+					var stubarHeight = Number(this.stubarHeight);
+					this.marTop = stubarHeight > 0 ? 692 - Number(data.height) * 2 : 692 - Number(data.height) *
+						2 + 40 //赋值,待会要用
+					if (top <= this.nvaHeight) {
+						const opacity = top / 100 // 计算透明度值
+						const color = `rgba(4, 145, 253, ${opacity})`
+						this.backgroundColor = color // 更新盒子背景颜色
+					} else {
+						this.backgroundColor = '#00A9F0'
+					}
+				}).exec();
+			},
+			init() {
+				// 门禁
+				getDictionaryFn('menj').then(res=>{
+					if(res.code==200){
+						this.mjlist = res.data.map(v => {
+							return {
+								dictLabel: v.dictLabel,
+								dictValue: v.dictValue
+							}
+						})
+					}
+				})
+			},
+			getDelFn(id){
+				var that=this;
+				getManagementDel(id).then(res=>{
+					if(res.code==200){
+						this.$toast('删除成功')
+						setTimeout(function(){
+							that.getConfirm()
+						},1200)
+					}
+				})
+			},
+			getDataFn() {
+				var params = {
+					pageSize: this.pageSize,
+					pageNum: this.pageNum,
+				}
+				if(this.title){
+					params.personneName=this.title
+				}
+				getManagementList(params).then(res => {
+					if (res.code == 200) {
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
+								1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = '上拉加载更多'
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					} else {
+						this.$toast(res.msg)
+					}
+				})
+
+			},
+		},
+
+	}
+</script>
+<style>
+/* 	page {
+		background: #ffffff;
+	} */
+</style>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 692rpx;}	
+.zxmain{position: relative;padding: 8rpx 32rpx 100rpx;box-sizing: border-box;}
+.search{padding: 0 52rpx;box-sizing: border-box;
+	width: 100%;height: 76rpx;background: rgba(40, 139, 214, 0.5);border-radius: 38rpx;
+	image{width: 24rpx;height: 24rpx;margin-right: 22rpx;flex: 0 0 auto;}
+	input{flex: 1;font-weight: 500;font-size: 22rpx;color: #FFFFFF;}
+}
+.daybtn{font-weight: 500;font-size: 26rpx;color: #FFFFFF;flex: 0 0 auto;
+	image{width: 30rpx;height: 30rpx;margin-right: 8rpx;}
+}
+.lbtab{padding-left:18rpx;
+	.limg{width: 24rpx;height: 24rpx;margin-right: 16rpx;flex:0 0 auto;}
+	.lbtabs{overflow: auto;flex-wrap: nowrap;flex:1;
+		.pickbox{text-align: right;font-weight: 500;font-size: 28rpx;color: #161616;min-height:88rpx;margin: 0 10rpx;
+			.pickboxa{justify-content: center;	
+				min-height: 88rpx;display: flex;align-items: center;	
+			}
+			.tit{font-weight: 500;font-size: 26rpx;color: #FFFFFF;}
+			.hupimg{width: 16rpx;height: 10rpx;margin-left: 26rpx;flex: 0 0 auto;}
+		}
+		
+	}
+}
+</style>

+ 337 - 0
work/pages/yyorder/limitdetail.vue

@@ -0,0 +1,337 @@
+<template>
+	<view>
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff" left-icon="left" title="人员权限" :background-color="backgroundColor"
+				:border="false" statusBar='true' fixed="true" @clickLeft='getBack'>
+			</uni-nav-bar>
+		</view>
+		<image :src="navbg" class="navbg"></image>
+		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
+			<view class="ytbox">
+				<uni-forms ref="form" class="ytforms"  :modelValue="datainfo">
+					<view class="ytsbox">
+						<view class="yttit">人员信息</view>
+						<view class="pt5">
+							<uni-forms-item label="姓名"   name="personneName">
+								<uni-easyinput :inputBorder="false"  v-model="datainfo.personneName" placeholder="请输入姓名">
+								</uni-easyinput>
+							</uni-forms-item>
+							<uni-forms-item label="联系方式"   name="personnePhone">
+								<uni-easyinput :inputBorder="false"  v-model="datainfo.personnePhone" placeholder="请输入联系方式">
+								</uni-easyinput>
+							</uni-forms-item>
+							<uni-forms-item label="门禁权限" name="guard">
+								<view class="pickbox" @click="getRecorddwFn">
+									<view class="flexc flex1">
+										<view class="flex1 f14" v-if="datainfo.guard&&!mjtxt">{{statusFormats(datainfo.guard,mjlist,'dblx')}}</view>
+										<view class="flex1 f14" v-else :class="mjtxt?'':'coa'">{{mjtxt||"请选择门禁"}}</view>
+										<image :src="hupimg" class="hupimg"></image>
+									</view>
+								</view>	
+							</uni-forms-item>
+							<uni-forms-item label="是否启用"  name="isEnable">
+								<view class="pickbox">
+									<view class="flexc flex1" >
+										<uni-data-checkbox :selectedColor="actcolor" selectedTextColor='#222327' v-model="datainfo.isEnable" :localdata="qylist" />
+									</view>
+								</view>	
+							</uni-forms-item>
+							
+							<uni-forms-item label="部门"   name="deptName">
+								<view class="pickbox" @click="getRecordbmFn">
+									<view class="flexc flex1">
+										<view class="flex1 f14" :class="datainfo.deptName?'':'coa'">{{datainfo.deptName||"请选择部门"}}</view>
+										<image :src="hupimg" class="hupimg"></image>
+									</view>
+								</view>	
+							</uni-forms-item>
+						</view>
+						<view class="ybtn flexcc" @click="getSubmit">确认提交</view>
+						<view class="tips"></view>
+					</view>	
+				</uni-forms>
+			</view>
+		</view>
+		<!-- 选择担保类型 -->
+		<bartree-pickerfixed ref="treePickerzrdw" deptType='1' :multiple='true' @select-change="selectChangezrdw" title="选择门禁"
+		:localdata="mjlist" :checkVal='datainfo.guard'  valueKey="value" textKey="label" childrenKey="children"></bartree-pickerfixed>
+		<!-- 选择部门 -->
+		<bartree-pickerfixed ref="treePickerbm" deptType='1' :multiple='false' @select-change="selectChangebm" title="选择部门"
+		:localdata="depTree" :checkVal='datainfo.deptName'  valueKey="id" textKey="label" childrenKey="children"></bartree-pickerfixed>
+	</view>
+</template>
+
+<script>
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import {getManagementAdd,getManagementPut,getManagementDetail} from "@/api/mine/work.js"
+	import {getDictionaryFn} from "@/api/mine/register.js"
+	import {selectValueKey} from "@/utils/common.js"
+	import {getDeptFn} from "@/api/mine/mine.js"
+	import bartreePickerfixed from "@/work/components/ba-tree-picker/ba-tree-pickerfixed.vue"
+	export default {
+		components: {bartreePickerfixed},
+		data() {
+			return {
+				hupimg:require("@/static/images/order/hup.png"),
+				navbg:require("@/static/images/navbg.png"),
+				backgroundColor: "transparent",
+				nvaHeight: 44,
+				marTop: 0, //距离顶部的距离
+				stubarHeight: 0, //
+				datainfo:{
+					"personneId":"",//ID
+					"personneName":"",//人员姓名
+					"personnePhone":"",//人员手机号
+					"deptId":"",//部门id
+					"deptName":"",//部门名称
+					"humanFaceData":"",//人脸数据
+					"guard":"",//门禁
+					"isEnable":"0"//是否启用  0:是,1:否 
+				},
+				mjtxt:'',
+				qylist:[{text:'是',value:'0'},{text:'否',value:'1'}],
+				actcolor:'#00A9F0',
+				qyidx:[],
+				sfqy:'',
+				mjlist:[],
+				depTree:[],
+				ptype:'add',
+				id:'',
+				// name:this.$store.state.user.name,
+				// userId:this.$store.state.user.userId,
+				// deptId:this.$store.state.user.deptId,
+				// deptName:this.$store.state.user.deptName,
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			if (scrollTop > 0) {
+				this.backgroundColor = '#0491FD'
+			} else {
+				this.backgroundColor = 'transparent'
+			}
+		},
+		onLoad: function(e) {
+			if(e.data){
+				var data=JSON.parse(decodeURIComponent(e.data))
+				if(data.type){
+					this.ptype=data.type;
+					this.id=data.id;
+					this.getDetail()
+				}
+			}else{
+				this.datainfo.orderFoodUser=this.name;
+				this.datainfo.orderFoodUserId=this.userId;
+				this.datainfo.orderFoodDept=this.deptName;
+				this.datainfo.orderFoodDeptId=this.deptId;
+			}
+			
+			this.init()
+			// this.getDataFn()
+			uni.getSystemInfo({
+				success: (e) => {
+					this.stubarHeight = Number(e.statusBarHeight);
+					this.nvaHeight = Number(e.statusBarHeight) + 44;
+					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
+				}
+			})
+		},
+		onShow() {},
+		mounted() {
+			this.getHeightFn()
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			getBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			statusFormat(ite,list,type) {
+				var aite=selectValueKey(list, ite);
+				this.qyidx=aite.key
+				return aite.actions;
+			},
+			statusFormats(ite,list,type){//多选匹配
+				if(ite){
+					var actions = [];
+					list.forEach(s => {
+						if(ite.indexOf(s.dictValue)>-1){
+							actions.push(s.dictLabel);
+						}
+					})
+					return actions.join(',')
+				}else{
+					return ''
+				}	
+			},
+			init() {
+				// 就餐类型
+				getDictionaryFn('menj').then(res=>{
+					if(res.code==200){
+						this.mjlist = res.data.map(v => {
+							return {
+								label: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+				getDeptFn().then(res=>{
+					if(res.code==200){
+						this.depTree=res.data
+					}
+				})
+			},
+			getRecorddwFn(){
+				this.$refs.treePickerzrdw._show();
+			},
+			getRecordbmFn(){
+				this.$refs.treePickerbm._show();
+			},
+			selectChangezrdw(e){
+				var val=e;
+				var newArr=[],newVal=[];
+				var a=0;
+				e.forEach((ite,idx)=>{
+					newArr[idx]=ite.deptName
+					newVal[idx]=ite.deptId
+				})
+				this.mjtxt=newArr.join(',')
+				this.datainfo.guard=newVal.join(',');
+			},
+			selectChangebm(e){
+				var val=e;
+				console.log(e)
+			},
+			bindTimeChangea(e){
+				var val=e.detail.value;
+				this.datainfo.orderFoodTime=val
+			},
+			bindTimeChangeb(e){
+				var val=e.detail.value;
+				this.datainfo.orderFoodType=this.jclxlist[val].value
+				this.jclx=this.jclxlist[val].label
+			},
+			getHeightFn() {
+				let query = uni.createSelectorQuery().in(this);
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.navbox').boundingClientRect(data => {
+					var top = data.top < 0 ? -data.top : data.top;
+					var stubarHeight = Number(this.stubarHeight);
+					this.marTop = stubarHeight > 0 ? 692 - Number(data.height) * 2 : 692 - Number(data.height) *
+						2 + 40 //赋值,待会要用
+					if (top <= this.nvaHeight) {
+						const opacity = top / 100 // 计算透明度值
+						const color = `rgba(4, 145, 253, ${opacity})`
+						this.backgroundColor = color // 更新盒子背景颜色
+					} else {
+						this.backgroundColor = '#00A9F0'
+					}
+				}).exec();
+			},
+			getSubmit() {
+				var that=this;
+				var params = JSON.parse(JSON.stringify(this.datainfo))
+				if(!params.orderFoodTime){
+					this.$toast("请选择就餐日期")
+					return
+				}
+				if(!this.jclx){
+					this.$toast("请选择就餐类型")
+					return
+				}
+				uni.showLoading({
+					title:"加载中"
+				})
+				if(this.ptype=='add'){
+					getFoodAdd(params).then(res => {
+						uni.hideLoading()
+						if (res.code == 200) {
+							this.$toast("预约成功")
+							setTimeout(function(){
+								uni.$emit('refreshfoodlist')
+								uni.navigateBack({
+									delta:1
+								})
+							},1200)
+						} else {
+							this.$toast(res.msg)
+						}
+					})
+				}else{
+					getFoodPut(params).then(res => {
+						uni.hideLoading()
+						if (res.code == 200) {
+							this.$toast("修改成功")
+							setTimeout(function(){
+								uni.$emit('refreshfoodlist')
+								uni.navigateBack({
+									delta:1
+								})
+							},1200)
+						} else {
+							this.$toast(res.msg)
+						}
+					})
+				}
+			},
+			getDetail(){
+				getFoodDetail(this.id).then(res=>{
+					if(res.code==200){
+						this.datainfo=JSON.parse(JSON.stringify(res.data))
+					}
+				})
+			}
+		},
+
+	}
+</script>
+<style>
+/* 	page {
+		background: #ffffff;
+	} */
+</style>
+<style lang="scss" scoped>
+.ytbox /deep/ .uni-forms .uni-forms-item{padding: 10rpx 26rpx 10rpx;border: 2rpx solid #0391FD;margin-bottom: 24rpx;border-radius: 12rpx;}
+.ytbox /deep/ .uni-forms-item__label{flex: 0 0 auto;width: 144rpx !important;font-size: 28rpx;font-weight: bold;position: relative;color: #161616;text-align-last: justify;}
+.ytbox /deep/ .uni-forms-item__label text{flex: 1;}
+.ytbox /deep/ .uni-forms-item__label .is-required{position: absolute;right: 0;color: #F10C31;margin-top: 16rpx;}
+.ytbox /deep/ uni-textarea{flex: 1;width: auto;text-align: right;}
+.ytbox /deep/ .uni-textarea-placeholder{font-size: 28rpx;color: #DDDDDD !important;}
+.ytbox /deep/ .uni-easyinput__placeholder-class{font-size: 28rpx;color: #AAAAAA;}
+.ytbox /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
+.ytbox /deep/ .uni-easyinput{flex: 1;text-align: right;}
+.ytbox /deep/ .uni-easyinput__content-input{font-size: 28rpx;}
+ .ytbox /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
+.ytbox /deep/ .checklist-group{justify-content: end;}
+ .disable{background: #EFF0F2;border: none !important;}
+ .ytbox{width: 684rpx;margin: 0 auto;padding-top: 24rpx;position: relative;flex: 1;overflow: auto;background-color: #ffffff;padding-bottom: 4rpx;border-radius: 14rpx;}
+.ytforms{
+	.yttit{font-size: 28rpx;font-weight: bold;margin-bottom: 56rpx;
+color: #161616;display: flex;align-items: center;padding: 0rpx 26rpx;box-sizing: border-box;position: relative;
+		&::before{content: '';width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 4rpx;position: absolute;top: 50%;transform: translateY(-50%);left: 0rpx;}
+	}
+	.ytsbox{background-color: #ffffff;padding: 32rpx 28rpx 0;border-radius: 14rpx;margin-bottom: 24rpx;
+		.intit{font-weight: 500;flex: 1;font-size: 26rpx;text-align: right;color: #666666;}
+		.pickbox{flex: 1;text-align: right;font-weight: 500;font-size: 28rpx;color: #161616;
+			.hupimg{width: 18rpx;height: 14rpx;margin-left: 12rpx;flex: 0 0 auto;}
+		}
+		
+	}
+}
+// 按钮
+	.ybtn{width: 100%;height: 90rpx;background: $com-cd3;border-radius: 14rpx;margin: 100rpx auto 0;font-size: 28rpx;font-weight: 500;color: #FFFFFF;
+		&.btn1{background-color: #9a9c9e;}
+	}
+	.tips{font-weight: bold;margin-top: 28rpx;
+font-size: 22rpx;line-height: 34rpx;
+color: #FF0000;}
+
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 692rpx;}	
+.zxmain{position: relative;padding: 20rpx 32rpx 40rpx;box-sizing: border-box;display: flex;
+		min-height: calc(100vh - 44px);		
+}
+</style>

+ 147 - 64
work/pages/yyorder/meeting.vue

@@ -8,47 +8,58 @@
 		<image :src="navbg" class="navbg"></image>
 		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
 			<view class="ytbox">
-				<uni-forms ref="form" class="ytforms"  :modelValue="datainfo">
+				<uni-forms ref="form" class="ytforms" :rules="rules"  :modelValue="datainfo">
 					<view class="ytsbox">
 						<view class="yttit">预订信息</view>
 						<view class="pt5">
 							<uni-forms-item label="预定人员" class="disable"  name="visitName">
-								<view class="intit">刘安宁</view>
+								<view class="intit">{{datainfo.orderUser}}</view>
 							</uni-forms-item>
-							<uni-forms-item label="开始时间" name="appointmentSite">
-								<uni-datetime-picker v-model="datainfo.starttime">
+							<uni-forms-item label="开始时间" name="startTime">
+								<uni-datetime-picker v-model="datainfo.startTime">
 									<view class="pickbox flexc">
-										<view :class="datainfo.starttime?'txr flex1':'coa txr flex1'">{{datainfo.starttime || "请选择开始时间"}}</view>
+										<view :class="datainfo.startTime?'txr flex1':'coa txr flex1'">{{datainfo.startTime || "请选择开始时间"}}</view>
 										<image :src="hupimg" class="hupimg"></image>
 									</view>	
 								</uni-datetime-picker>
 							</uni-forms-item>
-							<uni-forms-item label="结束时间" name="appointmentSite">
-								<uni-datetime-picker v-model="datainfo.starttime">
+							<uni-forms-item label="结束时间" name="endTime">
+								<uni-datetime-picker v-model="datainfo.endTime">
 									<view class="pickbox flexc">
-										<view :class="datainfo.starttime?'txr flex1':'coa txr flex1'">{{datainfo.starttime || "请选择结束时间"}}</view>
+										<view :class="datainfo.endTime?'txr flex1':'coa txr flex1'">{{datainfo.endTime || "请选择结束时间"}}</view>
 										<image :src="hupimg" class="hupimg"></image>
 									</view>	
 								</uni-datetime-picker>
 							</uni-forms-item>
 							<uni-forms-item label="会议室"  name="appointmentSite">
-								<picker  class="pickbox" range-key='dictLabel' :value="adridx"
-									:range="adrlist" @change="bindTimeChangea">
+								<w-select
+								      :list='hyslist'
+									  v-model="chooseValue"
+								      valueName='conferenceRoomName' 
+								      keyName="conferenceRoomId"
+									  :filterable='filterable'
+									  width='100%'
+									  height="36px"
+									  @change='getchangeb'
+								    >
+								    </w-select>
+								<!-- <picker  class="pickbox" range-key='dictLabel' :value="hysidx"
+									:range="hyslist" @change="bindTimeChangea">
 									<view class="flexc flex1">
-										<view class="flex1 " :class="jclx?'co16 fw5 f14':'coa f14'">
-											{{jclx||'请选择会议室'}}</view>
+										<view class="flex1 f14" v-if="datainfo.conferenceRoomName&&!hys">{{statusFormat(datainfo.conferenceRoomName,hyslist,'hys')}}</view>
+										<view class="flex1 f14" v-else :class="hys?'':'coa'">{{hys||"请选择会议室"}}</view>
 											<image :src="hupimg" class="hupimg"></image>
 									</view>
-								</picker>
+								</picker> -->
 							</uni-forms-item>
 							
-							<uni-forms-item label="会议名称"   name="visitPhone">
-								<uni-easyinput :inputBorder="false" type="textarea" autoHeight  v-model="datainfo.visitPhone"
+							<uni-forms-item label="会议名称"   name="conferenceName">
+								<uni-easyinput :inputBorder="false" type="textarea" autoHeight  v-model="datainfo.conferenceName"
 									placeholder="输入会议名称">
 								</uni-easyinput>
 							</uni-forms-item>
-							<uni-forms-item label="参会人数"   name="visitPhone">
-								<uni-easyinput :inputBorder="false"  v-model="datainfo.visitPhone"
+							<uni-forms-item label="参会人数"   name="conferenceNumber">
+								<uni-easyinput :inputBorder="false"  v-model="datainfo.conferenceNumber"
 									placeholder="输入参会人数">
 								</uni-easyinput>
 							</uni-forms-item>
@@ -67,25 +78,46 @@
 
 <script>
 	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
-	import {getCameraList,getCameraVideo} from "@/api/mine/order.js"
+	import {getRoomNoList,getRoomyyAdd,getRoomyyPut,getRoomyyDetail} from "@/api/mine/work.js"
 	import {getDictionaryFn} from "@/api/mine/register.js"
+	import wSelect from "@/work/components/w-select/w-select.vue"
 	export default {
-		components: {},
+		components: {wSelect},
 		data() {
 			return {
 				hupimg:require("@/static/images/order/hup.png"),
 				navbg:require("@/static/images/navbg.png"),
 				backgroundColor: "transparent",
-				datainfo:{
-					starttime:'',
-				},
 				nvaHeight: 44,
 				marTop: 0, //距离顶部的距离
 				stubarHeight: 0, //
-				day:'',
-				jclx:'',
-				adridx:'',
-				adrlist:[],
+				datainfo:{
+					"conferenceRoomId": "",//会议室ID
+					"conferenceRoomName": "",//会议室名称
+					"conferenceRoomAddress": "",//会议室地址
+					"orderUser": "",//会议室预约人员名称
+					"orderUserId": "",//会议室预约人员id(用户id)
+					"conferenceName": "",//会议名称
+					"conferenceNumber": "",//会议室人数
+					"startTime": "",//会议开始时间
+					"endTime": "",//会议结束时间
+				},
+				rules: {
+				  startTime: {rules: [{required: true,errorMessage: '请选择开始时间',}]},
+				  endTime: {rules: [{required: true,errorMessage: '请选择结束时间' } ]},
+				  conferenceRoomName: {rules: [{required: true,errorMessage: '请选择会议室'} ]},
+				  conferenceName: {rules: [{required: true,errorMessage: '请输入会议名称'} ]},
+				  conferenceNumber: {rules: [{required: true,errorMessage: '请输入会议人数'} ]},
+				},
+				hys:'',
+				hysidx:'',
+				hyslist:[],
+				ptype:'add',
+				id:'',
+				filterable:true,
+				chooseValue:'',
+				name:this.$store.state.user.name,
+				userId:this.$store.state.user.userId,
 			}
 		},
 		onPageScroll(e) {
@@ -96,9 +128,20 @@
 				this.backgroundColor = 'transparent'
 			}
 		},
-		onLoad: function() {
-			this.init()
-			// this.getDataFn()
+		onLoad: function(e) {
+			if(e.data){
+				var data=JSON.parse(decodeURIComponent(e.data))
+				if(data.type){
+					this.ptype=data.type;
+					this.id=data.id;
+					this.getDetail()
+				}
+			}else{
+				this.datainfo.orderUser=this.name;
+				this.datainfo.orderUserId=this.userId;
+			}
+			// this.init()
+			this.getRoomNoList()
 			uni.getSystemInfo({
 				success: (e) => {
 					this.stubarHeight = Number(e.statusBarHeight);
@@ -106,7 +149,6 @@
 					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
 				}
 			})
-			// 3c8cadac11af4f1298a2882addc8788d
 		},
 		onUnload() {
 			uni.$off('refreshdatalist')
@@ -116,13 +158,6 @@
 		mounted() {
 			this.getHeightFn()
 		},
-		// 上拉触底加载更多触发事件
-		onReachBottom() {
-			if (this.reachflag) {
-				this.pageNum++
-				this.getDataFn()
-			}
-		},
 		methods: {
 			checkPermi,
 			checkRole,
@@ -133,7 +168,7 @@
 			},
 			bindTimeChangea(e){
 				var val=e.detail.value;
-				this.day=val
+				// this.day=val
 			},
 			getHeightFn() {
 				let query = uni.createSelectorQuery().in(this);
@@ -165,39 +200,87 @@
 				// 	}
 				// })
 			},
-			getDataFn() {
-				var params = {
-					pageSize: this.pageSize,
-					pageNo: this.pageNum,
-					// visitType:3
+			statusFormat(ite,list,type) {
+				var aite=selectValueKey(list, ite);
+				if(type=='hys'){
+					this.hysidx=aite.key
 				}
-				getCameraList(params).then(res => {
-					if (res.code == 200) {
-						if (res.rows.length < this.pageSize) {
-							this.reachflag = false
-							this.wtdt = '到底了~';
-						} else {
-							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
-								1)
-							if (num < res.total) {
-								this.reachflag = true
-								this.wtdt = '上拉加载更多'
+				return aite.actions;
+			},
+			getSubmit(){
+				var that=this;
+				this.$refs.form.validate().then(res => {
+					var params = JSON.parse(JSON.stringify(this.datainfo))
+					if(!params.conferenceRoomName){
+						this.$toast("请选择会议室")
+						return
+					}
+					var regex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
+					var s=regex.test(params.startTime);
+					var e=regex.test(params.endTime);
+					if(!s){
+						that.$toast("请选择完整的开始时间")
+						return
+					}
+					if(!e){
+						that.$toast("请选择完整的结束时间")
+						return
+					}
+					if(this.ptype=='add'){
+						getRoomyyAdd(params).then(res => {
+							if (res.code == 200) {
+								this.$toast("新增成功")
+								uni.$emit('refreshmeetlist')
+								setTimeout(function(){
+									uni.navigateBack({
+										delta:1
+									})
+								},1200)
 							} else {
-								this.reachflag = false
-								this.wtdt = '到底了~';
+								this.$toast(res.msg)
 							}
-						}
-						if (this.pageNum == 1) {
-							this.list = res.rows;
-						} else {
-							this.list = this.list.concat(res.rows)
-						}
+						})
+					}else{
+						getRoomyyPut(params).then(res => {
+							if (res.code == 200) {
+								this.$toast("修改成功")
+								uni.$emit('refreshmeetlist')
+								setTimeout(function(){
+									uni.navigateBack({
+										delta:1
+									})
+								},1200)
+							} else {
+								this.$toast(res.msg)
+							}
+						})
+					}
+					
+				})
+				
+			},
+			getchangeb(e){
+				this.datainfo.conferenceRoomId=e.conferenceRoomId;
+				this.datainfo.conferenceRoomName=e.conferenceRoomName;
+				this.datainfo.conferenceRoomAddress=e.conferenceRoomAddress;
+			},
+			getRoomNoList() {
+				getRoomNoList().then(res => {
+					if (res.code == 200) {
+						this.hyslist=res.rows
 					} else {
 						this.$toast(res.msg)
 					}
 				})
-
 			},
+			getDetail(){
+				getRoomyyDetail(this.id).then(res=>{
+					if(res.code==200){
+						this.datainfo=res.data;
+						this.chooseValue=res.data.conferenceRoomId
+					}
+				})
+			}
 		},
 
 	}
@@ -218,7 +301,7 @@
 .ytbox /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
 .ytbox /deep/ .uni-easyinput{flex: 1;text-align: right;}
 .ytbox /deep/ .uni-easyinput__content-input{font-size: 28rpx;}
- .ytbox /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
+ .ytbox /deep/ .uni-forms-item__error{margin-top:0rpx;left: auto;right: 0;}
 .ytbox /deep/ .uni-easyinput__content-textarea{min-height: 48rpx;} 
  .disable{background: #EFF0F2;border: none !important;}
  .ytbox{width: 684rpx;margin: 0 auto;padding-top: 24rpx;position: relative;flex: 1;overflow: auto;background-color: #ffffff;padding-bottom: 4rpx;border-radius: 14rpx;}

+ 264 - 0
work/pages/yyorder/meetlist.vue

@@ -0,0 +1,264 @@
+<template>
+	<view>
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff" left-icon="left" title="我的会议预订" :background-color="backgroundColor"
+				:border="false" statusBar='true' fixed="true" @clickLeft='getBack'>
+			</uni-nav-bar>
+			<view class="plr16" :style="'background:'+backgroundColor">
+				<!-- <view class="search flexc mb4">
+					<image :src="serimg"></image>
+					<input placeholder="请输入人员姓名进行搜索" confirm-type="search" placeholder-style="color:#B9DCF7" v-model="title" @confirm="getConfirm"/>
+				</view> -->
+				<!-- 搜索 -->
+				<view class="lbtab flexc">
+					<image :src="licoimg" class="limg"  @click='getResetFn'></image>
+					<view class="lbtabs flexc">
+						<picker class="pickbox" range-key='conferenceRoomName' 	:range="adrlist" @change="bindTimeChangea">
+							<view class="pickboxa">
+								<view class="tit overtwo" >{{adrname||'会议室'}}</view>
+								<image :src="wupimg" class="hupimg"></image>
+							</view>
+						</picker>
+						<!-- <picker mode="date" class="pickbox"  :value="adridx"
+							 @change="bindTimeChangeb">
+							<view class="pickboxa">
+								<view class="tit" >{{time||'2024年07月'}}</view>
+								<image :src="wupimg" class="hupimg"></image>
+							</view>
+						</picker>
+						<picker class="pickbox" range-key='dictLabel' 	:range="adrlist" @change="bindTimeChangec">
+							<view class="pickboxa">
+								<view class="tit overtwo" >{{zt||'已结束'}}</view>
+								<image :src="wupimg" class="hupimg"></image>
+							</view>
+						</picker> -->
+					</view>
+					<!-- <view class="czbtns">重置</view> -->
+				</view>
+			</view>
+			
+		</view>
+		<image :src="navbg" class="navbg"></image>
+		<view class="zxmain" :style="'margin-top:-'+marTop+'rpx;'">
+			<!-- 列表 -->
+			<y-list type='meetlist' :datalist="list" :wtdt="wtdt" @getDetail='getDetail'  @getDelFn="getDelFn" ></y-list>
+			<view class="yyfbtn flexcc" v-if="checkPermi(['system:order:add'])" @click="getAddFn">添加会议预约</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import yList from "@/work/components/yuyue/list.vue"
+	import {getRoomyyList,getRoomNoList,getRoomyyDel} from "@/api/mine/work.js"
+	import {getDictionaryFn} from "@/api/mine/register.js"
+	export default {
+		components: {yList},
+		data() {
+			return {
+				wupimg:require("@/work/static/record/wup.png"),
+				serimg:require("@/work/static/record/search.png"),
+				licoimg:require("@/work/static/record/lico.png"),
+				navbg:require("@/static/images/navbg.png"),
+				backgroundColor: "transparent",
+				datainfo:{},
+				nvaHeight: 44,
+				marTop: 0, //距离顶部的距离
+				stubarHeight: 0, //
+				title:'',
+				adrlist:[],
+				list:[],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: false,
+				wtdt:'',
+				adrname:'',
+				adridx:[0],
+				time:'',
+				zt:'',
+				userId:this.$store.state.user.userId,
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			if (scrollTop > 0) {
+				this.backgroundColor = '#0491FD'
+			} else {
+				this.backgroundColor = 'transparent'
+			}
+		},
+		onUnload() {
+			uni.$off('refreshmeetlist')
+		},
+		onLoad: function() {
+			uni.$on('refreshmeetlist',(e) => {
+				this.getConfirm()
+			})
+			this.init()
+			this.getDataFn()
+			uni.getSystemInfo({
+				success: (e) => {
+					this.stubarHeight = Number(e.statusBarHeight);
+					this.nvaHeight = Number(e.statusBarHeight) + 44;
+					this.tabscheight = Number(this.nvaHeight) * 2 + 100;
+				}
+			})
+		},
+		onShow() {},
+		mounted() {
+			this.getHeightFn()
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			getConfirm(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getResetFn(){
+				// 重置
+				this.adrname='';
+				this.conferenceRoomId='';
+				this.adridx=[0];
+				this.getConfirm()
+			},
+			getBack() {
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			getDetail(id){
+				var obj={
+					id:id,
+					type:'edit'
+				}
+				this.$tab.navigateTo('/work/pages/yyorder/meeting?data='+encodeURIComponent(JSON.stringify(obj)))
+			},
+			getAddFn(){
+				this.$tab.navigateTo('/work/pages/yyorder/meeting')
+			},
+			bindTimeChangea(e){
+				var val=e.detail.value;
+				this.adrname=this.adrlist[val].conferenceRoomName;
+				this.conferenceRoomId=this.adrlist[val].conferenceRoomId;
+				this.getConfirm()
+			},
+			bindTimeChangeb(e){
+				var val=e.detail.value;
+			},
+			bindTimeChangec(e){
+				var val=e.detail.value;
+			},
+			getHeightFn() {
+				let query = uni.createSelectorQuery().in(this);
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.navbox').boundingClientRect(data => {
+					var top = data.top < 0 ? -data.top : data.top;
+					var stubarHeight = Number(this.stubarHeight);
+					this.marTop = stubarHeight > 0 ? 692 - Number(data.height) * 2 : 692 - Number(data.height) *
+						2 + 40 //赋值,待会要用
+					if (top <= this.nvaHeight) {
+						const opacity = top / 100 // 计算透明度值
+						const color = `rgba(4, 145, 253, ${opacity})`
+						this.backgroundColor = color // 更新盒子背景颜色
+					} else {
+						this.backgroundColor = '#00A9F0'
+					}
+				}).exec();
+			},
+			init() {
+				// 会议室
+				getRoomNoList().then(res=>{
+					if(res.code==200){
+						this.adrlist = res.rows
+					}
+				})
+			},
+			getDelFn(id){
+				var that=this;
+				getRoomyyDel(id).then(res=>{
+					if(res.code==200){
+						this.$toast('删除成功')
+						setTimeout(function(){
+							that.getConfirm()
+						},1200)
+					}
+				})
+			},
+			getDataFn() {
+				var params = {
+					pageSize: this.pageSize,
+					pageNum: this.pageNum,
+					userId:this.userId
+				}
+				if(this.adrname){
+					params.conferenceRoomId=this.conferenceRoomId
+				}
+				getRoomyyList(params).then(res => {
+					if (res.code == 200) {
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
+								1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = '上拉加载更多'
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					} else {
+						this.$toast(res.msg)
+					}
+				})
+
+			},
+		},
+
+	}
+</script>
+<style>
+/* 	page {
+		background: #ffffff;
+	} */
+</style>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 692rpx;}	
+.zxmain{position: relative;padding: 8rpx 32rpx 100rpx;box-sizing: border-box;}
+.search{padding: 0 52rpx;box-sizing: border-box;
+	width: 100%;height: 76rpx;background: rgba(40, 139, 214, 0.5);border-radius: 38rpx;
+	image{width: 24rpx;height: 24rpx;margin-right: 22rpx;flex: 0 0 auto;}
+	input{flex: 1;font-weight: 500;font-size: 22rpx;color: #131313;}
+}
+.lbtab{padding-left:18rpx;
+	.limg{width: 24rpx;height: 24rpx;margin-right: 16rpx;flex:0 0 auto;}
+	.lbtabs{overflow: auto;flex-wrap: nowrap;flex:1;
+		.pickbox{text-align: right;font-weight: 500;font-size: 28rpx;color: #161616;min-height:88rpx;margin: 0 10rpx;
+			.pickboxa{justify-content: center;	
+				min-height: 88rpx;display: flex;align-items: center;	
+			}
+			.tit{font-weight: 500;font-size: 26rpx;color: #FFFFFF;}
+			.hupimg{width: 16rpx;height: 10rpx;margin-left: 26rpx;flex: 0 0 auto;}
+		}
+		
+	}
+}
+</style>

二進制
work/static/yuy/day.png


二進制
work/static/yuy/del.png