李天标 4 tahun lalu
induk
melakukan
d62a223e2d
62 mengubah file dengan 8682 tambahan dan 434 penghapusan
  1. 11 0
      .hbuilderx/launch.json
  2. 2 2
      App.vue
  3. 7 1
      common/lang/en.js
  4. 10 4
      common/lang/zh.js
  5. 311 0
      components/ld-select/ld-select.vue
  6. 0 86
      components/t-table/t-table.vue
  7. 0 71
      components/t-table/t-td.vue
  8. 0 71
      components/t-table/t-th.vue
  9. 0 81
      components/t-table/t-tr.vue
  10. 1019 0
      components/wing-time-selector/wing-time-selector.vue
  11. 1 0
      configs/env.js
  12. 24 1
      main.js
  13. 10 2
      manifest.json
  14. 33 0
      package-lock.json
  15. 2 1
      package.json
  16. 320 0
      packageA/components/ld-select/ld-select.vue
  17. 200 0
      packageA/components/like-button/like-button.vue
  18. 819 0
      packageA/components/mx-datepicker/mx-datepicker.vue
  19. 90 0
      packageA/pages/equipmentStatus/GoogleMap.vue
  20. 47 0
      packageA/pages/equipmentStatus/map.vue
  21. 451 0
      packageA/pages/remote/advancedParameters.vue
  22. 679 0
      packageA/pages/remote/alarmClockItem.vue
  23. 224 0
      packageA/pages/remote/alarmClockList.vue
  24. 345 0
      packageA/pages/remote/dosugar.vue
  25. 595 0
      packageA/pages/remote/generalParameters.vue
  26. 29 0
      packageA/pages/remote/parameters.vue
  27. 69 0
      packageA/pages/remote/remoteList.vue
  28. 66 0
      packageA/pages/remote/sugarList.vue
  29. 0 0
      packageA/pages/user/equipmentName.vue
  30. 77 0
      packageA/pages/user/timeRule.vue
  31. 49 0
      packageA/pages/user/timeSelect.vue
  32. 335 0
      packageA/pages/user/timeSet.vue
  33. 2 0
      packageA/uni_modules/uni-badge/changelog.md
  34. 156 0
      packageA/uni_modules/uni-badge/components/uni-badge/uni-badge.vue
  35. 83 0
      packageA/uni_modules/uni-badge/package.json
  36. 43 0
      packageA/uni_modules/uni-badge/readme.md
  37. 2 0
      packageA/uni_modules/uni-icons/changelog.md
  38. 132 0
      packageA/uni_modules/uni-icons/components/uni-icons/icons.js
  39. 71 0
      packageA/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  40. TEMPAT SAMPAH
      packageA/uni_modules/uni-icons/components/uni-icons/uni.ttf
  41. 81 0
      packageA/uni_modules/uni-icons/package.json
  42. 43 0
      packageA/uni_modules/uni-icons/readme.md
  43. 5 0
      packageA/uni_modules/uni-list/changelog.md
  44. 107 0
      packageA/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue
  45. 58 0
      packageA/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss
  46. 533 0
      packageA/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue
  47. 440 0
      packageA/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue
  48. 106 0
      packageA/uni_modules/uni-list/components/uni-list/uni-list.vue
  49. 65 0
      packageA/uni_modules/uni-list/components/uni-list/uni-refresh.vue
  50. 87 0
      packageA/uni_modules/uni-list/components/uni-list/uni-refresh.wxs
  51. 85 0
      packageA/uni_modules/uni-list/package.json
  52. 340 0
      packageA/uni_modules/uni-list/readme.md
  53. 164 53
      pages.json
  54. 29 8
      pages/Charts/mainStatistics.vue
  55. 6 1
      pages/User/buyPromo.vue
  56. 0 1
      pages/User/equipmentSratisticsList.vue
  57. 135 37
      pages/User/equipmentStatusList.vue
  58. 2 9
      pages/User/promoCode.vue
  59. 34 5
      pages/User/user.vue
  60. TEMPAT SAMPAH
      static/icons/logo.png
  61. TEMPAT SAMPAH
      static/img/map.png
  62. 48 0
      store/modules/chart.js

+ 11 - 0
.hbuilderx/launch.json

@@ -0,0 +1,11 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+            "type": "uniCloud",
+            "default": {
+                "launchtype": "remote"
+            }
+        }
+    ]
+}

+ 2 - 2
App.vue

