From 0becab45282781f281ad5aa04202b83039ab275e Mon Sep 17 00:00:00 2001
From: qingyiay <2386314947@qq.com>
Date: 星期五, 14 四月 2023 17:42:08 +0800
Subject: [PATCH] 增加发运统计页面,修改websocket,增加消息推送

---
 pages/freight-forwarder-page/freightForwarder-my/freightForwarder-my.vue                      |   13 
 pages/driver-page/drvier-my/drvier-my.vue                                                     |   13 
 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json                            |   12 
 pages/customer-page/customer-index/fayunPlanDetails/fayunPlanDetails.vue                      |    1 
 pages/tabbar-page/index-tabbar/index-tabbar.vue                                               |   85 +
 pages/driver-page/driver-index/bill-of-lading-details/coal-pick-up-bill/coal-pick-up-bill.vue |    2 
 uni_modules/uni-calendar/package.json                                                         |   85 +
 App.vue                                                                                       |   19 
 store/index.js                                                                                |   61 
 uni_modules/uni-calendar/components/uni-calendar/i18n/en.json                                 |   12 
 pages/driver-page/driver-index/bill-of-lading-details/weighingDevice/weighingDevice.vue       |   23 
 pages/driver-page/appointment/appointment.vue                                                 |    2 
 uni_modules/uni-calendar/changelog.md                                                         |   26 
 pages/driver-page/driver-index/bill-of-lading-details/bill-of-lading-details.vue              |   47 
 uni_modules/uni-calendar/components/uni-calendar/i18n/index.js                                |    8 
 pages/freight-forwarder-page/freightForwarder-index/freightForwarder-index.vue                |    4 
 pages/public-page/forward/forward.vue                                                         |  208 ++--
 api/publicInterface.js                                                                        |    4 
 uni_modules/uni-calendar/readme.md                                                            |  103 ++
 uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue                             |  566 +++++++++++
 pages/public-page/messageDetails/messageDetails.vue                                           |   31 
 uni_modules/uni-calendar/components/uni-calendar/util.js                                      |  360 +++++++
 pages.json                                                                                    |   11 
 pages/customer-page/customer-my/customer-my.vue                                               |   11 
 api/globalApi.js                                                                              |   19 
 api/request.js                                                                                |    8 
 uni_modules/uni-calendar/components/uni-calendar/calendar.js                                  |  546 ++++++++++
 uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue                        |  187 +++
 pages/public-page/message/message.vue                                                         |   20 
 pages/customer-page/customer-my/faYunstatistics/faYunstatistics.vue                           |  471 +++++++++
 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json                            |   12 
 31 files changed, 2,743 insertions(+), 227 deletions(-)

diff --git a/App.vue b/App.vue
index 5eb0a20..2ff8874 100644
--- a/App.vue
+++ b/App.vue
@@ -1,18 +1,11 @@
 <script>
-	export default {
-		onLaunch: function() {
-			console.log('App Launch')
-		},
-		onShow: function() {
-			console.log('App Show')
-		},
-		onHide: function() {
-			console.log('App Hide')
-		}
-	}
+export default {
+	onShow() {},
+	methods: {}
+};
 </script>
 
 <style lang="scss" scoped>
-	/*姣忎釜椤甸潰鍏叡css */
-	@import '@/uni_modules/uview-ui/index.scss';
+/*姣忎釜椤甸潰鍏叡css */
+@import '@/uni_modules/uview-ui/index.scss';
 </style>
diff --git a/api/globalApi.js b/api/globalApi.js
index dd627c7..0b51552 100644
--- a/api/globalApi.js
+++ b/api/globalApi.js
@@ -295,6 +295,23 @@
 		url: '/wrzs/appMessage/getMessageByUser',
 		method: 'GET'
 	},
+	// 宸茶娑堟伅
 	readMessage: { url: '/wrzs/appMessage/readMessage' },
-	delteMessage: { url: '/wrzs/appMessage/deleteMessage', method: 'GET' }
+	// 鍒犻櫎娑堟伅
+	delteMessage: { url: '/wrzs/appMessage/deleteMessage', method: 'GET' },
+	// 娑堟伅璇︽儏
+	getMsgDetail: {
+		url: '/wrzs/appMessage/getMsgById',
+		method: 'GET'
+	},
+	// 鍙戣繍缁熻绛涢�夋潯浠�
+	getShippingCondition: {
+		url: '/wrzs/tmtaskcoal/getShippingCondition',
+		method: 'GET'
+	},
+	// 鍙戣繍缁熻鏁版嵁
+	getTmTaskCoalData: {
+		url: '/wrzs/tmtaskcoal/getTmTaskCoalData',
+		method: 'GET'
+	}
 }
diff --git a/api/publicInterface.js b/api/publicInterface.js
index 59e40cc..e850135 100644
--- a/api/publicInterface.js
+++ b/api/publicInterface.js
@@ -3,9 +3,9 @@
 
 
 import { BaseUrl as wrBaseUrl } from '@/api/request.js'
-// const BaseUrl = 'http://192.168.31.14:9999'
+const BaseUrl = 'http://192.168.31.14:9999'
 // const BaseUrl = "http://hesuancj.cn:9999"
-const BaseUrl = 'https://mx.jzeg.cn:9095'
+// const BaseUrl = 'https://mx.jzeg.cn:9095'
 // const BaseUrl = 'http://192.168.31.18:9999'
 
 // 鐧诲綍
diff --git a/api/request.js b/api/request.js
index 639bd3d..be2601b 100644
--- a/api/request.js
+++ b/api/request.js
@@ -81,14 +81,14 @@
 // const BaseUrl = "http://192.168.31.18:9997"
 // const webSocketUrl = "ws://192.168.31.18:9997/wrzs/ws/info"
 
-// const BaseUrl = "http://192.168.31.14:9997";
-// const webSocketUrl = "ws://192.168.31.14:9997/wrzs/ws/info"
+const BaseUrl = "http://192.168.31.14:9997";
+const webSocketUrl = "ws://192.168.31.14:9997/wrzs/ws/info"
 // // 绾夸笂寮�鍙�
 // const BaseUrl = "http://hesuancj.cn:9997";
 // const webSocketUrl = "ws://hesuancj.cn:9997/wrzs/ws/info"
 // // 绾夸笂鐢熶骇
-const BaseUrl = "https://mx.jzeg.cn:9095";
-const webSocketUrl = "wss://mx.jzeg.cn:9095/wrzs/ws/info"
+// const BaseUrl = "https://mx.jzeg.cn:9095";
+// const webSocketUrl = "wss://mx.jzeg.cn:9095/wrzs/ws/info"
 
 
 // 璇锋眰鎷︽埅
diff --git a/pages.json b/pages.json
index 7f71f99..c69b5d9 100644
--- a/pages.json
+++ b/pages.json
@@ -168,7 +168,16 @@
 			}
 
 		}
-	],
+	    ,{
+            "path" : "pages/customer-page/customer-my/faYunstatistics/faYunstatistics",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+    ],
 	"subPackages": [{
 			"root": "pages/register",
 			"pages": [{
diff --git a/pages/customer-page/customer-index/fayunPlanDetails/fayunPlanDetails.vue b/pages/customer-page/customer-index/fayunPlanDetails/fayunPlanDetails.vue
index cbbb80a..866478c 100644
--- a/pages/customer-page/customer-index/fayunPlanDetails/fayunPlanDetails.vue
+++ b/pages/customer-page/customer-index/fayunPlanDetails/fayunPlanDetails.vue
@@ -160,6 +160,7 @@
 					color: #909399;
 				}
 				.label-value {
+					min-width: vww(85);
 					margin-top: vww(10);
 					color: #606266;
 				}
diff --git a/pages/customer-page/customer-my/customer-my.vue b/pages/customer-page/customer-my/customer-my.vue
index 62643bc..4558572 100644
--- a/pages/customer-page/customer-my/customer-my.vue
+++ b/pages/customer-page/customer-my/customer-my.vue
@@ -33,6 +33,7 @@
 			</view>
 		</view>
 
+		<view class="statistics"><u-button text="鍙戣繍缁熻" type="primary" @click="statistics"></u-button></view>
 		<view class="logout"><u-button text="閫�鍑虹櫥褰�" type="primary" @click="logout()"></u-button></view>
 
 		<!-- 鏂板缓杞﹂槦寮瑰嚭妗� -->
@@ -274,12 +275,22 @@
 		},
 		logoutCancel() {
 			this.logoutShow = false;
+		},
+		// 璺宠浆鍙戣繍缁熻椤甸潰
+		statistics() {
+			uni.navigateTo({
+				url: '/pages/customer-page/customer-my/faYunstatistics/faYunstatistics'
+			});
 		}
 	}
 };
 </script>
 
 <style lang="scss" scoped>
+.statistics {
+	margin-top: vww(10);
+	margin-bottom: vww(10);
+}
 ::v-deep.customer-my {
 	width: 94%;
 	margin: 0 auto;
diff --git a/pages/customer-page/customer-my/faYunstatistics/faYunstatistics.vue b/pages/customer-page/customer-my/faYunstatistics/faYunstatistics.vue
new file mode 100644
index 0000000..4f89ef6
--- /dev/null
+++ b/pages/customer-page/customer-my/faYunstatistics/faYunstatistics.vue
@@ -0,0 +1,471 @@
+<template>
+	<view class="main">
+		<view class="top-statistics">
+			<view class="content-statistics">
+				<view class="content-text">鍙戣繍缁熻</view>
+				<view class="content-text">鍏眥{ totalLength }}杞�</view>
+				<view class="content-text">鍏眥{ totalTon }}鍚�</view>
+			</view>
+		</view>
+		<view class="collapse-main">
+			<u-collapse>
+				<u-collapse-item :title="dateRange" value="绛涢��">
+					<view class="filter-main">
+						<view class="filter-body">
+							<view class="condition-name">鐓ょ锛�</view>
+							<view class="filter-name">
+								<view class="filter-button" v-for="(item, index) in coalList" :key="index" @click="filterCondition(0, index, item.condition)">
+									<u-button shape="circle" :text="item.condition" :type="item.active ? 'success' : ''" size="small"></u-button>
+								</view>
+							</view>
+						</view>
+						<view class="filter-body">
+							<view class="condition-name">绫诲瀷锛�</view>
+							<view class="filter-name">
+								<view class="filter-button" v-for="(item, index) in typeList" :key="index" @click="filterCondition(1, index, item.condition)">
+									<u-button shape="circle" :text="item.condition" :type="item.active ? 'success' : ''" size="small"></u-button>
+								</view>
+							</view>
+						</view>
+						<view class="filter-body">
+							<view class="condition-name">瀹㈡埛锛�</view>
+							<view class="filter-name">
+								<view class="filter-button" v-for="(item, index) in customerList" :key="index" @click="filterCondition(2, index, item.condition)">
+									<u-button shape="circle" :text="item.condition" :type="item.active ? 'success' : ''" size="small"></u-button>
+								</view>
+							</view>
+						</view>
+						<view class="filter-body" v-if="roleType == 1">
+							<view class="condition-name">璐т唬锛�</view>
+							<view class="filter-name">
+								<view class="filter-button" v-for="(item, index) in forwarderList" :key="index" @click="filterCondition(3, index, item.condition)">
+									<u-button shape="circle" :text="item.condition" :type="item.active ? 'success' : ''" size="small"></u-button>
+								</view>
+							</view>
+						</view>
+						<view class="filter-body" v-if="roleType != 3">
+							<view class="condition-name">杞﹂槦锛�</view>
+							<view class="filter-name">
+								<view class="filter-button" v-for="(item, index) in fleetList" :key="index" @click="filterCondition(4, index, item.condition)">
+									<u-button shape="circle" :text="item.condition" :type="item.active ? 'success' : ''" size="small"></u-button>
+								</view>
+							</view>
+						</view>
+						<view class="filter-body" v-if="roleType != 1">
+							<view class="condition-name">鐭垮満锛�</view>
+							<view class="filter-name">
+								<view class="filter-button" v-for="(item, index) in filedList" :key="index" @click="filterCondition(5, index, item.condition)">
+									<u-button shape="circle" :text="item.condition" :type="item.active ? 'success' : ''" size="small"></u-button>
+								</view>
+							</view>
+						</view>
+						<view class="filter-body">
+							<view class="condition-name">鏃ユ湡锛�</view>
+							<view class="filter-name">
+								<u-button :text="dateselect" @click="opencalendar"></u-button>
+								<view class="filter-button">
+									<uni-calendar
+										ref="calendar"
+										class="uni-calendar--hook"
+										:clear-date="true"
+										:date="info.date"
+										:insert="info.insert"
+										:lunar="info.lunar"
+										:startDate="info.startDate"
+										:endDate="info.endDate"
+										:range="info.range"
+										@confirm="confirm"
+									/>
+								</view>
+							</view>
+						</view>
+					</view>
+				</u-collapse-item>
+			</u-collapse>
+		</view>
+		<view class="date-information">
+			<view class="statistics-card" v-for="(item, index) in filterList" :key="index">
+				<view class="card-title">
+					<view class="title-date">{{ item.condition }}</view>
+					<view class="title-number">
+						鍏眥{ item.taskCoalList.length }}杞�&nbsp;{{
+							item.taskCoalList.reduce((prev, cur) => {
+								return prev + cur.clean;
+							}, 0)
+						}}鍚�
+					</view>
+				</view>
+				<view class="card-main" v-for="(value, i) in item.taskCoalList" :key="i">
+					<view class="arrow-right"><u-icon name="arrow-right" size="50"></u-icon></view>
+					<view class="main-body">
+						<view class="coal-name">鐓ょ:{{ value.coalName || '' }}</view>
+						<view class="clean">鎵ц閲�:{{ value.clean || 0 }}</view>
+						<view class="out-time">鍑哄満鏃堕棿:{{ value.outTime || '' }}</view>
+						<view class="car-number">杞︾墝鍙�:{{ value.carNo || '' }}</view>
+						<view class="filedName">鐭垮満:{{ value.filedName || '' }}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			conditionList: [],
+			coalList: [],
+			typeList: [],
+			customerList: [],
+			forwarderList: [],
+			fleetList: [],
+			filedList: [],
+			isactive: false,
+			info: {
+				lunar: false,
+				range: true,
+				insert: false,
+				selected: []
+			},
+			first: '',
+			last: '',
+			taskList: [],
+			filterList: [],
+			totalLength: 0,
+			totalTon: 0
+		};
+	},
+	onShow() {
+		this.firstDate();
+		this.lastDate();
+		this.getShipping();
+		this.getTmTaskCoalData();
+	},
+	methods: {
+		firstDate() {
+			let y = new Date().getFullYear(); //鑾峰彇骞翠唤
+			let m = new Date().getMonth() + 1; //鑾峰彇鏈堜唤
+			let d = '01';
+			m = m < 10 ? '0' + m : m; //鏈堜唤琛� 0
+			this.first = [y, m, d].join('-');
+		},
+		lastDate() {
+			let y = new Date().getFullYear(); //鑾峰彇骞翠唤
+			let m = new Date().getMonth() + 1; //鑾峰彇鏈堜唤
+			let d = new Date(y, m, 0).getDate(); //鑾峰彇褰撴湀鏈�鍚庝竴鏃�
+			m = m < 10 ? '0' + m : m; //鏈堜唤琛� 0
+			d = d < 10 ? '0' + d : d; //鏃ユ暟琛� 0
+			this.last = [y, m, d].join('-');
+		},
+		// 绛涢�夋潯浠�
+		getShipping() {
+			this.$reqGet('getShippingCondition', { startTime: this.first, endTime: this.last }).then(res => {
+				this.conditionList = res.data;
+				this.coalList = res.data
+					.filter(v => v.conditionType == 0)
+					.map(item => {
+						return {
+							...item,
+							active: false
+						};
+					});
+				this.typeList = res.data
+					.filter(v => v.conditionType == 1)
+					.map(item => {
+						return {
+							...item,
+							active: false
+						};
+					});
+				this.customerList = res.data
+					.filter(v => v.conditionType == 2)
+					.map(item => {
+						return {
+							...item,
+							active: false
+						};
+					});
+				this.forwarderList = res.data
+					.filter(v => v.conditionType == 3)
+					.map(item => {
+						return {
+							...item,
+							active: false
+						};
+					});
+				this.fleetList = res.data
+					.filter(v => v.conditionType == 4)
+					.map(item => {
+						return {
+							...item,
+							active: false
+						};
+					});
+				this.filedList = res.data
+					.filter(v => v.conditionType == 5)
+					.map(item => {
+						return {
+							...item,
+							active: false
+						};
+					});
+			});
+		},
+		// 鑾峰彇鏁版嵁
+		getTmTaskCoalData() {
+			uni.showLoading({
+				title: '鍔犺浇涓�'
+			});
+			this.$reqGet('getTmTaskCoalData', { startTime: this.first, endTime: this.last }).then(res => {
+				this.filterList = this.taskList = res.data;
+				if (this.filterList.length != 0) {
+					this.totalLength = this.filterList.map(v => v.taskCoalList.length).reduce((x, y) => x + y);
+					this.totalTon = this.filterList.map(v =>
+						v.taskCoalList.reduce((prev, cur) => {
+							return cur.clean + prev;
+						}, 0)
+					);
+					this.totalTon = this.totalTon.reduce((x, y) => x + y);
+				} else {
+					this.totalLength = 0;
+					this.totalTon = 0;
+				}
+				uni.hideLoading();
+			});
+		},
+		// 绛涢�夋暟鎹�
+		filterCondition(value, i, data) {
+			switch (value) {
+				case 0:
+					this.coalList[i].active = !this.coalList[i].active;
+					break;
+				case 1:
+					this.typeList[i].active = !this.typeList[i].active;
+					break;
+				case 2:
+					this.customerList[i].active = !this.customerList[i].active;
+					break;
+				case 3:
+					this.forwarderList[i].active = !this.forwarderList[i].active;
+					break;
+				case 4:
+					this.fleetList[i].active = !this.fleetList[i].active;
+					break;
+				case 5:
+					this.filedList[i].active = !this.filedList[i].active;
+					break;
+			}
+
+			const validateFn = key => (v, arr) => {
+				if (arr.length == 0) {
+					return true;
+				} else {
+					return arr.includes(v[key]);
+				}
+			};
+			let conditionMapping = {
+				coalName: this.coalList.filter(v => v.active == true).map(item => item.condition),
+				orderType: this.typeList.filter(v => v.active == true).map(item => item.condition),
+				customerName: this.customerList.filter(v => v.active == true).map(item => item.condition),
+				xsUser2Name: this.forwarderList.filter(v => v.active == true).map(item => item.condition),
+				fleetName: this.fleetList.filter(v => v.active == true).map(item => item.condition),
+				filedName: this.filedList.filter(v => v.active == true).map(item => item.condition)
+			};
+
+			const mapping = {
+				coalName: validateFn('coalName'),
+				orderType: validateFn('orderType'),
+				customerName: validateFn('customerName'),
+				xsUser2Name: validateFn('xsUser2Name'),
+				fleetName: validateFn('fleetName'),
+				filedName: validateFn('filedName')
+			};
+			this.filterList = this.taskList.map(val => {
+				return {
+					condition: val.condition,
+					conditionId: val.conditionId,
+					conditionType: val.conditionType,
+					taskCoalList: val.taskCoalList.filter(v => Reflect.ownKeys(conditionMapping).every(key => mapping[key](v, conditionMapping[key])))
+				};
+			});
+			if (this.filterList.length != 0) {
+				this.totalLength = this.filterList.map(v => v.taskCoalList.length).reduce((x, y) => x + y);
+				this.totalTon = this.filterList.map(v =>
+					v.taskCoalList.reduce((prev, cur) => {
+						return cur.clean + prev;
+					}, 0)
+				);
+				this.totalTon = this.totalTon.reduce((x, y) => x + y);
+			} else {
+				this.totalLength = 0;
+				this.totalTon = 0;
+			}
+		},
+		confirm(e) {
+			this.first = e.range.before;
+			this.last = e.range.after;
+		},
+		opencalendar() {
+			this.$refs.calendar.open();
+		}
+	},
+	computed: {
+		roleType() {
+			return uni.getStorageSync('roleType');
+		},
+		dateRange() {
+			return `鏃ユ湡:${this.first}-${this.last}`;
+		},
+		dateselect() {
+			return `${this.first}-${this.last}`;
+		}
+	},
+	watch: {
+		dateselect(newV, old) {
+			let tempDate = `${this.first}-${this.last}`;
+			console.log(newV, '鏂�', old, '鏃�', tempDate, '涓�寮�濮�');
+			if (newV != old && old != '-') {
+				this.first = newV.slice(0, 10);
+				this.last = newV.slice(11);
+				this.getTmTaskCoalData();
+			}
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep .u-cell__value {
+	color: #9ec16c !important;
+	font-size: vww(18) !important;
+}
+::v-deep .filter-name:nth-last-child(1) {
+	.u-button {
+		width: 66%;
+	}
+}
+.main {
+	width: 96%;
+	margin: 0 auto;
+	background-color: #e8eaec;
+	/*椤堕儴缁熻鏍�*/
+	.top-statistics {
+		width: 100%;
+		height: vww(50);
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		.content-statistics {
+			width: 100%;
+			height: 100%;
+			padding: 0 vww(10);
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			.content-text {
+				width: vww(80);
+				height: vww(30);
+				font-size: vww(20);
+				color: #393a3c;
+			}
+		}
+	}
+	// 閫夐」鎶樺彔妗�
+	.collapse-main {
+		width: 100%;
+		margin-top: vww(10);
+		background-color: #fff;
+		border: 1px solid #cccccc;
+		border-radius: vww(5);
+		.filter-main {
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-around;
+			.filter-body {
+				width: 100%;
+				position: relative;
+				display: flex;
+				justify-content: flex-start;
+				flex-wrap: wrap;
+				.condition-name {
+					font-size: vww(16);
+				}
+				.filter-name {
+					width: 100%;
+					display: flex;
+					flex-wrap: wrap;
+					justify-content: flex-start;
+					align-items: flex-start;
+					position: relative;
+					top: vww(-34);
+
+					.filter-button {
+						color: #393a3c;
+						height: vww(16);
+						padding: vww(8);
+						margin: vww(5) vww(5);
+						&:nth-child(1) {
+							margin-left: vww(48);
+						}
+					}
+				}
+			}
+		}
+	}
+	// 鏃ユ湡鍙戣繍
+	.date-information {
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		.statistics-card {
+			width: 100%;
+			margin-top: vww(8);
+			border: 1px solid #cccccc;
+			border-radius: vww(5);
+			background-color: #fff;
+			min-height: vww(120);
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+			.card-title {
+				width: 100%;
+				height: vww(40);
+				line-height: vww(40);
+				padding-left: vww(5);
+				color: #bcbcbc;
+				border-bottom: 1px solid #cccccc;
+				display: flex;
+				.title-date {
+					width: vww(90);
+					margin-right: vww(10);
+				}
+				.title-number {
+					flex: 1;
+				}
+			}
+			.card-main {
+				width: 100%;
+				flex: 1;
+				position: relative;
+				.arrow-right {
+					position: absolute;
+					right: vww(14);
+					top: vww(18);
+				}
+				.main-body {
+					width: 80%;
+					height: vww(60);
+					margin-top: vww(5);
+					padding: vww(3);
+					color: #686868;
+					display: flex;
+					flex-wrap: wrap;
+					justify-content: space-around;
+				}
+			}
+		}
+	}
+}
+</style>
diff --git a/pages/driver-page/appointment/appointment.vue b/pages/driver-page/appointment/appointment.vue
index 42e79ca..885ccc9 100644
--- a/pages/driver-page/appointment/appointment.vue
+++ b/pages/driver-page/appointment/appointment.vue
@@ -102,7 +102,7 @@
 						uni.navigateBack({
 							delta: 1
 						});
-					}, 1000);
+					}, 500);
 				} else {
 					this.$u.toast(res.msg ? res.msg : '棰勭害澶辫触');
 				}
diff --git a/pages/driver-page/driver-index/bill-of-lading-details/bill-of-lading-details.vue b/pages/driver-page/driver-index/bill-of-lading-details/bill-of-lading-details.vue
index 53c8404..c5bc631 100644
--- a/pages/driver-page/driver-index/bill-of-lading-details/bill-of-lading-details.vue
+++ b/pages/driver-page/driver-index/bill-of-lading-details/bill-of-lading-details.vue
@@ -48,8 +48,8 @@
 </template>
 
 <script>
-let socket = null;
 import { webSocketUrl } from '@/api/request.js';
+import { mapState, mapMutations } from 'vuex';
 export default {
 	onLoad(value) {
 		if (value.orderPlanId && value.yyId) {
@@ -100,7 +100,7 @@
 				sceneId: '',
 				gateCameraId: '',
 				equipmentCode: '',
-				weigh: 30
+				weigh: 0
 			}
 		};
 	},
@@ -108,6 +108,7 @@
 		this.init();
 	},
 	computed: {
+		...mapState(['globalweigh', 'globalinfraredStatus']),
 		name() {
 			return uni.getStorageSync('name');
 		},
@@ -255,50 +256,16 @@
 				}
 			});
 		},