@@ -3,9 +3,9 @@
 		onLaunch: function() {
 			console.log('App Launch');
 			//默认语言
-			// var lan = 'en'
+			var lan = 'en'
 			
-			var lan = 'zh'
+			// var lan = 'zh'
 			 try {
 				const res = uni.getSystemInfoSync();
 				lan = res.language

+ 7 - 1
common/lang/en.js

@@ -84,7 +84,13 @@ export default {
 		error:'Abnormal operation',
 		guanjierror:'Equipment has been shut down.',
 		kaijierror:'Equipment has been started.',
-		network:'Bad machine network,operation failure'
+		network:'Bad machine network,operation failure',
+		yixiaochu:'cleared',
+		xiaochu:'clear',
+		gps:'GPS',
+		look:'look',
+		kaiqi:'on',
+		guanbi:'off',
 	},
 	equipmentStatics:{
 		title:'Machine Sales Ranking',

+ 10 - 4
common/lang/zh.js

@@ -63,8 +63,8 @@ export default {
 		green:'绿色代表机器正常',
 		sleep:'睡眠状态:机器已睡眠',
 		unsleep:'睡眠状态:未睡眠',
-		on:'开/关机:已开机',
-		off:'开/关机:已关机',
+		on:'开/关炉头:已开启',
+		off:'开/关炉头:已关闭',
 		equipmentNo:'机器唯一码',
 		area:'所在地',
 		temperature :'炉头温度',
@@ -77,12 +77,18 @@ export default {
 		onoff:'开/关机中',
 		kaiji:'开机中',
 		guanji:'关机中',
-		tishi:'三十秒内请勿重复操作',
+		tishi:'三十秒内请勿重复操作,状态改变需要等待',
 		remainingtime:'请勿操作,剩余时间:',
 		error:'操作异常',
 		guanjierror:'设备已关机',
 		kaijierror:'设备已开机',
-		network:'机器网络不好,操作失败'
+		network:'机器网络不好,操作失败',
+		yixiaochu:'已消除',
+		xiaochu:'消除',
+		gps:'定位',
+		look:'查看',
+		kaiqi:'开启',
+		guanbi:'关闭',
 	},
 	equipmentStatics:{
 		title:'机器销售排行',

File diff ditekan karena terlalu besar
+ 311 - 0
components/ld-select/ld-select.vue


+ 0 - 86
components/t-table/t-table.vue

@@ -1,86 +0,0 @@
-<template>
-	<view class="t-table" :style="{ 'border-width': border + 'px', 'border-color': borderColor }">
-		<slot />
-	</view>
-</template>
-
-<script>
-	export default {
-		props: {
-			border: {
-				type: String,
-				default: '1'
-			},
-			borderColor: {
-				type: String,
-				default: '#d0dee5'
-			},
-			isCheck: {
-				type: Boolean,
-				default: false
-			}
-		},
-		provide() {
-			return {
-				table: this
-			};
-		},
-		data() {
-			return {};
-		},
-		created() {
-			this.childrens = [];
-			this.index = 0;
-		},
-		methods: {
-			fire(e, index, len) {
-				let childrens = this.childrens;
-				console.log(childrens);
-				// 全选
-				if (index === 0) {
-					childrens.map((vm, index) => {
-						vm.checkboxData.checked = e;
-						return vm;
-					});
-				} else {
-					let isAll = childrens.find((n, ids) => ids !== 0 && !n.checkboxData.checked);
-					childrens[0].checkboxData.checked = isAll ? false : true;
-				}
-
-				let fireArr = [];
-				for (let i = 0; i < childrens.length; i++) {
-					if (childrens[i].checkboxData.checked && i !== 0) {
-						fireArr.push(childrens[i].checkboxData.value - 1);
-					}
-				}
-				this.$emit('change', {
-					detail: fireArr
-				});
-			}
-		}
-	};
-</script>
-
-<style scoped>
-	.t-table {
-		width: 100%;
-		border: 1px #d0dee5 solid;
-		border-left: none;
-		border-top: none;
-		box-sizing: border-box;
-	}
-
-	.t-table>>>t-tr {
-		display: flex;
-	}
-
-	.t-table>>>t-tr:nth-child(2n) {
-		background: #f5f5f5;
-	}
-
-	/* #ifdef H5 */
-	.t-table>>>.t-tr:nth-child(2n) {
-		background: #f5f5f5;
-	}
-	/* #endif */
-</style>

+ 0 - 71
components/t-table/t-td.vue

@@ -1,71 +0,0 @@
-<template>
-	<view class="t-td" :style="{ 'border-width': thBorder + 'px','border-color':borderColor ,'font-size':fontSize+'px' ,'color':color,'justify-content':tdAlignCpd}">
-		<slot></slot>
-	</view>
-</template>
-
-<script>
-	export default {
-		props: {
-			align: String
-		},
-		data() {
-			return {
-				thBorder: '1',
-				borderColor: '#d0dee5',
-				fontSize: '14',
-				color: '#555c60',
-				tdAlign: 'center'
-			};
-		},
-		inject: ['table', 'tr'],
-
-		created() {
-			this.thBorder = this.table.border;
-			this.borderColor = this.table.borderColor;
-			this.fontSize = this.tr.fontSize;
-			this.color = this.tr.color;
-			if (this.align) {
-				this.tdAlign = this.align;
-			} else {
-				this.tdAlign = this.tr.align
-			}
-		},
-		computed: {
-			tdAlignCpd() {
-				let nameAlign = '';
-				switch (this.tdAlign) {
-					case 'left':
-						nameAlign = 'flex-start'
-						break;
-					case 'center':
-						nameAlign = 'center'
-						break;
-					case 'right':
-						nameAlign = 'flex-end'
-						break;
-					default:
-						nameAlign = 'center'
-						break;
-				}
-				return nameAlign
-			}
-		}
-	};
-</script>
-
-<style>
-	.t-td {
-		flex: 1;
-		display: flex;
-		align-items: center;
-		width: 100%;
-		padding: 14upx;
-		border-top: 1px #d0dee5 solid;
-		border-left: 1px #d0dee5 solid;
-		text-align: center;
-		color: #555c60;
-		font-size: 28upx;
-
-	}
-</style>

+ 0 - 71
components/t-table/t-th.vue

@@ -1,71 +0,0 @@
-<template>
-	<view class="t-th" :style="{ 'border-width': thBorder + 'px' ,'border-color':borderColor,'font-size':fontSize+'px' ,'color':color,'justify-content':thAlignCpd}">
-		<slot></slot>
-	</view>
-</template>
-
-<script>
-	export default {
-		props: {
-			align: String,
-		},
-		data() {
-			return {
-				thBorder: '1',
-				borderColor: '#d0dee5',
-				fontSize: '15',
-				color: '#3b4246',
-				thAlign: 'center'
-			};
-		},
-		inject: ['table', 'tr'],
-
-		created() {
-			this.thBorder = this.table.border;
-			this.borderColor = this.table.borderColor;
-			this.fontSize = this.tr.fontSize;
-			this.color = this.tr.color;
-			if (this.align) {
-				this.thAlign = this.align;
-			} else {
-				this.thAlign = this.tr.align
-			}
-		},
-
-		computed: {
-			thAlignCpd() {
-				let nameAlign = '';
-				switch (this.thAlign) {
-					case 'left':
-						nameAlign = 'flex-start'
-						break;
-					case 'center':
-						nameAlign = 'center'
-						break;
-					case 'right':
-						nameAlign = 'flex-end'
-						break;
-					default:
-						nameAlign = 'center'
-						break;
-				}
-				return nameAlign
-			}
-		}
-	};
-</script>
-
-<style>
-	.t-th {
-		flex: 1;
-		display: flex;
-		align-items: center;
-		font-size: 30upx;
-		font-weight: bold;
-		text-align: center;
-		color: #3b4246;
-		border-left: 1px #d0dee5 solid;
-		border-top: 1px #d0dee5 solid;
-		padding: 15upx;
-	}
-</style>

+ 0 - 81
components/t-table/t-tr.vue

@@ -1,81 +0,0 @@
-<template>
-	<view class="t-tr">
-		<view v-if="isCheck" class="t-check-box" :style="{ 'border-width': thBorder + 'px' ,'border-color':borderColor}">
-			<checkbox-group @change="checkboxChange">
-				<checkbox :value="checkboxData.value + ''" :checked="checkboxData.checked" />
-			</checkbox-group>
-		</view>
-		<slot></slot>
-	</view>
-</template>
-
-<script>
-	export default {
-		props: {
-			fontSize: String,
-			color: String,
-			align: String
-		},
-		inject: ['table'],
-		provide() {
-			return {
-				tr: this
-			};
-		},
-		data() {
-			return {
-				isCheck: false,
-				checkboxData: {
-					value: 0,
-					checked: false
-				},
-				checked: false,
-				thBorder: '1',
-				borderColor: '#d0dee5'
-			};
-		},
-		created() {
-			this.thBorder = this.table.border;
-			this.borderColor = this.table.borderColor;
-			this.table.childrens.push(this);
-			this.checkboxData.value = this.table.index++;
-			this.isCheck = this.table.isCheck;
-
-		},
-		methods: {
-			checkboxChange(e) {
-				this.checkboxData.checked = !this.checkboxData.checked;
-				this.table.childrens[this.checkboxData.value] = this;
-				this.table.fire(e.detail.value[0] ? true : false, this.checkboxData.value, this.table.index);
-			}
-		}
-	};
-</script>
-
-<style>
-	.t-tr {
-		width: 100%;
-		display: flex;
-	}
-
-	.t-tr t-th,
-	.t-tr t-td {
-		display: flex;
-		flex: 1;
-	}
-
-	.t-tr .t-check-box {
-		flex-shrink: 0;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		width: 80upx;
-		color: #3b4246;
-		border-left: 1px #d0dee5 solid;
-		border-top: 1px #d0dee5 solid;
-	}
-
-	.t-tr .t-check-box checkbox {
-		transform: scale(0.8);
-	}
-</style>

File diff ditekan karena terlalu besar
+ 1019 - 0
components/wing-time-selector/wing-time-selector.vue


+ 1 - 0
configs/env.js

@@ -11,6 +11,7 @@ if (process.env.NODE_ENV === 'development') {
 	configs = Object.assign(configs, {
 		// baseUrl: 'https://app.sunzee.com.cn/ShenzeeServer',
 		baseUrl: 'http://127.0.0.1:8090',
+		// baseUrl: 'http://127.0.0.1:8686',
 	});
 }
 

+ 24 - 1
main.js

@@ -8,7 +8,30 @@ import zh from '@/common/lang/zh';
 import en from '@/common/lang/en';
 import mainStatistics from '@/pages/Charts/mainStatistics';
 
+//谷歌地图
+// import * as VueGoogleMaps from 'vue2-google-maps'
 
+// Vue.use(VueGoogleMaps, {
+
+//   load: {
+
+//     key: 'AIzaSyAqxnF8_35P_vlxVGxKhfL2lxFup-qZF6g',
+
+//     libraries: 'places', 
+// 	// This is required if you use the Autocomplete plugin
+
+//     // OR: libraries: 'places,drawing'
+
+//     // OR: libraries: 'places,drawing,visualization'
+
+//     // (as you require)
+
+//     //// If you want to set the version, you can do so:
+
+//     // v: '3.26',
+
+//   },
+// })
 Vue.use(VueI18n)
 Vue.config.productionTip = !!env.isProduction;
 const i18n = new VueI18n({  
@@ -21,7 +44,7 @@ const i18n = new VueI18n({
 });
 
 App.mpType = 'app'
-
+// Vue.prototype.serverurl="http://127.0.0.1:8686";
 Vue.prototype.serverurl="http://127.0.0.1:8090";
 // Vue.prototype.serverurl="https://app.sunzee.com.cn/ShenzeeServer";
 Vue.prototype.$store = store;

+ 10 - 2
manifest.json

@@ -93,7 +93,7 @@
     "mp-weixin" : {
         "appid" : "wx3844925af1740a7d",
         "setting" : {
-            "urlCheck" : true,
+            "urlCheck" : false,
             "es6" : true,
             "postcss" : true,
             "minified" : false
@@ -117,7 +117,15 @@
             "base" : "/sunzeeapp/"
         },
         "devServer" : {
-            "https" : true
+            "https" : false
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : false
+            }
+        },
+        "sdkConfigs" : {
+            "maps" : {}
         }
     }
 }

+ 33 - 0
package-lock.json

@@ -4,10 +4,43 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "core-js": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+      "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+    },
+    "marker-clusterer-plus": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/marker-clusterer-plus/-/marker-clusterer-plus-2.1.4.tgz",
+      "integrity": "sha1-+O/3TVmdqzt9Dj/tUmTqDnBPXWc="
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
     "vue-i18n": {
       "version": "8.15.1",
       "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.15.1.tgz",
       "integrity": "sha512-GBbz8qYCu0U2LNu4IcuFLZiuyninG4k26knvhL7GZG5Ncp4RR2VKDEH6g8gQ6I+UUBCvH2MBQVPSdxWe4DBkPw=="
+    },
+    "vue2-google-maps": {
+      "version": "0.10.7",
+      "resolved": "https://registry.npmjs.org/vue2-google-maps/-/vue2-google-maps-0.10.7.tgz",
+      "integrity": "sha512-y5aBJTAsfGvpsbfgPaeWU7o7QbOeINZKsP6SB9qrBe8U8EYBFO/bTWo3rcMq/NOtgT/XssV3Nwg/2u3no6jWbw==",
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "marker-clusterer-plus": "^2.1.4"
+      }
     }
   }
 }

+ 2 - 1
package.json

@@ -13,6 +13,7 @@
   "author": "",
   "license": "ISC",
   "dependencies": {
-    "vue-i18n": "^8.15.1"
+    "vue-i18n": "^8.15.1",
+    "vue2-google-maps": "^0.10.7"
   }
 }

File diff ditekan karena terlalu besar
+ 320 - 0
packageA/components/ld-select/ld-select.vue


File diff ditekan karena terlalu besar
+ 200 - 0
packageA/components/like-button/like-button.vue


File diff ditekan karena terlalu besar
+ 819 - 0
packageA/components/mx-datepicker/mx-datepicker.vue


+ 90 - 0
packageA/pages/equipmentStatus/GoogleMap.vue

@@ -0,0 +1,90 @@
+<template>
+	<view>
+		<div>
+
+			<gmap-map :center="centers" :zoom="11" map-type-id="terrain" style="width: 100%; height: 340px">
+
+				<gmap-marker @dragend="updateMaker" :key="index" v-for="(m, index) in markers" :position="m.position" :clickable="true"
+				 :draggable="true" @click="centers=m.position"></gmap-marker>
+			</gmap-map>
+
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				centers: {
+					lat: '',
+					lng: ''
+				},
+				markers: [{
+					position: {
+						lat: '',
+						lng: ''
+					}
+				}],
+				place: null,
+				description: 'Autocomplete Example (#164)',
+				longitude: '',
+				latitude: '',
+				id: 0, // 使用 marker点击事件 需要填写id
+				title: 'map',
+				covers: []
+			}
+
+		},
+		onLoad: function(option) {
+			const item = JSON.parse(decodeURIComponent(option.item));
+			this.longitude = item.longitude;
+			this.latitude = item.latitude;
+			var cover = [];
+			var cov = {};
+			cov["latitude"] = item.latitude;
+			cov["longitude"] = item.longitude;
+			cov["iconPath"] = '../../static/img/map.png';
+			cover.push(cov);
+			cover.push(cov);
+			this.markers[0].position = {
+				lat: item.latitude,
+				lng: item.longitude
+			};
+			this.centers={
+				lat: item.latitude,
+				lng: item.longitude
+			};
+		},
+		methods: {
+			setPlace(place) {
+				this.place = place
+			},
+			setDescription(description) {
+				this.description = description;
+			},
+			usePlace(place) {
+				if (this.place) {
+					var newPostion = {
+						lat: this.place.geometry.location.lat(),
+						lng: this.place.geometry.location.lng(),
+					};
+					this.center = newPostion;
+					this.markers[0].position = newPostion;
+					this.place = null;
+				}
+			},
+			updateMaker: function(event) {
+				console.log('updateMaker, ', event.latLng.lat());
+				this.markers[0].position = {
+					lat: event.latLng.lat(),
+					lng: event.latLng.lng(),
+				}
+			},
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 47 - 0
packageA/pages/equipmentStatus/map.vue

@@ -0,0 +1,47 @@
+<template>
+	<view>
+		<view class="page-body">
+			<view class="page-section page-section-gap">
+				<map style="width: 100%; height: 300px;" clickable="true" :latitude="latitude" :longitude="longitude" :markers="covers">
+				</map>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				longitude: '',
+				latitude: '',
+				id: 0, // 使用 marker点击事件 需要填写id
+				title: 'map',
+				covers: []
+			}
+
+		},
+		onLoad: function(option) {
+			const item = JSON.parse(decodeURIComponent(option.item));
+			this.longitude = item.longitude;
+			this.latitude = item.latitude;
+			var cover = [];
+			var cov = {};
+			cov["latitude"] = item.latitude;
+			cov["longitude"] = item.longitude;
+			cov["iconPath"] = '../../../static/img/map.png';
+			cover.push(cov);
+			cover.push(cov);
+			
+			this.covers = cover;
+			var kk = this.covers;
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 451 - 0
packageA/pages/remote/advancedParameters.vue

@@ -0,0 +1,451 @@
+<template>
+	<view class="">
+		<!-- <view class="line">
+		</view> -->
+		<view class="search">
+			<view class="search-title">
+				输入机器编码
+			</view>
+			<view class="search-input">
+				<input type="text" placeholder='输入设备编码后6位' v-model="searchClientId" />
+			</view>
+			<view class="search-button">
+				<button type="primary" class="" @click="search()">
+					<p class="">搜索</P>
+				</button>
+			</view>
+		</view>
+		<view class="td-right">
+			<view class="uni-list">
+				<view class="uni-list-cell">
+					<view class="uni-list-cell-left">
+						点击选择机器
+					</view>
+					<view class="uni-list-cell-db" style="overflow: hidden;text-overflow: ellipsis;">
+						<picker @change="changeEquipment" :value="index" :range="equipmentNameList">
+							<view class="uni-input">{{equipmentNameList[index]}}</view>
+						</picker>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view v-show="show">
+			<view class="body">
+				<p class="p">X零点补偿:</p>
+				<input class="input" type="text" v-model="D436" />
+				<button type="primary" class="button" @click="update('D436',D436)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">Y零点补偿:</p>
+				<input class="input" type="text" v-model="D438" />
+				<button type="primary" class="button" @click="update('D438',D438)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">Z零点补偿:</p>
+				<input class="input" type="text" v-model="D440" />
+				<button type="primary" class="button" @click="update('D440',D440)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">取糖位置X设置:</p>
+				<input class="input" type="text" v-model="D218" />
+				<button type="primary" class="button" @click="update('D218',D218)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">取糖位置Y设置:</p>
+				<input class="input" type="text" v-model="D268" />
+				<button type="primary" class="button" @click="update('D268',D268)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">取糖位置Z设置:</p>
+				<input class="input" type="text" v-model="D318" />
+				<button type="primary" class="button" @click="update('D318',D318)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<!-- //301特有 -->
+			<view class="" v-show="equimentType=='MG301'">
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">取棍位置X设置:</p>
+					<input class="input" type="text" v-model="D226" />
+					<button type="primary" class="button" @click="update('D226',D226)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">取棍位置Y设置:</p>
+					<input class="input" type="text" v-model="D276" />
+					<button type="primary" class="button" @click="update('D276',D276)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">取棍位置Z设置:</p>
+					<input class="input" type="text" v-model="D326" />
+					<button type="primary" class="button" @click="update('D326',D326)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+			</view>
+			<!-- //320特有 -->
+			<view class="" v-show="equimentType=='MG320'">
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">取棍位置X设置:</p>
+					<input class="input" type="text" v-model="D228" />
+					<button type="primary" class="button" @click="update('D228',D228)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">取棍位置Y设置:</p>
+					<input class="input" type="text" v-model="D278" />
+					<button type="primary" class="button" @click="update('D278',D278)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">取棍位置Z设置:</p>
+					<input class="input" type="text" v-model="D328" />
+					<button type="primary" class="button" @click="update('D328',D328)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">启动缺物料监控</p>
+					<button type="primary" class="button" @click="update('M502','0')">
+						<p class="p2">启动</P>
+					</button>
+					<button type="primary" class="button" @click="update('M502','1')">
+						<p class="p2">关闭</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">外循环按钮</p>
+					<button type="primary" class="button" @click="update('M506','0')">
+						<p class="p2">启动</P>
+					</button>
+					<button type="primary" class="button" @click="update('M506','1')">
+						<p class="p2">关闭</P>
+					</button>
+				</view>
+			</view>
+		</view>
+		<view class="line2"></view>
+	</view>
+</template>
+<script>
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				D436: 0,
+				D438: 0,
+				D440: 0,
+				D218: 0,
+				D268: 0,
+				D318: 0,
+				D226: 0,
+				D276: 0,
+				D326: 0,
+				D228: 0,
+				D278: 0,
+				D328: 0,
+				M502: 0,
+				M506: 0,
+				index: null,
+				equipmentName: null,
+				equimentType: null,
+				equipmentId:null,
+				equipmentNameList: [],
+				globalUser: null,
+				show: true,
+				searchClientId:null
+			}
+		},
+		onShow() {
+			var token = uni.getStorageSync("token");
+			this.globalUser = uni.getStorageSync("globalUser");
+			if (token.length > 1) {
+				this.getEquipmentListData();
+				// this.getParam();
+			} else {
+				uni.reLaunch({
+					url: '../Login/Login',
+				});
+			}
+
+		},
+		methods: {
+			...mapActions('chart', ['getParameters', 'updateParameters', 'getEquipmentListByUser']),
+			getEquipmentListData() {
+				this.getEquipmentListByUser(this.globalUser)
+					.then(data => {
+						// this.merchantList = data;
+						var listName = data[0].equipmentList;
+						var equipmentNameList = [];
+						for (var i = 0; i < listName.length; i++) {
+							equipmentNameList.push("名称:" + listName[i].name + " 编号:" + listName[i].clientId.substring(
+								listName[i].clientId.length - 6, listName[i].clientId.length));
+						}
+						this.equipmentNameList = equipmentNameList;
+						var listId = data[0].id;
+						if (listId != null && listId != '1') {
+							uni.setStorageSync("listName", listName);
+						}
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			search(){
+				var clientId = this.searchClientId;
+				var list = uni.getStorageSync("listName");
+				console.log(clientId);
+				var n = 0;
+				for (var i = 0; i < list.length; i++) {
+					var code = list[i].clientId.substring(list[i].clientId.length - 6, list[i].clientId.length);
+					if(code==clientId){
+						n++;
+						this.D436 = null;
+						this.D438 = null;
+						this.D440 = null;
+						this.D218 = null;
+						this.D268 = null;
+						this.D318 = null;
+						this.D226 = null;
+						this.D276 = null;
+						this.D326 = null;
+						this.D228 = null;
+						this.D278 = null;
+						this.D328 = null;
+						this.M502 = null;
+						this.M506 = null;
+						this.index = i;
+						var id = list[i].id;
+						this.equipmentId =  id;
+						this.equimentType = list[i].equimentType;
+						this.clientId = list[i].clientId;
+						this.show = true;
+						if (this.equimentType == 'MG280') {
+							this.show = false;
+						}
+						this.getParam();
+						break;
+					}
+				}
+				if(n==0){
+					uni.showModal({
+						title: "提示",
+						content: "找不到该机器",
+						success: (res) => {
+					
+						}
+					})
+				}
+			},
+			//改变机器
+			changeEquipment: function(e) {
+				this.D436 = null;
+				this.D438 = null;
+				this.D440 = null;
+				this.D218 = null;
+				this.D268 = null;
+				this.D318 = null;
+				this.D226 = null;
+				this.D276 = null;
+				this.D326 = null;
+				this.D228 = null;
+				this.D278 = null;
+				this.D328 = null;
+				this.M502 = null;
+				this.M506 = null;
+				this.searchClientId = null;
+				this.index = e.target.value;
+				var list = uni.getStorageSync("listName");
+				this.equipmentId = list[e.target.value].id;
+				this.equimentType = list[e.target.value].equimentType;
+				this.clientId = list[e.target.value].clientId;
+				this.show = true;
+				if (this.equimentType == 'MG280') {
+					this.show = false;
+				}
+				this.getParam();
+			},
+			getParam() {
+				const param = {};
+				param['id'] = this.equipmentId;
+				// 0:通用参数;  1:进阶参数
+				param['status'] = '1';
+				param['clientId'] = this.clientId;
+				this.getParameters(param).then(res => {
+					var code = res.code;
+					if(code==false){
+						uni.showToast({
+							title: res.message,
+							duration: 2000
+						});
+						return;
+					}
+					var info = res.data;
+					if (info != null || info != '') {
+						for (var i = 0; i < info.length; i++) {
+							if (info[i].name == 'D436') {
+								this.D436 = info[i].val;
+							}
+							if (info[i].name == 'D438') {
+								this.D438 = info[i].val;
+							}
+							if (info[i].name == 'D440') {
+								this.D440 = info[i].val;
+							}
+							if (info[i].name == 'D218') {
+								this.D218 = info[i].val;
+							}
+							if (info[i].name == 'D268') {
+								this.D268 = info[i].val;
+							}
+							if (info[i].name == 'D318') {
+								this.D318 = info[i].val;
+							}
+							if (info[i].name == 'D226') {
+								this.D226 = info[i].val;
+							}
+							if (info[i].name == 'D276') {
+								this.D276 = info[i].val;
+							}
+							if (info[i].name == 'D326') {
+								this.D326 = info[i].val;
+							}
+							if (info[i].name == 'D228') {
+								this.D228 = info[i].val;
+							}
+							if (info[i].name == 'D278') {
+								this.D278 = info[i].val;
+							}
+							if (info[i].name == 'D328') {
+								this.D328 = info[i].val;
+							}
+						}
+					}
+
+				}, _ => void uni.stopPullDownRefresh());
+			},
+			update(name, val) {
+				const param = {};
+				param['id'] = this.equipmentId;
+				param['name'] = name;
+				param['val'] = val;
+				this.updateParameters(param).then(res => {
+					if (res.data == 'SUCCESS') {
+						uni.showToast({
+							title: '发送成功',
+							duration: 1000
+						});
+					}
+				}, _ => void uni.stopPullDownRefresh());
+			},
+		},
+	}
+</script>
+
+<style>
+	.search{
+		width: 100%;
+		padding-top: 10upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+	}
+	.search-title{
+		width: 28%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+	}
+	.search-input{
+		width: 45%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+	}
+	.search-button{
+		width: 20%;
+		padding-left: 7upx;
+		text-align: center;
+	}
+	.line {
+		height: 50upx;
+	}
+
+	.line2 {
+		height: 10upx;
+	}
+
+	.body {
+		background-color: #FFFFFF;
+		width: 700upx;
+		padding: 10upx 10upx 10upx 10upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		font-size: 32upx;
+	}
+
+	.p {
+		width: 350upx;
+		text-align: right;
+	}
+
+	.input {
+		width: 200upx;
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+		text-align: center;
+	}
+
+	.button {
+		width: 120upx;
+		height: 60upx;
+		text-align: left;
+		border-radius: 10upx;
+
+	}
+
+	.p2 {
+		font-size: 30upx;
+		/* #ifndef H5 */
+		padding-top: 3upx;
+		/* #endif */
+		position: absolute;
+		/* 水平居中 */
+		left: 50%;
+		-webkit-transform: translateX(-50%);
+		transform: translateX(-50%);
+	}
+</style>

+ 679 - 0
packageA/pages/remote/alarmClockItem.vue

@@ -0,0 +1,679 @@
+<template>
+	<view>
+		<view class="test">
+			<view>时钟</view>
+			<p class="time">{{time}}</p>
+			<button class="btime" type="primary" @click="onShowDatePicker('time')">选择时间</button>
+		</view>
+		<mx-date-picker :show="showPicker" :type="type" :value="value" :show-tips="true" :begin-text="'1'"
+			:end-text="'2'" :show-seconds="true" @confirm="onSelected" @cancel="onSelected" />
+		<view class="example-body">
+			<uni-badge class="uni-badge-left-margin" :inverted="Sunday" text="日" type="primary" @click="wek(7)" />
+			<uni-badge class="uni-badge-left-margin" :inverted="Monday" text="一" type="primary" @click="wek(1)" />
+			<uni-badge class="uni-badge-left-margin" :inverted="Tuesday" text="二" type="primary" @click="wek(2)" />
+			<uni-badge class="uni-badge-left-margin" :inverted="Wednesday" text="三" type="primary" @click="wek(3)" />
+			<uni-badge class="uni-badge-left-margin" :inverted="Thursday" text="四" type="primary" @click="wek(4)" />
+			<uni-badge class="uni-badge-left-margin" :inverted="Friday" text="五" type="primary" @click="wek(5)" />
+			<uni-badge class="uni-badge-left-margin" :inverted="Saturday" text="六" type="primary" @click="wek(6)" />
+		</view>
+		<view class="line"></view>
+		<view class="uni-list-cell">
+			<view class="uni-list-cell-left">
+				闹钟类型:
+			</view>
+			<view class="uni-list-cell-db">
+				<picker @change="bindPickerChange" :value="indexType" :range="array">
+					<view class="uni-input">{{array[indexType]}}</view>
+				</picker>
+			</view>
+		</view>
+		<!-- //查找 -->
+		<view class="search">
+			<view class="search-title">
+				输入编码添加
+			</view>
+			<view class="search-input">
+				<input type="text" placeholder='输入设备编码后6位' v-model="searchClientId" />
+			</view>
+			<view class="search-button">
+				<button type="primary" class="" @click="search()">
+					<p class="">添加</P>
+				</button>
+			</view>
+		</view>
+		<!-- //多选下拉框 -->
+		<view class="select-item">
+			<ld-select :multiple="true" :list="equipmentNameList" label-key="label" value-key="value"
+				placeholder="请选择机器或通过搜索添加" clearable v-model="equipmentIds" @change="selectChange2"></ld-select>
+		</view>
+		<view class="uni-list">
+			<view class="uni-list-cell uni-list-cell-pd">
+				<view class="uni-list-cell-db">是否开启闹钟</view>
+				<switch :checked="status" @change="switchChange" />
+			</view>
+		</view>
+		<!-- //提交按钮 -->
+		<view class="tr">
+			<button v-if="clock=='add'" type="primary" formType="submit" @click="add()" class="button">
+				<p class="p1">添加</p>
+			</button>
+			<button v-if="clock!='add'" type="primary" formType="submit" @click="update()" class="button">
+				<p class="p1">修改</p>
+			</button>
+			<button v-if="clock!='add'" type="warn" formType="submit" @click="delet()" class="button">
+				<p class="p1">删除</p>
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	import MxDatePicker from "../../components/mx-datepicker/mx-datepicker.vue";
+	import ldSelect from "../../components/ld-select/ld-select.vue";
+	import likeButton from "../../components/like-button/like-button.vue";
+	export default {
+		components: {
+			MxDatePicker,
+			ldSelect,
+			likeButton
+		},
+		data() {
+			return {
+				showPicker: false,
+				// date: '2019/01/01',
+				time: '22:00:00',
+				// datetime: '2019/01/01 15:00:12',
+				// range: ['2019/01/01','2019/01/06'],
+				// rangetime: ['2019/01/08 14:00','2019/01/16 13:59'],
+				type: 'rangetime',
+				value: '',
+				//0:炉头开启,1:炉头关闭,2:开始休眠,3:结束休眠
+				array: ['开启炉头', '关闭炉头', '开始休眠', '结束休眠'],
+				indexType: 0,
+				Sunday: true,
+				Monday: true,
+				Tuesday: true,
+				Wednesday: true,
+				Thursday: true,
+				Friday: true,
+				Saturday: true,
+				week: '',
+				searchClientId: null,
+				equipmentName: null,
+				equipmentNameList: [],
+				globalUser: {},
+				equipmentIds: [],
+				clock: null,
+				status: true,
+			}
+		},
+		onShow() {
+			this.globalUser = uni.getStorageSync("globalUser");
+			this.clock = uni.getStorageSync("clock");
+			var token = uni.getStorageSync("token");
+			if (token.length > 1) {
+				this.getEquipmentListData();
+
+			} else {
+				uni.reLaunch({
+					url: '../../../pages/Login/Login',
+				});
+			}
+
+		},
+		onLoad() {
+			let that = this
+			// 回显
+			setTimeout(function() {
+				if (that.clock != "add") {
+					that.selectOne();
+				}
+			}, 2000)
+		},
+		methods: {
+			...mapActions('chart', ['getEquipmentListByUser', 'addAlarmClock', 'addAlarmClockItem', 'updateAlarmClock']),
+			getEquipmentListData() {
+				this.getEquipmentListByUser(this.globalUser)
+					.then(data => {
+						// this.merchantList = data;
+						console.log("1223");
+						var listName = data[0].equipmentList;
+						var equipmentNameList = this.equipmentNameList;
+						var co = {};
+						co["value"] = 'all';
+						co["label"] = '全部机器';
+						equipmentNameList.push(co);
+						for (var i = 0; i < listName.length; i++) {
+							var cov = {};
+							cov["value"] = listName[i].id;
+							cov["label"] = "名称:" + listName[i].name + " 编号:" + listName[i].clientId.substring(
+								listName[i].clientId.length - 6, listName[i].clientId.length);
+							equipmentNameList.push(cov);
+						}
+						this.equipmentNameList = equipmentNameList;
+						var listId = data[0].id;
+						if (listId != null && listId != '1') {
+							uni.setStorageSync("listName", listName);
+						}
+
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			selectOne() {
+				var token = uni.getStorageSync("token");
+				var id = this.clock;
+				var that = this;
+				uni.request({
+					url: this.serverurl + '/TAlarmClock/selectOne',
+					data: {
+						"id": id
+					},
+					header: {
+						'token': token
+					},
+					method: "POST",
+					success: (res) => {
+						if (res.data.code) {
+							var alarmClock = res.data.data;
+							console.log("list");
+							var status = alarmClock.status;
+							this.time = alarmClock.hour;
+							if (status == '0') {
+								this.status = false;
+							}
+							if (status == '1') {
+								this.status = true;
+							}
+							var equipmentIds = alarmClock.equipmentIds;
+							that.addEids(equipmentIds);
+							var week = alarmClock.week;
+							this.week = week;
+							if (week != null || week != '') {
+								var w = week.split(",").sort();
+								for (var j = 0; j < w.length; j++) {
+									var t = w[j];
+									switch (t) {
+										case "1":
+											this.Monday = false;
+											break;
+										case "2":
+											this.Tuesday = false;
+											break;
+										case "3":
+											this.Wednesday = false;
+											break;
+										case "4":
+											this.Thursday = false;
+											break;
+										case "5":
+											this.Friday = false;
+											break;
+										case "6":
+											this.Saturday = false;
+											break;
+										case "7":
+											this.Sunday = false;
+											break;
+										default:
+
+									}
+								}
+								var type = alarmClock.type;
+								switch (type) { //0:炉头开启,1:炉头关闭,2:开始休眠,3:结束休眠
+									case "0":
+										this.indexType = 0;
+										break;
+									case "1":
+										this.indexType = 1;
+										break;
+									case "2":
+										this.indexType = 2;
+										break;
+									case "3":
+										this.indexType = 3;
+										break;
+									default:
+
+								}
+							}
+						} else {
+							uni.showToast({
+								title: res.data.message,
+								duration: 2000
+							});
+						}
+
+
+					},
+				});
+			},
+			onShowDatePicker(type) { //显示
+				this.type = type;
+				this.showPicker = true;
+				this.value = this[type];
+			},
+			onSelected(e) { //选择
+				this.showPicker = false;
+				if (e) {
+					this[this.type] = e.value;
+					//选择的值
+					console.log('value => ' + e.value);
+					//原始的Date对象
+					console.log('date => ' + e.date);
+				}
+			},
+			bindPickerChange: function(e) {
+				this.indexType = e.target.value
+			},
+			wek(num) {
+				if (num == 1) {
+					if (this.Monday) {
+						this.Monday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Monday = true;
+						this.changWeek(0, num);
+					}
+				}
+				if (num == 2) {
+					if (this.Tuesday) {
+						this.Tuesday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Tuesday = true;
+						this.changWeek(0, num);
+					}
+				}
+				if (num == 3) {
+					if (this.Wednesday) {
+						this.Wednesday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Wednesday = true;
+						this.changWeek(0, num);
+					}
+				}
+				if (num == 4) {
+					if (this.Thursday) {
+						this.Thursday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Thursday = true;
+						this.changWeek(0, num);
+					}
+				}
+				if (num == 5) {
+					if (this.Friday) {
+						this.Friday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Friday = true;
+						this.changWeek(0, num);
+					}
+				}
+				if (num == 6) {
+					if (this.Saturday) {
+						this.Saturday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Saturday = true;
+						this.changWeek(0, num);
+					}
+				}
+				if (num == 7) {
+					if (this.Sunday) {
+						this.Sunday = false;
+						this.changWeek(1, num);
+					} else {
+						this.Sunday = true;
+						this.changWeek(0, num);
+					}
+				}
+			},
+			changWeek(type, num) {
+				var week = this.week;
+				var we = '';
+				//减
+				if (type == 0) {
+					var w = week.split(",").sort();
+					for (var j = 1; j < w.length; j++) {
+						var t = w[j];
+						if (t != num) {
+							we = we + t + ","
+						}
+					}
+				}
+				//加
+				if (type == 1) {
+					if (week == '' || week == null) {
+						we = num + ","
+					} else {
+						week += num + ",";
+						var w = week.split(",").sort();
+						for (var j = 1; j < w.length; j++) {
+							var t = w[j];
+							we = we + t + ","
+						}
+					}
+
+				}
+				this.week = we;
+				console.log('we => ' + this.week);
+			},
+			addEids(equipmentIds) {
+				console.log('equipmentIds' + equipmentIds);
+				var eids = equipmentIds.split(",");
+				var idss = this.equipmentIds;
+				var is = this.equipmentNameList
+				for (var k = 0; k < eids.length; k++) {
+					var id = eids[k];
+					if (id != "" && id != '') {
+						this.equipmentIds.push(parseInt(id));
+					}
+				}
+			},
+			search() {
+				console.log("search");
+				var clientId = this.searchClientId;
+				var list = uni.getStorageSync("listName");
+				var n = 0;
+				for (var i = 0; i < list.length; i++) {
+					var code = list[i].clientId.substring(list[i].clientId.length - 6, list[i].clientId.length);
+					if (code == clientId) {
+						n++;
+						var id = list[i].id;
+						this.equipmentIds.push(id);
+						break;
+					}
+				}
+				if (n == 0) {
+					uni.showModal({
+						title: "提示",
+						content: "找不到该机器",
+						success: (res) => {
+
+						}
+					})
+				}
+				if (n > 0) {
+					uni.showModal({
+						title: "提示",
+						content: "已添加该机器",
+						success: (res) => {
+
+						}
+					})
+				}
+			},
+			selectChange2(val) {
+				//有改动文件 import likeButton from "../../components/like-button/like-button.vue";
+				if (val == "all") {
+					this.equipmentIds = [];
+					var list = uni.getStorageSync("listName");
+					for (var i = 0; i < list.length; i++) {
+						this.equipmentIds.push(list[i].id);
+					}
+				} else {
+					this.equipmentIds = val
+				}
+				console.log('this.equipmentIds => ' + this.equipmentIds);
+			},
+			switchChange: function(e) {
+				this.status = e.target.value;
+			},
+			add() {
+				const param = {};
+				param['week'] = this.week;
+				param['hour'] = this.time;
+				if (this.status) {
+					param['status'] = "1";
+				} else {
+					param['status'] = "0";
+				}
+				param['type'] = this.indexType;
+				var eids = '';
+				var ids = this.equipmentIds;
+				for (var j = 0; j < ids.length; j++) {
+					var t = ids[j];
+					eids = eids + t + ","
+				}
+				param['equipmentIds'] = eids;
+				param['adminId'] = this.globalUser.id;
+				console.log("param =>" + param);
+				this.addAlarmClock(param)
+					.then(res => {
+						if (res.code) {
+							this.addAlarmClockItems(res.data);
+						}
+						// uni.showModal({
+						// 	title: "提示",
+						// 	content: res.message,
+						// 	success: (re) => {
+						// 		if (re.confirm) {
+						// 			uni.reLaunch({
+						// 				url: 'alarmClockList',
+						// 			});
+						// 		}
+						// 	}
+						// })
+
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			addAlarmClockItems(alarmClock) {
+				console.log("alarmClock =>" + alarmClock);
+				this.addAlarmClockItem(alarmClock)
+					.then(res => {
+						uni.showModal({
+							title: "提示",
+							content: res.message,
+							success: (re) => {
+								if (re.confirm) {
+									// uni.navigateTo({
+									// 	url: 'alarmClockList',
+									// });
+									uni.navigateBack({
+									    url:'alarmClockList'
+									});
+								}
+							}
+						})
+						
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			update() {
+				const param = {};
+				param['id'] = this.clock;
+				param['week'] = this.week;
+				param['hour'] = this.time;
+				if (this.status) {
+					param['status'] = "1";
+				} else {
+					param['status'] = "0";
+				}
+				param['type'] = this.indexType;
+				var eids = '';
+				var ids = this.equipmentIds;
+				for (var j = 0; j < ids.length; j++) {
+					var t = ids[j];
+					eids = eids + t + ","
+				}
+				param['equipmentIds'] = eids;
+				param['adminId'] = this.globalUser.id;
+				this.updateAlarmClock(param)
+					.then(res => {
+						uni.showToast({
+							title: res.message,
+							duration: 2000
+						});
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			delet() {
+				uni.showModal({
+					title: "提示",
+					content: "是否删除?",
+					success: (res) => {
+						if (res.confirm) {
+							var eids = '';
+							var ids = this.equipmentIds;
+							for (var j = 0; j < ids.length; j++) {
+								var t = ids[j];
+								eids = eids + t + ","
+							}
+							var token = uni.getStorageSync("token");
+							uni.request({
+								url: this.serverurl + '/TAlarmClock/delete',
+								data: {
+									"id": this.clock,
+									"adminId": this.globalUser.id,
+									"equipmentIds": eids,
+									"type": this.indexType
+								},
+								header: {
+									'token': token
+								},
+								method: "POST",
+								success: (res) => {
+									uni.showModal({
+										title: "提示",
+										content: res.data.message,
+										success: (re) => {
+											if (re.confirm) {
+												// uni.navigateTo({
+												// 	url: 'alarmClockList',
+												// });
+												uni.navigateBack({
+												    url:'alarmClockList'
+												});
+											}
+										}
+									})
+
+								},
+							});
+						}
+					}
+				});
+
+			},
+		}
+	}
+</script>
+
+<style>
+	.test {
+		text-align: center;
+		padding: 10px 0;
+	}
+
+	.time {
+		font-size: 78upx;
+	}
+
+	.btime {
+		margin: 20upx;
+		font-size: 28upx;
+	}
+
+	/* 	button {
+		margin: 20upx;
+		font-size: 28upx;
+	} */
+
+	/* #ifdef MP-ALIPAY */
+	.uni-badge {
+		margin-left: 20rpx;
+	}
+
+	/* #endif */
+	.uni-badge {
+		font-size: 40upx;
+	}
+
+	.example-body {
+		flex-direction: row;
+		justify-content: flex-start;
+		padding-bottom: 15upx;
+		font-size: 40upx;
+	}
+
+	.uni-badge-left-margin {
+		font-size: 40upx;
+		margin-left: 50upx;
+	}
+
+	.uni-list-cell {
+		padding-top: 20upx;
+		padding-bottom: 10upx;
+		font-size: 35upx;
+	}
+
+	.line {
+		height: 2upx;
+		background: #8C959F;
+	}
+
+	.search {
+		width: 100%;
+		padding-top: 15upx;
+		padding-bottom: 25upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+	}
+
+	.search-title {
+		width: 28%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+	}
+
+	.search-input {
+		width: 45%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+	}
+
+	.search-button {
+		width: 20%;
+		padding-left: 7upx;
+		text-align: center;
+	}
+
+	.select-item {
+		/* padding-top: 20upx; */
+	}
+
+	.tr {
+		padding-top: 15upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		font-size: 48upx;
+		font-family: "PingFang-SC-Bold";
+		position: fixed;
+		bottom: 100upx;
+		width: 100%;
+	}
+
+	.button {
+		margin: auto;
+		width: 60%;
+		height: 100upx;
+	}
+
+	.p1 {
+		font-size: 48upx;
+	}
+</style>

+ 224 - 0
packageA/pages/remote/alarmClockList.vue

@@ -0,0 +1,224 @@
+<template>
+	<view>
+		<view class="head">
+			<view class="left-top">
+				<p class="left-top-p">闹钟</p>
+			</view>
+			<view class="right-top">
+				<p class="right-top-p" @click="addAlarmClockItem()">+</p>
+			</view>
+		</view>
+		<view class="body">
+			<uni-collapse :accordion="true">
+				<uni-list>
+					<view v-for="(alarmClock,index) in alarmClockList" :key="index">
+						<uni-list-item :title="alarmClock.hour" :note="alarmClock.week+'---'+alarmClock.type"
+							:rightText="alarmClock.status" clickable @click="onClick(alarmClock.id)" />
+					</view>
+				</uni-list>
+			</uni-collapse>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex';
+	import uniCollapse from '@/components/uni-collapse/uni-collapse.vue';
+	import uniCollapseItem from '@/components/uni-collapse-item/uni-collapse-item.vue';
+	import uniList from '../../uni_modules/uni-list/components/uni-list/uni-list.vue';
+	import uniListItem from '../../uni_modules/uni-list/components/uni-list-item/uni-list-item.vue';
+	import uniIcons from '../../uni_modules/uni-icons/components/uni-icons/uni-icons.vue';
+	// import {
+	// 	dateUtils
+	// } from '@/common/util.js';
+	export default {
+		components: {
+			uniCollapse,
+			uniCollapseItem,
+			uniList,
+			uniListItem,
+			uniIcons
+		},
+		data() {
+			return {
+				globalUser: null,
+				alarmClockList: [],
+			}
+		},
+		onShow() {
+			var token = uni.getStorageSync("token");
+			if (token.length > 1) {
+				this.getAlarmClockList();
+			} else {
+				uni.reLaunch({
+					url: '../../../pages/Login/Login',
+				});
+			}
+		},
+		methods: {
+			getAlarmClockList() {
+				var token = uni.getStorageSync("token");
+				var adminId = uni.getStorageSync("globalUser").id;
+				uni.request({
+					url: this.serverurl + '/TAlarmClock/list',
+					data: {
+						"adminId": adminId
+					},
+					header: {
+						'token': token
+					},
+					method: "GET",
+					success: (res) => {
+						if (res.data.code) {
+							var alarmClockList = [];
+							var alarmClocks = res.data.data;
+							console.log("list");
+
+							for (var i = 0; i < alarmClocks.length; i++) {
+								var alarmClock = alarmClocks[i];
+								var status = alarmClock.status;
+								if (status == '0') {
+									alarmClock.status = "已关闭"
+								}
+								if (status == '1') {
+									alarmClock.status = "已启用"
+								}
+								var week = alarmClock.week;
+								if (week != null || week != '') {
+									var zhou = '';
+									var w = week.split(",").sort();
+									for (var j = 0; j < w.length; j++) {
+										var t = w[j];
+										switch (t) {
+											case "1":
+												zhou = zhou + "周一,"
+												break;
+											case "2":
+												zhou = zhou + "周二,"
+												break;
+											case "3":
+												zhou = zhou + "周三,"
+												break;
+											case "4":
+												zhou = zhou + "周四,"
+												break;
+											case "5":
+												zhou = zhou + "周五,"
+												break;
+											case "6":
+												zhou = zhou + "周六,"
+												break;
+											case "7":
+												zhou = zhou + "周日"
+												break;
+											default:
+
+										}
+									}
+									alarmClock.week = zhou;
+									var type = alarmClock.type;
+									switch (type) { //0:炉头开启,1:炉头关闭,2:开始休眠,3:结束休眠
+										case "0":
+											type = "炉头开启"
+											break;
+										case "1":
+											type = "炉头关闭"
+											break;
+										case "2":
+											type = "开始休眠"
+											break;
+										case "3":
+											type = "结束休眠"
+											break;
+										default:
+
+									}
+									alarmClock.type = type;
+								}
+								alarmClockList.push(alarmClock);
+							}
+							this.alarmClockList = alarmClockList;
+						} else {
+							uni.showToast({
+								title: res.data.message,
+								duration: 2000
+							});
+						}
+
+
+					},
+				});
+			},
+			onClick(id) {
+				// console.log("id==" + id);
+				uni.setStorageSync("clock", id);
+				uni.navigateTo({
+					url: 'alarmClockItem'
+				});
+			},
+			addAlarmClockItem() {
+				// console.log("addAlarmClockItem");
+				uni.setStorageSync("clock", "add");
+				uni.navigateTo({
+					url: 'alarmClockItem'
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+	.head {
+		height: 100upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		background: #F8F8F8;
+	}
+
+	.left-top {
+		height: 100upx;
+		width: 50%;
+		text-align: left;
+	}
+
+	.left-top-p {
+		height: 100upx;
+		padding-left: 8upx;
+		color: #363D44;
+		font-size: 25px;
+		font-family: "PingFang-SC-Bold";
+	}
+
+	.right-top {
+		height: 100upx;
+		width: 50%;
+		text-align: right;
+		/* 垂直居中 */
+		/* position: relative;
+            top: 50%; /*偏移*/
+		/* transform: translateY(-50%); */
+	}
+
+	.right-top-p {
+		height: 100upx;
+		padding-right: 12upx;
+		color: #3496FB;
+		font-size: 35px;
+		font-family: "PingFang-SC-Bold";
+		/* 垂直居中 */
+		position: relative;
+		top: 25%;
+		/*偏移*/
+		transform: translateY(-50%);
+	}
+
+	.body {
+		background: #F8F8F8;
+	}
+</style>

+ 345 - 0
packageA/pages/remote/dosugar.vue

@@ -0,0 +1,345 @@
+<template>
+	<view>
+		<view class="search">
+			<view class="search-title">
+				输入机器编码
+			</view>
+			<view class="search-input">
+				<input type="text" placeholder='输入设备编码后6位' v-model="searchClientId" />
+			</view>
+			<view class="search-button">
+				<button type="primary" class="" @click="search()">
+					<p class="">搜索</P>
+				</button>
+			</view>
+		</view>
+		<view class="td-right">
+			<view class="uni-list">
+				<view class="uni-list-cell">
+					<view class="uni-list-cell-left">
+						点击选择机器
+					</view>
+					<view class="uni-list-cell-db" style="overflow: hidden;text-overflow: ellipsis;">
+						<picker @change="changeEquipment" :value="index" :range="equipmentNameList">
+							<view class="uni-input">{{equipmentNameList[index]}}</view>
+						</picker>
+					</view>
+				</view>
+				<view class="uni-list-cell">
+					<view class="uni-list-cell-left">
+						点击选择商品
+					</view>
+					<view class="uni-list-cell-db" style="overflow: hidden;text-overflow: ellipsis;">
+						<picker @change="changeProduct" :value="index2" :range="productList">
+							<view class="uni-input">{{productList[index2]}}</view>
+						</picker>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="p">
+			<p style="text-align:right" @click=sugarList()>今日做糖列表>>></p>
+		</view>
+		<view class="tr">
+			<button type="primary" formType="submit" @click="dosugar()" class="button">
+				<p class="p1">提交</p>
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				globalUser: {},
+				index: null,
+				index2: null,
+				equipmentName: null,
+				equipmentNameList: [],
+				products: [],
+				productList: [],
+				productName: null,
+				equipmentId: null,
+				searchClientId:null
+			}
+		},
+		onShow() {
+			this.globalUser = uni.getStorageSync("globalUser");
+			// uni.setNavigationBarTitle({
+			// 	title: this.$t('equipmentStatusList.title')
+			// });
+			// uni.setTabBarItem({
+			// 	index: 3,
+			// 	text: this.$t('tabs.tab4')
+			// });
+			var token = uni.getStorageSync("token");
+			if (token.length > 1) {
+				this.getEquipmentListData();
+			} else {
+				uni.reLaunch({
+					url: '../Login/Login',
+				});
+			}
+
+		},
+		methods: {
+			...mapActions('chart', ['getEquipmentListByUser']),
+			getEquipmentListData() {
+				this.getEquipmentListByUser(this.globalUser)
+					.then(data => {
+						this.merchantList = data;
+						var listName = data[0].equipmentList;
+						var equipmentNameList = [];
+						for (var i = 0; i < listName.length; i++) {
+							equipmentNameList.push("名称:" + listName[i].name + " 编号:" + listName[i].clientId.substring(
+								listName[i].clientId.length - 6, listName[i].clientId.length));
+						}
+						this.equipmentNameList = equipmentNameList;
+						var listId = data[0].id;
+						if (listId != null && listId != '1') {
+							uni.setStorageSync("listName", listName);
+						}
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			search(){
+				var clientId = this.searchClientId;
+				var list = uni.getStorageSync("listName");
+				var n = 0;
+				for (var i = 0; i < list.length; i++) {
+					var code = list[i].clientId.substring(list[i].clientId.length - 6, list[i].clientId.length);
+					if(code==clientId){
+						n++;
+						this.index = i;
+						var id = list[i].id;
+						this.getProName(id);
+						this.equipmentId = id;
+						this.productName = null;
+						this.index2 = null;
+						break;
+					}
+				}
+				if(n==0){
+					uni.showModal({
+						title: "提示",
+						content: "找不到该机器",
+						success: (res) => {
+					
+						}
+					})
+				}
+			},
+			sugarList() {
+				uni.navigateTo({
+					url: 'sugarList',
+				});
+			},
+			//改变机器
+			changeEquipment: function(e) {
+				this.index = e.target.value;
+				// console.log("index="+this.index)
+				var list = uni.getStorageSync("listName");
+				this.getProName(list[e.target.value].id);
+				this.equipmentId = list[e.target.value].id;
+				this.productName = null;
+				this.index2 = null;
+				this.searchClientId = null;
+			},
+			changeProduct: function(e) {
+				this.index2 = e.target.value;
+				// console.log("index="+this.index2)
+				var list = this.products;
+				this.productName = list[this.index2].productName;
+			},
+			//获取商品列表
+			getProName(equipmentId) {
+				// console.log("equipmentId="+equipmentId)
+				var token = uni.getStorageSync("token");
+				uni.request({
+					url: this.serverurl + '/TProduct/selectProducts',
+					data: {
+						"equimentId": equipmentId
+					},
+					header: {
+						'token': token
+					},
+					method: "GET",
+					success: (res) => {
+						var listName = res.data.data;
+						this.products = listName;
+						var productList = [];
+						for (var i = 0; i < listName.length; i++) {
+							productList.push(listName[i].productName);
+						}
+						this.productList = productList;
+					},
+				});
+			},
+			dosugar() {
+				uni.showModal({
+					title: "提示",
+					content: "是否远程做糖?",
+					success: (res) => {
+						if (res.confirm) {
+							var that = this;
+							var token = uni.getStorageSync("token");
+							var productName = this.productName;
+							if (productName == null) {
+								return;
+							}
+							var adminId = uni.getStorageSync("globalUser").id;
+							var equipmentId = this.equipmentId;
+							if (equipmentId == null) {
+								return;
+							}
+							uni.request({
+								url: this.serverurl + '/TSugarDo/doSugar',
+								data: {
+									"equipmentId": equipmentId,
+									"adminId": adminId,
+									"productName": productName
+								},
+								header: {
+									'token': token
+								},
+								method: "GET",
+								success: (res) => {
+									var code = res.data.code;
+									if (code == true) {
+										uni.showToast({
+											title: "发送成功",
+											duration: 2000
+										});
+										var sugar = res.data.data;
+										console.log(sugar.no);
+										var no = sugar.no;
+										setTimeout(function() {
+											that.selectSugar(no);
+										}, 7000);
+										// this.selectSugar(sugar.no)
+									} else {
+										uni.showToast({
+											title: res.data.message,
+											duration: 2000
+										});
+									}
+								},
+							});
+						} else if (res.cancel) {}
+
+					}
+				})
+			},
+			selectSugar(no) {
+				var token = uni.getStorageSync("token");
+				uni.request({
+					url: this.serverurl + '/TSugarDo/selectSugarStatus',
+					data: {
+						"no": no
+					},
+					header: {
+						'token': token
+					},
+					method: "GET",
+					success: (res) => {
+						var code = res.data.code;
+						if (code == true) {
+							uni.showModal({
+								title: "提示",
+								content: res.data.message,
+								success: (res) => {
+
+								}
+							})
+
+							// var sugar = res.data.data;
+						} else {
+							uni.showModal({
+								title: "提示",
+								content: res.data.message,
+								confirmText: "重新查询",
+								success: (res) => {
+									if (res.confirm) {
+										this.selectSugar(no);
+									} else if (res.cancel) {}
+								}
+							})
+						}
+					},
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+	.search{
+		width: 100%;
+		padding-top: 10upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+	}
+	.search-title{
+		width: 28%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+	}
+	.search-input{
+		width: 45%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+	}
+	.search-button{
+		width: 20%;
+		padding-left: 7upx;
+		text-align: center;
+	}
+	.tr {
+		padding-top: 15upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		font-size: 48upx;
+		font-family: "PingFang-SC-Bold";
+		position: fixed;
+		bottom: 100upx;
+		width: 100%;
+	}
+
+	.button {
+		margin: auto;
+		width: 60%;
+		height: 100upx;
+	}
+.p2 {
+		font-size: 30upx;
+		/* #ifndef H5 */
+		padding-top: 3upx;
+		/* #endif */
+		position: absolute;
+		/* 水平居中 */
+		left: 50%;
+		-webkit-transform: translateX(-50%);
+		transform: translateX(-50%);
+	}
+	.p1 {
+		font-size: 48upx;
+	}
+
+	.p {
+		align: right;
+		color: #007AFF;
+		padding-top: 30upx;
+	}
+</style>

+ 595 - 0
packageA/pages/remote/generalParameters.vue

@@ -0,0 +1,595 @@
+<template>
+	<view class="">
+		<!-- <view class="line">
+		</view> -->
+		
+		<view class="search">
+			<view class="search-title">
+				输入机器编码
+			</view>
+			<view class="search-input">
+				<input type="text" placeholder='输入设备编码后6位' v-model="searchClientId" />
+			</view>
+			<view class="search-button">
+				<button type="primary" class="" @click="search()">
+					<p class="">搜索</P>
+				</button>
+			</view>
+		</view>
+		<view class="td-right">
+			<view class="uni-list">
+				<view class="uni-list-cell">
+					<view class="uni-list-cell-left">
+						点击选择机器
+					</view>
+					<view class="uni-list-cell-db" style="overflow: hidden;text-overflow: ellipsis;">
+						<picker @change="changeEquipment" :value="index" :range="equipmentNameList">
+							<view class="uni-input">{{equipmentNameList[index]}}</view>
+						</picker>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view >
+			<view class="body">
+				<p class="p">炉头工作温度:</p>
+				<input class="input" type="text" v-model="D418" />
+				<button type="primary" class="button" @click="update('D418',D418)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">炉头中速:</p>
+				<input class="input" type="text" v-model="D406" />
+				<button type="primary" class="button" @click="update('D406',D406)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">水泵开启时间:</p>
+				<input class="input" type="text" v-model="D408" />
+				<button type="primary" class="button" @click="update('D408',D408)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">风机吹气时间:</p>
+				<input class="input" type="text" v-model="D409" />
+				<button type="primary" class="button" @click="update('D409',D409)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">下糖粗细系数:</p>
+				<input class="input" type="text" v-model="D416" />
+				<button type="primary" class="button" @click="update('D416',D416)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">柜内允许做糖温度误差:</p>
+				<input class="input" type="text" v-model="D419" />
+				<button type="primary" class="button" @click="update('D419',D419)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<view class="body">
+				<p class="p">回差调节:</p>
+				<input class="input" type="text" v-model="M504" />
+				<button type="primary" class="button" @click="update('M504',M504)">
+					<p class="p2">更新</P>
+				</button>
+			</view>
+			<view class="line2"></view>
+			<!-- 320和301特有 -->
+			<view class="" v-show="equimentType=='MG301'||equimentType=='MG320'">
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">炉头低速:</p>
+					<input class="input" type="text" v-model="D405" />
+					<button type="primary" class="button" @click="update('D405',D405)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">炉头高速:</p>
+					<input class="input" type="text" v-model="D407" />
+					<button type="primary" class="button" @click="update('D407',D407)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">手动门关闭等待时间:</p>
+					<input class="input" type="text" v-model="D412" />
+					<button type="primary" class="button" @click="update('D412',D412)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">低温环境设定(炉头升柜温):</p>
+					<input class="input" type="text" v-model="D460" />
+					<button type="primary" class="button" @click="update('D460',D460)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">高温环境设定(外循环风机):</p>
+					<input class="input" type="text" v-model="D461" />
+					<button type="primary" class="button" @click="update('D461',D461)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+			</view>
+			<!-- //320特有 -->
+			<view class="" v-show="equimentType=='MG320'">
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿时炉头升温N度:</p>
+					<input class="input" type="text" v-model="D467" />
+					<button type="primary" class="button" @click="update('D467',D467)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿时候监控时间:</p>
+					<input class="input" type="text" v-model="D468" />
+					<button type="primary" class="button" @click="update('D468',D468)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿OFF时间:</p>
+					<input class="input" type="text" v-model="D475" />
+					<button type="primary" class="button" @click="update('D475',D475)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿ON时间:</p>
+					<input class="input" type="text" v-model="D476" />
+					<button type="primary" class="button" @click="update('D476',D476)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿启动延时:</p>
+					<input class="input" type="text" v-model="D477" />
+					<button type="primary" class="button" @click="update('D477',D477)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿停止延时:</p>
+					<input class="input" type="text" v-model="D478" />
+					<button type="primary" class="button" @click="update('D478',D478)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">出棍后机械手等待时间:</p>
+					<input class="input" type="text" v-model="D471" />
+					<button type="primary" class="button" @click="update('D471',D471)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+			</view>
+			<!-- 301和280特有 -->
+			<view class="" v-show="equimentType=='MG301'||equimentType=='MG280'">
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">基准系数:</p>
+					<input class="input" type="text" v-model="D444" />
+					<button type="primary" class="button" @click="update('D444',D444)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">基准湿度:</p>
+					<input class="input" type="text" v-model="D445" />
+					<button type="primary" class="button" @click="update('D445',D445)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+			</view>
+			<!-- 280特有 -->
+			<view class="" v-show="equimentType=='MG280'">
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿OFF时间:</p>
+					<input class="input" type="text" v-model="D472" />
+					<button type="primary" class="button" @click="update('D472',D472)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+				<view class="line2"></view>
+				<view class="body">
+					<p class="p">加湿ON时间:</p>
+					<input class="input" type="text" v-model="D473" />
+					<button type="primary" class="button" @click="update('D473',D473)">
+						<p class="p2">更新</P>
+					</button>
+				</view>
+			</view>
+		</view>
+		<view class="line2"></view>
+	</view>
+</template>
+<script>
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				D418: 0,
+				D405: 0,
+				D406: 0,
+				D407: 0,
+				D408: 0,
+				D409: 0,
+				D412: 0,
+				D416: 0,
+				D460: 0,
+				D461: 0,
+				D419: 0,
+				D435: 0,
+				D467: 0,
+				D468: 0,
+				M504: 0,
+				D475: 0,
+				D476: 0,
+				D477: 0,
+				D478: 0,
+				D471: 0,
+				D444: 0,
+				D445: 0,
+				D472: 0,
+				D473: 0,
+				index: null,
+				equipmentName: null,
+				equimentType: null,
+				equipmentId:null,
+				equipmentNameList: [],
+				globalUser: null,
+				show: true,
+				searchClientId:null
+			}
+		},
+		onShow() {
+			var token = uni.getStorageSync("token");
+			this.globalUser = uni.getStorageSync("globalUser");
+			if (token.length > 1) {
+				this.getEquipmentListData();
+				// this.getParam();
+			} else {
+				uni.reLaunch({
+					url: '../Login/Login',
+				});
+			}
+
+		},
+		methods: {
+			...mapActions('chart', ['getParameters', 'updateParameters', 'getEquipmentListByUser']),
+			getEquipmentListData() {
+				this.getEquipmentListByUser(this.globalUser)
+					.then(data => {
+						// this.merchantList = data;
+						var listName = data[0].equipmentList;
+						var equipmentNameList = [];
+						for (var i = 0; i < listName.length; i++) {
+							equipmentNameList.push("名称:" + listName[i].name + " 编号:" + listName[i].clientId.substring(
+								listName[i].clientId.length - 6, listName[i].clientId.length));
+						}
+						this.equipmentNameList = equipmentNameList;
+						var listId = data[0].id;
+						if (listId != null && listId != '1') {
+							uni.setStorageSync("listName", listName);
+						}
+						uni.stopPullDownRefresh();
+					}, _ => void uni.stopPullDownRefresh());
+			},
+			search(){
+				var clientId = this.searchClientId;
+				var list = uni.getStorageSync("listName");
+				var n = 0;
+				for (var i = 0; i < list.length; i++) {
+					var code = list[i].clientId.substring(list[i].clientId.length - 6, list[i].clientId.length);
+					if(code==clientId){
+						n++;
+						this.D418=null;
+						this.D405=null;
+						this.D406=null;
+						this.D407=null;
+						this.D408=null;
+						this.D409=null;
+						this.D412=null;
+						this.D416=null;
+						this.D460=null;
+						this.D461=null;
+						this.D419=null;
+						this.D435=null;
+						this.D467=null;
+						this.D468=null;
+						this.M504=null;
+						this.D475=null;
+						this.D476=null;
+						this.D477=null;
+						this.D478=null;
+						this.D471=null;
+						this.D444=null;
+						this.D445=null;
+						this.D472=null;
+						this.D473=null;
+						this.index = i;
+						var id = list[i].id;
+						this.equipmentId =  id;
+						this.equimentType = list[i].equimentType;
+						this.clientId = list[i].clientId;
+						this.show = true;
+						if (this.equimentType == 'MG280') {
+							this.show = false;
+						}
+						this.getParam();
+						break;
+					}
+				}
+				if(n==0){
+					uni.showModal({
+						title: "提示",
+						content: "找不到该机器",
+						success: (res) => {
+					
+						}
+					})
+				}
+			},
+			//改变机器
+			changeEquipment: function(e) {
+				this.D418=null;
+				this.D405=null;
+				this.D406=null;
+				this.D407=null;
+				this.D408=null;
+				this.D409=null;
+				this.D412=null;
+				this.D416=null;
+				this.D460=null;
+				this.D461=null;
+				this.D419=null;
+				this.D435=null;
+				this.D467=null;
+				this.D468=null;
+				this.M504=null;
+				this.D475=null;
+				this.D476=null;
+				this.D477=null;
+				this.D478=null;
+				this.D471=null;
+				this.D444=null;
+				this.D445=null;
+				this.D472=null;
+				this.D473=null;
+				this.searchClientId = null;
+				this.index = e.target.value;
+				var list = uni.getStorageSync("listName");
+				// this.getProName(list[e.target.value].id);
+				this.equipmentId = list[e.target.value].id;
+				this.equimentType = list[e.target.value].equimentType;
+				this.clientId = list[e.target.value].clientId;
+				this.show = true;
+				if (this.equimentType == 'MG280') {
+					this.show = false;
+				}
+				// console.log("eid==" + this.equipmentId);
+				// console.log("equimentType==" + this.equimentType);
+				this.getParam();
+			},
+			getParam() {
+				const param = {};
+				param['id'] = this.equipmentId;
+				// 0:通用参数;  1:进阶参数
+				param['status'] = '0';
+				param['clientId'] = this.clientId;
+				this.getParameters(param).then(res => {
+					var code = res.code;
+					if(code==false){
+						uni.showToast({
+							title: data.data.message,
+							duration: 2000
+						});
+						return;
+					}
+					var info = res.data;
+					if (info != null || info != '') {
+						for (var i = 0; i < info.length; i++) {
+							if (info[i].name == 'D418') {
+								this.D418 = info[i].val;
+							}
+							if (info[i].name == 'D405') {
+								this.D405 = info[i].val;
+							}
+							if (info[i].name == 'D406') {
+								this.D406 = info[i].val;
+							}
+							if (info[i].name == 'D407') {
+								this.D407 = info[i].val;
+							}
+							if (info[i].name == 'D408') {
+								this.D408 = info[i].val;
+							}
+							if (info[i].name == 'D409') {
+								this.D409 = info[i].val;
+							}
+							if (info[i].name == 'D412') {
+								this.D412 = info[i].val;
+							}
+							if (info[i].name == 'D416') {
+								this.D416 = info[i].val;
+							}
+							if (info[i].name == 'D460') {
+								this.D460 = info[i].val;
+							}
+							if (info[i].name == 'D461') {
+								this.D461 = info[i].val;
+							}
+							if (info[i].name == 'D419') {
+								this.D419 = info[i].val;
+							}
+							if (info[i].name == 'D435') {
+								this.D435 = info[i].val;
+							}
+							if (info[i].name == 'D467') {
+								this.D467 = info[i].val;
+							}
+							if (info[i].name == 'D468') {
+								this.D468 = info[i].val;
+							}
+							if (info[i].name == 'M504') {
+								this.M504 = info[i].val;
+							}
+							if (info[i].name == 'D475') {
+								this.D475 = info[i].val;
+							}
+							if (info[i].name == 'D476') {
+								this.D476 = info[i].val;
+							}
+							if (info[i].name == 'D477') {
+								this.D477 = info[i].val;
+							}
+							if (info[i].name == 'D478') {
+								this.D478 = info[i].val;
+							}
+							if (info[i].name == 'D471') {
+								this.D471 = info[i].val;
+							}
+							if (info[i].name == 'D444') {
+								this.D444 = info[i].val;
+							}
+							if (info[i].name == 'D445') {
+								this.D445 = info[i].val;
+							}
+							if (info[i].name == 'D472') {
+								this.D472 = info[i].val;
+							}
+							if (info[i].name == 'D473') {
+								this.D473 = info[i].val;
+							}
+						}
+					}
+
+				}, _ => void uni.stopPullDownRefresh());
+			},
+			update(name, val) {
+				const param = {};
+				param['id'] = this.equipmentId;
+				param['name'] = name;
+				param['val'] = val;
+				this.updateParameters(param).then(res => {
+					if (res.data == 'SUCCESS') {
+						uni.showToast({
+							title: '发送成功',
+							duration: 1000
+						});
+					}
+				}, _ => void uni.stopPullDownRefresh());
+			},
+		},
+	}
+</script>
+
+<style>
+	.search{
+		width: 100%;
+		padding-top: 10upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+	}
+	.search-title{
+		width: 28%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+	}
+	.search-input{
+		width: 45%;
+		text-align: center;
+		font-size: 26upx;
+		font-family: "PingFang-SC-Bold";
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+	}
+	.search-button{
+		width: 20%;
+		padding-left: 7upx;
+		text-align: center;
+	}
+	.line {
+		height: 50upx;
+	}
+
+	.line2 {
+		height: 10upx;
+	}
+
+	.body {
+		background-color: #FFFFFF;
+		width: 700upx;
+		padding: 10upx 10upx 10upx 10upx;
+		display: flex;
+		flex-direction: row;
+		justify-content: flex-start;
+		font-size: 32upx;
+	}
+
+	.p {
+		width: 350upx;
+		text-align: right;
+	}
+
+	.input {
+		width: 200upx;
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+		text-align: center;
+	}
+
+	.button {
+		width: 120upx;
+		height: 60upx;
+		text-align: left;
+		border-radius: 10upx;
+
+	}
+
+	.p2 {
+		font-size: 30upx;
+		/* #ifndef H5 */
+		padding-top: 3upx;
+		/* #endif */
+		position: absolute;
+		/* 水平居中 */
+		left: 50%;
+		-webkit-transform: translateX(-50%);
+		transform: translateX(-50%);
+	}
+</style>

+ 29 - 0
packageA/pages/remote/parameters.vue

@@ -0,0 +1,29 @@
+<template>
+	<view class="">
+		<uni-list>
+			<uni-list-item title="通用参数"  @click="general()"></uni-list-item>
+			<uni-list-item title="进阶参数"  @click="advanced()"></uni-list-item>
+		</uni-list>
+	</view>
+</template>
+
+<script>
+	export default {
+		methods: {
+			general(){
+				uni.navigateTo({
+					url:'generalParameters',
+				});
+			},
+			advanced(){
+				uni.navigateTo({
+					url: 'advancedParameters',
+				});
+			},
+			
+		}
+	}
+</script>
+
+<style>
+</style>

+ 69 - 0
packageA/pages/remote/remoteList.vue

@@ -0,0 +1,69 @@
+<template>
+	<view>
+		<view>
+			<uni-collapse :accordion="true">
+				<uni-list>
+					<view v-show="show">
+						<uni-list-item title="远程做糖" @click="sugar()" />
+					</view>
+					<view v-show="show2">
+						<uni-list-item title="参数调整" @click="parameters()" />
+					</view>
+					<view v-show="show">
+						<uni-list-item title="闹钟" @click="alarmClock()" />
+					</view>
+				</uni-list>
+			</uni-collapse>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniList from '@/components/uni-list/uni-list.vue'
+	import uniListItem from '@/components/uni-list-item/uni-list-item.vue'
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				show: true,
+				show2: true
+			}
+		},
+		onShow(state) {
+			var globalUser = uni.getStorageSync("globalUser");
+			var gid = globalUser.id;
+			var name = globalUser.name;
+			// if (gid != 1||gid != 236||name!="邱咪") {
+			// this.show = true;
+			// this.show2 = true;
+			// }
+		},
+		methods: {
+			sugar() {
+				uni.navigateTo({
+					url: 'dosugar',
+				});
+			},
+			parameters() {
+				uni.navigateTo({
+					url: './parameters',
+				});
+			},
+			alarmClock() {
+				uni.navigateTo({
+					url: 'alarmClockList',
+				});
+			},
+		}
+	}
+	
+	
+</script>
+
+<style>
+
+</style>

+ 66 - 0
packageA/pages/remote/sugarList.vue

@@ -0,0 +1,66 @@
+<template>
+	<view>
+		<!-- <list>
+		    注意事项: 不能使用 index 作为 key 的唯一标识 -->
+		    <!-- <cell v-for="(item, index) in sugarList" :key="item.id">
+		      <text>{{item.productName}}</text>
+		    </cell>
+		  </list> --> 
+		  <view class="" style="padding: 10upx;">
+		  	
+		  </view>
+		  <view class="sugar" v-for="(item,index) in sugarList" :key="index">
+		  	{{item.productName}}
+		  </view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				sugarList:[]
+			}
+		},
+		onShow() {
+			var token = uni.getStorageSync("token");
+			if (token.length > 1) {
+				this.selectSugarList();
+			} else {
+				uni.reLaunch({
+					url: '../Login/Login',
+				});
+			}
+		},
+		methods: {
+			selectSugarList(){
+				var globalUser = uni.getStorageSync("globalUser");
+				var token = uni.getStorageSync("token");
+				uni.request({
+					url: this.serverurl + '/TSugarDo/selectSugarList',
+					data: {
+						"adminId": globalUser.id
+					},
+					header: {
+						'token': token
+					},
+					method: "GET",
+					success: (res) => {
+						this.sugarList = res.data.data;
+					},
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+	.sugar{
+		padding-top: 8upx;
+		padding-bottom: 8upx;
+		text-align:center;
+		color: #363D44;
+		font-size: 28upx;
+		font-family: "PingFang-SC-Medium";
+	}
+</style>

pages/User/equipmentName.vue → packageA/pages/user/equipmentName.vue


+ 77 - 0
packageA/pages/user/timeRule.vue

@@ -0,0 +1,77 @@
+<template>
+	<view>
+		<view >
+			<uni-collapse :accordion="true">
+				<uni-list>
+					<view  v-for="equipment in equipmentList" :key="equipment.id">
+						<uni-list-item :title="getMerchantTitle(equipment)" @click="openEquipmentStatisticsByAdmin(equipment)"/>
+					</view>
+				</uni-list>
+			</uni-collapse>	
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniList from '@/components/uni-list/uni-list.vue'
+	import uniListItem from '@/components/uni-list-item/uni-list-item.vue'
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				globalUser:{},
+				equipmentList: [],
+				merchantList:[{equipmentList:[]}],
+				extraIcon: {
+					color: '#4cd964',
+					size: '22',
+					type: 'spinner'
+				}
+			}
+		},
+		onShow(state){
+			this.globalUser = uni.getStorageSync("globalUser");
+			this.init();
+		},
+		onLoad(state){
+			// this.init();
+		},
+		onPullDownRefresh() {
+			this.init();
+		},
+		methods: {
+			...mapActions('chart', ['getEquipmentListByUser']),
+			async init(){
+				await this.getEquipmentListData();
+			},
+			openEquipmentStatisticsByAdmin(merchant){
+				uni.setStorageSync("timeSet",merchant.id);
+				uni.setStorageSync("bootTime",merchant.bootTime);
+				uni.setStorageSync("offTime",merchant.offTime);
+				uni.navigateTo({
+					url: 'timeSelect',
+				});
+			},
+			getMerchantTitle(merchant){
+				return merchant.name?merchant.name:merchant.username;
+			},
+			getEquipmentListData(){
+				this.getEquipmentListByUser(this.globalUser)
+				.then(data => {
+					this.merchantList = data;
+					this.equipmentList = data[0].equipmentList;
+					uni.stopPullDownRefresh();
+				}
+				, _ => void uni.stopPullDownRefresh());
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 49 - 0
packageA/pages/user/timeSelect.vue

@@ -0,0 +1,49 @@
+<template>
+	<view>
+		<uni-collapse :accordion="true">
+			<uni-list>
+				<view >
+					<uni-list-item title="开机" @click="open()"/>
+				</view>
+				<view >
+					<uni-list-item title="关机" @click="off()"/>
+				</view>
+			</uni-list>
+		</uni-collapse>	
+	</view>
+</template>
+
+<script>
+	import uniList from '@/components/uni-list/uni-list.vue'
+	import uniListItem from '@/components/uni-list-item/uni-list-item.vue'
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			open(){
+				uni.setStorageSync("timeFlag","boot");
+				uni.navigateTo({
+					url: 'timeSet',
+				});
+			},
+			off(){
+				uni.setStorageSync("timeFlag","off");
+				uni.navigateTo({
+					url: 'timeSet',
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 335 - 0
packageA/pages/user/timeSet.vue

@@ -0,0 +1,335 @@
+<template>
+	<view class="content">
+		<view class="box-title">当前定时{{ title }}时间</view>
+		<timeSelector showType="time" @btnConfirm="btnConfirm0" @btnCancel="btnCancel0">
+			<view class="box-time">
+				<input type="text" class="input" :value="time0" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm1" @btnCancel="btnCancel1">
+			<view class="box-time">
+				<input type="text" class="input" :value="time1" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm2" @btnCancel="btnCancel2">
+			<view class="box-time">
+				<input type="text" class="input" :value="time2" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm3" @btnCancel="btnCancel3">
+			<view class="box-time">
+				<input type="text" class="input" :value="time3" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm4" @btnCancel="btnCancel4">
+			<view class="box-time">
+				<input type="text" class="input" :value="time4" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm5" @btnCancel="btnCancel5">
+			<view class="box-time">
+				<input type="text" class="input" :value="time5" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm6" @btnCancel="btnCancel6">
+			<view class="box-time">
+				<input type="text" class="input" :value="time6" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm7" @btnCancel="btnCancel7">
+			<view class="box-time">
+				<input type="text" class="input" :value="time7" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm8" @btnCancel="btnCancel8">
+			<view class="box-time">
+				<input type="text" class="input" :value="time8" />
+			</view>
+		</timeSelector>
+		<timeSelector showType="time" @btnConfirm="btnConfirm9" @btnCancel="btnCancel9">
+			<view class="box-time">
+				<input type="text" class="input" :value="time9" />
+			</view>
+		</timeSelector>
+
+		<view class="bu">
+			<button type="primary" @click="submit()" class="button">
+				<p class="p">提交</p>
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapActions,
+		mapMutations
+	} from 'vuex';
+	import timeSelector from '@/components/wing-time-selector/wing-time-selector.vue';
+	export default {
+		components: {
+			timeSelector
+		},
+		data() {
+			return {
+				title: '',
+				time0: '',
+				time1: '',
+				time2: '',
+				time3: '',
+				time4: '',
+				time5: '',
+				time6: '',
+				time7: '',
+				time8: '',
+				time9: ''
+			};
+		},
+		onLoad() {
+			var timeFlag = uni.getStorageSync("timeFlag");
+			var rule;
+			if(timeFlag=='boot'){
+				this.title = '开机';
+				rule = uni.getStorageSync("bootTime");
+			}
+			if(timeFlag=='off'){
+				this.title = '关机';
+				rule = uni.getStorageSync("offTime");
+			}
+			
+			var rules = rule.split(",");
+			if(rules.length>0){
+				for(var i=0;i<rules.length;i++){
+					switch (i) {
+					    case 0:
+					        this.time0=rules[i];
+					        break;
+					    case 1:
+					        this.time1=rules[i];
+					         break;
+					    case 2:
+					        this.time2=rules[i];
+					         break;
+					    case 3:
+					        this.time3=rules[i];
+					         break;
+					    case 4:
+					        this.time4=rules[i];
+					         break;
+					    case 5:
+					        this.time5=rules[i];
+					         break;
+					    case 6:
+					        this.time6=rules[i];
+							break;
+						case 7:
+						    this.time7=rules[i];
+						    break;
+						case 8:
+						    this.time8=rules[i];
+						    break;
+						case 9:
+						    this.time9=rules[i];
+						    break;
+					} 
+				}
+			}
+		},
+		onShow() {
+			
+		},
+		methods: {
+			...mapActions('chart', ['updateRule']),
+			btnConfirm0(e) {
+				console.log('确定时间为:', e);
+				this.time0 = e.key;
+			},
+			btnCancel0() {
+				this.time0 = '';
+			},
+
+			btnConfirm1(e) {
+				this.time1 = e.key;
+			},
+			btnCancel1() {
+				this.time1 = '';
+			},
+
+			btnConfirm2(e) {
+				this.time2 = e.key;
+			},
+			btnCancel2() {
+				this.time2 = '';
+			},
+
+			btnConfirm3(e) {
+				this.time3 = e.key;
+			},
+			btnCancel3() {
+				this.time3 = '';
+			},
+
+			btnConfirm4(e) {
+				this.time4 = e.key;
+			},
+			btnCancel4() {
+				this.time4 = '';
+			},
+
+			btnConfirm5(e) {
+				this.time5 = e.key;
+			},
+			btnCancel5() {
+				this.time5 = '';
+			},
+
+			btnConfirm6(e) {
+				this.time6 = e.key;
+			},
+			btnCancel6() {
+				this.time6 = '';
+			},
+
+			btnConfirm7(e) {
+				this.time7 = e.key;
+			},
+			btnCancel7() {
+				this.time7 = '';
+			},
+
+			btnConfirm8(e) {
+				this.time8 = e.key;
+			},
+			btnCancel8() {
+				this.time8 = '';
+			},
+
+			btnConfirm9(e) {
+				this.time9 = e.key;
+			},
+			btnCancel9() {
+				this.time9 = '';
+			},
+			submit() {
+				var rules = [];
+				if (this.time0 != '') {
+					rules.push(this.time0);
+				}
+				if (this.time1 != '') {
+					rules.push(this.time1);
+				}
+				if (this.time2 != '') {
+					rules.push(this.time2);
+				}
+				if (this.time3 != '') {
+					rules.push(this.time3);
+				}
+				if (this.time4 != '') {
+					rules.push(this.time4);
+				}
+				if (this.time5 != '') {
+					rules.push(this.time5);
+				}
+				if (this.time6 != '') {
+					rules.push(this.time6);
+				}
+				if (this.time7 != '') {
+					rules.push(this.time7);
+				}
+				if (this.time8 != '') {
+					rules.push(this.time8);
+				}
+				if (this.time9 != '') {
+					rules.push(this.time9);
+				}
+				var rule;
+				if (rules.length > 0) {
+					rule = rules.join(",");
+				}
+
+				const param = {};
+				var equipmentId = uni.getStorageSync("timeSet");
+				if (equipmentId != '') {
+					param['id'] = equipmentId;
+				}
+				var timeFlag = uni.getStorageSync("timeFlag");
+				if(timeFlag=='boot'){
+					param['bootTime'] =rules.toString();
+				}
+				if(timeFlag=='off'){
+					param['offTime'] =rules.toString();
+				}
+				return this.updateRule(param)
+					.then(data => {
+						if (data.message == "SUCCESS") {
+							uni.setStorageSync("bootTime",data.data.bootTime);
+							uni.setStorageSync("offTime",data.data.offTime);
+							uni.showToast({
+								title: "修改成功",
+								icon: 'none',
+								duration: 1000
+							});
+						}
+						if (data == "ERROR") {
+							uni.showToast({
+								title: "修改失败",
+								icon: 'none',
+								duration: 1000
+							});
+						}
+						if (data == "") {
+							uni.showToast({
+								title: "修改异常",
+								icon: 'none',
+								duration: 1000
+							});
+						}
+					}, _ => void uni.stopPullDownRefresh());
+			},
+		}
+	};
+</script>
+
+<style>
+	.box-title {
+		margin: 24upx;
+		font-size: 40upx;
+		font-weight: bold;
+		color: #333333;
+		padding-left: 40upx;
+	}
+
+	.box-time {
+		margin: 24upx;
+		font-size: 30upx;
+		color: #3496fb;
+		padding-top: 10upx;
+		padding-left: 40upx;
+	}
+
+	.input {
+		/* padding: 10upx 20upx 10upx 0upx; */
+		padding-left: 20upx;
+		padding-top: 10upx;
+		background-color: #FFFFFF;
+		width: 600upx;
+		height: 50upx;
+		box-shadow: 0upx 0upx 20upx #D3D3D3;
+		border-radius: 5upx;
+	}
+
+	.bu {
+		font-size: 50upx
+	}
+
+	.button {
+		width: 220upx;
+		height: 100upx;
+	}
+
+	.p {
+		/* transform: translateY(-8upx); */
+		font-size: 50upx
+	}
+</style>

+ 2 - 0
packageA/uni_modules/uni-badge/changelog.md

@@ -0,0 +1,2 @@
+## 1.0.6(2021-02-04)
+- 调整为uni_modules目录规范

+ 156 - 0
packageA/uni_modules/uni-badge/components/uni-badge/uni-badge.vue

@@ -0,0 +1,156 @@
+<template>
+	<text v-if="text" :class="inverted ? 'uni-badge--' + type + ' uni-badge--' + size + ' uni-badge--' + type + '-inverted' : 'uni-badge--' + type + ' uni-badge--' + size"
+	 :style="badgeStyle" class="uni-badge" @click="onClick()">{{ text }}</text>
+</template>
+
+<script>
+	/**
+	 * Badge 数字角标
+	 * @description 数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=21
+	 * @property {String} text 角标内容
+	 * @property {String} type = [default|primary|success|warning|error] 颜色类型
+	 * 	@value default 灰色
+	 * 	@value primary 蓝色
+	 * 	@value success 绿色
+	 * 	@value warning 黄色
+	 * 	@value error 红色
+	 * @property {String} size = [normal|small] Badge 大小
+	 * 	@value normal 一般尺寸
+	 * 	@value small 小尺寸
+	 * @property {String} inverted = [true|false] 是否无需背景颜色
+	 * @event {Function} click 点击 Badge 触发事件
+	 * @example <uni-badge text="1"></uni-badge>
+	 */
+	export default {
+		name: 'UniBadge',
+		props: {
+			type: {
+				type: String,
+				default: 'default'
+			},
+			inverted: {
+				type: Boolean,
+				default: false
+			},
+			text: {
+				type: [String, Number],
+				default: ''
+			},
+			size: {
+				type: String,
+				default: 'normal'
+			}
+		},
+		data() {
+			return {
+				badgeStyle: ''
+			};
+		},
+		watch: {
+			text() {
+				this.setStyle()
+			}
+		},
+		mounted() {
+			this.setStyle()
+		},
+		methods: {
+			setStyle() {
+				this.badgeStyle = `width: ${String(this.text).length * 8 + 12}px`
+			},
+			onClick() {
+				this.$emit('click');
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$bage-size: 12px;
+	$bage-small: scale(0.8);
+	$bage-height: 20px;
+
+	.uni-badge {
+		/* #ifndef APP-PLUS */
+		display: flex;
+		box-sizing: border-box;
+		overflow: hidden;
+		/* #endif */
+		justify-content: center;
+		flex-direction: row;
+		height: $bage-height;
+		line-height: $bage-height;
+		color: $uni-text-color;
+		border-radius: 100px;
+		background-color: $uni-bg-color-hover;
+		background-color: transparent;
+		text-align: center;
+		font-family: 'Helvetica Neue', Helvetica, sans-serif;
+		font-size: $bage-size;
+		padding: 0px 6px;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-badge--inverted {
+		padding: 0 5px 0 0;
+		color: $uni-bg-color-hover;
+	}
+
+	.uni-badge--default {
+		color: $uni-text-color;
+		background-color: $uni-bg-color-hover;
+	}
+
+	.uni-badge--default-inverted {
+		color: $uni-text-color-grey;
+		background-color: transparent;
+	}
+
+	.uni-badge--primary {
+		color: $uni-text-color-inverse;
+		background-color: $uni-color-primary;
+	}
+
+	.uni-badge--primary-inverted {
+		color: $uni-color-primary;
+		background-color: transparent;
+	}
+
+	.uni-badge--success {
+		color: $uni-text-color-inverse;
+		background-color: $uni-color-success;
+	}
+
+	.uni-badge--success-inverted {
+		color: $uni-color-success;
+		background-color: transparent;
+	}
+
+	.uni-badge--warning {
+		color: $uni-text-color-inverse;
+		background-color: $uni-color-warning;
+	}
+
+	.uni-badge--warning-inverted {
+		color: $uni-color-warning;
+		background-color: transparent;
+	}
+
+	.uni-badge--error {
+		color: $uni-text-color-inverse;
+		background-color: $uni-color-error;
+	}
+
+	.uni-badge--error-inverted {
+		color: $uni-color-error;
+		background-color: transparent;
+	}
+
+	.uni-badge--small {
+		transform: $bage-small;
+		transform-origin: center center;
+	}
+</style>

+ 83 - 0
packageA/uni_modules/uni-badge/package.json

@@ -0,0 +1,83 @@
+{
+  "id": "uni-badge",
+  "displayName": "Badge 数字角标",
+  "version": "1.0.6",
+  "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。",
+  "keywords": [
+    "",
+    "badge",
+    "uni-ui",
+    "数字角标",
+    "徽章"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "u",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "u",
+          "Android Browser": "u",
+          "微信浏览器(Android)": "u",
+          "QQ浏览器(Android)": "u"
+        },
+        "H5-pc": {
+          "Chrome": "u",
+          "IE": "u",
+          "Edge": "u",
+          "Firefox": "u",
+          "Safari": "u"
+        },
+        "小程序": {
+          "微信": "u",
+          "阿里": "u",
+          "百度": "u",
+          "字节跳动": "u",
+          "QQ": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 43 - 0
packageA/uni_modules/uni-badge/readme.md

@@ -0,0 +1,43 @@
+
+
+## Badge 数字角标
+> 代码块: `uBadge`
+
+
+数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景,
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+<uni-badge text="1"></uni-badge>
+<uni-badge text="2" type="purple" @click="bindClick"></uni-badge>
+<uni-badge text="3" type="primary" :inverted="true"></uni-badge>
+```
+
+
+## API
+
+### Badge Props
+
+|属性名		|类型		|默认值	|说明																											|
+|:-:		|:-:		|:-:	|:-:					 																						|
+|text		|String		|-		|角标内容																										|
+|type		|String		|default|颜色类型,可选值:default(灰色)、primary(蓝色)、success(绿色)、warning(黄色)、error(红色)|
+|size		|String		|normal|Badge 大小,可取值:normal、small|
+|inverted	|Boolean	|false	|是否无需背景颜色,为 true 时,背景颜色将变为文字的字体颜色														|
+
+### Badge Events
+
+|事件名	|事件说明			|返回参数	|
+|:-:	|:-:				|:-:		|
+|@click	|点击 Badge 触发事件| -			|
+
+

+ 2 - 0
packageA/uni_modules/uni-icons/changelog.md

@@ -0,0 +1,2 @@
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范

+ 132 - 0
packageA/uni_modules/uni-icons/components/uni-icons/icons.js

@@ -0,0 +1,132 @@
+export default {
+	"pulldown": "\ue588",
+	"refreshempty": "\ue461",
+	"back": "\ue471",
+	"forward": "\ue470",
+	"more": "\ue507",
+	"more-filled": "\ue537",
+	"scan": "\ue612",
+	"qq": "\ue264",
+	"weibo": "\ue260",
+	"weixin": "\ue261",
+	"pengyouquan": "\ue262",
+	"loop": "\ue565",
+	"refresh": "\ue407",
+	"refresh-filled": "\ue437",
+	"arrowthindown": "\ue585",
+	"arrowthinleft": "\ue586",
+	"arrowthinright": "\ue587",
+	"arrowthinup": "\ue584",
+	"undo-filled": "\ue7d6",
+	"undo": "\ue406",
+	"redo": "\ue405",
+	"redo-filled": "\ue7d9",
+	"bars": "\ue563",
+	"chatboxes": "\ue203",
+	"camera": "\ue301",
+	"chatboxes-filled": "\ue233",
+	"camera-filled": "\ue7ef",
+	"cart-filled": "\ue7f4",
+	"cart": "\ue7f5",
+	"checkbox-filled": "\ue442",
+	"checkbox": "\ue7fa",
+	"arrowleft": "\ue582",
+	"arrowdown": "\ue581",
+	"arrowright": "\ue583",
+	"smallcircle-filled": "\ue801",
+	"arrowup": "\ue580",
+	"circle": "\ue411",
+	"eye-filled": "\ue568",
+	"eye-slash-filled": "\ue822",
+	"eye-slash": "\ue823",
+	"eye": "\ue824",
+	"flag-filled": "\ue825",
+	"flag": "\ue508",
+	"gear-filled": "\ue532",
+	"reload": "\ue462",
+	"gear": "\ue502",
+	"hand-thumbsdown-filled": "\ue83b",
+	"hand-thumbsdown": "\ue83c",
+	"hand-thumbsup-filled": "\ue83d",
+	"heart-filled": "\ue83e",
+	"hand-thumbsup": "\ue83f",
+	"heart": "\ue840",
+	"home": "\ue500",
+	"info": "\ue504",
+	"home-filled": "\ue530",
+	"info-filled": "\ue534",
+	"circle-filled": "\ue441",
+	"chat-filled": "\ue847",
+	"chat": "\ue263",
+	"mail-open-filled": "\ue84d",
+	"email-filled": "\ue231",
+	"mail-open": "\ue84e",
+	"email": "\ue201",
+	"checkmarkempty": "\ue472",
+	"list": "\ue562",
+	"locked-filled": "\ue856",
+	"locked": "\ue506",
+	"map-filled": "\ue85c",
+	"map-pin": "\ue85e",
+	"map-pin-ellipse": "\ue864",
+	"map": "\ue364",
+	"minus-filled": "\ue440",
+	"mic-filled": "\ue332",
+	"minus": "\ue410",
+	"micoff": "\ue360",
+	"mic": "\ue302",
+	"clear": "\ue434",
+	"smallcircle": "\ue868",
+	"close": "\ue404",
+	"closeempty": "\ue460",
+	"paperclip": "\ue567",
+	"paperplane": "\ue503",
+	"paperplane-filled": "\ue86e",
+	"person-filled": "\ue131",
+	"contact-filled": "\ue130",
+	"person": "\ue101",
+	"contact": "\ue100",
+	"images-filled": "\ue87a",
+	"phone": "\ue200",
+	"images": "\ue87b",
+	"image": "\ue363",
+	"image-filled": "\ue877",
+	"location-filled": "\ue333",
+	"location": "\ue303",
+	"plus-filled": "\ue439",
+	"plus": "\ue409",
+	"plusempty": "\ue468",
+	"help-filled": "\ue535",
+	"help": "\ue505",
+	"navigate-filled": "\ue884",
+	"navigate": "\ue501",
+	"mic-slash-filled": "\ue892",
+	"search": "\ue466",
+	"settings": "\ue560",
+	"sound": "\ue590",
+	"sound-filled": "\ue8a1",
+	"spinner-cycle": "\ue465",
+	"download-filled": "\ue8a4",
+	"personadd-filled": "\ue132",
+	"videocam-filled": "\ue8af",
+	"personadd": "\ue102",
+	"upload": "\ue402",
+	"upload-filled": "\ue8b1",
+	"starhalf": "\ue463",
+	"star-filled": "\ue438",
+	"star": "\ue408",
+	"trash": "\ue401",
+	"phone-filled": "\ue230",
+	"compose": "\ue400",
+	"videocam": "\ue300",
+	"trash-filled": "\ue8dc",
+	"download": "\ue403",
+	"chatbubble-filled": "\ue232",
+	"chatbubble": "\ue202",
+	"cloud-download": "\ue8e4",
+	"cloud-upload-filled": "\ue8e5",
+	"cloud-upload": "\ue8e6",
+	"cloud-download-filled": "\ue8e9",
+	"headphones":"\ue8bf",
+	"shop":"\ue609"
+}

File diff ditekan karena terlalu besar
+ 71 - 0
packageA/uni_modules/uni-icons/components/uni-icons/uni-icons.vue


TEMPAT SAMPAH
packageA/uni_modules/uni-icons/components/uni-icons/uni.ttf


+ 81 - 0
packageA/uni_modules/uni-icons/package.json

@@ -0,0 +1,81 @@
+{
+  "id": "uni-icons",
+  "displayName": "Icons 图标",
+  "version": "1.1.4",
+  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+  "keywords": [
+    "icon",
+    "图标",
+    "uni-icons"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "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"
+        }
+      }
+    }
+  }
+}

+ 43 - 0
packageA/uni_modules/uni-icons/readme.md

@@ -0,0 +1,43 @@
+
+
+## Icons 图标
+> 代码块: `uIcons`
+
+
+用于展示 icons 图标 。
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+<uni-icons type="contact" size="30"></uni-icons>
+```
+
+## 图标示例
+
+点击复制图标类型
+<icons-layouts></icons-layouts>
+
+## API
+
+### Icons Props
+
+|属性名	|类型		|默认值	|说明				|
+|:-:	|:-:		|:-:	|:-:				|
+|size	|Number		|24		|图标大小			|
+|type	|String		|-		|图标图案,参考示例	|
+|color	|String		|-		|图标颜色			|
+
+
+### Icons Events
+|事件名	|说明			|返回值|
+|:-:	|:-:			|:-:  |
+|@click|点击 Icon 触发事件|-    |
+

+ 5 - 0
packageA/uni_modules/uni-list/changelog.md

@@ -0,0 +1,5 @@
+## 1.0.16(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+## 1.0.15(2021-02-05)
+- 调整为uni_modules目录规范
+- 修复 uni-list-chat 角标显示不正常的问题

+ 107 - 0
packageA/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue

@@ -0,0 +1,107 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+		<view class="uni-list-ad">
+			<view v-if="borderShow" :class="{'uni-list--border':border,'uni-list-item--first':isFirstChild}"></view>
+			<ad style="width: 200px;height: 300px;border-width: 1px;border-color: red;border-style: solid;" adpid="1111111111"
+			 unit-id="" appid="" apid="" type="feed" @error="aderror" @close="closeAd"></ad>
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom');
+	// #endif
+	export default {
+		name: 'UniListAd',
+		props: {
+			title: {
+				type: String,
+				default: '',
+
+			}
+		},
+		// inject: ['list'],
+		data() {
+			return {
+				isFirstChild: false,
+				border: false,
+				borderShow: true,
+			}
+		},
+
+		mounted() {
+			this.list = this.getForm()
+			if (this.list) {
+				if (!this.list.firstChildAppend) {
+					this.list.firstChildAppend = true
+					this.isFirstChild = true
+				}
+				this.border = this.list.border
+			}
+		},
+		methods: {
+			/**
+			 * 获取父元素实例
+			 */
+			getForm(name = 'uniList') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			aderror(e) {
+				console.log("aderror: " + JSON.stringify(e.detail));
+			},
+			closeAd(e) {
+				this.borderShow = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-list-ad {
+		position: relative;
+		border: 1px red solid;
+	}
+
+	.uni-list--border {
+		position: relative;
+		padding-bottom: 1px;
+		/* #ifdef APP-PLUS */
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		/* #endif */
+		margin-left: $uni-spacing-row-lg;
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border:after {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: $uni-border-color;
+	}
+
+	.uni-list-item--first:after {
+		height: 0px;
+	}
+
+	/* #endif */
+</style>

+ 58 - 0
packageA/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss

@@ -0,0 +1,58 @@
+/**
+ * 这里是 uni-list 组件内置的常用样式变量
+ * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码
+ *
+ */
+
+// 背景色
+$background-color : #fff;
+// 分割线颜色
+$divide-line-color : #e5e5e5;
+
+// 默认头像大小,如需要修改此值,注意同步修改 js 中的值 const avatarWidth = xx ,目前只支持方形头像
+// nvue 页面不支持修改头像大小
+$avatar-width : 45px ;
+
+// 头像边框
+$avatar-border-radius: 5px;
+$avatar-border-color: #eee;
+$avatar-border-width: 1px;
+
+// 标题文字样式
+$title-size : 16px;
+$title-color : #3b4144;
+$title-weight : normal;
+
+// 描述文字样式
+$note-size : 12px;
+$note-color : #999;
+$note-weight : normal;
+
+// 右侧额外内容默认样式
+$right-text-size : 12px;
+$right-text-color : #999;
+$right-text-weight : normal;
+
+// 角标样式
+// nvue 页面不支持修改圆点位置以及大小
+// 角标在左侧时,角标的位置,默认为 0 ,负数左/下移动,正数右/上移动
+$badge-left: 0px;
+$badge-top: 0px;
+
+// 显示圆点时,圆点大小
+$dot-width: 10px;
+$dot-height: 10px;
+
+// 显示角标时,角标大小和字体大小
+$badge-size : 18px;
+$badge-font : 12px;
+// 显示角标时,角标前景色
+$badge-color : #fff;
+// 显示角标时,角标背景色
+$badge-background-color : #ff5a5f;
+// 显示角标时,角标左右间距
+$badge-space : 6px;
+
+// 状态样式
+// 选中颜色
+$hover : #f5f5f5;

+ 533 - 0
packageA/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue

@@ -0,0 +1,533 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+		<view :hover-class="!clickable && !link ? '' : 'uni-list-chat--hover'" class="uni-list-chat" @click.stop="onClick">
+			<view :class="{ 'uni-list--border': border, 'uni-list-chat--first': isFirstChild }"></view>
+			<view class="uni-list-chat__container">
+				<view class="uni-list-chat__header-warp">
+					<view v-if="avatarCircle || avatarList.length === 0" class="uni-list-chat__header" :class="{ 'header--circle': avatarCircle }">
+						<image class="uni-list-chat__header-image" :src="avatar" mode="aspectFill"></image>
+					</view>
+					<!-- 头像组 -->
+					<view v-else class="uni-list-chat__header">
+						<view v-for="(item, index) in avatarList" :key="index" class="uni-list-chat__header-box" :class="computedAvatar"
+						 :style="{ width: imageWidth + 'px', height: imageWidth + 'px' }">
+							<image class="uni-list-chat__header-image" :style="{ width: imageWidth + 'px', height: imageWidth + 'px' }" :src="item.url"
+							 mode="aspectFill"></image>
+						</view>
+					</view>
+				</view>
+				<view v-if="badgeText && badgePositon === 'left'" class="uni-list-chat__badge uni-list-chat__badge-pos" :class="[isSingle]">
+					<text class="uni-list-chat__badge-text">{{ badgeText === 'dot' ? '' : badgeText }}</text>
+				</view>
+				<view class="uni-list-chat__content">
+					<view class="uni-list-chat__content-main">
+						<text class="uni-list-chat__content-title uni-ellipsis">{{ title }}</text>
+						<text class="uni-list-chat__content-note uni-ellipsis">{{ note }}</text>
+					</view>
+					<view class="uni-list-chat__content-extra">
+						<slot>
+							<text class="uni-list-chat__content-extra-text">{{ time }}</text>
+							<view v-if="badgeText && badgePositon === 'right'" class="uni-list-chat__badge" :class="[isSingle, badgePositon === 'right' ? 'uni-list-chat--right' : '']">
+								<text class="uni-list-chat__badge-text">{{ badgeText === 'dot' ? '' : badgeText }}</text>
+							</view>
+						</slot>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+	// 头像大小
+	const avatarWidth = 45;
+
+	/**
+	 * ListChat 聊天列表
+	 * @description 聊天列表,用于创建聊天类列表
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+	 * @property {String} 	title 							标题
+	 * @property {String} 	note 							描述
+	 * @property {Boolean} 	clickable = [true|false] 		是否开启点击反馈,默认为false
+	 * @property {String} 	badgeText						数字角标内容
+	 * @property {String}  	badgePositon = [left|right]		角标位置,默认为 right
+	 * @property {String} 	link = [false|navigateTo|redirectTo|reLaunch|switchTab] 是否展示右侧箭头并开启点击反馈,默认为false
+	 *  @value false	 	不开启
+	 *  @value navigateTo 	同 uni.navigateTo()
+	 * 	@value redirectTo 	同 uni.redirectTo()
+	 * 	@value reLaunch   	同 uni.reLaunch()
+	 * 	@value switchTab  	同 uni.switchTab()
+	 * @property {String | PageURIString} 	to  			跳转目标页面
+	 * @property {String} 	time							右侧时间显示
+	 * @property {Boolean} 	avatarCircle = [true|false]		是否显示圆形头像,默认为false
+	 * @property {String} 	avatar							头像地址,avatarCircle 不填时生效
+	 * @property {Array} 	avatarList 						头像组,格式为 [{url:''}]
+	 * @event {Function} 	click 							点击 uniListChat 触发事件
+	 */
+	export default {
+		name: 'UniListChat',
+		props: {
+			title: {
+				type: String,
+				default: ''
+			},
+			note: {
+				type: String,
+				default: ''
+			},
+			clickable: {
+				type: Boolean,
+				default: false
+			},
+			link: {
+				type: [Boolean, String],
+				default: false
+			},
+			to: {
+				type: String,
+				default: ''
+			},
+			badgeText: {
+				type: [String, Number],
+				default: ''
+			},
+			badgePositon: {
+				type: String,
+				default: 'right'
+			},
+			time: {
+				type: String,
+				default: ''
+			},
+			avatarCircle: {
+				type: Boolean,
+				default: false
+			},
+			avatar: {
+				type: String,
+				default: ''
+			},
+			avatarList: {
+				type: Array,
+				default () {
+					return [];
+				}
+			}
+		},
+		// inject: ['list'],
+		computed: {
+			isSingle() {
+				if (this.badgeText === 'dot') {
+					return 'uni-badge--dot';
+				} else {
+					const badgeText = this.badgeText.toString();
+					if (badgeText.length > 1) {
+						return 'uni-badge--complex';
+					} else {
+						return 'uni-badge--single';
+					}
+				}
+			},
+			computedAvatar() {
+				if (this.avatarList.length > 4) {
+					this.imageWidth = avatarWidth * 0.31;
+					return 'avatarItem--3';
+				} else if (this.avatarList.length > 1) {
+					this.imageWidth = avatarWidth * 0.47;
+					return 'avatarItem--2';
+				} else {
+					this.imageWidth = avatarWidth;
+					return 'avatarItem--1';
+				}
+			}
+		},
+		data() {
+			return {
+				isFirstChild: false,
+				border: true,
+				// avatarList: 3,
+				imageWidth: 50
+			};
+		},
+		mounted() {
+			this.list = this.getForm()
+			if (this.list) {
+				if (!this.list.firstChildAppend) {
+					this.list.firstChildAppend = true;
+					this.isFirstChild = true;
+				}
+				this.border = this.list.border;
+			}
+		},
+		methods: {
+			/**
+			 * 获取父元素实例
+			 */
+			getForm(name = 'uniList') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			onClick() {
+				if (this.to !== '') {
+					this.openPage();
+					return;
+				}
+
+				if (this.clickable || this.link) {
+					this.$emit('click', {
+						data: {}
+					});
+				}
+			},
+			openPage() {
+				if (['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].indexOf(this.link) !== -1) {
+					this.pageApi(this.link);
+				} else {
+					this.pageApi('navigateTo');
+				}
+			},
+			pageApi(api) {
+				uni[api]({
+					url: this.to,
+					success: res => {
+						this.$emit('click', {
+							data: res
+						});
+					},
+					fail: err => {
+						this.$emit('click', {
+							data: err
+						});
+						console.error(err.errMsg);
+					}
+				});
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$background-color: #fff;
+	$divide-line-color: #e5e5e5;
+	$avatar-width: 45px;
+	$avatar-border-radius: 5px;
+	$avatar-border-color: #eee;
+	$avatar-border-width: 1px;
+	$title-size: 16px;
+	$title-color: #3b4144;
+	$title-weight: normal;
+	$note-size: 12px;
+	$note-color: #999;
+	$note-weight: normal;
+	$right-text-size: 12px;
+	$right-text-color: #999;
+	$right-text-weight: normal;
+	$badge-left: 0px;
+	$badge-top: 0px;
+	$dot-width: 10px;
+	$dot-height: 10px;
+	$badge-size: 18px;
+	$badge-font: 12px;
+	$badge-color: #fff;
+	$badge-background-color: #ff5a5f;
+	$badge-space: 6px;
+	$hover: #f5f5f5;
+
+	.uni-list-chat {
+		font-size: $uni-font-size-lg;
+		position: relative;
+		flex-direction: column;
+		justify-content: space-between;
+		background-color: $background-color;
+	}
+
+	// .uni-list-chat--disabled {
+	// 	opacity: 0.3;
+	// }
+
+	.uni-list-chat--hover {
+		background-color: $hover;
+	}
+
+	.uni-list--border {
+		position: relative;
+		margin-left: $uni-spacing-row-lg;
+		/* #ifdef APP-PLUS */
+		border-top-color: $divide-line-color;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border:after {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: $divide-line-color;
+	}
+
+	.uni-list-item--first:after {
+		height: 0px;
+	}
+
+	/* #endif */
+
+	.uni-list-chat--first {
+		border-top-width: 0px;
+	}
+
+	.uni-ellipsis {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		/* #endif */
+	}
+
+	.uni-ellipsis-2 {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+		/* #endif */
+
+		/* #ifdef APP-NVUE */
+		lines: 2;
+		/* #endif */
+	}
+
+	.uni-list-chat__container {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+		padding: $uni-spacing-row-base $uni-spacing-row-lg;
+		position: relative;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__header-warp {
+		position: relative;
+	}
+
+	.uni-list-chat__header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		align-content: center;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		flex-wrap: wrap-reverse;
+		/* #ifdef APP-NVUE */
+		width: 50px;
+		height: 50px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		width: $avatar-width;
+		height: $avatar-width;
+		/* #endif */
+
+		border-radius: $avatar-border-radius;
+		border-color: $avatar-border-color;
+		border-width: $avatar-border-width;
+		border-style: solid;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__header-box {
+		/* #ifndef APP-PLUS */
+		box-sizing: border-box;
+		display: flex;
+		width: $avatar-width;
+		height: $avatar-width;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		width: 50px;
+		height: 50px;
+		/* #endif */
+		overflow: hidden;
+		border-radius: 2px;
+	}
+
+	.uni-list-chat__header-image {
+		margin: 1px;
+		/* #ifdef APP-NVUE */
+		width: 50px;
+		height: 50px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		width: $avatar-width;
+		height: $avatar-width;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list-chat__header-image {
+		display: block;
+		width: 100%;
+		height: 100%;
+	}
+
+	.avatarItem--1 {
+		width: 100%;
+		height: 100%;
+	}
+
+	.avatarItem--2 {
+		width: 47%;
+		height: 47%;
+	}
+
+	.avatarItem--3 {
+		width: 32%;
+		height: 32%;
+	}
+
+	/* #endif */
+	.header--circle {
+		border-radius: 50%;
+	}
+
+	.uni-list-chat__content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+		overflow: hidden;
+		padding: 2px 0;
+	}
+
+	.uni-list-chat__content-main {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: space-between;
+		padding-left: $uni-spacing-row-base;
+		flex: 1;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__content-title {
+		font-size: $title-size;
+		color: $title-color;
+		font-weight: $title-weight;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__content-note {
+		margin-top: 3px;
+		color: $note-color;
+		font-size: $note-size;
+		font-weight: $title-weight;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__content-extra {
+		/* #ifndef APP-NVUE */
+		flex-shrink: 0;
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: space-between;
+		align-items: flex-end;
+		margin-left: 5px;
+	}
+
+	.uni-list-chat__content-extra-text {
+		color: $right-text-color;
+		font-size: $right-text-size;
+		font-weight: $right-text-weight;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__badge-pos {
+		position: absolute;
+		/* #ifdef APP-NVUE */
+		left: 55px;
+		top: 3px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		left: calc(#{$avatar-width} + 10px - #{$badge-space} + #{$badge-left});
+		top: calc(#{$uni-spacing-row-base}/ 2 + 1px + #{$badge-top});
+		/* #endif */
+	}
+
+	.uni-list-chat__badge {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		border-radius: 100px;
+		background-color: $badge-background-color;
+	}
+
+	.uni-list-chat__badge-text {
+		color: $badge-color;
+		font-size: $badge-font;
+	}
+
+	.uni-badge--single {
+		/* #ifndef APP-NVUE */
+		// left: calc(#{$avatar-width} + 7px + #{$badge-left});
+		/* #endif */
+		width: $badge-size;
+		height: $badge-size;
+	}
+
+	.uni-badge--complex {
+		/* #ifdef APP-NVUE */
+		left: 50px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		width: auto;
+		/* #endif */
+		height: $badge-size;
+		padding: 0 $badge-space;
+	}
+
+	.uni-badge--dot {
+		/* #ifdef APP-NVUE */
+		left: 60px;
+		top: 6px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		left: calc(#{$avatar-width} + 15px - #{$dot-width}/ 2 + 1px + #{$badge-left});
+		/* #endif */
+		width: $dot-width;
+		height: $dot-height;
+		padding: 0;
+	}
+
+	.uni-list-chat--right {
+		/* #ifdef APP-NVUE */
+		left: 0;
+		/* #endif */
+	}
+</style>

+ 440 - 0
packageA/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue

@@ -0,0 +1,440 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+
+		<view
+			:class="{ 'uni-list-item--disabled': disabled }"
+			:hover-class="(!clickable && !link) || disabled || showSwitch ? '' : 'uni-list-item--hover'"
+			class="uni-list-item"
+			@click.stop="onClick"
+		>
+			<view v-if="!isFirstChild" class="border--left" :class="{ 'uni-list--border': border }"></view>
+			<view class="uni-list-item__container" :class="{ 'container--right': showArrow || link, 'flex--direction': direction === 'column' }">
+				<slot name="header">
+					<view class="uni-list-item__header">
+						<view v-if="thumb" class="uni-list-item__icon"><image :src="thumb" class="uni-list-item__icon-img" :class="['uni-list--' + thumbSize]" /></view>
+						<view v-else-if="showExtraIcon" class="uni-list-item__icon"><uni-icons :color="extraIcon.color" :size="extraIcon.size" :type="extraIcon.type" /></view>
+					</view>
+				</slot>
+				<slot name="body">
+					<view class="uni-list-item__content" :class="{ 'uni-list-item__content--center': thumb || showExtraIcon || showBadge || showSwitch }">
+						<text v-if="title" class="uni-list-item__content-title" :class="[ellipsis !== 0 && ellipsis <= 2 ? 'uni-ellipsis-' + ellipsis : '']">{{ title }}</text>
+						<text v-if="note" class="uni-list-item__content-note">{{ note }}</text>
+					</view>
+				</slot>
+				<slot name="footer">
+					<view v-if="rightText || showBadge || showSwitch" class="uni-list-item__extra" :class="{ 'flex--justify': direction === 'column' }">
+						<text v-if="rightText" class="uni-list-item__extra-text">{{ rightText }}</text>
+						<uni-badge v-if="showBadge" :type="badgeType" :text="badgeText" />
+						<switch v-if="showSwitch" :disabled="disabled" :checked="switchChecked" @change="onSwitchChange" />
+					</view>
+				</slot>
+			</view>
+			<uni-icons v-if="showArrow || link" :size="16" class="uni-icon-wrapper" color="#bbb" type="arrowright" />
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+
+
+/**
+ * ListItem 列表子组件
+ * @description 列表子组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+ * @property {String} 	title 							标题
+ * @property {String} 	note 							描述
+ * @property {String} 	thumb 							左侧缩略图,若thumb有值,则不会显示扩展图标
+ * @property {String}  	thumbSize = [lg|base|sm]		略缩图大小
+ * 	@value 	 lg			大图
+ * 	@value 	 base		一般
+ * 	@value 	 sm			小图
+ * @property {String} 	badgeText						数字角标内容
+ * @property {String} 	badgeType 						数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21)
+ * @property {String} 	rightText 						右侧文字内容
+ * @property {Boolean} 	disabled = [true|false]			是否禁用
+ * @property {Boolean} 	clickable = [true|false] 		是否开启点击反馈
+ * @property {String} 	link = [navigateTo|redirectTo|reLaunch|switchTab] 是否展示右侧箭头并开启点击反馈
+ *  @value 	navigateTo 	同 uni.navigateTo()
+ * 	@value redirectTo 	同 uni.redirectTo()
+ * 	@value reLaunch   	同 uni.reLaunch()
+ * 	@value switchTab  	同 uni.switchTab()
+ * @property {String | PageURIString} 	to  			跳转目标页面
+ * @property {Boolean} 	showBadge = [true|false] 		是否显示数字角标
+ * @property {Boolean} 	showSwitch = [true|false] 		是否显示Switch
+ * @property {Boolean} 	switchChecked = [true|false] 	Switch是否被选中
+ * @property {Boolean} 	showExtraIcon = [true|false] 	左侧是否显示扩展图标
+ * @property {Object} 	extraIcon 						扩展图标参数,格式为 {color: '#4cd964',size: '22',type: 'spinner'}
+ * @property {String} 	direction = [row|column]		排版方向
+ * @value row 			水平排列
+ * @value column 		垂直排列
+ * @event {Function} 	click 							点击 uniListItem 触发事件
+ * @event {Function} 	switchChange 					点击切换 Switch 时触发
+ */
+export default {
+	name: 'UniListItem',
+	props: {
+		direction: {
+			type: String,
+			default: 'row'
+		},
+		title: {
+			type: String,
+			default: ''
+		},
+		note: {
+			type: String,
+			default: ''
+		},
+		ellipsis: {
+			type: [Number],
+			default: 0
+		},
+		disabled: {
+			type: [Boolean, String],
+			default: false
+		},
+		clickable: {
+			type: Boolean,
+			default: false
+		},
+		showArrow: {
+			type: [Boolean, String],
+			default: false
+		},
+		link: {
+			type: [Boolean, String],
+			default: false
+		},
+		to: {
+			type: String,
+			default: ''
+		},
+		showBadge: {
+			type: [Boolean, String],
+			default: false
+		},
+		showSwitch: {
+			type: [Boolean, String],
+			default: false
+		},
+		switchChecked: {
+			type: [Boolean, String],
+			default: false
+		},
+		badgeText: {
+			type: String,
+			default: ''
+		},
+		badgeType: {
+			type: String,
+			default: 'success'
+		},
+		rightText: {
+			type: String,
+			default: ''
+		},
+		thumb: {
+			type: String,
+			default: ''
+		},
+		thumbSize: {
+			type: String,
+			default: 'base'
+		},
+		showExtraIcon: {
+			type: [Boolean, String],
+			default: false
+		},
+		extraIcon: {
+			type: Object,
+			default() {
+				return {
+					type: 'contact',
+					color: '#000000',
+					size: 20
+				};
+			}
+		},
+		border: {
+			type: Boolean,
+			default: true
+		}
+	},
+	// inject: ['list'],
+	data() {
+		return {
+			isFirstChild: false
+		};
+	},
+	mounted() {
+		this.list = this.getForm()
+		// 判断是否存在 uni-list 组件
+		if(this.list){
+			if (!this.list.firstChildAppend) {
+				this.list.firstChildAppend = true;
+				this.isFirstChild = true;
+			}
+		}
+	},
+	methods: {
+		/**
+		 * 获取父元素实例
+		 */
+		getForm(name = 'uniList') {
+			let parent = this.$parent;
+			let parentName = parent.$options.name;
+			while (parentName !== name) {
+				parent = parent.$parent;
+				if (!parent) return false
+				parentName = parent.$options.name;
+			}
+			return parent;
+		},
+		onClick() {
+			if (this.to !== '') {
+				this.openPage();
+				return;
+			}
+			if (this.clickable || this.link) {
+				this.$emit('click', {
+					data: {}
+				});
+			}
+		},
+		onSwitchChange(e) {
+			this.$emit('switchChange', e.detail);
+		},
+		openPage() {
+			if (['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].indexOf(this.link) !== -1) {
+				this.pageApi(this.link);
+			} else {
+				this.pageApi('navigateTo');
+			}
+		},
+		pageApi(api) {
+			uni[api]({
+				url: this.to,
+				success: res => {
+					this.$emit('click', {
+						data: res
+					});
+				},
+				fail: err => {
+					this.$emit('click', {
+						data: err
+					});
+					console.error(err.errMsg);
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+$list-item-pd: $uni-spacing-col-lg $uni-spacing-row-lg;
+
+.uni-list-item {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	font-size: $uni-font-size-lg;
+	position: relative;
+	justify-content: space-between;
+	align-items: center;
+	background-color: #fff;
+	flex-direction: row;
+	/* #ifdef H5 */
+	cursor: pointer;
+	/* #endif */
+}
+
+.uni-list-item--disabled {
+	opacity: 0.3;
+}
+
+.uni-list-item--hover {
+	background-color: $uni-bg-color-hover;
+}
+
+.uni-list-item__container {
+	position: relative;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	padding: $list-item-pd;
+	padding-left: $uni-spacing-row-lg;
+	flex: 1;
+	overflow: hidden;
+	// align-items: center;
+}
+
+.container--right {
+	padding-right: 0;
+}
+
+// .border--left {
+// 	margin-left: $uni-spacing-row-lg;
+// }
+
+.uni-list--border {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	/* #ifdef APP-NVUE */
+	border-top-color: $uni-border-color;
+	border-top-style: solid;
+	border-top-width: 0.5px;
+	/* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.uni-list--border:after {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	background-color: $uni-border-color;
+}
+
+/* #endif */
+
+.uni-list-item__content {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	padding-right: 8px;
+	flex: 1;
+	color: #3b4144;
+	// overflow: hidden;
+	flex-direction: column;
+	justify-content: space-between;
+	overflow: hidden;
+}
+
+.uni-list-item__content--center {
+	justify-content: center;
+}
+
+.uni-list-item__content-title {
+	font-size: $uni-font-size-base;
+	color: #3b4144;
+	overflow: hidden;
+}
+
+.uni-list-item__content-note {
+	margin-top: 6rpx;
+	color: $uni-text-color-grey;
+	font-size: $uni-font-size-sm;
+	overflow: hidden;
+}
+
+.uni-list-item__extra {
+	// width: 25%;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	justify-content: flex-end;
+	align-items: center;
+}
+
+.uni-list-item__header {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+}
+
+.uni-list-item__icon {
+	margin-right: 18rpx;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+
+.uni-list-item__icon-img {
+	/* #ifndef APP-NVUE */
+	display: block;
+	/* #endif */
+	height: $uni-img-size-base;
+	width: $uni-img-size-base;
+	marin-right: 10px;
+}
+
+.uni-icon-wrapper {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	align-items: center;
+	padding: 0 10px;
+}
+
+.flex--direction {
+	flex-direction: column;
+	/* #ifndef APP-NVUE */
+	align-items: initial;
+	/* #endif */
+}
+
+.flex--justify {
+	/* #ifndef APP-NVUE */
+	justify-content: initial;
+	/* #endif */
+}
+
+.uni-list--lg {
+	height: $uni-img-size-lg;
+	width: $uni-img-size-lg;
+}
+
+.uni-list--base {
+	height: $uni-img-size-base;
+	width: $uni-img-size-base;
+}
+
+.uni-list--sm {
+	height: $uni-img-size-sm;
+	width: $uni-img-size-sm;
+}
+
+.uni-list-item__extra-text {
+	color: $uni-text-color-grey;
+	font-size: $uni-font-size-sm;
+}
+.uni-ellipsis-1 {
+	/* #ifndef APP-NVUE */
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	lines: 1;
+	/* #endif */
+}
+
+.uni-ellipsis-2 {
+	/* #ifndef APP-NVUE */
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box;
+	-webkit-line-clamp: 2;
+	-webkit-box-orient: vertical;
+	/* #endif */
+
+	/* #ifdef APP-NVUE */
+	lines: 2;
+	/* #endif */
+}
+</style>

+ 106 - 0
packageA/uni_modules/uni-list/components/uni-list/uni-list.vue

@@ -0,0 +1,106 @@
+<template>
+	<!-- #ifndef APP-NVUE -->
+	<view class="uni-list uni-border-top-bottom">
+		<view v-if="border" class="uni-list--border-top"></view>
+		<slot />
+		<view v-if="border" class="uni-list--border-bottom"></view>
+	</view>
+	<!-- #endif -->
+	<!-- #ifdef APP-NVUE -->
+	<list class="uni-list" :class="{ 'uni-list--border': border }" :enableBackToTop="enableBackToTop" loadmoreoffset="15"><slot /></list>
+	<!-- #endif -->
+</template>
+
+<script>
+/**
+ * List 列表
+ * @description 列表组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+ * @property {String} 	border = [true|false] 		标题
+ */
+export default {
+	name: 'uniList',
+	'mp-weixin': {
+		options: {
+			multipleSlots: false
+		}
+	},
+	props: {
+		enableBackToTop: {
+			type: [Boolean, String],
+			default: false
+		},
+		scrollY: {
+			type: [Boolean, String],
+			default: false
+		},
+		border: {
+			type: Boolean,
+			default: true
+		}
+	},
+	// provide() {
+	// 	return {
+	// 		list: this
+	// 	};
+	// },
+	created() {
+		this.firstChildAppend = false;
+	},
+	methods: {
+		loadMore(e) {
+			this.$emit('scrolltolower');
+		}
+	}
+};
+</script>
+<style lang="scss">
+.uni-list {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	background-color: $uni-bg-color;
+	position: relative;
+	flex-direction: column;
+}
+
+.uni-list--border {
+	position: relative;
+	/* #ifdef APP-NVUE */
+	border-top-color: $uni-border-color;
+	border-top-style: solid;
+	border-top-width: 0.5px;
+	border-bottom-color: $uni-border-color;
+	border-bottom-style: solid;
+	border-bottom-width: 0.5px;
+	/* #endif */
+	z-index: -1;
+}
+
+/* #ifndef APP-NVUE */
+
+.uni-list--border-top {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	height: 1px;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	background-color: $uni-border-color;
+	z-index: 1;
+}
+
+.uni-list--border-bottom {
+	position: absolute;
+	bottom: 0;
+	right: 0;
+	left: 0;
+	height: 1px;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	background-color: $uni-border-color;
+}
+
+/* #endif */
+</style>

+ 65 - 0
packageA/uni_modules/uni-list/components/uni-list/uni-refresh.vue

@@ -0,0 +1,65 @@
+<template>
+    <!-- #ifdef APP-NVUE -->
+    <refresh :display="display" @refresh="onrefresh" @pullingdown="onpullingdown">
+        <slot />
+    </refresh>
+    <!-- #endif -->
+    <!-- #ifndef APP-NVUE -->
+    <view ref="uni-refresh" class="uni-refresh" v-show="isShow">
+        <slot />
+    </view>
+    <!-- #endif -->
+</template>
+
+<script>
+    export default {
+        name: 'UniRefresh',
+        props: {
+            display: {
+                type: [String],
+                default: "hide"
+            }
+        },
+        data() {
+            return {
+                pulling: false
+            }
+        },
+        computed: {
+            isShow() {
+                if (this.display === "show" || this.pulling === true) {
+                    return true;
+                }
+                return false;
+            }
+        },
+        created() {},
+        methods: {
+            onchange(value) {
+                this.pulling = value;
+            },
+            onrefresh(e) {
+                this.$emit("refresh", e);
+            },
+            onpullingdown(e) {
+                // #ifdef APP-NVUE
+                this.$emit("pullingdown", e);
+                // #endif
+                // #ifndef APP-NVUE
+                var detail = {
+                    viewHeight: 90,
+                    pullingDistance: e.height
+                }
+                this.$emit("pullingdown", detail);
+                // #endif
+            }
+        }
+    }
+</script>
+
+<style>
+    .uni-refresh {
+        height: 0;
+        overflow: hidden;
+    }
+</style>

+ 87 - 0
packageA/uni_modules/uni-list/components/uni-list/uni-refresh.wxs

@@ -0,0 +1,87 @@
+var pullDown = {
+    threshold: 95,
+    maxHeight: 200,
+    callRefresh: 'onrefresh',
+    callPullingDown: 'onpullingdown',
+    refreshSelector: '.uni-refresh'
+};
+
+function ready(newValue, oldValue, ownerInstance, instance) {
+    var state = instance.getState()
+    state.canPullDown = newValue;
+    // console.log(newValue);
+}
+
+function touchStart(e, instance) {
+    var state = instance.getState();
+    state.refreshInstance = instance.selectComponent(pullDown.refreshSelector);
+    state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined);
+    if (!state.canPullDown) {
+        return
+    }
+
+    // console.log("touchStart");
+
+    state.height = 0;
+    state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY;
+    state.refreshInstance.setStyle({
+        'height': 0
+    });
+    state.refreshInstance.callMethod("onchange", true);
+}
+
+function touchMove(e, ownerInstance) {
+    var instance = e.instance;
+    var state = instance.getState();
+    if (!state.canPullDown) {
+        return
+    }
+
+    var oldHeight = state.height;
+    var endY = e.touches[0].pageY || e.changedTouches[0].pageY;
+    var height = endY - state.touchStartY;
+    if (height > pullDown.maxHeight) {
+        return;
+    }
+
+    var refreshInstance = state.refreshInstance;
+    refreshInstance.setStyle({
+        'height': height + 'px'
+    });
+
+    height = height < pullDown.maxHeight ? height : pullDown.maxHeight;
+    state.height = height;
+    refreshInstance.callMethod(pullDown.callPullingDown, {
+        height: height
+    });
+}
+
+function touchEnd(e, ownerInstance) {
+    var state = e.instance.getState();
+    if (!state.canPullDown) {
+        return
+    }
+
+    state.refreshInstance.callMethod("onchange", false);
+
+    var refreshInstance = state.refreshInstance;
+    if (state.height > pullDown.threshold) {
+        refreshInstance.callMethod(pullDown.callRefresh);
+        return;
+    }
+
+    refreshInstance.setStyle({
+        'height': 0
+    });
+}
+
+function propObserver(newValue, oldValue, instance) {
+    pullDown = newValue;
+}
+
+module.exports = {
+    touchmove: touchMove,
+    touchstart: touchStart,
+    touchend: touchEnd,
+    propObserver: propObserver
+}

+ 85 - 0
packageA/uni_modules/uni-list/package.json

@@ -0,0 +1,85 @@
+{
+  "id": "uni-list",
+  "displayName": "List 列表",
+  "version": "1.0.16",
+  "description": "List 组件 ,帮助使用者快速构建列表。",
+  "keywords": [
+    "",
+    "列表",
+    "uni-list",
+    "list"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [
+      "uni-badge",
+      "uni-icons"
+    ],
+    "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"
+        }
+      }
+    }
+  }
+}

+ 340 - 0
packageA/uni_modules/uni-list/readme.md

@@ -0,0 +1,340 @@
+
+
+## List 列表
+> 代码块: `uList`、`uListItem`
+> 关联组件:`uni-list-item`、`uni-badge`、`uni-icons`、`uni-list-chat`、`uni-list-ad`
+
+
+List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。
+
+在vue页面里,它默认使用页面级滚动。在app-nvue页面里,它默认使用原生list组件滚动。这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。
+
+uni-list组件是父容器,里面的核心是uni-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。
+
+uni-list-item有很多风格,uni-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容。
+
+内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表、通信录列表、聊天记录列表。
+
+涉及很多大图或丰富内容的列表,比如类今日头条的新闻列表、类淘宝的电商列表,需要通过扩展插槽实现。
+
+下文均有样例给出。
+
+uni-list不包含下拉刷新和上拉翻页。上拉翻页另见组件:[uni-load-more](https://ext.dcloud.net.cn/plugin?id=29)
+
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。
+> - 组件需要依赖 `sass` 插件 ,请自行手动安装
+> - 组件内部依赖 `'uni-icons'` 、`uni-badge` 组件
+> - `uni-list` 和 `uni-list-item` 需要配套使用,暂不支持单独使用 `uni-list-item`
+> - 只有开启点击反馈后,会有点击选中效果
+> - 使用插槽时,可以完全自定义内容
+> - note 、rightText 属性暂时没做限制,不支持文字溢出隐藏,使用时应该控制长度显示或通过默认插槽自行扩展
+> - 支付宝小程序平台需要在支付宝小程序开发者工具里开启 component2 编译模式,开启方式: 详情 --> 项目配置 --> 启用 component2 编译
+> - 如果需要修改 `switch`、`badge` 样式,请使用插槽自定义
+> - 在 `HBuilderX` 低版本中,可能会出现组件显示 `undefined` 的问题,请升级最新的 `HBuilderX` 或者 `cli`
+> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+ 
+
+### 基本用法 
+
+- 设置 `title` 属性,可以显示列表标题
+- 设置 `disabled` 属性,可以禁用当前项
+
+```html
+<uni-list>
+	<uni-list-item  title="列表文字" ></uni-list-item>
+	<uni-list-item :disabled="true" title="列表禁用状态" ></uni-list-item>
+</uni-list>
+			 
+```
+
+### 多行内容显示
+
+- 设置 `note` 属性 ,可以在第二行显示描述文本信息
+
+```html
+<uni-list>
+	<uni-list-item title="列表文字" note="列表描述信息"></uni-list-item>
+	<uni-list-item :disabled="true" title="列表文字" note="列表禁用状态"></uni-list-item>
+</uni-list>
+
+```
+
+### 右侧显示角标、switch
+
+- 设置 `show-badge` 属性 ,可以显示角标内容
+- 设置 `show-switch` 属性,可以显示 switch 开关
+
+```html
+<uni-list>
+	<uni-list-item  title="列表右侧显示角标" :show-badge="true" badge-text="12" ></uni-list-item>
+	<uni-list-item title="列表右侧显示 switch"  :show-switch="true"  @switchChange="switchChange" ></uni-list-item>
+</uni-list>
+
+```
+
+### 左侧显示略缩图、图标  
+
+- 设置 `thumb` 属性 ,可以在列表左侧显示略缩图
+- 设置 `show-extra-icon` 属性,并指定 `extra-icon` 可以在左侧显示图标
+
+```html
+ <uni-list>
+ 	<uni-list-item title="列表左侧带略缩图" note="列表描述信息" thumb="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png"
+ 	 thumb-size="lg" rightText="右侧文字"></uni-list-item>
+ 	<uni-list-item :show-extra-icon="true" :extra-icon="extraIcon1" title="列表左侧带扩展图标" ></uni-list-item>
+</uni-list>
+```
+
+### 开启点击反馈和右侧箭头
+- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件
+- 设置 `link` 属性,会自动开启点击反馈,并给列表右侧添加一个箭头
+- 设置 `to` 属性,可以跳转页面,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo`
+
+```html
+
+<uni-list>
+	<uni-list-item title="开启点击反馈" clickable  @click="onClick" ></uni-list-item>
+	<uni-list-item title="默认 navigateTo 方式跳转页面" link to="/pages/vue/index/index" @click="onClick($event,1)" ></uni-list-item>
+	<uni-list-item title="reLaunch 方式跳转页面" link="reLaunch" to="/pages/vue/index/index" @click="onClick($event,1)" ></uni-list-item>
+</uni-list>
+
+```
+
+
+### 聊天列表示例
+- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件
+- 设置 `link` 属性,会自动开启点击反馈,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo`
+- 设置 `to` 属性,可以跳转页面
+- `time` 属性,通常会设置成时间显示,但是这个属性不仅仅可以设置时间,你可以传入任何文本,注意文本长度可能会影响显示
+- `avatar` 和 `avatarList` 属性同时只会有一个生效,同时设置的话,`avatarList` 属性的长度大于1 ,`avatar` 属性将失效
+- 可以通过默认插槽自定义列表右侧内容
+
+```html
+
+<uni-list>
+	<uni-list :border="true">
+		<!-- 显示圆形头像 -->
+		<uni-list-chat :avatar-circle="true" title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="您收到一条新的消息" time="2020-02-02 20:20" ></uni-list-chat>
+		<!-- 右侧带角标 -->
+		<uni-list-chat title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="您收到一条新的消息" time="2020-02-02 20:20" badge-text="12"></uni-list-chat>
+		<!-- 头像显示圆点 -->
+		<uni-list-chat title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="您收到一条新的消息" time="2020-02-02 20:20" badge-positon="left" badge-text="dot"></uni-list-chat>
+		<!-- 头像显示角标 -->
+		<uni-list-chat title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="您收到一条新的消息" time="2020-02-02 20:20" badge-positon="left" badge-text="99"></uni-list-chat>
+		<!-- 显示多头像 -->
+		<uni-list-chat title="uni-app" :avatar-list="avatarList" note="您收到一条新的消息" time="2020-02-02 20:20" badge-positon="left" badge-text="dot"></uni-list-chat>
+		<!-- 自定义右侧内容 -->
+		<uni-list-chat title="uni-app" :avatar-list="avatarList" note="您收到一条新的消息" time="2020-02-02 20:20" badge-positon="left" badge-text="dot">
+			<view class="chat-custom-right">
+				<text class="chat-custom-text">刚刚</text>
+				<!-- 需要使用 uni-icons 请自行引入 -->
+				<uni-icons type="star-filled" color="#999" size="18"></uni-icons>
+			</view>
+		</uni-list-chat>
+	</uni-list>
+</uni-list>
+
+```
+
+```javascript
+
+export default {
+	components: {},
+	data() {
+		return {
+			avatarList: [{
+				url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png'
+			}, {
+				url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png'
+			}, {
+				url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png'
+			}]
+		}
+	}
+}
+
+```
+
+
+```css
+
+.chat-custom-right {
+	flex: 1;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	justify-content: space-between;
+	align-items: flex-end;
+}
+
+.chat-custom-text {
+	font-size: 12px;
+	color: #999;
+}
+
+```
+
+## API
+
+### List Props
+
+属性名			|类型		|默认值		|	说明																									
+:-:				|:-:		|:-:		|	:-:	
+border			|Boolean	|true		|	是否显示边框
+
+
+### ListItem Props
+
+属性名			|类型		|默认值		|	说明																					
+:-:				|:-:		|:-:		|	:-:	
+title			|String		|-			|	标题
+note			|String		|-			|	描述
+ellipsis		|Number		|0			|	title 是否溢出隐藏,可选值,0:默认;  1:显示一行;	2:显示两行;【nvue 暂不支持】
+thumb			|String		|-			|	左侧缩略图,若thumb有值,则不会显示扩展图标
+thumbSize		|String 	|medium 	|	略缩图尺寸,可选值,lg:大图;  medium:一般;	sm:小图;
+showBadge		|Boolean	|false		|	是否显示数字角标	
+badgeText		|String		|-			|	数字角标内容
+badgeType		|String		|-			|	数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21)					
+rightText		|String		|-			|	右侧文字内容
+disabled		|Boolean	|false		|	是否禁用	
+showArrow 		|Boolean	|true		|	是否显示箭头图标			
+link			|String 	|navigateTo	|	新页面跳转方式,可选值见下表
+to				|String		|-			|	新页面跳转地址,如填写此属性,click 会返回页面是否跳转成功			
+clickable		|Boolean	|false		|	是否开启点击反馈
+showSwitch	    |Boolean	|false		|	是否显示Switch																			
+switchChecked	|Boolean	|false		|	Switch是否被选中																			
+showExtraIcon   |Boolean	|false		|	左侧是否显示扩展图标																		
+extraIcon		|Object		|-			|	扩展图标参数,格式为 ``{color: '#4cd964',size: '22',type: 'spinner'}``,参考 [uni-icons](https://ext.dcloud.net.cn/plugin?id=28)	
+direction		| String	|row		|	排版方向,可选值,row:水平排列;  column:垂直排列; 3个插槽是水平排还是垂直排,也受此属性控制
+
+
+#### Link Options
+
+属性名				|	说明
+:-:					|	:-:
+navigateTo 	| 	同 uni.navigateTo()
+redirectTo 	|	同 uni.reLaunch()
+reLaunch		|	同 uni.reLaunch()
+switchTab  	|	同 uni.switchTab()
+
+### ListItem Events
+
+事件称名			|说明									|返回参数			
+:-:				|:-:									|:-:				
+click			|点击 uniListItem 触发事件,需开启点击反馈	|-					
+switchChange	|点击切换 Switch 时触发,需显示 switch		|e={value:checked}	
+
+
+
+### ListItem Slots
+
+名称	 	|	说明					
+:-:		|	:-:						
+header	|	左/上内容插槽,可完全自定义默认显示
+body	|	中间内容插槽,可完全自定义中间内容				
+footer	|	右/下内容插槽,可完全自定义右侧内容		
+
+
+> 需要注意的是当使用插槽时,内置样式将会失效,只保留排版样式,此时的样式需要开发者自己实现
+> 如果	`uni-list-item` 组件内置属性样式无法满足需求,可以使用插槽来自定义uni-list-item里的内容。
+> uni-list-item提供了3个可扩展的插槽:`header`、`body`、`footer`
+> - 当 `direction` 属性为 `row` 时表示水平排列,此时 `header` 表示列表的左边部分,`body` 表示列表的中间部分,`footer` 表示列表的右边部分
+> - 当 `direction` 属性为 `column` 时表示垂直排列,此时 `header` 表示列表的上边部分,`body` 表示列表的中间部分,`footer` 表示列表的下边部分
+> 开发者可以只用1个插槽,也可以3个一起使用。在插槽中可自主编写view标签,实现自己所需的效果。
+
+	
+**示例**
+
+```html
+<uni-list>
+	<uni-list-item title="自定义右侧插槽" note="列表描述信息" link>
+		<template slot="header">
+			<image class="slot-image" src="/static/logo.png" mode="widthFix"></image>
+		</template>
+	</uni-list-item>
+	<uni-list-item>
+		<!-- 自定义 header -->
+		<view slot="header" class="slot-box"><image class="slot-image" src="/static/logo.png" mode="widthFix"></image></view>
+		<!-- 自定义 body -->
+		<text slot="body" class="slot-box slot-text">自定义插槽</text>
+		<!-- 自定义 footer-->
+		<template slot="footer">
+			<image class="slot-image" src="/static/logo.png" mode="widthFix"></image>
+		</template>
+	</uni-list-item>
+</uni-list>
+```
+
+
+
+
+
+### ListItemChat Props
+
+属性名			|类型		|默认值		|	说明																		
+:-:				|:-:		|:-:		|	:-:	
+title 			|String		|-			|	标题
+note 			|String		|-			|	描述
+clickable		|Boolean	|false		|	是否开启点击反馈
+badgeText		|String		|-			|	数字角标内容,设置为 `dot` 将显示圆点
+badgePositon 	|String		|right		|	角标位置
+link			|String 	|navigateTo	|	是否展示右侧箭头并开启点击反馈,可选值见下表
+clickable		|Boolean	|false		|	是否开启点击反馈
+to				|String		|-			|	跳转页面地址,如填写此属性,click 会返回页面是否跳转成功	
+time			|String 	|-			|	右侧时间显示
+avatarCircle 	|Boolean 	|false		|	是否显示圆形头像
+avatar			|String 	|-			|	头像地址,avatarCircle 不填时生效
+avatarList 		|Array	 	|-			|	头像组,格式为 [{url:''}]
+
+#### Link Options
+
+属性名		|	说明
+:-:			|	:-:
+navigateTo 	| 	同 uni.navigateTo()
+redirectTo 	|	同 uni.reLaunch()
+reLaunch	|	同 uni.reLaunch()
+switchTab  	|	同 uni.switchTab()
+
+### ListItemChat Slots
+
+名称	 	|	说明					
+:-		|	:-						
+default	|	自定义列表右侧内容(包括时间和角标显示)
+
+### ListItemChat Events
+事件称名			|	说明						|	返回参数			
+:-:				|	:-:						|	:-:	
+@click			|	点击 uniListChat 触发事件	|	{data:{}}	,如有 to 属性,会返回页面跳转信息	
+
+
+
+
+
+
+## 基于uni-list扩展的页面模板
+
+通过扩展插槽,可实现多种常见样式的列表
+
+**新闻列表类**
+
+1. 云端一体混合布局:[https://ext.dcloud.net.cn/plugin?id=2546](https://ext.dcloud.net.cn/plugin?id=2546)
+2. 云端一体垂直布局,大图模式:[https://ext.dcloud.net.cn/plugin?id=2583](https://ext.dcloud.net.cn/plugin?id=2583)
+3. 云端一体垂直布局,多行图文混排:[https://ext.dcloud.net.cn/plugin?id=2584](https://ext.dcloud.net.cn/plugin?id=2584)
+4. 云端一体垂直布局,多图模式:[https://ext.dcloud.net.cn/plugin?id=2585](https://ext.dcloud.net.cn/plugin?id=2585)
+5. 云端一体水平布局,左图右文:[https://ext.dcloud.net.cn/plugin?id=2586](https://ext.dcloud.net.cn/plugin?id=2586)
+6. 云端一体水平布局,左文右图:[https://ext.dcloud.net.cn/plugin?id=2587](https://ext.dcloud.net.cn/plugin?id=2587)
+7. 云端一体垂直布局,无图模式,主标题+副标题:[https://ext.dcloud.net.cn/plugin?id=2588](https://ext.dcloud.net.cn/plugin?id=2588)
+
+**商品列表类**
+
+1. 云端一体列表/宫格视图互切:[https://ext.dcloud.net.cn/plugin?id=2651](https://ext.dcloud.net.cn/plugin?id=2651)
+2. 云端一体列表(宫格模式):[https://ext.dcloud.net.cn/plugin?id=2671](https://ext.dcloud.net.cn/plugin?id=2671)
+3. 云端一体列表(列表模式):[https://ext.dcloud.net.cn/plugin?id=2672](https://ext.dcloud.net.cn/plugin?id=2672)

+ 164 - 53
pages.json

@@ -1,74 +1,70 @@
 {
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
-            "path" : "pages/Login/Login",
-            "style" : {
+			"path": "pages/Login/Login",
+			"style": {
 				"navigationStyle": "custom",
 				"disableScroll": true
 			}
-        },
+		},
 		{
-		    "path" : "pages/Login/loginWeixin",
-		    "style" : {
+			"path": "pages/Login/loginWeixin",
+			"style": {
 				"navigationStyle": "custom"
 			}
 		},
 		{
-		    "path" : "pages/Charts/mainStatistics",
-		    "style" : {
-				"navigationBarTitleText":"统计图表"
-				// "disableScroll": true
-				// "enablePullDownRefresh": true
+			"path": "pages/Charts/mainStatistics",
+			"style": {
+				"navigationBarTitleText": "统计图表"
 			}
 		},
+
+		// "disableScroll": true
+		// "enablePullDownRefresh": true
 		{
-		    "path" : "pages/User/merchantList",
-		    "style" : {
-				"navigationBarTitleText":"机器销售",
+			"path": "pages/User/merchantList",
+			"style": {
+				"navigationBarTitleText": "机器销售",
 				// "disableScroll": true,
 				"enablePullDownRefresh": true
 			}
 		},
 		{
-		    "path" : "pages/User/equipmentSratisticsList",
-		    "style" : {
-				"navigationBarTitleText":"机器排行",
+			"path": "pages/User/equipmentSratisticsList",
+			"style": {
+				"navigationBarTitleText": "机器排行",
 				// "disableScroll": true,
 				"enablePullDownRefresh": true
 			}
 		},
 		{
-		    "path" : "pages/User/equipmentStatusList",
-		    "style" : {
-				"navigationBarTitleText":"机器状态",
+			"path": "pages/User/equipmentStatusList",
+			"style": {
+				"navigationBarTitleText": "机器状态",
 				// "disableScroll": true,
 				"enablePullDownRefresh": true
 			}
 		},
 		{
-		    "path" : "pages/User/user",
-		    "style" : {
-				"navigationBarTitleText":"我的"
-			}
-		},
-		{
-		    "path" : "pages/User/promoCode",
-		    "style" : {
-				"navigationBarTitleText":"优惠码"
-			}
-		},
-		{
-		    "path" : "pages/User/buyPromo",
-		    "style" : {
-				"navigationBarTitleText":"购买优惠码"
-			}
-		},
-		{
-		    "path" : "pages/User/equipmentName",
-		    "style" : {
-				"navigationBarTitleText":"修改设备名称"
+			"path": "pages/User/user",
+			"style": {
+				"navigationBarTitleText": "我的"
 			}
 		},
+		// {
+		//     "path" : "pages/User/promoCode",
+		//     "style" : {
+		//         "navigationBarTitleText" : "优惠码"
+		//     }
+		// },
+		// {
+		//     "path" : "pages/User/buyPromo",
+		//     "style" : {
+		//         "navigationBarTitleText" : "购买优惠码"
+		//     }
+		// },
+
 		{
 			"path": "pages/Charts/elseStatistics",
 			"style": {
@@ -80,26 +76,42 @@
 			"style": {
 				"navigationBarTitleText": "销售排行"
 			}
-		}
-        
-        ,{
-            "path" : "pages/WeixinSwicth/WeixinSwicth",
-            "style" : {
+		},
+		{
+			"path": "pages/WeixinSwicth/WeixinSwicth",
+			"style": {
 				// "navigationStyle": "custom",
 				"navigationBarTitleText": "微信绑定",
-				"menuSrc":"static/img/leftTriangle.png",
-				 "enablePullDownRefresh": true
-				// "disableScroll": true
+				"menuSrc": "static/img/leftTriangle.png",
+				"enablePullDownRefresh": true
 			}
-        }
-    ],
+		}
+		// {
+		//     "path" : "App",
+		//     "style" : {}
+		// }
+
+		// ,{
+		//     "path" : "pages/User/map",
+		//     "style" : {
+		//     	"navigationBarTitleText" : "Map"
+		//     }
+		// }
+		// ,{
+		//     "path" : "pages/User/GoogleMap",
+		//     "style" : {
+		//     	"navigationBarTitleText" : "GoogleMap"
+		//     }
+		// }
+	],
+	// "disableScroll": true
 	"globalStyle": {
 		"navigationBarTextStyle": "white",
 		"navigationBarTitleText": "",
 		"navigationBarBackgroundColor": "#206DC3",
 		"backgroundColor": "#F8F8F8",
-		"animationType":"slide-in-right",
-		"animationDuration":200
+		"animationType": "slide-in-right",
+		"animationDuration": 200
 	},
 	"tabBar": {
 		"color": "#7A7E83",
@@ -137,5 +149,104 @@
 				"text": "我的"
 			}
 		]
-	}
+	},
+	"subPackages": [{
+			"root": "packageA",
+			"name": "pack1",
+			"pages": [{
+					"path": "pages/equipmentStatus/map",
+					"style": {
+						"navigationBarTitleText": "MAP",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "pages/equipmentStatus/GoogleMap",
+					"style": {
+						"navigationBarTitleText": "GoogleMap",
+						"enablePullDownRefresh": false
+					}
+				}, {
+					"path": "pages/remote/dosugar",
+					"style": {
+						"navigationBarTitleText": "远程做糖",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "pages/remote/sugarList",
+					"style": {
+						"navigationBarTitleText": "今日做糖列表",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "pages/remote/remoteList",
+					"style": {
+						"navigationBarTitleText": "远程操作列表",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "pages/remote/parameters",
+					"style": {
+						"navigationBarTitleText": "参数列表",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "pages/remote/advancedParameters",
+					"style": {
+						"navigationBarTitleText": "进阶参数",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "pages/remote/generalParameters",
+					"style": {
+						"navigationBarTitleText": "通用参数",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "pages/remote/alarmClockList",
+					"style": {
+						"navigationBarTitleText": "闹钟",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "pages/remote/alarmClockItem",
+					"style": {
+						"navigationBarTitleText": "设置闹钟",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "pages/user/equipmentName",
+					"style": {
+						"navigationBarTitleText": "修改设备名称"
+					}
+				},
+				{
+					"path": "pages/user/timeRule",
+					"style": {
+						"navigationBarTitleText": "定时开关机"
+					}
+				},
+				{
+					"path": "pages/user/timeSet",
+					"style": {
+						"navigationBarTitleText": "定时开关机"
+					}
+				},
+				{
+					"path": "pages/user/timeSelect",
+					"style": {}
+				}
+			
+		]
+	}]
 }

+ 29 - 8
pages/Charts/mainStatistics.vue

@@ -239,7 +239,7 @@
 			var token = uni.getStorageSync("token");
 			if (token.toString().length > 1) {
 				this.init();
-			}else{
+			} else {
 				uni.reLaunch({
 					url: '../Login/Login',
 				});
@@ -262,7 +262,7 @@
 			var token = uni.getStorageSync("token");
 			if (token.toString().length > 1) {
 				this.init();
-			}else{
+			} else {
 				uni.reLaunch({
 					url: '../Login/Login',
 				});
@@ -299,9 +299,10 @@
 				this.today = daystr;
 				// var str= '星期'+'日一二三四五六'.charAt(date.getDay());
 				this.week = this.$t('mainStatistics.week' + date.getDay());
-				
+
 			},
-			equipmentStatus(){
+			equipmentStatus() {
+				var that = this;
 				var id = uni.getStorageSync("globalUser").id;
 				var token = uni.getStorageSync("token");
 				uni.request({
@@ -309,12 +310,30 @@
 					data: {
 						"adminId": id
 					},
-					header:{
-						'token':token
+					header: {
+						'token': token
 					},
 					method: "POST",
 					success: (res) => {
-				
+						setTimeout(function() {
+							that.checkEquipmentStatus(id);
+						}, 5000);
+					},
+				});
+			},
+			checkEquipmentStatus(id){
+				var token = uni.getStorageSync("token");
+				uni.request({
+					url: this.serverurl + '/TEquipment/checkEquipmentStatus',
+					data: {
+						"adminId": id
+					},
+					header: {
+						'token': token
+					},
+					method: "POST",
+					success: (res) => {
+						
 					},
 				});
 			},
@@ -572,7 +591,9 @@
 						"equipmentId": equipmentId
 					},
 					method: "POST",
-					header:{'token':token},
+					header: {
+						'token': token
+					},
 					success: (res) => {
 						var list = res.data.data;
 						this.machineTotalNum = list[0];

+ 6 - 1
pages/User/buyPromo.vue

@@ -1,4 +1,4 @@
-<template>
+<!-- <template>
 	<view class=" ">
 		<view class="font header">
 			优惠码价格:{{price}}元/个
@@ -91,9 +91,13 @@
 				}
 				var globalUser = uni.getStorageSync("globalUser");
 				var id = globalUser.id;
+				var token = uni.getStorageSync("token");
 				uni.request({
 					url: this.serverurl + '/TPromoCode/buy?pri='+pri+'&adminId='+id+'&day='+this.day,
 					method: "GET",
+					header:{
+						'token':token
+					},
 					success: (res) => {
 						var img = res.data.data;
 						this.title = "请用微信扫码支付";
@@ -181,3 +185,4 @@
 		margin: auto;
 	}
 </style>
+ -->

+ 0 - 1
pages/User/equipmentSratisticsList.vue

@@ -83,7 +83,6 @@
 				// console.log('getEquipmentListData')
 				this.getEquipmentListByUser(this.globalUser)
 				.then(data => {
-					debugger
 					this.merchantList = data;
 					console.log('getEquipmentListData',this.merchantList)
 					uni.stopPullDownRefresh();

+ 135 - 37
pages/User/equipmentStatusList.vue

@@ -52,7 +52,14 @@
 											<view v-if="equipment.hasTodayAlarm">
 												<view><span>报警内容:</span></view>
 												<view v-for="(alarm,index) in equipment.alarmList" :key="index">
-													<view><span class="baojing">{{alarm.occurrenceTime?alarm.occurrenceTime:''}} {{alarm.alarmContent}}</span></view>
+													<view><span class="baojing">{{alarm.occurrenceTime?alarm.occurrenceTime:''}} {{alarm.alarmContent}}
+															<button v-if="alarm.isEliminate==1" style="color:#BEBEBE;" @click="eliminate(alarm.id)" class="eliminateButton">
+																<p class="p">已消除</p>
+															</button>
+															<button v-if="alarm.isEliminate!=1" type="primary" @click="eliminate(alarm.id)" class="eliminateButton">
+																<p class="p">消除</p>
+															</button>
+														</span></view>
 												</view>
 											</view>
 											<view v-else>
@@ -97,16 +104,30 @@
 						<view class="line1"></view>
 						<!-- 关机 -->
 						<view class="" v-if="globalUser.open==0">
+							<!-- 已关机 -->
 							<view class="swithBox" v-if="equipment.eqeStatus==0">
-								<view class="swichFont">{{$t('equipmentStatusList.off')}}</view>
-								<view class="switch">
-									<switch style="transform:scale(0.65)" checked @change="OnOff(equipment.id,1)" />
+								<view class="swichFont1">{{$t('equipmentStatusList.off')}}</view>
+								<view class="switch1">
+									<!-- <switch style="transform:scale(0.65)" checked @change="OnOff(equipment.id,1)" /> -->
+									<button style="color:#BEBEBE;" @click="OnOff(equipment.id,1)" class="button">
+										<p class="p">{{$t('equipmentStatusList.kaiqi')}}</p>
+									</button>
+									<button type="primary" @click="OnOff(equipment.id,0)" class="button">
+										<p class="p">{{$t('equipmentStatusList.guanbi')}}</p>
+									</button>
 								</view>
 							</view>
+							<!-- 已开机 -->
 							<view class="swithBox" v-else>
-								<view class="swichFont">{{$t('equipmentStatusList.on')}}</view>
-								<view class="switch">
-									<switch style="transform:scale(0.65)" :checked="onffChecked" @change="OnOff(equipment.id,0)" />
+								<view class="swichFont1">{{$t('equipmentStatusList.on')}}</view>
+								<view class="switch1">
+									<!-- <switch style="transform:scale(0.65)" :checked="onffChecked" @change="OnOff(equipment.id,0)" /> -->
+									<button type="primary" @click="OnOff(equipment.id,1)" class="button">
+										<p class="p">{{$t('equipmentStatusList.kaiqi')}}</p>
+									</button>
+									<button style="color:#BEBEBE;" @click="OnOff(equipment.id,0)" class="button">
+										<p class="p">{{$t('equipmentStatusList.guanbi')}}</p>
+									</button>
 								</view>
 							</view>
 						</view>
@@ -120,7 +141,14 @@
 								</button>
 							</view>
 						</view>
-
+						<!-- 查看定位 -->
+						<view class="opendoor"><span>{{$t('equipmentStatusList.gps')}}:</span>
+							<view class="">
+								<button type="primary" @click="lookMap(equipment.id,equipment.longitude,equipment.latitude)" class="button">
+									<p class="p">{{$t('equipmentStatusList.look')}}</p>
+								</button>
+							</view>
+						</view>
 						<view><span>{{$t('equipmentStatusList.equipmentNo')}}:</span><span>{{equipment.clientId}}</span></view>
 						<view><span>{{$t('equipmentStatusList.area')}}:</span><span>{{equipment.fullName?equipment.fullName:''}}</span></view>
 						<view><span>{{$t('equipmentStatusList.temperature')}}:</span><span>{{equipment.furnaceTm?equipment.furnaceTm:''}}</span></view>
@@ -129,7 +157,16 @@
 						<view class="" v-if="equipment.hasTodayAlarm">
 							<view><span>{{$t('equipmentStatusList.alarm')}}:</span></view>
 							<view v-for="(alarm,index) in equipment.alarmList" :key="index">
-								<view><span class="baojing">{{alarm.occurrenceTime?alarm.occurrenceTime:''}} {{alarm.alarmContent}}</span></view>
+								<view>
+									<span class="baojing">{{alarm.occurrenceTime?alarm.occurrenceTime:''}} {{alarm.alarmContent}}
+										<button v-if="alarm.isEliminate==1" style="color:#BEBEBE;" @click="eliminate(alarm.id)" class="eliminateButton">
+											<p class="p">{{$t('equipmentStatusList.yixiaochu')}}</p>
+										</button>
+										<button v-if="alarm.isEliminate!=1" type="primary" @click="eliminate(alarm.id)" class="eliminateButton">
+											<p class="p">{{$t('equipmentStatusList.xiaochu')}}</p>
+										</button>
+									</span>
+								</view>
 							</view>
 						</view>
 						<view class="" v-else>
@@ -203,9 +240,9 @@
 				text: this.$t('tabs.tab4')
 			});
 			var token = uni.getStorageSync("token");
-			if (token.length>1) {
+			if (token.length > 1) {
 				this.getEquipmentListData();
-			}else{
+			} else {
 				uni.reLaunch({
 					url: '../Login/Login',
 				});
@@ -240,6 +277,19 @@
 						uni.stopPullDownRefresh();
 					}, _ => void uni.stopPullDownRefresh());
 			},
+			//查看经纬度
+			lookMap(id,longitude,latitude){
+				var item={};
+				item["id"] = id;
+				item["longitude"] = longitude;
+				item["latitude"] = latitude;
+				uni.navigateTo({
+					// url:'map?item='+ encodeURIComponent(JSON.stringify(item))
+					url:'../../packageA/pages/equipmentStatus/map?item='+ encodeURIComponent(JSON.stringify(item))
+					// url:'GoogleMap?item='+ encodeURIComponent(JSON.stringify(item))
+				    // url: '/pages/user/map?item='+ encodeURIComponent(JSON.stringify(item))
+				});
+			},
 			OnOff(id, code) {
 				var that = this;
 				// var token = uni.getStorageSync("token");
@@ -290,8 +340,8 @@
 										"equipmentId": equipmentId
 									},
 									method: "POST",
-									header:{
-										'token':token
+									header: {
+										'token': token
 									},
 									success: (res) => {
 										var list = res.data.data;
@@ -307,8 +357,8 @@
 												content: that.$t('equipmentStatusList.tishi'),
 												success: function(res) {
 													that.getEquipmentListData();
-													setTimeout(function () {
-													    that.network(id);
+													setTimeout(function() {
+														that.network(id);
 													}, 7000);
 												}
 											})
@@ -343,8 +393,8 @@
 							"equipmentId": equipmentId
 						},
 						method: "POST",
-						header:{
-							'token':token
+						header: {
+							'token': token
 						},
 						success: (res) => {
 							that.input = 2;
@@ -360,8 +410,8 @@
 									content: that.$t('equipmentStatusList.tishi'),
 									success: function(res) {
 										that.getEquipmentListData();
-										setTimeout(function () {
-										    that.network(id);
+										setTimeout(function() {
+											that.network(id);
 										}, 7000);
 									}
 								})
@@ -380,7 +430,29 @@
 					});
 				}
 			},
-			network(id){
+			eliminate(id) {
+				var token = uni.getStorageSync("token");
+				uni.request({
+					url: this.serverurl + '/TEquipment/eliminate',
+					data: {
+						"id": id
+					},
+					method: "POST",
+					header: {
+						'token': token
+					},
+					success: (res) => {
+						uni.showToast({
+							title: "发送成功",
+							icon: 'none',
+							duration: 1000
+						});
+						this.getEquipmentListData();
+					}
+				});
+			},
+			network(id) {
+				console.log("network");
 				var token = uni.getStorageSync("token");
 				var equipmentId = id;
 				uni.request({
@@ -389,16 +461,16 @@
 						"equipmentId": id
 					},
 					method: "POST",
-					header:{
-						'token':token
+					header: {
+						'token': token
 					},
 					success: (res) => {
 						var data = res.data.data;
-						if(data=='fail'){
+						if (data == 'fail') {
 							uni.showToast({
-							    title: this.$t('equipmentStatusList.network'),
-								icon:'none',
-							    duration: 3000
+								title: this.$t('equipmentStatusList.network'),
+								icon: 'none',
+								duration: 3000
 							});
 							this.getEquipmentListData();
 						}
@@ -413,8 +485,8 @@
 						"equipmentId": id
 					},
 					method: "POST",
-					header:{
-						'token':token
+					header: {
+						'token': token
 					},
 					success: (res) => {
 						uni.showModal({
@@ -447,8 +519,8 @@
 										"equipmentId": equipmentId
 									},
 									method: "POST",
-									header:{
-										'token':token
+									header: {
+										'token': token
 									},
 									success: (res) => {
 										var list = res.data.data;
@@ -473,8 +545,8 @@
 							"equipmentId": equipmentId
 						},
 						method: "POST",
-						header:{
-							'token':token
+						header: {
+							'token': token
 						},
 						success: (res) => {
 							var list = res.data.data;
@@ -508,7 +580,9 @@
 	}
 
 	.baojing {
-		padding-left: 120upx;
+		display: flex;
+		flex-direction: row;
+		padding-left: 20upx;
 	}
 
 	.titleFlag {
@@ -522,7 +596,7 @@
 
 	.opendoor {
 		/* #ifdef H5 */
-		
+
 		/* #endif */
 		padding-top: 10upx;
 		padding-bottom: 10upx;
@@ -535,7 +609,17 @@
 		/* #ifdef H5 */
 		text-align: center;
 		height: 50upx;
-		weight:20upx ;
+		weight: 20upx;
+		/* #endif */
+		padding-left: 15upx;
+		/* padding-top: 2upx; */
+	}
+
+	.eliminateButton {
+		/* #ifdef H5 */
+		text-align: center;
+		height: 50upx;
+		weight: 20upx;
 		/* #endif */
 		padding-left: 15upx;
 		/* padding-top: 2upx; */
@@ -545,7 +629,7 @@
 		/* #ifdef H5 */
 		font-size: 28upx;
 		height: 50upx;
-		weight:20upx ;
+		weight: 20upx;
 		transform: translateY(-14upx);
 		/* text-align: center; */
 		/* #endif */
@@ -580,15 +664,29 @@
 	}
 
 	.switch {
-		width: 44upx;
+		width: 100upx;
 		height: 22upx;
 	}
 
+	.switch1 {
+		display: flex;
+		flex-direction: row;
+		width: 35%;
+		height: 42upx;
+		padding-top: 13upx;
+		padding-left: 72upx;
+	}
+
 	.swichFont {
 		width: 85%;
 		padding-top: 12upx;
 	}
 
+	.swichFont1 {
+		width: 55%;
+		padding-top: 12upx;
+	}
+
 	.line1 {
 		width: 100%;
 		height: 3upx;

+ 2 - 9
pages/User/promoCode.vue

@@ -1,4 +1,4 @@
-<template>
+<!-- <template>
 	<view class="warp">
 		<view class="font">
 				<uni-list class="font">
@@ -11,7 +11,6 @@
 				<view class="nickname">
 					筛选条件:
 				</view>
-				<!-- <view class="header"> -->
 				<view class="nickname">
 					状态:
 				</view>
@@ -21,7 +20,6 @@
 					 @change="change">
 					</xfl-select>
 				</view>
-				<!-- </view> -->
 			</view>
 
 			<t-table @change="change">
@@ -142,12 +140,6 @@
 					},
 					success: (res) => {
 						this.tableList = res.data.data;
-						// if(res.statusCode==401){
-						// 	uni.reLaunch({
-						// 		url: '../Login/Login',
-						// 	});
-						// 	return;
-						// }
 					}
 				})
 			}
@@ -177,3 +169,4 @@
 		font-family: "PingFang-SC-Bold";
 	}
 </style>
+ -->

+ 34 - 5
pages/User/user.vue

@@ -21,10 +21,20 @@
 		</view>
 		<view class="">
 			<uni-list>
-				<view v-if="ifForeign">
+				<!-- <view v-if="ifForeign">
 					<view v-if="gid">
 						<uni-list-item title="优惠码" @click="open()" />
 					</view>
+				</view> -->
+				<view v-if="showRemote">
+					<!-- <view v-if=""> -->
+					<uni-list-item title="远程操作" @click="remote()" />
+					<!-- </view> -->
+				</view>
+				<view v-if="show">
+					<!-- <view v-if=""> -->
+					<uni-list-item title="定时开关炉头" @click="time()" />
+					<!-- </view> -->
 				</view>
 				<view v-if="show">
 					<uni-list-item :title="$t('user.equipmentname')" @click="updataName()" />
@@ -58,6 +68,7 @@
 			return {
 				name: '',
 				show: false,
+				showRemote: true,
 				ifForeign: false,
 				listName: [],
 				value: null,
@@ -70,6 +81,7 @@
 				showOrNo: null,
 				avatarUrl: null,
 				weixinUp: false,
+				open: '',
 				weixinDown: true
 			};
 		},
@@ -89,15 +101,22 @@
 			// uni.startPullDownRefresh();
 			var globalUser = uni.getStorageSync("globalUser");
 			var gid = globalUser.id;
+			var name = globalUser.name;
+			
 			if (gid != 1) {
 				this.gid = true;
+				this.show = true;
 			}
+			// if (gid == 236||name == "邱咪") {
+			// 	this.showRemote = false;
+			// }
 			var ifForeign = globalUser.ifForeign;
 			if (ifForeign == 0) {
 				this.ifForeign = true;
 			}
 			var token = uni.getStorageSync("token");
-			if (token.length>1) {
+			if (token.length > 1) {
+				this.open = globalUser.open;
 				var name = uni.getStorageSync("name");
 				this.name = name;
 				var listName = uni.getStorageSync("listName");
@@ -128,14 +147,24 @@
 
 		},
 		methods: {
-			open() {
+			// open() {
+			// 	uni.navigateTo({
+			// 		url: 'promoCode',
+			// 	});
+			// },
+			time() {
+				uni.navigateTo({
+					url: '../../packageA/pages/user/timeRule',
+				});
+			},
+			remote() {
 				uni.navigateTo({
-					url: 'promoCode',
+					url:'../../packageA/pages/remote/remoteList',
 				});
 			},
 			updataName() {
 				uni.navigateTo({
-					url: 'equipmentName',
+					url: '../../packageA/pages/user/equipmentName',
 				});
 			},
 			trant() {

TEMPAT SAMPAH
static/icons/logo.png


TEMPAT SAMPAH
static/img/map.png


+ 48 - 0
store/modules/chart.js

@@ -60,6 +60,14 @@ export default {
 					return res;
 				});
 		},
+		//修改定时
+		updateRule({ commit },param) {
+			return apis.sz.post('/TEquipment/updateRule',param)
+				.then(res => {
+					var data = res;
+					return data;
+				});
+		},
 		getMachineNum({ commit },param) {
 			return apis.sz.post('/TEquipment/getMachineNum',param)
 				.then(res => {
@@ -67,6 +75,46 @@ export default {
 					return data;
 				});
 		},
+		//获取参数
+		getParameters({ commit },param) {
+			return apis.sz.post('/TParameters/getParameters',param)
+				.then(res => {
+					// const { data } = res;
+					return res;
+				});
+		},
+		//修改参数
+		updateParameters({ commit },param) {
+			return apis.sz.post('/TParameters/updateParameters',param)
+				.then(res => {
+					// const { data } = res;
+					return res;
+				});
+		},
+		//添加闹钟list
+		addAlarmClock({ commit },param) {
+			return apis.sz.post('/TAlarmClock/add',param)
+				.then(res => {
+					// const { data } = res;
+					return res;
+				});
+		},
+		//添加闹钟item
+		addAlarmClockItem({ commit },param) {
+			return apis.sz.post('/TAlarmClockItem/add',param)
+				.then(res => {
+					// const { data } = res;
+					return res;
+				});
+		},
+		//修改闹钟
+		updateAlarmClock({ commit },param) {
+			return apis.sz.post('/TAlarmClock/updata',param)
+				.then(res => {
+					// const { data } = res;
+					return res;
+				});
+		},
 	}
 }