-		/**
-		 * 鍒濆鍖� weoSocket
-		 */
-		initWebSocket() {
-			let wsUrl = `${webSocketUrl}?access_token=${uni.getStorageSync('token')}`;
-			socket = uni.connectSocket({
-				url: wsUrl,
-				header: {
-					CLIENT_TOC: 'Y'
-				},
-				complete: res => {
-					console.log(res, 'socket缁撴灉');
-				}
-			});
-			socket.onOpen(() => {
-				console.log('onOpen');
-			});
-			// 鑾峰彇鏈嶅姟鍣ㄤ紶鏉ョ殑鏁版嵁锛屽仛鐩稿簲澶勭悊
-			socket.onMessage(res => {
-				console.log('socketWeigh', res);
-				let nowWeighObj = JSON.parse(res.data.slice(7));
-				if (nowWeighObj.eqCode == this.weighHouseCode) {
-					if (nowWeighObj.eqInfraredStatus) {
-						this.weighData.weigh = nowWeighObj.weigh;
-					} else {
-						this.weighData.weigh = nowWeighObj.weigh;
-					}
-				}
-			});
-			socket.onClose(() => {
-				console.log('webSocketClose');
-				this.$u.toast('纾呮埧涓柇');
-			});
-			socket.onError(err => {
-				console.log('socket鎶ラ敊', err);
-				this.$u.toast('鍑虹幇閿欒锛岃閲嶆柊杩涘叆璇ラ〉闈紝閲嶈瘯锛侊紒');
-			});
-		},
 		// 鏀剧┖
 		evacuation() {
 			this.evacuationModalShow = true;
 		},
 		// 鏀剧┖寮圭獥纭
 		evacuationConfirm() {
+			this.weighData = {
+				...this.weighData,
+				weigh: this.globalweigh
+			};
 			let mix = Object.assign(this.weighData, this.getWeightHouseObj);
 			this.$reqPost('getOneEvacuation', mix, 'json').then(res => {
 				console.log(res, '绗竴娆℃斁绌�');
diff --git a/pages/driver-page/driver-index/bill-of-lading-details/coal-pick-up-bill/coal-pick-up-bill.vue b/pages/driver-page/driver-index/bill-of-lading-details/coal-pick-up-bill/coal-pick-up-bill.vue
index 7db8d01..e0fdead 100644
--- a/pages/driver-page/driver-index/bill-of-lading-details/coal-pick-up-bill/coal-pick-up-bill.vue
+++ b/pages/driver-page/driver-index/bill-of-lading-details/coal-pick-up-bill/coal-pick-up-bill.vue
@@ -1,6 +1,6 @@
 <template>
 	<view class="coal-pick-up-bill">
-		<view class="driver" style="background:url(https://hesuancj.cn:9095/appimg/image/coalBackgroud/coal-background.png) no-repeat;background-size:100% 100%;">
+		<view class="driver" style="background:url(https://mx.jzeg.cn:9095/appimg/image/coalBackgroud/coal-background.png) no-repeat;background-size:100% 100%;">
 			<view class="driver-coalOne">鐢靛瓙鎻愮叅鍗�</view>
 			<view class="driver-coalTwo">
 				<view>{{ coalData.code || '鏆傛棤璁㈠崟缂栧彿' }}</view>
diff --git a/pages/driver-page/driver-index/bill-of-lading-details/weighingDevice/weighingDevice.vue b/pages/driver-page/driver-index/bill-of-lading-details/weighingDevice/weighingDevice.vue
index 47564df..cea97c8 100644
--- a/pages/driver-page/driver-index/bill-of-lading-details/weighingDevice/weighingDevice.vue
+++ b/pages/driver-page/driver-index/bill-of-lading-details/weighingDevice/weighingDevice.vue
@@ -12,7 +12,7 @@
 					</view>
 					<view class="">
 						绾㈠:
-						<u--text :type="infraredStatus ? 'error' : 'success'" :text="infraredStatus ? '寮傚父' : '姝e父'" size="34"></u--text>
+						<u--text :type="globalinfraredStatus ? 'error' : 'success'" :text="globalinfraredStatus ? '寮傚父' : '姝e父'" size="34"></u--text>
 					</view>
 					<!-- <view class="">
 						闆疯揪:
@@ -40,9 +40,9 @@
 			<u-button
 				type="primary"
 				text="纭畾绉伴噸"
-				:disabled="realTimeWeigh == 0 || infraredStatus"
+				:disabled="realTimeWeigh == 0 || globalinfraredStatus"
 				:loading="isConfirmWeighLoading"
-				loadingText="鍔犺浇涓�"
+				loadingText="纭"
 				@click="confirmWeigh"
 			></u-button>
 			<u-button type="primary" text="杩斿洖鍔犲噺鍚�" :disabled="addAndSubtractCoalDisabled" @click="addAndSubtractCoal" class="jiajian"></u-button>
@@ -65,14 +65,16 @@
 <script>
 let socket = null;
 import { webSocketUrl } from '@/api/request.js';
+import { mapState, mapMutations } from 'vuex';
+import toast from '../../../../../uni_modules/uview-ui/libs/config/props/toast';
 export default {
 	onLoad(params) {
-		console.log(params, '绗簩娆℃斁绌哄弬鏁�');
 		this.takeCoalId = params.takeCoalId;
 		this.weighData.sceneId = params.sceneId;
 		this.weighData.gateCameraId = params.gateCameraId;
 		this.weighData.equipmentCode = params.gateCameraCode;
 		this.weighHouseCode = params.weighHouseCode;
+		this.changeweighHouseCode(params.weighHouseCode);
 	},
 	data() {
 		return {
@@ -118,6 +120,7 @@
 	},
 	watch: {
 		realTimeWeigh(newV, oldV) {
+			console.log(newV);
 			if (this.weighList.orderType == '澶栭攢' || this.weighList.orderType == '鍐呴攢') {
 				if (this.weighList.skin == 0) {
 					// this.temporaryWeighObj.skin = this.realTimeWeigh;
@@ -137,13 +140,18 @@
 					this.temporaryWeighObj.clean = (this.weighList.hair - this.temporaryWeighObj.skin).toFixed(2);
 				}
 			}
+		},
+		// 鐩戝惉閲嶉噺鍙樺寲
+		globalweigh(v) {
+			this.weighData.weigh = this.realTimeWeigh = v;
 		}
 	},
 	onShow() {
 		this.init();
-		this.initWebSocket();
+		// this.initWebSocket();
 	},
 	computed: {
+		...mapState(['globalweigh', 'globalinfraredStatus']),
 		token() {
 			return uni.getStorageSync('token');
 		},
@@ -167,6 +175,7 @@
 		}
 	},
 	methods: {
+		...mapMutations(['changeweighHouseCode']),
 		init() {
 			// 鑾峰彇绉伴噸淇℃伅
 			this.$reqGet('weighList', { id: this.takeCoalId }).then(res => {
@@ -216,6 +225,8 @@
 							});
 							this.isConfirmWeighLoading = false;
 						}, 1000);
+					} else {
+						this.$u.toast('绉伴噸澶辫触锛岃绋嶅悗閲嶈瘯');
 					}
 				})
 				.catch(err => {
@@ -259,8 +270,6 @@
 			socket.onMessage(res => {
 				console.log('socketWeigh', res);
 				let nowWeighObj = JSON.parse(res.data.slice(7));
-				console.log(nowWeighObj);
-				// 涓�寮�濮嬫槸weighHouseCode
 				if (nowWeighObj.eqCode == this.weighHouseCode) {
 					if (nowWeighObj.eqInfraredStatus) {
 						this.infraredStatus = true;
diff --git a/pages/driver-page/drvier-my/drvier-my.vue b/pages/driver-page/drvier-my/drvier-my.vue
index 464386b..1233de8 100644
--- a/pages/driver-page/drvier-my/drvier-my.vue
+++ b/pages/driver-page/drvier-my/drvier-my.vue
@@ -52,12 +52,13 @@
 				<u-button text="閫�鍑虹櫥褰�" type="primary" @click="logout"></u-button>
 				<u-button text="淇敼涓汉璧勬枡" type="primary" @click="editBtnClick"></u-button>
 			</view>
+			<view class="statistics"><u-button text="鍙戣繍缁熻" type="primary" @click="statistics"></u-button></view>
 		</view>
 
 		<!-- 鍥剧墖棰勮寮瑰嚭妗� -->
 		<view class="previewImage-container">
 			<u-popup :show="previewImageShow" mode="center" @close="previewImageClose" @open="previewImageOpen">
-				<u--image :src="previewImageSrc!=null?BaseUrl + previewImageSrc:''" width="400px" height="400px"></u--image>
+				<u--image :src="previewImageSrc != null ? BaseUrl + previewImageSrc : ''" width="400px" height="400px"></u--image>
 			</u-popup>
 		</view>
 
@@ -258,12 +259,22 @@
 		},
 		logoutCancel() {
 			this.logoutShow = false;
+		},
+		// 璺宠浆鍙戣繍缁熻椤甸潰
+		statistics() {
+			uni.navigateTo({
+				url: '/pages/customer-page/customer-my/faYunstatistics/faYunstatistics'
+			});
 		}
 	}
 };
 </script>
 
 <style lang="scss" scoped>
+.statistics {
+	margin-top: vww(10);
+	margin-bottom: vww(10);
+}
 ::v-deep.driver-my {
 	width: 90%;
 	margin: 0 auto;
diff --git a/pages/freight-forwarder-page/freightForwarder-index/freightForwarder-index.vue b/pages/freight-forwarder-page/freightForwarder-index/freightForwarder-index.vue
index 8537405..9e48a5c 100644
--- a/pages/freight-forwarder-page/freightForwarder-index/freightForwarder-index.vue
+++ b/pages/freight-forwarder-page/freightForwarder-index/freightForwarder-index.vue
@@ -8,9 +8,7 @@
 						<text>{{ item.carNum }}</text>
 						寮�
 					</view>
-					<view class="card-left__utils">
-						<u-button text="杞彂" type="primary" @tap.stop="forwardClick(item)" shape="circle" v-if="item.carNumSurplusHuodai !== 0"></u-button>
-					</view>
+					<view class="card-left__utils"><u-button text="杞彂" type="primary" @tap.stop="forwardClick(item)" shape="circle"></u-button></view>
 				</template>
 				<template v-slot:right-top>
 					<view class="right-top">
diff --git a/pages/freight-forwarder-page/freightForwarder-my/freightForwarder-my.vue b/pages/freight-forwarder-page/freightForwarder-my/freightForwarder-my.vue
index 8db9103..01a7f7b 100644
--- a/pages/freight-forwarder-page/freightForwarder-my/freightForwarder-my.vue
+++ b/pages/freight-forwarder-page/freightForwarder-my/freightForwarder-my.vue
@@ -34,7 +34,10 @@
 				<view class="addCarButton"><u-button text="娣诲姞" type="primary" @click="addNewGroupClick"></u-button></view>
 			</u-popup>
 		</view>
+
+		<view class="statistics"><u-button text="鍙戣繍缁熻" type="primary" @click="statistics"></u-button></view>
 		<view class="utils"><u-button text="閫�鍑虹櫥褰�" type="primary" @click="logout"></u-button></view>
+
 		<!-- 鍒犻櫎杞﹂槦妯℃�佹 -->
 		<view class="deleteFleetModal">
 			<u-modal
@@ -167,12 +170,22 @@
 		},
 		logoutCancel() {
 			this.logoutShow = false;
+		},
+		// 璺宠浆鍙戣繍缁熻椤甸潰
+		statistics() {
+			uni.navigateTo({
+				url: '/pages/customer-page/customer-my/faYunstatistics/faYunstatistics'
+			});
 		}
 	}
 };
 </script>
 
 <style lang="scss" scoped>
+.statistics {
+	margin-top: vww(10);
+	margin-bottom: vww(10);
+}
 ::v-deep.freightForwarder-my {
 	width: 94%;
 	margin: 0 auto;
diff --git a/pages/public-page/forward/forward.vue b/pages/public-page/forward/forward.vue
index 885473b..57a8e42 100644
--- a/pages/public-page/forward/forward.vue
+++ b/pages/public-page/forward/forward.vue
@@ -54,18 +54,18 @@
 </template>
 
 <script>
-import { customerId } from '@/utils/status'
+import { customerId } from '@/utils/status';
 
 export default {
 	onLoad(params) {
-		console.log(params, '杞彂椤甸潰鐨勫弬鏁�')
+		console.log(params, '杞彂椤甸潰鐨勫弬鏁�');
 		// 瀹㈡埛
-		this.cars2 = Number(params.cars2)
-		this.carNumSurplus1 = Number(params.carNumSurplus1)
+		this.cars2 = Number(params.cars2);
+		this.carNumSurplus1 = Number(params.carNumSurplus1);
 		// 璐т唬
-		this.carNum = Number(params.carNum)
-		this.carNumSurplusHuodai = this.forwardSurplus = Number(params.carNumSurplusHuodai)
-		this.orderPlanId = params.orderPlanId
+		this.carNum = Number(params.carNum);
+		this.carNumSurplusHuodai = this.forwardSurplus = Number(params.carNumSurplusHuodai);
+		this.orderPlanId = params.orderPlanId;
 		this.$reqGet('forwardList', { OrderPlanId: params.orderPlanId }).then(res => {
 			if (res.data.length !== 0 && this.roleType == 1) {
 				this.jhOrderPlanForwardList = res.data.map(item => {
@@ -77,8 +77,8 @@
 						xsUserId: item.xsUserId === null ? 0 : item.xsUserId,
 						fleetId: item.fleetId === null ? 0 : item.fleetId,
 						checkboxValue1: ''
-					}
-				})
+					};
+				});
 			} else if (res.data.length !== 0 && this.roleType == 2) {
 				this.jhOrderPlanForwardList = res.data.map(item => {
 					return {
@@ -89,19 +89,19 @@
 						xsUserId: item.xsUserId === null ? 0 : item.xsUserId,
 						fleetId: item.fleetId === null ? 0 : item.fleetId,
 						checkboxValue1: ''
-					}
-				})
+					};
+				});
 			} else {
 				this.jhOrderPlanForwardList = this.jhOrderPlanForwardList.map(v => {
 					if (!v.orderPlanId) {
 						return {
 							...v,
 							orderPlanId: params.orderPlanId
-						}
+						};
 					}
-				})
+				});
 			}
-		})
+		});
 	},
 	data() {
 		return {
@@ -132,155 +132,161 @@
 			carNum: '',
 			carNumSurplusHuodai: '',
 			formNum: 1
-		}
+		};
 	},
 	onShow() {
-		this.init()
+		this.init();
 		if (this.roleType == 2) {
-			this.list1.splice(1, 1)
-			this.tabHuoDai = false
+			this.list1.splice(1, 1);
+			this.tabHuoDai = false;
 		}
 	},
 	computed: {
 		roleType() {
-			return uni.getStorageSync('roleType')
+			return uni.getStorageSync('roleType');
 		},
 		text() {
-			return `宸查鍙�${this.cars2}寮犳彁鐓ゅ崟,鍓╀綑${this.carNumSurplus1}寮犳彁鐓ゅ崟`
+			return `宸查鍙�${this.cars2}寮犳彁鐓ゅ崟,鍓╀綑${this.carNumSurplus1}寮犳彁鐓ゅ崟`;
 		},
 		text1() {
-			return `宸叉嫢鏈�${this.carNum}寮犳彁鐓ゅ崟,鍓╀綑${this.carNumSurplusHuodai}寮犳彁鐓ゅ崟`
+			return `宸叉嫢鏈�${this.carNum}寮犳彁鐓ゅ崟,鍓╀綑${this.carNumSurplusHuodai}寮犳彁鐓ゅ崟`;
 		}
 	},
 	methods: {
 		init() {
-			console.log('roleType', this.roleType)
+			console.log('roleType', this.roleType);
 			switch (this.roleType) {
 				case 1:
-					this.getAllHuoDaiByCustomerId()
-					this.getFleet()
-					break
+					this.getAllHuoDaiByCustomerId();
+					this.getFleet();
+					break;
 				case 2:
-					this.getFleet()
-					break
+					this.getFleet();
+					break;
 				default:
-					break
+					break;
 			}
 		},
 		allrelay(x, y) {
-			let a = 0
+			let a = 0;
 			if (y != 0) {
-				a = Number(x) + Number(y)
-				return a
+				a = Number(x) + Number(y);
+				return a;
 			} else {
-				return Number(x)
+				return Number(x);
 			}
 		},
 		allrelayto(x, y) {
-			let a = 0
+			let a = 0;
 			if (y != 0) {
-				a = Number(x) - Number(y)
-				return a
+				a = Number(x) - Number(y);
+				return a;
 			} else {
-				return Number(x)
+				return Number(x);
 			}
 		},
 		checkboxChange(value, index) {
-			uni.setStorageSync('allrelay', this.jhOrderPlanForwardList[index].carNum)
+			uni.setStorageSync('allrelay', this.jhOrderPlanForwardList[index].carNum);
 			this.jhOrderPlanForwardList = this.jhOrderPlanForwardList.map((v, i) => {
 				return {
 					...v,
 					ischecked: false
-				}
-			})
+				};
+			});
 			if (value.length != 0) {
-				let tempforwardSurplus = this.forwardSurplus
-				let tempcarNumSurplus1 = this.carNumSurplus1
+				let tempforwardSurplus = this.forwardSurplus;
+				let tempcarNumSurplus1 = this.carNumSurplus1;
 				// 璁$畻鍏ㄩ儴杞彂鏁�
 				// 瀹㈡埛
 				if (this.roleType == 1) {
-					this.jhOrderPlanForwardList[index].carNum = this.allrelay(this.jhOrderPlanForwardList[index].carNum, tempcarNumSurplus1)
+					this.jhOrderPlanForwardList[index].carNum = this.allrelay(this.jhOrderPlanForwardList[index].carNum, tempcarNumSurplus1);
 				}
-				tempcarNumSurplus1 = 0
+				tempcarNumSurplus1 = 0;
 				// 璐т唬
 				if (this.roleType == 2) {
-					this.jhOrderPlanForwardList[index].carNum = this.allrelay(this.jhOrderPlanForwardList[index].carNum, tempforwardSurplus)
+					this.jhOrderPlanForwardList[index].carNum = this.allrelay(this.jhOrderPlanForwardList[index].carNum, tempforwardSurplus);
 				}
-				tempforwardSurplus = 0
+				tempforwardSurplus = 0;
 				// 閫夋嫨涓�涓悗鍏朵綑绂佹澶嶉��
 				this.jhOrderPlanForwardList.forEach((v, i) => {
 					if (i !== index) {
-						v.ischecked = true
+						v.ischecked = true;
 					}
-				})
+				});
 			} else {
-				let tempforwardSurplus = this.forwardSurplus
-				let tempcarNumSurplus1 = this.carNumSurplus1
+				let tempforwardSurplus = this.forwardSurplus;
+				let tempcarNumSurplus1 = this.carNumSurplus1;
 				// 璐т唬
 				if (this.roleType == 2) {
-					this.jhOrderPlanForwardList[index].carNum = this.allrelayto(this.jhOrderPlanForwardList[index].carNum, this.forwardSurplus)
+					this.jhOrderPlanForwardList[index].carNum = this.allrelayto(this.jhOrderPlanForwardList[index].carNum, this.forwardSurplus);
+					if (this.jhOrderPlanForwardList[index].carNum <= 0) {
+						this.jhOrderPlanForwardList[index].carNum = 0;
+					}
 				}
 				// 瀹㈡埛
 				if (this.roleType == 1) {
-					this.jhOrderPlanForwardList[index].carNum = this.allrelayto(this.jhOrderPlanForwardList[index].carNum, this.carNumSurplus1)
+					this.jhOrderPlanForwardList[index].carNum = this.allrelayto(this.jhOrderPlanForwardList[index].carNum, this.carNumSurplus1);
+					if (this.jhOrderPlanForwardList[index].carNum <= 0) {
+						this.jhOrderPlanForwardList[index].carNum = 0;
+					}
 				}
 			}
 		},
 		// 鑾峰彇璐т唬鍒楄〃
 		getAllHuoDaiByCustomerId() {
 			this.$reqGet('getAllHuoDaiByCustomerId').then(res => {
-				this.huoDaiData = res.data
-			})
+				this.huoDaiData = res.data;
+			});
 		},
 		// 鑾峰彇杞﹂槦鍒楄〃
 		getFleet() {
 			this.$reqGet('getFleet').then(res => {
-				this.fleetData = res.data
-			})
+				this.fleetData = res.data;
+			});
 		},
 		// 杞彂
 		forwardObjectClick(index) {
-			this.selectPopupShow = true
-			this.index = index
+			this.selectPopupShow = true;
+			this.index = index;
 		},
 		selectPopupClose() {
-			this.selectPopupShow = false
+			this.selectPopupShow = false;
 		},
 		selectPopupOpen() {},
 		// 杞彂閫夋嫨璐т唬
 		forwardHuoDaiObjectSelect(item, index) {
 			this.$nextTick(() => {
-				let isableAdd = this.jhOrderPlanForwardList.filter(v => item.name === v.name)
+				let isableAdd = this.jhOrderPlanForwardList.filter(v => item.name === v.name);
 				if (isableAdd.length > 0) {
-					this.$u.toast('瀛樺湪閲嶅娣诲姞')
-					this.selectPopupShow = true
+					this.$u.toast('瀛樺湪閲嶅娣诲姞');
+					this.selectPopupShow = true;
 				} else {
-					this.selectPopupShow = false
-					this.jhOrderPlanForwardList[this.index].xsUserId = item.userId
-					this.jhOrderPlanForwardList[this.index].name = item.name
-					this.jhOrderPlanForwardList[this.index].fleetId = 0
+					this.selectPopupShow = false;
+					this.jhOrderPlanForwardList[this.index].xsUserId = item.userId;
+					this.jhOrderPlanForwardList[this.index].name = item.name;
+					this.jhOrderPlanForwardList[this.index].fleetId = 0;
 				}
-			})
+			});
 		},
 		// 杞彂閫夋嫨杞﹂槦
 		forwardFleetObjectSelect(item, index) {
 			this.$nextTick(() => {
-				let isableAdd = this.jhOrderPlanForwardList.filter(v => item.name === v.name)
+				let isableAdd = this.jhOrderPlanForwardList.filter(v => item.name === v.name);
 				if (isableAdd.length > 0) {
-					this.$u.toast('瀛樺湪閲嶅娣诲姞')
-					this.selectPopupShow = true
+					this.$u.toast('瀛樺湪閲嶅娣诲姞');
+					this.selectPopupShow = true;
 				} else {
-					this.selectPopupShow = false
-					this.jhOrderPlanForwardList[this.index].fleetId = item.id
-					this.jhOrderPlanForwardList[this.index].name = item.name
-					this.jhOrderPlanForwardList[this.index].xsUserId = 0
+					this.selectPopupShow = false;
+					this.jhOrderPlanForwardList[this.index].fleetId = item.id;
+					this.jhOrderPlanForwardList[this.index].name = item.name;
+					this.jhOrderPlanForwardList[this.index].xsUserId = 0;
 				}
-			})
+			});
 		},
 		// 娣诲姞涓�缁勮〃鍗�
 		addForm() {
 			// 鍒ゆ柇鏄惁鏈変竴涓閫夛紝濡傛灉鏈夊垯绂佹鏂板姞鐨勫閫夛紝娌℃湁鍒欎笉绂佹
-			let ischeck = this.jhOrderPlanForwardList.some(v => v.ischecked == true)
+			let ischeck = this.jhOrderPlanForwardList.some(v => v.ischecked == true);
 			if (!ischeck) {
 				this.jhOrderPlanForwardList.push({
 					orderPlanId: this.orderPlanId,
@@ -290,7 +296,7 @@
 					fleetId: 0,
 					checkboxValue1: '',
 					ischecked: false
-				})
+				});
 			} else {
 				this.jhOrderPlanForwardList.push({
 					orderPlanId: this.orderPlanId,
@@ -300,37 +306,37 @@
 					fleetId: 0,
 					checkboxValue1: '',
 					ischecked: true
-				})
+				});
 			}
 		},
 		// 鍒犻櫎涓�缁勮〃鍗�
 		deleteGroup(index, v) {
-			let tempcarNum = v.carNum
+			let tempcarNum = v.carNum;
 			if (v.id && this.jhOrderPlanForwardList[index].carNum !== tempcarNum) {
 				this.$reqPost('deleteForward', { id: v.id }, 'params').then(res => {
 					if (res.code === 0) {
-						this.jhOrderPlanForwardList.splice(index, 1)
-						this.$u.toast('鍒犻櫎鎴愬姛')
+						this.jhOrderPlanForwardList.splice(index, 1);
+						this.$u.toast('鍒犻櫎鎴愬姛');
 					} else if (res.code === 1) {
-						this.$u.toast(res.msg)
+						this.$u.toast(res.msg);
 					}
-				})
+				});
 			} else {
-				this.jhOrderPlanForwardList.splice(index, 1)
-				this.$u.toast('鍒犻櫎鎴愬姛')
+				this.jhOrderPlanForwardList.splice(index, 1);
+				this.$u.toast('鍒犻櫎鎴愬姛');
 			}
 		},
 		// 鎻愪氦
 		submitForm() {
-			let isPass = false
+			let isPass = false;
 			if (this.jhOrderPlanForwardList.length === 0) {
-				this.$u.toast('璇疯嚦灏戦�夋嫨涓�缁勮浆鍙戝璞�')
+				this.$u.toast('璇疯嚦灏戦�夋嫨涓�缁勮浆鍙戝璞�');
 			}
 			this.jhOrderPlanForwardList.forEach(v => {
 				if (isNaN(Number(v.carNum)) || Number(v.carNum) <= 0) {
-					this.$u.toast('璇疯緭鍏ュ悎娉曟暟瀛�')
-					isPass = false
-					return isPass
+					this.$u.toast('璇疯緭鍏ュ悎娉曟暟瀛�');
+					isPass = false;
+					return isPass;
 				}
 				// else if (Number(v.carNum) > Number(this.forwardSurplus)) {
 				// 	this.$u.toast('瓒呰繃鏈�澶ц鍗曞墿浣欓噺');
@@ -338,33 +344,33 @@
 				// 	return isPass;
 				// }
 				else {
-					isPass = true
-					return isPass
+					isPass = true;
+					return isPass;
 				}
-			})
+			});
 			if (isPass) {
 				this.$reqPost('forward', this.jhOrderPlanForwardList, 'json').then(res => {
-					console.log(res, 'zh')
+					console.log(res, 'zh');
 					if (res.code == 0) {
-						this.$u.toast('鎻愪氦鎴愬姛')
+						this.$u.toast('鎻愪氦鎴愬姛');
 						setTimeout(() => {
-							uni.navigateBack({ delta: 1 })
-						}, 1000)
+							uni.navigateBack({ delta: 1 });
+						}, 1000);
 					} else {
-						this.$u.toast(res.msg)
+						this.$u.toast(res.msg);
 					}
-				})
+				});
 			}
 		},
 		tabClick(item) {
 			if (item.name == '璐т唬') {
-				this.tabHuoDai = true
+				this.tabHuoDai = true;
 			} else {
-				this.tabHuoDai = false
+				this.tabHuoDai = false;
 			}
 		}
 	}
-}
+};
 </script>
 
 <style lang="scss" scoped>
diff --git a/pages/public-page/message/message.vue b/pages/public-page/message/message.vue
index 710e11d..e84b822 100644
--- a/pages/public-page/message/message.vue
+++ b/pages/public-page/message/message.vue
@@ -1,11 +1,11 @@
 <template>
 	<view class="message-body">
 		<u-empty mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png" v-if="messageList.length == 0" width="400" height="400" textSize="18"></u-empty>
-		<u-list @scrolltolower="scrolltolower" :height="1400">
+		<u-list @scroll="scrolltolower" :height="1400">
 			<u-list-item>
 				<u-swipe-action>
 					<u-swipe-action-item :options="options1" v-for="(item, index) in messageList" :key="item.id" @click="deleteMsg(item, index)">
-						<u-badge :isDot="true" type="error" v-if="item.status === 0"></u-badge>
+						<u-badge :isDot="true" type="error" v-if="item.status !== 1"></u-badge>
 						<u-cell size="large" :title="item.title" :label="item.content" @click="messageDetails(item, index)">
 							<view class="prepose" slot="icon"><u-icon name="file-text" color="#a299a0" size="80"></u-icon></view>
 						</u-cell>
@@ -41,6 +41,10 @@
 	onShow() {
 		this.messageReq();
 	},
+	onHide() {
+		this.messageList = [];
+		this.pageNum = 1;
+	},
 	methods: {
 		// 瑙﹀簳鍔犺浇
 		scrolltolower() {
@@ -73,21 +77,13 @@
 				this.$reqAllJson('readMessage', { id: value.id, status: value.status }, { method: 'PUT', 'Content-Type': 'application/json' }).then(res => {
 					if (res.code == 0) {
 						uni.navigateTo({
-							url: `/pages/public-page/messageDetails/messageDetails?index=${index}`
+							url: `/pages/public-page/messageDetails/messageDetails?messageId=${value.messageId}&id=${value.id}`
 						});
-						// uni.showLoading({
-						// 	title: '鍔犺浇涓�'
-						// });
-						// this.$reqGet('getMessageByUser', { current: 1, size: this.pageSize }).then(res => {
-						// 	uni.hideLoading();
-						// 	this.total = res.data.total;
-						// 	this.messageList = res.data.records;
-						// });
 					}
 				});
 			} else {
 				uni.navigateTo({
-					url: `/pages/public-page/messageDetails/messageDetails?index=${index}`
+					url: `/pages/public-page/messageDetails/messageDetails?messageId=${value.messageId}&id=${value.id}`
 				});
 			}
 		},
diff --git a/pages/public-page/messageDetails/messageDetails.vue b/pages/public-page/messageDetails/messageDetails.vue
index 87b45f4..cca0914 100644
--- a/pages/public-page/messageDetails/messageDetails.vue
+++ b/pages/public-page/messageDetails/messageDetails.vue
@@ -1,19 +1,19 @@
 <template>
 	<view>
 		<combined-title title="娑堟伅璇︽儏"></combined-title>
-		<view class="compDetails" v-for="(item, index) in detail" :key="index">
+		<view class="compDetails">
 			<uni-table border stripe emptyText="鏆傛棤鏇村鏁版嵁">
 				<uni-tr>
 					<uni-th align="left">娑堟伅鏍囬</uni-th>
-					<uni-td align="left">{{ item.title || '' }}</uni-td>
+					<uni-td align="left">{{ detail.title || '' }}</uni-td>
 				</uni-tr>
 				<uni-tr>
 					<uni-th align="left">娑堟伅鍐呭</uni-th>
-					<uni-td align="left">{{ item.content || '' }}</uni-td>
+					<uni-td align="left">{{ detail.content || '' }}</uni-td>
 				</uni-tr>
 				<uni-tr>
 					<uni-th align="left">鍒涘缓鏃堕棿</uni-th>
-					<uni-td align="left">{{ item.createTime || '' }}</uni-td>
+					<uni-td align="left">{{ detail.createTime || '' }}</uni-td>
 				</uni-tr>
 			</uni-table>
 		</view>
@@ -25,27 +25,22 @@
 	data() {
 		return {
 			index: '',
-			detail: []
+			detail: {},
+			messageId: '',
+			id: ''
 		};
 	},
 	onLoad(v) {
-		this.index = v.index;
+		this.messageId = v.messageId;
+		this.id = v.id;
 	},
 	onShow() {
-		this.messageReq();
+		this.getDetail();
 	},
 	methods: {
-		messageReq() {
-			uni.showLoading({
-				title: '鍔犺浇涓�'
-			});
-			this.$reqGet('getMessageByUser', { current: 1, size: 10 }).then(res => {
-				if (res.code == 0) {
-					uni.hideLoading();
-					this.detail = res.data.records.filter((v, i) => i == this.index);
-				} else {
-					this.$u.toast('鍔犺浇澶辫触');
-				}
+		getDetail() {
+			this.$reqGet('getMsgDetail', { messageId: this.messageId, id: this.id }).then(res => {
+				this.detail = res.data;
 			});
 		}
 	}
diff --git a/pages/tabbar-page/index-tabbar/index-tabbar.vue b/pages/tabbar-page/index-tabbar/index-tabbar.vue
index e2db085..a42f5ec 100644
--- a/pages/tabbar-page/index-tabbar/index-tabbar.vue
+++ b/pages/tabbar-page/index-tabbar/index-tabbar.vue
@@ -12,6 +12,8 @@
 		></freight-forwarder-index>
 		<driver-index v-if="roleType == 3" ref="driverIndexRef" :indexdriverBillOfLoadingData="indexdriverBillOfLoadingData"></driver-index>
 		<tab-bar :current="0"></tab-bar>
+		<!-- 鎺ㄩ�佹秷鎭脊绐� -->
+		<u-modal :show="messagePushShow" :title="messageList.title" :content="messageList.content" @confirm="messageconfirm"></u-modal>
 	</view>
 </template>
 
@@ -19,12 +21,17 @@
 import customerIndex from '@/pages/customer-page/customer-index/customer-index.vue';
 import driverIndex from '@/pages/driver-page/driver-index/driver-index.vue';
 import freightForwarderIndex from '@/pages/freight-forwarder-page/freightForwarder-index/freightForwarder-index.vue';
-import { mapState } from 'vuex';
+import { mapState, mapMutations } from 'vuex';
+import { webSocketUrl } from '@/api/request.js';
+let socket = null;
 export default {
 	components: {
 		customerIndex,
 		driverIndex,
 		freightForwarderIndex
+	},
+	computed: {
+		...mapState(['globalweighHouseCode', 'globalweigh'])
 	},
 	//棣栭〉涓嬫媺鍒锋柊
 	onPullDownRefresh() {
@@ -46,6 +53,7 @@
 			this.$reqGet('GetOrderPlan').then(res => {
 				if (res.data) {
 					this.orderPlanDataStore = res.data;
+					this.$u.toast('鍔犺浇鎴愬姛');
 					uni.hideLoading();
 					uni.stopPullDownRefresh();
 				} else {
@@ -56,6 +64,7 @@
 			this.$reqGet('huoDaiList').then(res => {
 				if (res.data) {
 					this.indexHuoDaiOrderPlanData = res.data;
+					this.$u.toast('鍔犺浇鎴愬姛');
 					uni.hideLoading();
 					uni.stopPullDownRefresh();
 				} else {
@@ -64,7 +73,6 @@
 			});
 		} else if (this.roleType == 3) {
 			this.$reqGet('qiangDanList').then(res => {
-				console.log(res, '鍒锋柊涔嬪悗鐨勬暟鎹�');
 				if (res.code == 0) {
 					this.indexdriverBillOfLoadingData = res.data;
 					this.$u.toast('鍔犺浇鎴愬姛');
@@ -101,14 +109,27 @@
 			orderPlanDataStore: [],
 			indexHuoDaiOrderPlanData: [],
 			indexHistoryCoalData: [],
-			indexdriverBillOfLoadingData: {}
+			indexdriverBillOfLoadingData: {},
+			messagePushShow: false,
+			messageList: {},
+			isconnect: false
 		};
+	},
+	beforeDestroy() {
+		this.closeSocket();
 	},
 	onShow() {
 		this.init();
+		if (!this.isconnect) {
+			this.initWebsocket();
+		}
 		this.userAuthorization();
 	},
+	onBackPress() {
+		this.closeSocket();
+	},
 	methods: {
+		...mapMutations(['pushMessage', 'changeWeigh', 'changeinfraredStatus']),
 		messagePage() {
 			uni.navigateTo({
 				url: '/pages/public-page/message/message'
@@ -175,6 +196,64 @@
 					console.log('鑾峰彇澶辫触');
 				}
 			});
+		},
+		// 鍒濆鍖杦ebsocket
+		initWebsocket() {
+			let wsUrl = `${webSocketUrl}?access_token=${uni.getStorageSync('token')}`;
+			socket = uni.connectSocket({
+				url: wsUrl,
+				header: {
+					CLIENT_TOC: 'Y'
+				},
+				complete: res => {
+					console.log(res, 'socket缁撴灉');
+					if (res.errMsg == 'connectSocket:ok') {
+						this.isconnect = true;
+					}
+				}
+			});
+			socket.onOpen(() => {
+				console.log('onOpen');
+			});
+			// 鑾峰彇鏈嶅姟鍣ㄤ紶鏉ョ殑鏁版嵁锛屽仛鐩稿簲澶勭悊
+			socket.onMessage(res => {
+				console.log('socketWeigh', res);
+				if (res.data.startsWith('weigh')) {
+					let nowWeighObj = JSON.parse(res.data.slice(7));
+					if (this.globalweighHouseCode && nowWeighObj.eqCode == this.globalweighHouseCode) {
+						if (nowWeighObj.eqInfraredStatus) {
+							this.changeinfraredStatus(true);
+							this.changeWeigh(nowWeighObj.weigh);
+						} else {
+							this.changeinfraredStatus(false);
+							this.changeWeigh(nowWeighObj.weigh);
+						}
+					}
+				} else {
+					this.messageList = JSON.parse(res.data.slice(5));
+					this.messagePushShow = true;
+				}
+			});
+			socket.onClose(() => {
+				console.log('webSocketClose');
+			});
+			socket.onError(err => {
+				console.log('socket鎶ラ敊', err);
+				this.$u.toast('鍑虹幇閿欒锛岃閲嶆柊杩涘叆璇ラ〉闈紝閲嶈瘯锛侊紒');
+			});
+		},
+		closeSocket() {
+			socket.close({
+				success(res) {
+					console.log('鍏抽棴鎴愬姛', res);
+				},
+				fail(err) {
+					console.log('鍏抽棴澶辫触', err);
+				}
+			});
+		},
+		messageconfirm() {
+			this.messagePushShow = false;
 		}
 	}
 };
diff --git a/store/index.js b/store/index.js
index ebd4104..1321749 100644
--- a/store/index.js
+++ b/store/index.js
@@ -5,29 +5,29 @@
 // 鍔ㄦ�佸簳閮╰abbar
 const userRoleTabbar = {
 	first: [{
-			pagePath: "pages/tabbar-page/index-tabbar/index-tabbar",
-			iconPath: "../../static/tabBar-icon/Gfayun.png",
-			selectedIconPath: "../../static/tabBar-icon/Bfayun1.png",
-			text: "棣栭〉"
+			pagePath: 'pages/tabbar-page/index-tabbar/index-tabbar',
+			iconPath: '../../static/tabBar-icon/Gfayun.png',
+			selectedIconPath: '../../static/tabBar-icon/Bfayun1.png',
+			text: '棣栭〉'
 		},
 		{
-			pagePath: "pages/tabbar-page/myPage-tabbar/myPage-tabbar",
-			iconPath: "../../static/tabBar-icon/Gmine10.png",
-			selectedIconPath: "../../static/tabBar-icon/Bmine57.png",
-			text: "鎴戠殑"
+			pagePath: 'pages/tabbar-page/myPage-tabbar/myPage-tabbar',
+			iconPath: '../../static/tabBar-icon/Gmine10.png',
+			selectedIconPath: '../../static/tabBar-icon/Bmine57.png',
+			text: '鎴戠殑'
 		}
 	],
 	second: [{
-			pagePath: "pages/tabbar-page/index-tabbar/index-tabbar",
-			iconPath: "../../static/tabBar-icon/Ghome.png",
-			selectedIconPath: "../../static/tabBar-icon/Bhome.png",
-			text: "棣栭〉"
+			pagePath: 'pages/tabbar-page/index-tabbar/index-tabbar',
+			iconPath: '../../static/tabBar-icon/Ghome.png',
+			selectedIconPath: '../../static/tabBar-icon/Bhome.png',
+			text: '棣栭〉'
 		},
 		{
-			pagePath: "pages/tabbar-page/myPage-tabbar/myPage-tabbar",
-			iconPath: "../../static/tabBar-icon/Gmine10.png",
-			selectedIconPath: "../../static/tabBar-icon/Bmine57.png",
-			text: "鎴戠殑"
+			pagePath: 'pages/tabbar-page/myPage-tabbar/myPage-tabbar',
+			iconPath: '../../static/tabBar-icon/Gmine10.png',
+			selectedIconPath: '../../static/tabBar-icon/Bmine57.png',
+			text: '鎴戠殑'
 		}
 	]
 }
@@ -37,7 +37,14 @@
 		userInfo: {},
 		roleType: null, // 1瀹㈡埛锛�2璐т唬锛�3鍙告満
 		userTabbar: [], // 鐢ㄦ埛鎵�鍦ㄨ鑹插簳閮ㄨ彍鍗曪紝
-		fleetDriverDataLength: 0
+		// 绉伴噸鏃剁殑閲嶉噺
+		globalweigh: 0,
+		// 娑堟伅鎺ㄩ��
+		globalmessage: '',
+		// 鍏ㄥ眬weihousecode
+		globalweighHouseCode: '',
+		// 鍏ㄥ眬绾㈠鐘舵��
+		globalinfraredStatus: false
 	},
 	mutations: {
 		lengthchange(state, payload) {
@@ -56,8 +63,24 @@
 				state.userTabbar = userRoleTabbar.second
 				uni.setStorageSync('userTabbar', state.userTabbar)
 			}
-
-
+		},
+		// 鏀瑰彉閲嶉噺
+		changeWeigh(state, payload) {
+			state.globalweigh = payload
+			console.log(state.globalweigh, '閲嶉噺鏀瑰彉浜�')
+		},
+		// 娑堟伅鎺ㄩ��
+		pushMessage(state, payload) {
+			state.globalmessage = payload
+		},
+		// 鏀瑰彉weighHouseCode
+		changeweighHouseCode(state, payload) {
+			state.globalweighHouseCode = payload
+			console.log(state.globalweighHouseCode, 'globalweighHouseCode鏀瑰彉浜�')
+		},
+		// 鏀瑰彉绾㈠鐘舵��
+		changeinfraredStatus(state, payload) {
+			state.globalinfraredStatus = payload
 		}
 	}
 })
diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md
new file mode 100644
index 0000000..f291eec
--- /dev/null
+++ b/uni_modules/uni-calendar/changelog.md
@@ -0,0 +1,26 @@
+## 1.4.10锛�2023-04-10锛�
+- 淇 鏌愪簺鎯呭喌 monthSwitch 鏈Е鍙戠殑Bug
+## 1.4.9锛�2023-02-02锛�
+- 淇 鏌愪簺鎯呭喌鍒囨崲鏈堜唤閿欒鐨凚ug
+## 1.4.8锛�2023-01-30锛�
+- 淇 鏌愪簺鎯呭喌鍒囨崲鏈堜唤閿欒鐨凚ug [璇︽儏](https://ask.dcloud.net.cn/question/161964)
+## 1.4.7锛�2022-09-16锛�
+- 浼樺寲 鏀寔浣跨敤 uni-scss 鎺у埗涓婚鑹�
+## 1.4.6锛�2022-09-08锛�
+- 淇 琛ㄥご骞存湀鍒囨崲锛屽鑷存敼鍙樺綋鍓嶆棩鏈熶负閫夋嫨鏈�1鍙凤紝涓旀湭瑙﹀彂change浜嬩欢鐨凚ug
+## 1.4.5锛�2022-02-25锛�
+- 淇 鏉′欢缂栬瘧 nvue 涓嶆敮鎸佺殑 css 鏍峰紡鐨凚ug
+## 1.4.4锛�2022-02-25锛�
+- 淇 鏉′欢缂栬瘧 nvue 涓嶆敮鎸佺殑 css 鏍峰紡鐨凚ug
+## 1.4.3锛�2021-09-22锛�
+- 淇 startDate銆� endDate 灞炴�уけ鏁堢殑Bug
+## 1.4.2锛�2021-08-24锛�
+- 鏂板 鏀寔鍥介檯鍖�
+## 1.4.1锛�2021-08-05锛�
+- 淇 寮瑰嚭灞傝 tabbar 閬洊鐨凚ug
+## 1.4.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.3.16锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.3.15锛�2021-02-04锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
diff --git a/uni_modules/uni-calendar/components/uni-calendar/calendar.js b/uni_modules/uni-calendar/components/uni-calendar/calendar.js
new file mode 100644
index 0000000..b8d7d6f
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/calendar.js
@@ -0,0 +1,546 @@
+/**
+* @1900-2100鍖洪棿鍐呯殑鍏巻銆佸啘鍘嗕簰杞�
+* @charset UTF-8
+* @github  https://github.com/jjonline/calendar.js
+* @Author  Jea鏉�(JJonline@JJonline.Cn)
+* @Time    2014-7-21
+* @Time    2016-8-13 Fixed 2033hex銆丄ttribution 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]
+*/
+/* eslint-disable */
+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, 0x06e95, 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
+    0x0a2e0, 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'],
+
+  /**
+      * 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; var sum = 348
+    for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
+    return (sum + this.leapDays(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涓洪棸鏈堟椂鐨勫ぉ鏁拌浣跨敤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骞磎鏈堢殑澶╂暟
+      * @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)锛沶浜屽崄鍥涜妭姘斾腑鐨勭鍑犱釜鑺傛皵(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
+        break
+      case 30:
+        s = '\u4e09\u5341'; break
+        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]
+  },
+
+  /**
+      * 浼犲叆闃冲巻骞存湀鏃ヨ幏寰楄缁嗙殑鍏巻銆佸啘鍘唎bject淇℃伅 <=>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
+    // 骞翠唤闄愬畾銆佷笂闄�
+    if (y < 1900 || y > 2100) {
+      return -1// undefined杞崲涓烘暟瀛楀彉涓篘aN
+    }
+    // 鍏巻浼犲弬鏈�涓嬮檺
+    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; var leap = 0; var temp = 0
+    // 淇ymd鍙傛暟
+    var y = objDate.getFullYear()
+    var m = objDate.getMonth() + 1
+    var 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()
+    var isToday = false
+    if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+      isToday = true
+    }
+    // 鏄熸湡鍑�
+    var nWeek = objDate.getDay()
+    var 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)// 璁$畻鍐滃巻鏅�氭湀澶╂暟
+      }
+      // 瑙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)
+
+    return { '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 }
+  },
+
+  /**
+      * 浼犲叆鍐滃巻骞存湀鏃ヤ互鍙婁紶鍏ョ殑鏈堜唤鏄惁闂版湀鑾峰緱璇︾粏鐨勫叕鍘嗐�佸啘鍘唎bject淇℃伅 <=>JSON
+      * @param y  lunar year
+      * @param m  lunar month
+      * @param d  lunar day
+      * @param isLeapMonth  lunar month is leap or not.[濡傛灉鏄啘鍘嗛棸鏈堢鍥涗釜鍙傛暟璧嬪�紅rue鍗冲彲]
+      * @return JSON object
+      * @eg:console.log(calendar.lunar2solar(1987,9,10));
+      */
+  lunar2solar: function (y, m, d, isLeapMonth) { // 鍙傛暟鍖洪棿1900.1.31~2100.12.1
+    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; var 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
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json
new file mode 100644
index 0000000..fcbd13c
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json
@@ -0,0 +1,12 @@
+{
+	"uni-calender.ok": "ok",
+	"uni-calender.cancel": "cancel",
+	"uni-calender.today": "today",
+	"uni-calender.MON": "MON",
+	"uni-calender.TUE": "TUE",
+	"uni-calender.WED": "WED",
+	"uni-calender.THU": "THU",
+	"uni-calender.FRI": "FRI",
+	"uni-calender.SAT": "SAT",
+	"uni-calender.SUN": "SUN"
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json
new file mode 100644
index 0000000..1ca43de
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json
@@ -0,0 +1,12 @@
+{
+	"uni-calender.ok": "纭畾",
+	"uni-calender.cancel": "鍙栨秷",
+	"uni-calender.today": "浠婃棩",
+	"uni-calender.SUN": "鏃�",
+	"uni-calender.MON": "涓�",
+	"uni-calender.TUE": "浜�",
+	"uni-calender.WED": "涓�",
+	"uni-calender.THU": "鍥�",
+	"uni-calender.FRI": "浜�",
+	"uni-calender.SAT": "鍏�"
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json
new file mode 100644
index 0000000..e0fe33b
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json
@@ -0,0 +1,12 @@
+{
+	"uni-calender.ok": "纰哄畾",
+	"uni-calender.cancel": "鍙栨秷",
+	"uni-calender.today": "浠婃棩",
+	"uni-calender.SUN": "鏃�",
+	"uni-calender.MON": "涓�",
+	"uni-calender.TUE": "浜�",
+	"uni-calender.WED": "涓�",
+	"uni-calender.THU": "鍥�",
+	"uni-calender.FRI": "浜�",
+	"uni-calender.SAT": "鍏�"
+}
diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue
new file mode 100644
index 0000000..a54135e
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue
@@ -0,0 +1,187 @@
+<template>
+	<view class="uni-calendar-item__weeks-box" :class="{
+		'uni-calendar-item--disable':weeks.disable,
+		'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+		'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
+		'uni-calendar-item--before-checked':weeks.beforeMultiple,
+		'uni-calendar-item--multiple': weeks.multiple,
+		'uni-calendar-item--after-checked':weeks.afterMultiple,
+		}"
+	 @click="choiceDate(weeks)">
+		<view class="uni-calendar-item__weeks-box-item">
+			<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
+			<text class="uni-calendar-item__weeks-box-text" :class="{
+				'uni-calendar-item--isDay-text': weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.date}}</text>
+			<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				}">{{todayText}}</text>
+			<text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.isDay ? todayText : (weeks.lunar.IDayCn === '鍒濅竴'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
+			<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--extra':weeks.extraInfo.info,
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.extraInfo.info}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { initVueI18n } from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	const {	t	} = initVueI18n(i18nMessages)
+
+	export default {
+		emits:['change'],
+		props: {
+			weeks: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			calendar: {
+				type: Object,
+				default: () => {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			lunar: {
+				type: Boolean,
+				default: false
+			}
+		},
+		computed: {
+			todayText() {
+				return t("uni-calender.today")
+			},
+		},
+		methods: {
+			choiceDate(weeks) {
+				this.$emit('change', weeks)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	$uni-font-size-base:14px;
+	$uni-text-color:#333;
+	$uni-font-size-sm:12px;
+	$uni-color-error: #e43d33;
+	$uni-opacity-disabled: 0.3;
+	$uni-text-color-disable:#c0c0c0;
+	$uni-primary: #2979ff !default;
+	.uni-calendar-item__weeks-box {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-calendar-item__weeks-box-text {
+		font-size: $uni-font-size-base;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar-item__weeks-lunar-text {
+		font-size: $uni-font-size-sm;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar-item__weeks-box-item {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 100rpx;
+		height: 100rpx;
+	}
+
+	.uni-calendar-item__weeks-box-circle {
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		width: 8px;
+		height: 8px;
+		border-radius: 8px;
+		background-color: $uni-color-error;
+
+	}
+
+	.uni-calendar-item--disable {
+		background-color: rgba(249, 249, 249, $uni-opacity-disabled);
+		color: $uni-text-color-disable;
+	}
+
+	.uni-calendar-item--isDay-text {
+		color: $uni-primary;
+	}
+
+	.uni-calendar-item--isDay {
+		background-color: $uni-primary;
+		opacity: 0.8;
+		color: #fff;
+	}
+
+	.uni-calendar-item--extra {
+		color: $uni-color-error;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item--checked {
+		background-color: $uni-primary;
+		color: #fff;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item--multiple {
+		background-color: $uni-primary;
+		color: #fff;
+		opacity: 0.8;
+	}
+	.uni-calendar-item--before-checked {
+		background-color: #ff5a5f;
+		color: #fff;
+	}
+	.uni-calendar-item--after-checked {
+		background-color: #ff5a5f;
+		color: #fff;
+	}
+</style>
diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
new file mode 100644
index 0000000..17c958d
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
@@ -0,0 +1,566 @@
+<template>
+	<view class="uni-calendar">
+		<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view>
+		<view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
+			<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
+				<view class="uni-calendar__header-btn-box" @click="close">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width">{{cancelText}}</text>
+				</view>
+				<view class="uni-calendar__header-btn-box" @click="confirm">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width">{{okText}}</text>
+				</view>
+			</view>
+			<view class="uni-calendar__header">
+				<view class="uni-calendar__header-btn-box" @click.stop="pre">
+					<view class="uni-calendar__header-btn uni-calendar--left"></view>
+				</view>
+				<picker mode="date" :value="date" fields="month" @change="bindDateChange">
+					<text class="uni-calendar__header-text">{{ (nowDate.year||'') +' / '+( nowDate.month||'')}}</text>
+				</picker>
+				<view class="uni-calendar__header-btn-box" @click.stop="next">
+					<view class="uni-calendar__header-btn uni-calendar--right"></view>
+				</view>
+				<text class="uni-calendar__backtoday" @click="backToday">{{todayText}}</text>
+
+			</view>
+			<view class="uni-calendar__box">
+				<view v-if="showMonth" class="uni-calendar__box-bg">
+					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
+				</view>
+				<view class="uni-calendar__weeks">
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SUNText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{monText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{TUEText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{WEDText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{THUText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{FRIText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SATText}}</text>
+					</view>
+				</view>
+				<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
+					<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
+						<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Calendar from './util.js';
+	import CalendarItem from './uni-calendar-item.vue'
+
+	import { initVueI18n } from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	const {	t	} = initVueI18n(i18nMessages)
+
+	/**
+	 * Calendar 鏃ュ巻
+	 * @description 鏃ュ巻缁勪欢鍙互鏌ョ湅鏃ユ湡锛岄�夋嫨浠绘剰鑼冨洿鍐呯殑鏃ユ湡锛屾墦鐐规搷浣溿�傚父鐢ㄥ満鏅锛氶厭搴楁棩鏈熼璁€�佺伀杞︽満绁ㄩ�夋嫨璐拱鏃ユ湡銆佷笂涓嬬彮鎵撳崱绛�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=56
+	 * @property {String} date 鑷畾涔夊綋鍓嶆椂闂达紝榛樿涓轰粖澶�
+	 * @property {Boolean} lunar 鏄剧ず鍐滃巻
+	 * @property {String} startDate 鏃ユ湡閫夋嫨鑼冨洿-寮�濮嬫棩鏈�
+	 * @property {String} endDate 鏃ユ湡閫夋嫨鑼冨洿-缁撴潫鏃ユ湡
+	 * @property {Boolean} range 鑼冨洿閫夋嫨
+	 * @property {Boolean} insert = [true|false] 鎻掑叆妯″紡,榛樿涓篺alse
+	 * 	@value true 寮圭獥妯″紡
+	 * 	@value false 鎻掑叆妯″紡
+	 * @property {Boolean} clearDate = [true|false] 寮圭獥妯″紡鏄惁娓呯┖涓婃閫夋嫨鍐呭
+	 * @property {Array} selected 鎵撶偣锛屾湡寰呮牸寮廩{date: '2019-06-27', info: '绛惧埌', data: { custom: '鑷畾涔変俊鎭�', name: '鑷畾涔夋秷鎭ご',xxx:xxx... }}]
+	 * @property {Boolean} showMonth 鏄惁閫夋嫨鏈堜唤涓鸿儗鏅�
+	 * @event {Function} change 鏃ユ湡鏀瑰彉锛宍insert :ture` 鏃剁敓鏁�
+	 * @event {Function} confirm 纭閫夋嫨`insert :false` 鏃剁敓鏁�
+	 * @event {Function} monthSwitch 鍒囨崲鏈堜唤鏃惰Е鍙�
+	 * @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
+	 */
+	export default {
+		components: {
+			CalendarItem
+		},
+		emits:['close','confirm','change','monthSwitch'],
+		props: {
+			date: {
+				type: String,
+				default: ''
+			},
+			selected: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			lunar: {
+				type: Boolean,
+				default: false
+			},
+			startDate: {
+				type: String,
+				default: ''
+			},
+			endDate: {
+				type: String,
+				default: ''
+			},
+			range: {
+				type: Boolean,
+				default: false
+			},
+			insert: {
+				type: Boolean,
+				default: true
+			},
+			showMonth: {
+				type: Boolean,
+				default: true
+			},
+			clearDate: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				show: false,
+				weeks: [],
+				calendar: {},
+				nowDate: '',
+				aniMaskShow: false
+			}
+		},
+		computed:{
+			/**
+			 * for i18n
+			 */
+
+			okText() {
+				return t("uni-calender.ok")
+			},
+			cancelText() {
+				return t("uni-calender.cancel")
+			},
+			todayText() {
+				return t("uni-calender.today")
+			},
+			monText() {
+				return t("uni-calender.MON")
+			},
+			TUEText() {
+				return t("uni-calender.TUE")
+			},
+			WEDText() {
+				return t("uni-calender.WED")
+			},
+			THUText() {
+				return t("uni-calender.THU")
+			},
+			FRIText() {
+				return t("uni-calender.FRI")
+			},
+			SATText() {
+				return t("uni-calender.SAT")
+			},
+			SUNText() {
+				return t("uni-calender.SUN")
+			},
+		},
+		watch: {
+			date(newVal) {
+				// this.cale.setDate(newVal)
+				this.init(newVal)
+			},
+			startDate(val){
+				this.cale.resetSatrtDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			endDate(val){
+				this.cale.resetEndDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			selected(newVal) {
+				this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
+				this.weeks = this.cale.weeks
+			}
+		},
+		created() {
+			this.cale = new Calendar({
+				selected: this.selected,
+				startDate: this.startDate,
+				endDate: this.endDate,
+				range: this.range,
+			})
+			this.init(this.date)
+		},
+		methods: {
+			// 鍙栨秷绌块��
+			clean() {},
+			bindDateChange(e) {
+				const value = e.detail.value + '-1'
+				this.setDate(value)
+
+				const { year,month } = this.cale.getDate(value)
+        this.$emit('monthSwitch', {
+            year,
+            month
+        })
+			},
+			/**
+			 * 鍒濆鍖栨棩鏈熸樉绀�
+			 * @param {Object} date
+			 */
+			init(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.calendar = this.cale.getInfo(date)
+			},
+			/**
+			 * 鎵撳紑鏃ュ巻寮圭獥
+			 */
+			open() {
+				// 寮圭獥妯″紡骞朵笖娓呯悊鏁版嵁
+				if (this.clearDate && !this.insert) {
+					this.cale.cleanMultipleStatus()
+					// this.cale.setDate(this.date)
+					this.init(this.date)
+				}
+				this.show = true
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.aniMaskShow = true
+					}, 50)
+				})
+			},
+			/**
+			 * 鍏抽棴鏃ュ巻寮圭獥
+			 */
+			close() {
+				this.aniMaskShow = false
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false
+						this.$emit('close')
+					}, 300)
+				})
+			},
+			/**
+			 * 纭鎸夐挳
+			 */
+			confirm() {
+				this.setEmit('confirm')
+				this.close()
+			},
+			/**
+			 * 鍙樺寲瑙﹀彂
+			 */
+			change() {
+				if (!this.insert) return
+				this.setEmit('change')
+			},
+			/**
+			 * 閫夋嫨鏈堜唤瑙﹀彂
+			 */
+			monthSwitch() {
+				let {
+					year,
+					month
+				} = this.nowDate
+				this.$emit('monthSwitch', {
+					year,
+					month: Number(month)
+				})
+			},
+			/**
+			 * 娲惧彂浜嬩欢
+			 * @param {Object} name
+			 */
+			setEmit(name) {
+				let {
+					year,
+					month,
+					date,
+					fullDate,
+					lunar,
+					extraInfo
+				} = this.calendar
+				this.$emit(name, {
+					range: this.cale.multipleStatus,
+					year,
+					month,
+					date,
+					fulldate: fullDate,
+					lunar,
+					extraInfo: extraInfo || {}
+				})
+			},
+			/**
+			 * 閫夋嫨澶╄Е鍙�
+			 * @param {Object} weeks
+			 */
+			choiceDate(weeks) {
+				if (weeks.disable) return
+				this.calendar = weeks
+				// 璁剧疆澶氶��
+				this.cale.setMultiple(this.calendar.fullDate)
+				this.weeks = this.cale.weeks
+				this.change()
+			},
+			/**
+			 * 鍥炲埌浠婂ぉ
+			 */
+			backToday() {
+				const nowYearMonth = `${this.nowDate.year}-${this.nowDate.month}`
+				const date = this.cale.getDate(new Date())
+        const todayYearMonth = `${date.year}-${date.month}`
+
+        if(nowYearMonth !== todayYearMonth) {
+          this.monthSwitch()
+        }
+
+				this.init(date.fullDate)
+				this.change()
+			},
+			/**
+			 * 涓婁釜鏈�
+			 */
+			pre() {
+				const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
+				this.setDate(preDate)
+				this.monthSwitch()
+
+			},
+			/**
+			 * 涓嬩釜鏈�
+			 */
+			next() {
+				const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
+				this.setDate(nextDate)
+				this.monthSwitch()
+			},
+			/**
+			 * 璁剧疆鏃ユ湡
+			 * @param {Object} date
+			 */
+			setDate(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	$uni-bg-color-mask: rgba($color: #000000, $alpha: 0.4);
+	$uni-border-color: #EDEDED;
+	$uni-text-color: #333;
+	$uni-bg-color-hover:#f1f1f1;
+	$uni-font-size-base:14px;
+	$uni-text-color-placeholder: #808080;
+	$uni-color-subtitle: #555555;
+	$uni-text-color-grey:#999;
+	.uni-calendar {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-calendar__mask {
+		position: fixed;
+		bottom: 0;
+		top: 0;
+		left: 0;
+		right: 0;
+		background-color: $uni-bg-color-mask;
+		transition-property: opacity;
+		transition-duration: 0.3s;
+		opacity: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--mask-show {
+		opacity: 1
+	}
+
+	.uni-calendar--fixed {
+		position: fixed;
+		/* #ifdef APP-NVUE */
+		bottom: 0;
+		/* #endif */
+		left: 0;
+		right: 0;
+		transition-property: transform;
+		transition-duration: 0.3s;
+		transform: translateY(460px);
+		/* #ifndef APP-NVUE */
+		bottom: calc(var(--window-bottom));
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--ani-show {
+		transform: translateY(0);
+	}
+
+	.uni-calendar__content {
+		background-color: #fff;
+	}
+
+	.uni-calendar__header {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 50px;
+		border-bottom-color: $uni-border-color;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar--fixed-top {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--fixed-width {
+		width: 50px;
+	}
+
+	.uni-calendar__backtoday {
+		position: absolute;
+		right: 0;
+		top: 25rpx;
+		padding: 0 5px;
+		padding-left: 10px;
+		height: 25px;
+		line-height: 25px;
+		font-size: 12px;
+		border-top-left-radius: 25px;
+		border-bottom-left-radius: 25px;
+		color: $uni-text-color;
+		background-color: $uni-bg-color-hover;
+	}
+
+	.uni-calendar__header-text {
+		text-align: center;
+		width: 100px;
+		font-size: $uni-font-size-base;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar__header-btn-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 50px;
+		height: 50px;
+	}
+
+	.uni-calendar__header-btn {
+		width: 10px;
+		height: 10px;
+		border-left-color: $uni-text-color-placeholder;
+		border-left-style: solid;
+		border-left-width: 2px;
+		border-top-color: $uni-color-subtitle;
+		border-top-style: solid;
+		border-top-width: 2px;
+	}
+
+	.uni-calendar--left {
+		transform: rotate(-45deg);
+	}
+
+	.uni-calendar--right {
+		transform: rotate(135deg);
+	}
+
+
+	.uni-calendar__weeks {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-calendar__weeks-item {
+		flex: 1;
+	}
+
+	.uni-calendar__weeks-day {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		height: 45px;
+		border-bottom-color: #F5F5F5;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar__weeks-day-text {
+		font-size: 14px;
+	}
+
+	.uni-calendar__box {
+		position: relative;
+	}
+
+	.uni-calendar__box-bg {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+
+	.uni-calendar__box-bg-text {
+		font-size: 200px;
+		font-weight: bold;
+		color: $uni-text-color-grey;
+		opacity: 0.1;
+		text-align: center;
+		/* #ifndef APP-NVUE */
+		line-height: 1;
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uni-calendar/components/uni-calendar/util.js b/uni_modules/uni-calendar/components/uni-calendar/util.js
new file mode 100644
index 0000000..5ec8a92
--- /dev/null
+++ b/uni_modules/uni-calendar/components/uni-calendar/util.js
@@ -0,0 +1,360 @@
+import CALENDAR from './calendar.js'
+
+class Calendar {
+	constructor({
+		date,
+		selected,
+		startDate,
+		endDate,
+		range
+	} = {}) {
+		// 褰撳墠鏃ユ湡
+		this.date = this.getDate(new Date()) // 褰撳墠鍒濆叆鏃ユ湡
+		// 鎵撶偣淇℃伅
+		this.selected = selected || [];
+		// 鑼冨洿寮�濮�
+		this.startDate = startDate
+		// 鑼冨洿缁撴潫
+		this.endDate = endDate
+		this.range = range
+		// 澶氶�夌姸鎬�
+		this.cleanMultipleStatus()
+		// 姣忓懆鏃ユ湡
+		this.weeks = {}
+		// this._getWeek(this.date.fullDate)
+	}
+	/**
+	 * 璁剧疆鏃ユ湡
+	 * @param {Object} date
+	 */
+	setDate(date) {
+		this.selectDate = this.getDate(date)
+		this._getWeek(this.selectDate.fullDate)
+	}
+
+	/**
+	 * 娓呯悊澶氶�夌姸鎬�
+	 */
+	cleanMultipleStatus() {
+		this.multipleStatus = {
+			before: '',
+			after: '',
+			data: []
+		}
+	}
+
+	/**
+	 * 閲嶇疆寮�濮嬫棩鏈�
+	 */
+	resetSatrtDate(startDate) {
+		// 鑼冨洿寮�濮�
+		this.startDate = startDate
+
+	}
+
+	/**
+	 * 閲嶇疆缁撴潫鏃ユ湡
+	 */
+	resetEndDate(endDate) {
+		// 鑼冨洿缁撴潫
+		this.endDate = endDate
+	}
+
+	/**
+	 * 鑾峰彇浠绘剰鏃堕棿
+	 */
+	getDate(date, AddDayCount = 0, str = 'day') {
+		if (!date) {
+			date = new Date()
+		}
+		if (typeof date !== 'object') {
+			date = date.replace(/-/g, '/')
+		}
+		const dd = new Date(date)
+		switch (str) {
+			case 'day':
+				dd.setDate(dd.getDate() + AddDayCount) // 鑾峰彇AddDayCount澶╁悗鐨勬棩鏈�
+				break
+			case 'month':
+				if (dd.getDate() === 31 && AddDayCount>0) {
+					dd.setDate(dd.getDate() + AddDayCount)
+				} else {
+					const preMonth = dd.getMonth()
+					dd.setMonth(preMonth + AddDayCount) // 鑾峰彇AddDayCount澶╁悗鐨勬棩鏈�
+					const nextMonth = dd.getMonth()
+					// 澶勭悊 pre 鍒囨崲鏈堜唤鐩爣鏈堜唤涓�2鏈堟病鏈夊綋鍓嶆棩(30 31) 鍒囨崲閿欒闂
+					if(AddDayCount<0 && preMonth!==0 && nextMonth-preMonth>AddDayCount){
+						dd.setMonth(nextMonth+(nextMonth-preMonth+AddDayCount))
+					}
+					// 澶勭悊 next 鍒囨崲鏈堜唤鐩爣鏈堜唤涓�2鏈堟病鏈夊綋鍓嶆棩(30 31) 鍒囨崲閿欒闂
+					if(AddDayCount>0 && nextMonth-preMonth>AddDayCount){
+						dd.setMonth(nextMonth-(nextMonth-preMonth-AddDayCount))
+					}
+				}
+				break
+			case 'year':
+				dd.setFullYear(dd.getFullYear() + AddDayCount) // 鑾峰彇AddDayCount澶╁悗鐨勬棩鏈�
+				break
+		}
+		const y = dd.getFullYear()
+		const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 鑾峰彇褰撳墠鏈堜唤鐨勬棩鏈燂紝涓嶈冻10琛�0
+		const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 鑾峰彇褰撳墠鍑犲彿锛屼笉瓒�10琛�0
+		return {
+			fullDate: y + '-' + m + '-' + d,
+			year: y,
+			month: m,
+			date: d,
+			day: dd.getDay()
+		}
+	}
+
+
+	/**
+	 * 鑾峰彇涓婃湀鍓╀綑澶╂暟
+	 */
+	_getLastMonthDays(firstDay, full) {
+		let dateArr = []
+		for (let i = firstDay; i > 0; i--) {
+			const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
+			dateArr.push({
+				date: beforeDate,
+				month: full.month - 1,
+				lunar: this.getlunar(full.year, full.month - 1, beforeDate),
+				disable: true
+			})
+		}
+		return dateArr
+	}
+	/**
+	 * 鑾峰彇鏈湀澶╂暟
+	 */
+	_currentMonthDys(dateData, full) {
+		let dateArr = []
+		let fullDate = this.date.fullDate
+		for (let i = 1; i <= dateData; i++) {
+			let nowDate = full.year + '-' + (full.month < 10 ?
+				full.month : full.month) + '-' + (i < 10 ?
+				'0' + i : i)
+			// 鏄惁浠婂ぉ
+			let isDay = fullDate === nowDate
+			// 鑾峰彇鎵撶偣淇℃伅
+			let info = this.selected && this.selected.find((item) => {
+				if (this.dateEqual(nowDate, item.date)) {
+					return item
+				}
+			})
+
+			// 鏃ユ湡绂佺敤
+			let disableBefore = true
+			let disableAfter = true
+			if (this.startDate) {
+				// let dateCompBefore = this.dateCompare(this.startDate, fullDate)
+				// disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
+				disableBefore = this.dateCompare(this.startDate, nowDate)
+			}
+
+			if (this.endDate) {
+				// let dateCompAfter = this.dateCompare(fullDate, this.endDate)
+				// disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
+				disableAfter = this.dateCompare(nowDate, this.endDate)
+			}
+			let multiples = this.multipleStatus.data
+			let checked = false
+			let multiplesStatus = -1
+			if (this.range) {
+				if (multiples) {
+					multiplesStatus = multiples.findIndex((item) => {
+						return this.dateEqual(item, nowDate)
+					})
+				}
+				if (multiplesStatus !== -1) {
+					checked = true
+				}
+			}
+			let data = {
+				fullDate: nowDate,
+				year: full.year,
+				date: i,
+				multiple: this.range ? checked : false,
+				beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate),
+				afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate),
+				month: full.month,
+				lunar: this.getlunar(full.year, full.month, i),
+				disable: !(disableBefore && disableAfter),
+				isDay
+			}
+			if (info) {
+				data.extraInfo = info
+			}
+
+			dateArr.push(data)
+		}
+		return dateArr
+	}
+	/**
+	 * 鑾峰彇涓嬫湀澶╂暟
+	 */
+	_getNextMonthDays(surplus, full) {
+		let dateArr = []
+		for (let i = 1; i < surplus + 1; i++) {
+			dateArr.push({
+				date: i,
+				month: Number(full.month) + 1,
+				lunar: this.getlunar(full.year, Number(full.month) + 1, i),
+				disable: true
+			})
+		}
+		return dateArr
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠鏃ユ湡璇︽儏
+	 * @param {Object} date
+	 */
+	getInfo(date) {
+		if (!date) {
+			date = new Date()
+		}
+		const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
+		return dateInfo
+	}
+
+	/**
+	 * 姣旇緝鏃堕棿澶у皬
+	 */
+	dateCompare(startDate, endDate) {
+		// 璁$畻鎴鏃堕棿
+		startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+		// 璁$畻璇︾粏椤圭殑鎴鏃堕棿
+		endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+		if (startDate <= endDate) {
+			return true
+		} else {
+			return false
+		}
+	}
+
+	/**
+	 * 姣旇緝鏃堕棿鏄惁鐩哥瓑
+	 */
+	dateEqual(before, after) {
+		// 璁$畻鎴鏃堕棿
+		before = new Date(before.replace('-', '/').replace('-', '/'))
+		// 璁$畻璇︾粏椤圭殑鎴鏃堕棿
+		after = new Date(after.replace('-', '/').replace('-', '/'))
+		if (before.getTime() - after.getTime() === 0) {
+			return true
+		} else {
+			return false
+		}
+	}
+
+
+	/**
+	 * 鑾峰彇鏃ユ湡鑼冨洿鍐呮墍鏈夋棩鏈�
+	 * @param {Object} begin
+	 * @param {Object} end
+	 */
+	geDateAll(begin, end) {
+		var arr = []
+		var ab = begin.split('-')
+		var ae = end.split('-')
+		var db = new Date()
+		db.setFullYear(ab[0], ab[1] - 1, ab[2])
+		var de = new Date()
+		de.setFullYear(ae[0], ae[1] - 1, ae[2])
+		var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+		var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+		for (var k = unixDb; k <= unixDe;) {
+			k = k + 24 * 60 * 60 * 1000
+			arr.push(this.getDate(new Date(parseInt(k))).fullDate)
+		}
+		return arr
+	}
+	/**
+	 * 璁$畻闃村巻鏃ユ湡鏄剧ず
+	 */
+	getlunar(year, month, date) {
+		return CALENDAR.solar2lunar(year, month, date)
+	}
+	/**
+	 * 璁剧疆鎵撶偣
+	 */
+	setSelectInfo(data, value) {
+		this.selected = value
+		this._getWeek(data)
+	}
+
+	/**
+	 *  鑾峰彇澶氶�夌姸鎬�
+	 */
+	setMultiple(fullDate) {
+		let {
+			before,
+			after
+		} = this.multipleStatus
+
+		if (!this.range) return
+		if (before && after) {
+			this.multipleStatus.before = ''
+			this.multipleStatus.after = ''
+			this.multipleStatus.data = []
+		} else {
+			if (!before) {
+				this.multipleStatus.before = fullDate
+			} else {
+				this.multipleStatus.after = fullDate
+				if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+				} else {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+				}
+			}
+		}
+		this._getWeek(fullDate)
+	}
+
+	/**
+	 * 鑾峰彇姣忓懆鏁版嵁
+	 * @param {Object} dateData
+	 */
+	_getWeek(dateData) {
+		const {
+			year,
+			month
+		} = this.getDate(dateData)
+		let firstDay = new Date(year, month - 1, 1).getDay()
+		let currentDay = new Date(year, month, 0).getDate()
+		let dates = {
+			lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 涓婁釜鏈堟湯灏惧嚑澶�
+			currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 鏈湀澶╂暟
+			nextMonthDays: [], // 涓嬩釜鏈堝紑濮嬪嚑澶�
+			weeks: []
+		}
+		let canlender = []
+		const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
+		dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
+		canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
+		let weeks = {}
+		// 鎷兼帴鏁扮粍  涓婁釜鏈堝紑濮嬪嚑澶� + 鏈湀澶╂暟+ 涓嬩釜鏈堝紑濮嬪嚑澶�
+		for (let i = 0; i < canlender.length; i++) {
+			if (i % 7 === 0) {
+				weeks[parseInt(i / 7)] = new Array(7)
+			}
+			weeks[parseInt(i / 7)][i % 7] = canlender[i]
+		}
+		this.canlender = canlender
+		this.weeks = weeks
+	}
+
+	//闈欐�佹柟娉�
+	// static init(date) {
+	// 	if (!this.instance) {
+	// 		this.instance = new Calendar(date);
+	// 	}
+	// 	return this.instance;
+	// }
+}
+
+
+export default Calendar
diff --git a/uni_modules/uni-calendar/package.json b/uni_modules/uni-calendar/package.json
new file mode 100644
index 0000000..fad841f
--- /dev/null
+++ b/uni_modules/uni-calendar/package.json
@@ -0,0 +1,85 @@
+{
+  "id": "uni-calendar",
+  "displayName": "uni-calendar 鏃ュ巻",
+  "version": "1.4.10",
+  "description": "鏃ュ巻缁勪欢",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "鏃ュ巻",
+    "",
+    "鎵撳崱",
+    "鏃ュ巻閫夋嫨"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-calendar/readme.md b/uni_modules/uni-calendar/readme.md
new file mode 100644
index 0000000..4e1748c
--- /dev/null
+++ b/uni_modules/uni-calendar/readme.md
@@ -0,0 +1,103 @@
+
+
+## Calendar 鏃ュ巻
+> **缁勪欢鍚嶏細uni-calendar**
+> 浠g爜鍧楋細 `uCalendar`
+
+
+鏃ュ巻缁勪欢
+
+> **娉ㄦ剰浜嬮」**
+> 涓轰簡閬垮厤閿欒浣跨敤锛岀粰澶у甯︽潵涓嶅ソ鐨勫紑鍙戜綋楠岋紝璇峰湪浣跨敤缁勪欢鍓嶄粩缁嗛槄璇讳笅闈㈢殑娉ㄦ剰浜嬮」锛屽彲浠ュ府浣犻伩鍏嶄竴浜涢敊璇��
+> - 鏈粍浠跺啘鍘嗚浆鎹娇鐢ㄧ殑js鏄� [@1900-2100鍖洪棿鍐呯殑鍏巻銆佸啘鍘嗕簰杞琞(https://github.com/jjonline/calendar.js)  
+> - 浠呮敮鎸佽嚜瀹氫箟缁勪欢妯″紡
+> - `date`灞炴�т紶鍏ョ殑搴旇鏄竴涓� String 锛屽锛� 2019-06-27 锛岃�屼笉鏄� new Date()
+> - 閫氳繃 `insert` 灞炴�ф潵纭畾褰撳墠鐨勪簨浠舵槸 @change 杩樻槸 @confirm 銆傜悊搴斿悎骞朵负涓�涓簨浠讹紝浣嗘槸涓轰簡鍖哄垎妯″紡锛岀幇浣跨敤涓や釜浜嬩欢锛岃繖閲岄渶瑕佹敞鎰�
+> - 寮圭獥妯″紡涓嬫棤娉曢樆姝㈠悗闈㈢殑鍏冪礌婊氬姩锛屽鏈夐渶瑕侀樆姝紝璇峰湪寮圭獥寮瑰嚭鍚庯紝鎵嬪姩璁剧疆婊氬姩鍏冪礌涓轰笉鍙粴鍔�
+
+
+### 瀹夎鏂瑰紡
+
+鏈粍浠剁鍚圼easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)瑙勮寖锛宍HBuilderX 2.5.5`璧凤紝鍙渶灏嗘湰缁勪欢瀵煎叆椤圭洰锛屽湪椤甸潰`template`涓嵆鍙洿鎺ヤ娇鐢紝鏃犻渶鍦ㄩ〉闈腑`import`鍜屾敞鍐宍components`銆�
+
+濡傞渶閫氳繃`npm`鏂瑰紡浣跨敤`uni-ui`缁勪欢锛屽彟瑙佹枃妗o細[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 鍩烘湰鐢ㄦ硶
+
+鍦� ``template`` 涓娇鐢ㄧ粍浠�
+
+```html
+<view>
+	<uni-calendar 
+	:insert="true"
+	:lunar="true" 
+	:start-date="'2019-3-2'"
+	:end-date="'2019-5-20'"
+	@change="change"
+	 />
+</view>
+```
+
+### 閫氳繃鏂规硶鎵撳紑鏃ュ巻
+
+闇�瑕佽缃� `insert` 涓� `false`
+
+```html
+<view>
+	<uni-calendar 
+	ref="calendar"
+	:insert="false"
+	@confirm="confirm"
+	 />
+	 <button @click="open">鎵撳紑鏃ュ巻</button>
+</view>
+```
+
+```javascript
+
+export default {
+	data() {
+		return {};
+	},
+	methods: {
+		open(){
+			this.$refs.calendar.open();
+		},
+		confirm(e) {
+			console.log(e);
+		}
+	}
+};
+
+```
+
+
+## API
+
+### Calendar Props
+
+|  灞炴�у悕	|    绫诲瀷	| 榛樿鍊紎 璇存槑																													|
+| -	| -	| - | - |
+| date		| String	|-		| 鑷畾涔夊綋鍓嶆椂闂达紝榛樿涓轰粖澶�																							|
+| lunar		| Boolean	| false	| 鏄剧ず鍐滃巻																												|
+| startDate	| String	|-		| 鏃ユ湡閫夋嫨鑼冨洿-寮�濮嬫棩鏈�																									|
+| endDate	| String	|-		| 鏃ユ湡閫夋嫨鑼冨洿-缁撴潫鏃ユ湡																									|
+| range		| Boolean	| false	| 鑼冨洿閫夋嫨																												|
+| insert	| Boolean	| false	| 鎻掑叆妯″紡,鍙�夊�硷紝ture锛氭彃鍏ユā寮忥紱false锛氬脊绐楁ā寮忥紱榛樿涓烘彃鍏ユā寮�														|
+|clearDate	|Boolean	|true	|寮圭獥妯″紡鏄惁娓呯┖涓婃閫夋嫨鍐呭	|
+| selected	| Array		|-		| 鎵撶偣锛屾湡寰呮牸寮廩{date: '2019-06-27', info: '绛惧埌', data: { custom: '鑷畾涔変俊鎭�', name: '鑷畾涔夋秷鎭ご',xxx:xxx... }}]	|
+|showMonth	| Boolean	| true	| 鏄惁鏄剧ず鏈堜唤涓鸿儗鏅�																									|
+
+### Calendar Events
+
+|  浜嬩欢鍚�		| 璇存槑								|杩斿洖鍊紎
+| -	|	-	| -	|
+| open	| 寮瑰嚭鏃ュ巻缁勪欢锛宍insert :false` 鏃剁敓鏁坾- 	|
+
+
+
+
+
+## 缁勪欢绀轰緥
+
+鐐瑰嚮鏌ョ湅锛歔https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar](https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar)

--
Gitblit v1.9.1