Pārlūkot izejas kodu

首次提交,代码合并

tiandewen 3 gadi atpakaļ
vecāks
revīzija
039080763f
100 mainītis faili ar 16652 papildinājumiem un 0 dzēšanām
  1. BIN
      .DS_Store
  2. 20 0
      .hbuilderx/launch.json
  3. 23 0
      App.vue
  4. 18 0
      common/production-http/index.js
  5. 233 0
      common/production-http/interface.js
  6. 274 0
      common/production-http/production-api.js
  7. 198 0
      common/production-http/readme.md
  8. 310 0
      common/vmeitime-http/api.js
  9. 18 0
      common/vmeitime-http/index.js
  10. 229 0
      common/vmeitime-http/interface.js
  11. 198 0
      common/vmeitime-http/readme.md
  12. BIN
      components/p-personnel-orientation-navbar/icon/search.png
  13. 114 0
      components/p-personnel-orientation-navbar/p-personnel-orientation-navbar.vue
  14. 152 0
      components/p-personnel-orientation-section-1/p-personnel-orientation-section-1.vue
  15. 47 0
      components/p-personnel-orientation-section-3/p-personnel-orientation-section-3.vue
  16. 71 0
      components/p-personnel-orientation-section-4/p-personnel-orientation-section-4.vue
  17. 314 0
      components/p-production-report-inner-1/p-production-report-inner-1.vue
  18. 626 0
      components/p-production-report-inner-2/p-production-report-inner-2.vue
  19. BIN
      components/p-production-report-inner-3/icon/icon.png
  20. 77 0
      components/p-production-report-inner-3/p-production-report-inner-3.vue
  21. 97 0
      components/p-production-statistics-section-1/p-production-statistics-section-1.vue
  22. 114 0
      components/p-production-statistics-section-2/p-production-statistics-section-2.vue
  23. 93 0
      components/p-production-statistics-section-3/p-production-statistics-section-3.vue
  24. 171 0
      components/p-production-statistics-section-4/p-production-statistics-section-4.vue
  25. 242 0
      components/p-safety-monitoring-content-1/p-safety-monitoring-content-1.vue
  26. 202 0
      components/p-safety-monitoring-content-2/p-safety-monitoring-content-2.vue
  27. BIN
      components/p-safety-monitoring-navbar/icon/search.png
  28. 116 0
      components/p-safety-monitoring-navbar/p-safety-monitoring-navbar.vue
  29. BIN
      components/t-p-icon/icon_1.png
  30. BIN
      components/t-p-icon/icon_10.png
  31. BIN
      components/t-p-icon/icon_11.png
  32. BIN
      components/t-p-icon/icon_2.png
  33. BIN
      components/t-p-icon/icon_3.png
  34. BIN
      components/t-p-icon/icon_4.png
  35. BIN
      components/t-p-icon/icon_5.png
  36. BIN
      components/t-p-icon/icon_6.png
  37. BIN
      components/t-p-icon/icon_7.png
  38. BIN
      components/t-p-icon/icon_8.png
  39. BIN
      components/t-p-icon/icon_9.png
  40. 183 0
      components/t-p-n-section-1/t-p-n-section-1.vue
  41. BIN
      components/t-p-n-section-2/img/map.jpg
  42. 68 0
      components/t-p-n-section-2/t-p-n-section-2.vue
  43. 41 0
      components/t-p-ningdongyunying/t-p-ningdongyunying.vue
  44. 125 0
      components/t-p-shicaocun/t-p-shicaocun.vue
  45. 165 0
      components/u-charts/component.vue
  46. 5662 0
      components/u-charts/u-charts.js
  47. 1 0
      components/u-charts/u-charts.min.js
  48. 14 0
      index.html
  49. 30 0
      main.js
  50. 72 0
      manifest.json
  51. 173 0
      pages.json
  52. BIN
      pages/ningdongyunying/personnel_orientation/icon/right.png
  53. 159 0
      pages/ningdongyunying/personnel_orientation/personnel_orientation.vue
  54. 92 0
      pages/ningdongyunying/production_statistics/production_statistics.vue
  55. 19 0
      pages/ningdongyunying/safety_monitoring/safety_monitoring.vue
  56. 134 0
      pages/production/personnel_orientation/depart-people-2/depart-people-2.vue
  57. 145 0
      pages/production/personnel_orientation/depart-people/depart-people.vue
  58. 339 0
      pages/production/personnel_orientation/downhole_statistics/downhole_statistics.vue
  59. 100 0
      pages/production/personnel_orientation/people_track/people_track.vue
  60. 521 0
      pages/production/personnel_orientation/personnel_orientation.vue
  61. BIN
      pages/production/personnel_orientation/search/icon/search.png
  62. 275 0
      pages/production/personnel_orientation/search/search.vue
  63. 75 0
      pages/production/production_report/detail/detail.vue
  64. 92 0
      pages/production/production_report/production_report.vue
  65. BIN
      pages/production/safety_monitoring/icon/ss1.png
  66. BIN
      pages/production/safety_monitoring/icon/ss2.png
  67. BIN
      pages/production/safety_monitoring/icon/work.png
  68. BIN
      pages/production/safety_monitoring/icon/work_active.png
  69. 160 0
      pages/production/safety_monitoring/safety_monitoring.vue
  70. 257 0
      pages/production/safety_monitoring/safety_monitoring_name_detail/safety_monitoring_name_detail.vue
  71. BIN
      pages/production/safety_monitoring/safety_monitoring_search/icon/search_black.png
  72. 237 0
      pages/production/safety_monitoring/safety_monitoring_search/safety_monitoring_search.vue
  73. 138 0
      pages/production/safety_monitoring/safety_monitoring_status_detail/safety_monitoring_status_detail.vue
  74. 27 0
      pages/tabbar/index/index.vue
  75. 19 0
      pages/tabbar/my/my.vue
  76. 41 0
      pages/tabbar/production/production.vue
  77. 19 0
      pages/tabbar/workbench/workbench.vue
  78. 58 0
      read.md
  79. BIN
      static/tabbar/home.png
  80. BIN
      static/tabbar/home_active.png
  81. BIN
      static/tabbar/my.png
  82. BIN
      static/tabbar/my_active.png
  83. BIN
      static/tabbar/news.png
  84. BIN
      static/tabbar/news_active.png
  85. BIN
      static/tabbar/production.png
  86. BIN
      static/tabbar/production_active.png
  87. BIN
      static/tabbar/work.png
  88. BIN
      static/tabbar/work_active.png
  89. 76 0
      uni.scss
  90. 177 0
      uni_modules/qiun-data-charts/changelog.md
  91. 1541 0
      uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
  92. 46 0
      uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
  93. 162 0
      uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue
  94. 170 0
      uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue
  95. 173 0
      uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue
  96. 222 0
      uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue
  97. 229 0
      uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue
  98. 36 0
      uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue
  99. 422 0
      uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js
  100. 0 0
      uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js

BIN
.DS_Store


+ 20 - 0
.hbuilderx/launch.json

@@ -0,0 +1,20 @@
+{ // 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": [{
+     	"app-plus" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"h5" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 23 - 0
App.vue

@@ -0,0 +1,23 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+			// 启动初始化
+
+			// 煤矿鉴别-名称
+			uni.setStorageSync('mine_code', 'ningdongyunying');
+			// uni.setStorageSync('mine_code', 'shicaocun');
+
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+</style>

+ 18 - 0
common/production-http/index.js

@@ -0,0 +1,18 @@
+// 批量导出文件
+const requireApi = require.context(
+	// api 目录的相对路径
+	'.',
+	// 是否查询子目录
+	false,
+	// 查询文件的一个后缀
+	/.js$/
+)
+
+let module = {}
+requireApi.keys().forEach((key,index)=>{
+	if(key === './index.js' || key === './interface.js') return
+	console.log(key);
+	Object.assign(module,requireApi(key))
+})
+
+export default module

+ 233 - 0
common/production-http/interface.js

@@ -0,0 +1,233 @@
+/**
+ * 通用uni-app网络请求
+ * 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
+ */
+
+/*
+// 开放的接口
+import http from './interface'
+
+http.config.baseUrl = "http://localhost:8080/api/"
+
+http.request(url:'user/list',method:'GET').then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.get('user/list').then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.get('user/list', {status: 1}).then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.post('user', {id:1, status: 1}).then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.put('user/1', {status: 2}).then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.delete('user/1').then((res)=>{
+	console.log(JSON.stringify(res))
+}) 
+
+*/
+
+
+export default {
+	config: {
+		baseUrl: "http://nmjt.nxjiewei.com:8011/api",
+		header: {
+			"Content-Type":"multipart/form-data",
+			'Content-Type':'application/json;charset=UTF-8',
+			'Content-Type':'application/x-www-form-urlencoded',
+			'Authorization' : uni.getStorageSync('token_type') +' '+uni.getStorageSync('Authorization') || {}
+		},  
+		data: {
+			mine: "640181B0011010027175",
+			mine_code: "640181B0011010027175",
+			org_num: "1019",
+		},
+		method: "GET",
+		dataType: "json",  /* 如设为json,会对返回的数据做一次 JSON.parse */
+		responseType: "text",
+		success() {},
+		fail() {},
+		complete() {
+			// uni.hideLoading()
+		}
+	},
+	interceptor: {
+		request: null,
+		response: null
+	},
+	request(options) {
+		if (!options) {
+			options = {}
+		}
+		options.baseUrl = options.baseUrl || this.config.baseUrl
+		options.dataType = options.dataType || this.config.dataType
+		options.url = options.baseUrl + options.url
+		// 合并对象
+		options.data = {...options.data,...this.config.data}
+		options.method = options.method || this.config.method
+		//TODO 加密数据
+		
+		//TODO 数据签名
+		/* 
+		_token = {'token': getStorage(STOREKEY_LOGIN).token || 'undefined'},
+		_sign = {'sign': sign(JSON.stringify(options.data))}
+		options.header = Object.assign({}, options.header, _token,_sign) 
+		*/
+	   
+		return new Promise((resolve, reject) => {
+			let _config = null
+			
+			// uni.showLoading({
+			// 	icon:"none",
+			// 	title:"加载中...",
+			// 	mask:true
+			// })
+			
+			options.complete = (response) => {
+				let statusCode = response.statusCode
+				// console.log("【" + _config.requestId + "】 状态码:" + JSON.stringify(statusCode))
+				response.config = _config
+				if (process.env.NODE_ENV === 'development') {
+					if (statusCode === 200) {
+						// uni.hideLoading()
+						// console.log("【" + _config.requestId + "】 结果:" + JSON.stringify(response.data))
+						if(response.data.code == 401){
+							uni.showToast({
+								icon:"none",
+								title:"登录失效、请重新登录"
+							})
+							setTimeout(function(){
+								uni.redirectTo({
+									url:"/pages/login/login"
+								})
+							},2000)
+						}
+					}else if(statusCode === 500){
+						uni.hideLoading()
+						uni.showToast({
+							icon:"none",
+							title:"500"
+						})
+						// setTimeout(function(){
+						// 	uni.navigateTo({
+						// 		url:"/pages/login/login"
+						// 	})
+						// },1500)
+					}
+				}
+				if (this.interceptor.response) {
+					let newResponse = this.interceptor.response(response)
+					if (newResponse) {
+						response = newResponse
+					}
+				}
+				// 统一的响应日志记录
+				// _reslog(response)
+				if (statusCode === 200) { //成功
+					resolve(response);
+				} else {
+					reject(response)
+				}
+			}
+
+			_config = Object.assign({}, this.config, options)
+			_config.requestId = new Date().getTime()
+
+			if (this.interceptor.request) {
+				this.interceptor.request(_config)
+			}
+			
+			// 统一的请求日志记录
+			// _reqlog(_config)
+
+			if (process.env.NODE_ENV === 'development') {
+				// console.log("【" + _config.requestId + "】 地址:" + _config.url)
+				if (_config.data) {
+					// console.log("【" + _config.requestId + "】 参数:" + JSON.stringify(_config.data))
+				}
+			}
+
+			uni.request(_config);
+			
+		});
+	},
+	get(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'GET'  
+		return this.request(options)
+	},
+	post(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'POST'
+		return this.request(options)
+	},
+	put(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'PUT'
+		return this.request(options)
+	},
+	delete(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'DELETE'
+		return this.request(options)
+	}
+}
+
+
+/**
+ * 请求接口日志记录
+ */
+function _reqlog(req) {
+	if (process.env.NODE_ENV === 'development') {
+		console.log("【" + req.requestId + "】 地址:" + req.url)
+		if (req.data) {
+			console.log("【" + req.requestId + "】 请求参数:" + JSON.stringify(req.data))
+		}
+	}
+	//TODO 调接口异步写入日志数据库
+}
+
+/**
+ * 响应接口日志记录
+ */
+function _reslog(res) {
+	let _statusCode = res.statusCode;
+	if (process.env.NODE_ENV === 'development') {
+		console.log("【" + res.config.requestId + "】 地址:" + res.config.url)
+		if (res.config.data) {
+			console.log("【" + res.config.requestId + "】 请求参数:" + JSON.stringify(res.config.data))
+		}
+		console.log("【" + res.config.requestId + "】 响应结果:" + JSON.stringify(res))
+	}
+	//TODO 除了接口服务错误外,其他日志调接口异步写入日志数据库
+	switch(_statusCode){
+		case 200:
+			break;
+		case 401:
+			break;
+		case 404:
+			break;
+		default:
+			break;
+	}
+}
+

+ 274 - 0
common/production-http/production-api.js

@@ -0,0 +1,274 @@
+import http from './interface'
+
+/**
+ * 将业务所有接口统一起来便于维护
+ * 如果项目很大可以将 url 独立成文件,接口分成不同的模块
+ * 
+ */
+
+// 单独导出(测试接口) import {test} from '@/common/vmeitime-http/'
+export const test = (data) => {
+	// http.config.baseUrl = "http://localhost:8080/api/"
+	//设置请求前拦截器
+	http.interceptor.request = (config) => {
+		config.header = {
+			// "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+		}
+	}
+	//设置请求结束后拦截器
+	http.interceptor.response = (response) => {
+		// console.log('个性化response....')
+		//判断返回状态 执行相应操作
+		return response;
+	}
+    return http.request({
+		baseUrl: 'https://unidemo.dcloud.net.cn/',
+        url: 'ajax/echo/text?name=uni-app',
+		dataType: 'text',
+        data,
+    })
+}
+
+// 默认全部导出  import api from '@/common/vmeitime-http/'
+// export default {
+// 	test,
+// }
+
+
+// //方式一
+// sendRequest1(){
+// 	this.$api.getNavs({
+// 		noncestr: Date.now(),
+// 		user:123456,
+		
+// 	}).then((res)=>{
+// 		this.res = '请求结果 : ' + JSON.stringify(res);
+// 		console.log('request success', res)
+// 	}).catch((err)=>{
+// 		console.log('request fail', err);
+// 	})
+// },
+// // 方式二
+// async sendRequest2() {
+// 	let res = await this.$api.getBlocksList();
+// 	this.res = '请求结果 : ' + JSON.stringify(res);
+// }
+
+
+
+// 生产数据
+
+// 列表页数据
+// // 井下人数
+// export const personnel_mineall_people = (data) => {
+//     return http.request({
+// 		method:"POST",
+//         url: '/personnel/mineall/people',
+//         data,
+//     })
+// }
+// // 安全监测今日总量
+// export const jt_safety_total_count = (data) => {
+//     return http.request({
+// 		method:"POST",
+//         url: '/jt/safety/total/count',
+//         data,
+//     })
+// }
+// // 当日生产
+// export const coalmine_output = (data) => {
+//     return http.request({
+//         url: '/coalmine/output',
+//         data,
+//     })
+// }
+
+// 人员定位
+// 当前人员统计
+export const personnel_people_now = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/people/now',
+        data,
+    })
+}
+// 职能科室人数统计
+export const personnel_office_total = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/office/total',
+        data,
+    })
+}
+// 基层区队人数统计
+export const personnel_basic_total = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/basic/total',
+        data,
+    })
+}
+// 今日各部门人数统计
+export const personnel_depart_today = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/depart/today',
+        data,
+    })
+}
+// 下井人员查询
+export const personnel_people_search = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/people/search',
+        data,
+    })
+}
+// 部门下井人员列表
+export const personnel_depart_people = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/depart/people',
+        data,
+    })
+}
+
+// 人员定位统计
+// 下井月份列表
+export const personnel_downwell_monthlist_once = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/downwell/monthlist/once',
+        data,
+    })
+}
+// 当月下井信息
+export const personnel_downwell_month_once = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/downwell/month/once',
+        data,
+    })
+}
+// 当月下井记录
+export const personnel_downwell_month_info = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/downwell/month/info',
+        data,
+    })
+}
+
+
+
+
+
+
+// 人员轨迹
+export const personnel_downwell_once_info = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/downwell/once/info',
+        data,
+    })
+}
+// 定位信息
+export const personnel_people_info = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/personnel/people/info',
+        data,
+    })
+}
+
+
+// 安全监测
+
+// 模拟量统计
+export const jt_safety_simulation_total = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/simulation/total',
+        data,
+    })
+}
+// 开关量统计
+export const jt_safety_sluice_total = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/sluice/total',
+        data,
+    })
+}
+// 开关量模拟量查询
+export const jt_safety_info_search = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/info/search',
+        data,
+    })
+}
+// 监测类型详情
+export const jt_safety_info_total = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/info/total',
+        data,
+    })
+}
+// 监测详情
+export const jt_safety_info_detail = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/info/detail',
+        data,
+    })
+}
+// 安全监测报警列表
+export const jt_safety_Safety_bj_info = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/Safety/bj/info',
+        data,
+    })
+}
+
+// 通风管理
+
+export const jt_safety_aerator_list = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/jt/safety/aerator/list',
+        data,
+    })
+}
+
+// 井口计量
+// 今日产量
+export const coalmine_days_output = (data) => {
+    return http.request({
+        url: '/coalmine/days/output',
+        data,
+    })
+}
+// 工作面列表
+export const coalmine_working_face = (data) => {
+    return http.request({
+        url: '/coalmine/working/face',
+        data,
+    })
+}
+// 工作面详情
+export const coalmine_working_face_info = (data) => {
+    return http.request({
+        url: '/coalmine/working/face/info',
+        data,
+    })
+}
+// 产量趋势
+export const coalmine_one_trend = (data) => {
+    return http.request({
+        url: '/coalmine/one/trend',
+        data,
+    })
+}

+ 198 - 0
common/production-http/readme.md

@@ -0,0 +1,198 @@
+**插件使用说明**
+
+- 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
+- 下载后把 vmeitime-http 文件夹 copy 到项目 common/ 目录下
+
+## 1. 配置 
+
+### 1.1 全局配置修改(修改vmeitime-http/interface.js中config和interceptor)
+``` javascript 
+	config: {
+		baseUrl: "https://api.com/api/",
+		header: {
+			'Content-Type':'application/json;charset=UTF-8',
+			'Content-Type':'application/x-www-form-urlencoded'
+		},    
+		dataType: "json",  
+		responseType: "text"
+	},
+	interceptor: {
+		request: null,
+		response: null
+	}
+```
+	
+### 1.2 具体接口调用时修改(在vmeitime-http/index.js文件中具体业务接口中配置)
+``` javascript
+//设置baseUrl
+http.config.baseUrl = "http://localhost:8080/api/"
+//设置请求前拦截器
+http.interceptor.request = (config) => {
+    //添加通用参数
+    config.header = {
+        "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+    }
+}
+//设置请求结束后拦截器
+http.interceptor.response = (response) => {
+    //判断返回状态 执行相应操作
+    return response;
+}
+```	
+
+
+## 2. 使用
+
+### 2.1 全局使用(在main.js注册)
+
+``` //  main.js
+  import api from '@/common/vmeitime-http/'
+	
+	// 全局挂载后使用
+	Vue.prototype.$api = api
+```
+
+``` // pages/index/index.vue
+
+<template>
+	<view class="content">
+		
+		<view class="uni-padding-wrap uni-common-mt">
+			<view class="uni-textarea uni-common-mt">
+				<textarea :value="res"></textarea>
+			</view>
+			<view class="uni-btn-v uni-common-mt">
+				<button type="primary" @click="sendRequest" :loading="loading">发起请求</button>
+				<button type="default" @click="sendRequest1" :loading="loading">发起请求(async/await)</button>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				loading: false,
+				res: ''
+			}
+		},
+		onLoad(option) {
+			//this.sendRequest();
+			//this.sendRequest1();
+		},
+		methods: {
+			// 方式一
+			sendRequest: function() {
+				this.loading = true
+				this.$api.test({noncestr: Date.now()}).then((res)=>{
+					this.loading = false;
+					console.log('request success', res)
+					uni.showToast({
+						title: '请求成功',
+						icon: 'success',
+						mask: true
+					});
+					this.res = '请求结果 : ' + JSON.stringify(res);
+				}).catch((err)=>{
+					this.loading = false;
+					console.log('request fail', err);
+				})
+			},
+			
+			//方式二  https://segmentfault.com/a/1190000013292562?utm_source=channel-newest
+			async sendRequest1() {
+				this.loading = true
+				let res = await this.$api.test({noncestr: Date.now()});
+				this.loading = false;
+				this.res = '请求结果 : ' + JSON.stringify(res);
+			}
+		}
+	}
+</script>
+```
+
+
+### 2.2 局部使用(局部使用,不需要在 main.js 中注册) 
+
+``` // pages/index/index.vue
+
+<template>
+	<view class="content">
+		
+		<view class="uni-padding-wrap uni-common-mt">
+			<view class="uni-textarea uni-common-mt">
+				<textarea :value="res"></textarea>
+			</view>
+			<view class="uni-btn-v uni-common-mt">
+				<button type="primary" @click="sendRequest" :loading="loading">发起请求</button>
+				<button type="default" @click="sendRequest1" :loading="loading">发起请求(async/await)</button>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+    import api from '@/common/vmeitime-http/'
+
+    export default {
+        data() {
+            return {
+				loading: false,
+				res: ''
+			}
+        },
+        onLoad(option) {
+        	//this.sendRequest();
+        	//this.sendRequest1();
+        },
+        methods: {
+        	// 方式一
+        	sendRequest: function() {
+        		this.loading = true
+        		api.test({noncestr: Date.now()}).then((res)=>{
+        			this.loading = false;
+        			console.log('request success', res)
+        			uni.showToast({
+        				title: '请求成功',
+        				icon: 'success',
+        				mask: true
+        			});
+        			this.res = '请求结果 : ' + JSON.stringify(res);
+        		}).catch((err)=>{
+        			this.loading = false;
+        			console.log('request fail', err);
+        		})
+        	},
+        	
+        	//方式二
+        	async sendRequest1() {
+        		this.loading = true
+        		let res = await this.api.test({noncestr: Date.now()});
+        		this.loading = false;
+        		this.res = '请求结果 : ' + JSON.stringify(res);
+        	}
+        }
+    }
+</script>
+
+```
+
+
+## 3. 接口数据加密、接口签名核验
+
+在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码
+
+## 4. 接口请求/响应日志记录
+
+在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码
+
+## 5. 业务相关接口编写
+
+在vmeitime-http/index.js文件中的编写具体业务相关的接口,参考test()方法
+
+
+
+	

+ 310 - 0
common/vmeitime-http/api.js

@@ -0,0 +1,310 @@
+import http from './interface'
+
+/**
+ * 将业务所有接口统一起来便于维护
+ * 如果项目很大可以将 url 独立成文件,接口分成不同的模块
+ * 
+ */
+
+// 单独导出(测试接口) import {test} from '@/common/vmeitime-http/'
+export const test = (data) => {
+	// http.config.baseUrl = "http://localhost:8080/api/"
+	//设置请求前拦截器
+	http.interceptor.request = (config) => {
+		config.header = {
+			// "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+		}
+	}
+	//设置请求结束后拦截器
+	http.interceptor.response = (response) => {
+		// console.log('个性化response....')
+		//判断返回状态 执行相应操作
+		return response;
+	}
+    return http.request({
+		baseUrl: 'https://unidemo.dcloud.net.cn/',
+        url: 'ajax/echo/text?name=uni-app',
+		dataType: 'text',
+        data,
+    })
+}
+
+// 默认全部导出  import api from '@/common/vmeitime-http/'
+// export default {
+// 	test,
+// }
+
+
+// //方式一
+// sendRequest1(){
+// 	this.$api.getNavs({
+// 		noncestr: Date.now(),
+// 		user:123456,
+		
+// 	}).then((res)=>{
+// 		this.res = '请求结果 : ' + JSON.stringify(res);
+// 		console.log('request success', res)
+// 	}).catch((err)=>{
+// 		console.log('request fail', err);
+// 	})
+// },
+// // 方式二
+// async sendRequest2() {
+// 	let res = await this.$api.getBlocksList();
+// 	this.res = '请求结果 : ' + JSON.stringify(res);
+// }
+
+
+
+// 请求首页分类链接
+export const home_link = (data) => {
+    return http.request({
+        url: '/home/links',
+        data,
+    })
+}
+// 请求首页导航链接
+export const homeNav_list = (data) => {
+    return http.request({
+        url: '/homeNav/list',
+        data,
+    })
+}
+
+
+// 登录
+export const login = (data) => {
+    return http.request({
+		method: "POST",
+        url: '/oauth/token',
+        data,
+    })
+}
+
+// 首页
+// 首页公告
+export const notice_list = (data) => {
+	return http.request({
+		url:'/notice/list',
+		data
+	})
+}
+// 首页轮播图
+export const scrollImg_list = (data) => {
+	return http.request({
+		url:'/scrollImg/list',
+		data
+	})
+}
+// 首页新闻动态 
+export const article_list = (data) => {
+	return http.request({
+		url:'/article/list',
+		data
+	})
+}
+
+// 消息推送
+// 消息列表
+export const message_list = (data) => {
+    return http.request({
+        url: '/message/list',
+        data,
+    })
+}
+// 标记已读
+export const message_read = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/message/read',
+        data,
+    })
+}
+// 未读消息数
+export const message_unread_num = (data) => {
+    return http.request({
+        url: '/message/unread_num',
+        data,
+    })
+}
+
+// 梅花井 业务审核管理
+// 业务审核列表
+export const worksheet_check_listmei = (data) => {
+    return http.request({
+        url: '/worksheet/check/listmei',
+        data,
+    })
+}
+// 业务审核详情
+export const worksheet_checkmei = (data) => {
+    return http.request({
+        url: '/worksheet/checkmei/' + data.id,
+        data,
+    })
+}
+// 提交审核
+export const worksheet_checkmei_tijiao = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/worksheet/checkmei/' + data.id,
+        data,
+    })
+}
+// 我的业务列表
+export const worksheet_apply_listmei = (data) => {
+    return http.request({
+        url: '/worksheet/apply/listmei',
+        data,
+    })
+}
+//我的业务撤回 
+export const worksheet_orderdel = (data) => {
+    return http.request({
+		method:"POST",
+        url: '/worksheet/orderdel/' + data.id,
+        data,
+    })
+}
+//我的业务详情 
+export const worksheet_applymei = (data) => {
+    return http.request({
+        url: '/worksheet/applymei/' + data.id,
+        data,
+    })
+}
+
+// 业务申请
+// 业务选择列表
+export const worksheet_classify_list = (data) => {
+    return http.request({
+        url: '/worksheet/classify/list',
+        data,
+    })
+}
+// 可申请业务列表
+export const worksheet_design_list = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/worksheet/design/list',
+        data,
+    })
+}
+// 可申请业务详情
+export const worksheet_designmei = (data) => {
+    return http.request({
+        url: '/worksheet/designmei/' + data.id,
+        data,
+    })
+}
+// 强制浏览限制
+export const worksheet_force_query = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/worksheet/force/query',
+        data,
+    })
+}
+
+
+// 我的
+// 上传头像
+export const user_avatar_upload = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/user/avatar/upload',
+        data,
+    })
+}
+// 发送验证码
+export const sms_vcode = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/sms/vcode',
+        data,
+    })
+}
+
+// 忘记密码,不需要token的发送验证码
+export const sms_send_v_code = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/sms/send_v_code',
+        data,
+    })
+}
+// 绑定手机号
+export const user_mobile_set = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/user/mobile/set',
+        data,
+    })
+}
+// 修改密码
+export const user_repassword = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/user/repassword',
+        data,
+    })
+}
+
+// 忘记密码
+export const user_forget_password = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/user/forget_password',
+        data,
+    })
+}
+
+// 上传手写签名
+export const worksheet_baseimg = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/worksheet/baseimg',
+        data,
+    })
+}
+
+
+
+// 生产数据
+
+// 生产公告
+export const dispatch_bulletin = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/dispatch/bulletin',
+        data,
+    })
+}
+
+// 模拟量统计
+export const safety_simulation_total = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/safety/simulation/total',
+        data,
+    })
+}
+
+
+// 用户权限设置
+export const workbench_leader_mailbox_check = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/workbench/leader_mailbox/check',
+        data,
+    })
+}
+
+// 隐患排查待办数量
+export const troubleshoot_getDBNum = (data) => {
+    return http.request({
+		method:'POST',
+        url: '/troubleshoot/getDBNum',
+        data,
+    })
+}

+ 18 - 0
common/vmeitime-http/index.js

@@ -0,0 +1,18 @@
+// 批量导出文件
+const requireApi = require.context(
+	// api 目录的相对路径
+	'.',
+	// 是否查询子目录
+	false,
+	// 查询文件的一个后缀
+	/.js$/
+)
+
+let module = {}
+requireApi.keys().forEach((key,index)=>{
+	if(key === './index.js' || key === './interface.js') return
+	console.log(key);
+	Object.assign(module,requireApi(key))
+})
+
+export default module

+ 229 - 0
common/vmeitime-http/interface.js

@@ -0,0 +1,229 @@
+/**
+ * 通用uni-app网络请求
+ * 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
+ */
+
+/*
+// 开放的接口
+import http from './interface'
+
+http.config.baseUrl = "http://localhost:8080/api/"
+
+http.request(url:'user/list',method:'GET').then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.get('user/list').then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.get('user/list', {status: 1}).then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.post('user', {id:1, status: 1}).then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.put('user/1', {status: 2}).then((res)=>{
+	console.log(JSON.stringify(res))
+})
+http.delete('user/1').then((res)=>{
+	console.log(JSON.stringify(res))
+}) 
+
+*/
+
+
+export default {
+	config: {
+		// baseUrl: "http://colliery.nxjiewei.com/api",
+		baseUrl: "http://meihuajing.nxjiewei.com:8011/api",
+		header: {
+			"Content-Type":"multipart/form-data",
+			'Content-Type':'application/json;charset=UTF-8',
+			'Content-Type':'application/x-www-form-urlencoded',
+			'Authorization' : uni.getStorageSync('token_type') +' '+uni.getStorageSync('Authorization') || {}
+		},  
+		data: {},
+		method: "GET",
+		dataType: "json",  /* 如设为json,会对返回的数据做一次 JSON.parse */
+		responseType: "text",
+		success() {},
+		fail() {},
+		complete() {
+			// uni.hideLoading()
+		}
+	},
+	interceptor: {
+		request: null,
+		response: null
+	},
+	request(options) {
+		if (!options) {
+			options = {}
+		}
+		options.baseUrl = options.baseUrl || this.config.baseUrl
+		options.dataType = options.dataType || this.config.dataType
+		options.url = options.baseUrl + options.url
+		options.data = options.data || {}
+		options.method = options.method || this.config.method
+		//TODO 加密数据
+		
+		//TODO 数据签名
+		/* 
+		_token = {'token': getStorage(STOREKEY_LOGIN).token || 'undefined'},
+		_sign = {'sign': sign(JSON.stringify(options.data))}
+		options.header = Object.assign({}, options.header, _token,_sign) 
+		*/
+	   
+		return new Promise((resolve, reject) => {
+			let _config = null
+			
+			// uni.showLoading({
+			// 	icon:"none",
+			// 	title:"加载中...",
+			// 	mask:true
+			// })
+			
+			options.complete = (response) => {
+				let statusCode = response.statusCode
+				// console.log("【" + _config.requestId + "】 状态码:" + JSON.stringify(statusCode))
+				response.config = _config
+				if (process.env.NODE_ENV === 'development') {
+					if (statusCode === 200) {
+						// uni.hideLoading()
+						// console.log("【" + _config.requestId + "】 结果:" + JSON.stringify(response.data))
+						if(response.data.code == 401){
+							uni.showToast({
+								icon:"none",
+								title:"登录失效、请重新登录"
+							})
+							setTimeout(function(){
+								uni.redirectTo({
+									url:"/pages/login/login"
+								})
+							},2000)
+						}
+					}else if(statusCode === 500){
+						uni.hideLoading()
+						uni.showToast({
+							icon:"none",
+							title:"500"
+						})
+						// setTimeout(function(){
+						// 	uni.navigateTo({
+						// 		url:"/pages/login/login"
+						// 	})
+						// },1500)
+					}
+				}
+				if (this.interceptor.response) {
+					let newResponse = this.interceptor.response(response)
+					if (newResponse) {
+						response = newResponse
+					}
+				}
+				// 统一的响应日志记录
+				// _reslog(response)
+				if (statusCode === 200) { //成功
+					resolve(response);
+				} else {
+					reject(response)
+				}
+			}
+
+			_config = Object.assign({}, this.config, options)
+			_config.requestId = new Date().getTime()
+
+			if (this.interceptor.request) {
+				this.interceptor.request(_config)
+			}
+			
+			// 统一的请求日志记录
+			// _reqlog(_config)
+
+			if (process.env.NODE_ENV === 'development') {
+				// console.log("【" + _config.requestId + "】 地址:" + _config.url)
+				if (_config.data) {
+					// console.log("【" + _config.requestId + "】 参数:" + JSON.stringify(_config.data))
+				}
+			}
+
+			uni.request(_config);
+			
+		});
+	},
+	get(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'GET'  
+		return this.request(options)
+	},
+	post(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'POST'
+		return this.request(options)
+	},
+	put(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'PUT'
+		return this.request(options)
+	},
+	delete(url, data, options) {
+		if (!options) {
+			options = {}
+		}
+		options.url = url
+		options.data = data
+		options.method = 'DELETE'
+		return this.request(options)
+	}
+}
+
+
+/**
+ * 请求接口日志记录
+ */
+function _reqlog(req) {
+	if (process.env.NODE_ENV === 'development') {
+		console.log("【" + req.requestId + "】 地址:" + req.url)
+		if (req.data) {
+			console.log("【" + req.requestId + "】 请求参数:" + JSON.stringify(req.data))
+		}
+	}
+	//TODO 调接口异步写入日志数据库
+}
+
+/**
+ * 响应接口日志记录
+ */
+function _reslog(res) {
+	let _statusCode = res.statusCode;
+	if (process.env.NODE_ENV === 'development') {
+		console.log("【" + res.config.requestId + "】 地址:" + res.config.url)
+		if (res.config.data) {
+			console.log("【" + res.config.requestId + "】 请求参数:" + JSON.stringify(res.config.data))
+		}
+		console.log("【" + res.config.requestId + "】 响应结果:" + JSON.stringify(res))
+	}
+	//TODO 除了接口服务错误外,其他日志调接口异步写入日志数据库
+	switch(_statusCode){
+		case 200:
+			break;
+		case 401:
+			break;
+		case 404:
+			break;
+		default:
+			break;
+	}
+}
+

+ 198 - 0
common/vmeitime-http/readme.md

@@ -0,0 +1,198 @@
+**插件使用说明**
+
+- 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
+- 下载后把 vmeitime-http 文件夹 copy 到项目 common/ 目录下
+
+## 1. 配置 
+
+### 1.1 全局配置修改(修改vmeitime-http/interface.js中config和interceptor)
+``` javascript 
+	config: {
+		baseUrl: "https://api.com/api/",
+		header: {
+			'Content-Type':'application/json;charset=UTF-8',
+			'Content-Type':'application/x-www-form-urlencoded'
+		},    
+		dataType: "json",  
+		responseType: "text"
+	},
+	interceptor: {
+		request: null,
+		response: null
+	}
+```
+	
+### 1.2 具体接口调用时修改(在vmeitime-http/index.js文件中具体业务接口中配置)
+``` javascript
+//设置baseUrl
+http.config.baseUrl = "http://localhost:8080/api/"
+//设置请求前拦截器
+http.interceptor.request = (config) => {
+    //添加通用参数
+    config.header = {
+        "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+    }
+}
+//设置请求结束后拦截器
+http.interceptor.response = (response) => {
+    //判断返回状态 执行相应操作
+    return response;
+}
+```	
+
+
+## 2. 使用
+
+### 2.1 全局使用(在main.js注册)
+
+``` //  main.js
+  import api from '@/common/vmeitime-http/'
+	
+	// 全局挂载后使用
+	Vue.prototype.$api = api
+```
+
+``` // pages/index/index.vue
+
+<template>
+	<view class="content">
+		
+		<view class="uni-padding-wrap uni-common-mt">
+			<view class="uni-textarea uni-common-mt">
+				<textarea :value="res"></textarea>
+			</view>
+			<view class="uni-btn-v uni-common-mt">
+				<button type="primary" @click="sendRequest" :loading="loading">发起请求</button>
+				<button type="default" @click="sendRequest1" :loading="loading">发起请求(async/await)</button>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				loading: false,
+				res: ''
+			}
+		},
+		onLoad(option) {
+			//this.sendRequest();
+			//this.sendRequest1();
+		},
+		methods: {
+			// 方式一
+			sendRequest: function() {
+				this.loading = true
+				this.$api.test({noncestr: Date.now()}).then((res)=>{
+					this.loading = false;
+					console.log('request success', res)
+					uni.showToast({
+						title: '请求成功',
+						icon: 'success',
+						mask: true
+					});
+					this.res = '请求结果 : ' + JSON.stringify(res);
+				}).catch((err)=>{
+					this.loading = false;
+					console.log('request fail', err);
+				})
+			},
+			
+			//方式二  https://segmentfault.com/a/1190000013292562?utm_source=channel-newest
+			async sendRequest1() {
+				this.loading = true
+				let res = await this.$api.test({noncestr: Date.now()});
+				this.loading = false;
+				this.res = '请求结果 : ' + JSON.stringify(res);
+			}
+		}
+	}
+</script>
+```
+
+
+### 2.2 局部使用(局部使用,不需要在 main.js 中注册) 
+
+``` // pages/index/index.vue
+
+<template>
+	<view class="content">
+		
+		<view class="uni-padding-wrap uni-common-mt">
+			<view class="uni-textarea uni-common-mt">
+				<textarea :value="res"></textarea>
+			</view>
+			<view class="uni-btn-v uni-common-mt">
+				<button type="primary" @click="sendRequest" :loading="loading">发起请求</button>
+				<button type="default" @click="sendRequest1" :loading="loading">发起请求(async/await)</button>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+    import api from '@/common/vmeitime-http/'
+
+    export default {
+        data() {
+            return {
+				loading: false,
+				res: ''
+			}
+        },
+        onLoad(option) {
+        	//this.sendRequest();
+        	//this.sendRequest1();
+        },
+        methods: {
+        	// 方式一
+        	sendRequest: function() {
+        		this.loading = true
+        		api.test({noncestr: Date.now()}).then((res)=>{
+        			this.loading = false;
+        			console.log('request success', res)
+        			uni.showToast({
+        				title: '请求成功',
+        				icon: 'success',
+        				mask: true
+        			});
+        			this.res = '请求结果 : ' + JSON.stringify(res);
+        		}).catch((err)=>{
+        			this.loading = false;
+        			console.log('request fail', err);
+        		})
+        	},
+        	
+        	//方式二
+        	async sendRequest1() {
+        		this.loading = true
+        		let res = await this.api.test({noncestr: Date.now()});
+        		this.loading = false;
+        		this.res = '请求结果 : ' + JSON.stringify(res);
+        	}
+        }
+    }
+</script>
+
+```
+
+
+## 3. 接口数据加密、接口签名核验
+
+在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码
+
+## 4. 接口请求/响应日志记录
+
+在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码
+
+## 5. 业务相关接口编写
+
+在vmeitime-http/index.js文件中的编写具体业务相关的接口,参考test()方法
+
+
+
+	

BIN
components/p-personnel-orientation-navbar/icon/search.png


+ 114 - 0
components/p-personnel-orientation-navbar/p-personnel-orientation-navbar.vue

@@ -0,0 +1,114 @@
+<template>
+	<view>
+		<view class="content">
+			<view :style="{height:statusBarHeight + 'px'}"></view>
+			<view class="navbar">
+		
+				<view class="left" @click="click_left()">
+					<uni-icons type="arrowleft" color="#fff" size="18"></uni-icons>
+				</view>
+				<view class="right" @click="search()">
+					<view class="input_box">
+						<view class="input_icon"></view>
+						<view class="input_text">搜索井下人员</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 占位符 -->
+		<view :style="{height: statusBarHeight + 'px'}"></view>
+		<view style="height: 94rpx;"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: ['mine'],
+		data() {
+			return {
+				statusBarHeight: 20,
+				
+			};
+		},
+		created() {
+			// 获取手机系统信息
+			const info = uni.getSystemInfoSync()
+			// 设置状态栏高度
+			this.statusBarHeight = info.statusBarHeight
+			
+			
+		},
+		methods: {
+			click_left() {
+				uni.navigateBack();
+			},
+			search(){
+				uni.navigateTo({
+					url:"../../production/personnel_orientation/search/search?mine=" + this.mine
+				})
+			}
+		}
+
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		position: fixed;
+		top: 0;
+		left: 0;
+			
+		background-color: #009FE8;
+		z-index: 999;
+	}
+
+	.navbar {
+		width: 750rpx;
+		box-sizing: border-box;
+		padding-left: 31rpx;
+		padding-right: 26rpx;
+		padding-top: 14rpx;
+		padding-bottom: 14rpx;
+		display: flex;
+		// justify-content: space-between;
+
+		.left {
+			width: 42rpx;
+			line-height: 65rpx;
+			margin-right: 15rpx;
+		}
+
+		.right {
+			width: 620rpx;
+			height: 65rpx;
+			background: rgba(255, 255, 255, 0.2);
+			border-radius: 33rpx;
+
+			.input_box {
+				display: flex;
+
+				.input_icon {
+					margin-left: 43rpx;
+					margin-top: 16rpx;
+					width: 34rpx;
+					height: 34rpx;
+
+					background-image: url(icon/search.png);
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+
+				.input_text {
+					margin-left: 19rpx;
+
+					font-size: 24rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+					line-height: 65rpx;
+
+				}
+			}
+		}
+	}
+</style>

+ 152 - 0
components/p-personnel-orientation-section-1/p-personnel-orientation-section-1.vue

@@ -0,0 +1,152 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="title">
+				当前井下人员
+			</view>
+			<view class="inner">
+				<slot></slot>
+			</view>
+
+
+			<!-- 当前下井领导 -->
+			<view class="list" v-if="people_list.length > 0">
+				<view class="label">
+					<view class="text box_1">姓名</view>
+					<view class="text box_2">下井时间</view>
+					<view class="text box_3">当前位置</view>
+				</view>
+				<view class="item" v-for="(item,index) in people_list" :key="index">
+					<view class="text box_1">{{item.name}}</view>
+					<view class="text box_2">{{item.down_time}}</view>
+					<view class="text box_3">{{item.station_name}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+
+<script>
+	export default {
+		props: ['mine'],
+		data() {
+			return {
+				// mine:"",
+				people_list: [],
+				
+			}
+		},
+		watch: {
+			// mine: function(newVal, oldVal) {
+			// 	this.mine = newVal
+			// 	console.log(newVal)
+			// }
+		},
+		created() {
+			this.$p_api.personnel_people_now({
+				mine: this.mine
+			}).then((res) => {
+				console.log(res)
+				this.people_list = res.data.data.people_list
+			})
+		}
+	}
+</script>
+
+
+
+<style lang="scss">
+	.content {
+		margin-top: 16rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 3rpx 29rpx 0px rgba(59, 74, 116, 0.14);
+		border-radius: 20rpx;
+
+		.title {
+			line-height: 96rpx;
+			text-align: center;
+
+
+			font-size: 30rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #232627;
+
+			border-bottom: 2rpx solid #f3f3f3;
+		}
+
+		.inner {
+			// height: 500px;
+		}
+	}
+
+	.list {
+		padding: 0 10rpx;
+
+		.label {
+			display: flex;
+			align-items: center;
+			height: 82rpx;
+			background: #F3F6FA;
+
+			.text {
+				text-align: center;
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+
+			.box_1 {
+				width: 150rpx;
+			}
+
+			.box_2 {
+				width: 150rpx;
+			}
+
+			.box_3 {
+				text-align: right;
+				width: 400rpx;
+				padding-right: 15rpx;
+			}
+		}
+
+		.item {
+			display: flex;
+			align-items: center;
+			height: 82rpx;
+
+			.text {
+				text-align: center;
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+
+			.box_1 {
+				width: 150rpx;
+			}
+
+			.box_2 {
+				width: 150rpx;
+			}
+
+			.box_3 {
+				text-align: right;
+				width: 400rpx;
+				padding-right: 15rpx;
+			}
+		}
+	}
+</style>

+ 47 - 0
components/p-personnel-orientation-section-3/p-personnel-orientation-section-3.vue

@@ -0,0 +1,47 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="title">
+				井下人员(部门分布)
+			</view>
+			<view class="inner">
+				<slot></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content{
+		margin-top: 16rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 3rpx 29rpx 0px rgba(59, 74, 116, 0.14);
+		border-radius: 20rpx;
+
+		.title{
+			line-height: 96rpx;
+			text-align: center;
+			
+			
+			font-size: 30rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #232627;
+			
+			border-bottom: 2rpx solid #f3f3f3;
+		}
+		.inner{
+			// height: 200rpx;
+		}
+	}
+</style>

+ 71 - 0
components/p-personnel-orientation-section-4/p-personnel-orientation-section-4.vue

@@ -0,0 +1,71 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="title">
+				<picker mode="selector" :range="array" :value="index" @change="bindPickerChange">
+					<view class="title_select">
+						<view>{{array[index]}}</view>
+						<view class="icon">
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+				</picker>
+			</view>
+			<view class="inner">
+				<slot></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				array: ['当前各科室下井人数', '今日各科室下井人数'],
+				index: 0,
+			};
+		},
+		methods: {
+			bindPickerChange: function(e) {
+				console.log('picker发送选择改变,携带值为', e.target.value)
+				this.$emit("changeDepart",e.target.value)
+				this.index = e.target.value
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		margin-top: 16rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 3rpx 29rpx 0px rgba(59, 74, 116, 0.14);
+		border-radius: 20rpx;
+
+		.title {
+			line-height: 96rpx;
+			text-align: center;
+
+
+			font-size: 30rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #232627;
+			
+
+			
+			.title_select{
+				display: flex;
+				justify-content: center;
+				.icon{
+					margin-left: 20rpx;
+				}
+			}
+		}
+
+		.inner {
+			// height: 200rpx;
+		}
+	}
+</style>

+ 314 - 0
components/p-production-report-inner-1/p-production-report-inner-1.vue

@@ -0,0 +1,314 @@
+<template>
+	<view class="inner">
+		<view class="img">
+			<canvas canvas-id="canvasRing" id="canvasRing" @touchstart="touchRing" style="width: 700upx; height:500upx;"></canvas>
+		</view>
+
+		<view class="container">
+			<view class="title">
+				<view class="row">
+					<view class="item">
+						<view class="icon"></view>
+						<view class="name"> </view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="name">早班</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="name">中班</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="name">晚班</view>
+					</view>
+				</view>
+			</view>
+			
+			
+		
+			<view class="content">
+				<view class="row">
+					<view class="item">当日</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[0].n1}}吨</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[0].n2}}吨</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[0].n3}}吨</view>
+					</view>
+				</view>
+				<view class="row">
+					<view class="item">昨日</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[1].n1}}吨</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[1].n2}}吨</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[1].n3}}吨</view>
+					</view>
+				</view>
+				<view class="row">
+					<view class="item">前日</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[2].n1}}吨</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[2].n2}}吨</view>
+					</view>
+					<view class="item">
+						<view class="icon"></view>
+						<view class="num">{{data[2].n3}}吨</view>
+					</view>
+				</view>
+			</view>
+	
+	
+	
+		</view>
+	</view>
+</template>
+
+<script>
+	import uCharts from '@/components/u-charts/u-charts.js';
+	var _self;
+	var canvaRing = null;
+
+	export default {
+		props:[
+			"mine",
+			"org_num"
+		],
+		data() {
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				serverData: '',
+				
+				data:[
+					{
+						n1:0,
+						n2:0,
+						n3:0
+					},
+					{
+						n1:0,
+						n2:0,
+						n3:0
+					},
+					{
+						n1:0,
+						n2:0,
+						n3:0
+					}
+				]
+			}
+		},
+		mounted() {
+			_self = this;
+			this.cWidth = uni.upx2px(700);
+			this.cHeight = uni.upx2px(500);
+			this.getServerData();
+		},
+		methods: {
+			getServerData() {
+				this.$p_api.coalmine_days_output({
+					mine:this.mine,
+					org_num:this.org_num
+				}).then((res)=>{
+					// console.log(res)
+					
+					this.data = res.data.data
+					// console.log(this.data)
+					
+					let Ring = {
+						"series": [{
+							"name": "早班",
+							"data": 0
+						}, {
+							"name": "中班",
+							"data": 0
+						}, {
+							"name": "晚班",
+							"data": 0
+						}],
+						"total":0
+					};
+					
+					Ring.total = res.data.data[0].total
+					
+					Ring.series[0].data = res.data.data[0].n1
+					Ring.series[1].data = res.data.data[0].n2
+					Ring.series[2].data = res.data.data[0].n3
+					
+					_self.showRing("canvasRing", Ring);
+				})
+				
+			},
+			showRing(canvasId, chartData) {
+				canvaRing = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'ring',
+					fontSize: 11,
+					legend: {
+						show: true,
+						position: 'right',
+						lineHeight: 40,
+					},
+					title: {
+						name: chartData.total + ' ',
+						color: '#000000',
+						fontSize: 20 * _self.pixelRatio,
+						offsetY: 20 * _self.pixelRatio,
+					},
+					subtitle: {
+						name: "总产量",
+						color: '#666666',
+						fontSize: 14 * _self.pixelRatio,
+						offsetY: -30 * _self.pixelRatio,
+					},
+					extra: {
+						pie: {
+							offsetAngle: -90,
+							ringWidth: 20 * _self.pixelRatio,
+							labelWidth: 15
+						}
+					},
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					disablePieStroke: true,
+					dataLabel: false,
+				});
+			},
+			touchRing(e) {
+				canvaRing.showToolTip(e, {
+					format: function(item) {
+						return item.name + ' : ' + item.data + ' 吨'
+					}
+				});
+			},
+		}
+
+	}
+</script>
+
+<style lang="scss">
+	.inner {
+		padding-bottom: 40rpx;
+	}
+
+	.img {
+		height: 500rpx;
+	}
+
+	.container {
+		.title {
+			.row {
+				display: flex;
+
+				.item {
+					width: 165rpx;
+
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					line-height: 72rpx;
+					border-bottom: 1px solid #eee;
+
+					.icon {
+						width: 16rpx;
+						height: 16rpx;
+						border-radius: 50%;
+					}
+
+					.name {
+						margin-left: 16rpx;
+						font-size: 20rpx;
+						color: #9a9a9a;
+					}
+				}
+
+				.item:nth-child(2) .icon {
+					background-color: #00A0EC;
+				}
+
+				.item:nth-child(3) .icon {
+					background-color: #F7BE3B;
+				}
+
+				.item:nth-child(4) .icon {
+					background-color: #FFBEAD;
+				}
+			}
+		}
+
+		.content {
+			padding: 0 20rpx;
+
+			.row {
+				display: flex;
+
+				.item {
+					width: 165rpx;
+
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+
+					line-height: 72rpx;
+					border-bottom: 1px solid #eee;
+
+					color: #9a9a9a;
+					font-size: 20rpx;
+
+					.icon {
+						width: 16rpx;
+						height: 16rpx;
+						border-radius: 50%;
+					}
+
+					.num {
+						margin-left: 16rpx;
+						font-size: 24rpx;
+
+						color: #1e1e1e;
+
+					}
+				}
+
+				.item:nth-child(2) .icon {
+					background-color: #00A0EC;
+				}
+
+				.item:nth-child(3) .icon {
+					background-color: #F7BE3B;
+				}
+
+				.item:nth-child(4) .icon {
+					background-color: #FFBEAD;
+				}
+			}
+		}
+	}
+</style>

+ 626 - 0
components/p-production-report-inner-2/p-production-report-inner-2.vue

@@ -0,0 +1,626 @@
+<template>
+	<view>
+		<!-- 产量趋势 -->
+		<view class="content">
+			<view class="title_box">
+				<picker mode="selector" :range="array_active" :value="index_active" @change="bindPickerChange_active">
+					<view class="box">
+						<view>{{array_active[index_active]}}</view>
+						<view class="icon">
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+				</picker>
+				
+				<view v-if="index_active==1">
+					<picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange" fields="month">
+						<view class="box">
+							<view>{{date}}</view>
+						</view>
+					</picker>
+				</view>
+				
+				<view v-if="index_active==2">
+					<picker mode="date" :value="date_year" :start="startDate_year" :end="endDate_year" @change="bindDateChange_year" fields="year">
+						<view class="box">
+							<view>{{date_year}}</view>
+						</view>
+					</picker>
+				</view>
+				
+			</view>
+			<view class="inner">
+				<view v-show="index_active == 0">
+					<view class="inner_content">
+						<canvas style="width: 700upx; height:600upx;" canvas-id="canvasColumnStack" id="canvasColumnStack" class="charts"  @touchstart="touchColumn"></canvas>
+					</view>
+				</view>
+				<view v-show="index_active == 1">
+					<view class="inner_content">
+						<canvas style="width: 700upx; height:2500upx;" canvas-id="canvasColumnStack_month" id="canvasColumnStack_month" class="charts"  @touchstart="touchColumn_month"></canvas>
+					</view>
+				</view>
+				<view v-show="index_active == 2">
+					<view class="inner_content">
+						<canvas style="width: 700upx; height:600upx;" canvas-id="canvasColumnStack_year" id="canvasColumnStack_year" class="charts"  @touchstart="touchColumn_year"></canvas>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uCharts from '@/components/u-charts/u-charts.js';
+	var _self;
+	
+	// 周产量
+	var canvaColumn=null;
+	
+	// 月产量
+	var canvaColumn_month=null;
+	
+	// 年产量
+	var canvaColumn_year=null;
+   
+	
+	
+	export default {
+		name:"p-production-report-inner-2",
+		props:[
+			"mine",
+			"org_num"
+		],
+		data() {
+			const currentDate = this.getDate({
+				format: true
+			})
+			const currentDate_year = this.getDate_year({
+				format: true
+			})
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				// serverData: '',
+				
+				
+				// 月
+				cWidth_month: '',
+				cHeight_month: '',
+				pixelRatio_month: 1,
+				cHeight_month:'',
+				
+				// 周产量
+				
+				// 产量趋势
+				array_active: ['周产量趋势', '月产量趋势','年产量趋势'],
+				index_active: 0,
+				// 年 月
+				date: currentDate,
+				// 
+				date_year:currentDate_year,
+				
+				
+				
+				// 当前月
+				month:""
+				
+			}
+		},
+		computed: {
+			// 月
+			startDate() {
+				return this.getDate('start');
+			},
+			endDate() {
+				return this.getDate('end');
+			},
+			// 年
+			startDate_year() {
+				return this.getDate_year('start');
+			},
+			endDate_year() {
+				return this.getDate_year('end');
+			}
+		},
+		created() {
+			this.month = (new Date().getFullYear()) + "-" + (new Date().getMonth()+1)
+			// console.log(this.month)
+			_self = this;
+			this.cWidth = uni.upx2px(680);
+			this.cHeight = uni.upx2px(500);
+			
+			this.cWidth_month = uni.upx2px(680);
+			this.cHeight_month = uni.upx2px(2500);
+			
+			// 周产量
+			this.getServerData_week();
+			
+			// 月产量
+			this.getServerData_month(this.date);
+			
+			// 年产量
+			this.getServerData_year(this.date_year);
+			
+		},
+		methods: {
+			// 产量趋势 选择列表
+			bindPickerChange_active: function(e) {
+				console.log('picker发送选择改变,携带值为', e.target.value)
+				this.index_active = 0
+				
+				setTimeout(()=>{
+					this.index_active = e.target.value
+					
+					if(this.index_active == 0){
+						this.getServerData_week(this.date)
+					}else if(this.index_active == 1){
+						// uni.switchTab({
+						// 	url:"../../tabbar/production/production",
+						// 	animationType:"fade-in",
+						// 	animationDuration:50
+						// })
+						// uni.navigateTo({
+						// 	url:"../../production/p-i-metering/p-i-metering",
+						// 	animationType:"fade-in",
+						// 	animationDuration:150
+						// })
+						// console.log(this.date)
+						this.date = this.month
+						this.getServerData_month(this.month)
+					}else if(this.index_active == 2){
+						this.getServerData_year(this.date_year)
+					}
+					
+				},100)
+				
+				
+			},
+			// 月
+			bindDateChange: function(e) {
+				this.date = e.target.value
+				console.log(this.date)
+				this.getServerData_month(this.date);
+			},
+			getDate(type) {
+				const date = new Date();
+				let year = date.getFullYear();
+				let month = date.getMonth() + 1;
+				let day = date.getDate();
+
+				if (type === 'start') {
+					year = year - 60;
+				} else if (type === 'end') {
+					year = year + 2;
+				}else{
+					year = year
+				}
+				month = month > 9 ? month : '0' + month;
+				return `${year}-${month}`;
+			},
+			
+			// 年
+			bindDateChange_year: function(e) {
+				this.date_year = e.target.value
+				console.log(this.date_year)
+				
+				this.getServerData_year(this.date_year)
+			},
+			getDate_year(type) {
+				const date = new Date();
+				let year = date.getFullYear();
+			
+				if (type === 'start') {
+					year = year - 60;
+				} else if (type === 'end') {
+					year = year + 2;
+				}
+				return `${year}`;
+			},
+			
+			
+			
+			// 周产量
+			getServerData_week(){
+				this.$p_api.coalmine_one_trend({
+					type:"week",
+					mine:this.mine,
+					org_num:this.org_num
+				}).then((res)=>{
+					// console.log(res.data.data)
+					
+					let ColumnStack={
+						categories:[],
+						series:[
+							{
+								"name": "早班",
+								"data": []
+							},
+							{
+								"name": "中班",
+								"data": []
+							},
+							{
+								"name": "晚班",
+								"data": []
+							}
+						],
+					};
+					
+					const categories = res.data.data
+					categories.map(function(item,index){
+						// console.log(item.date,index)
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.date;
+						//将项放进新的数组
+						ColumnStack.categories[index] = sevm
+					})
+					
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n1;
+						//将项放进新的数组
+						ColumnStack.series[0].data[index] = sevm
+					})
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n2;
+						//将项放进新的数组
+						ColumnStack.series[1].data[index] = sevm
+					})
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n3;
+						//将项放进新的数组
+						ColumnStack.series[2].data[index] = sevm
+					})
+					
+					_self.showColumnStack("canvasColumnStack",ColumnStack);
+				})
+				
+			
+			},
+			showColumnStack(canvasId,chartData){
+				canvaColumn=new uCharts({
+					$this:_self,
+					canvasId: canvasId,
+					type: 'column',
+					legend:{show:true},
+					fontSize:11,
+					background:'#FFFFFF',
+					pixelRatio:_self.pixelRatio,
+					animation: true,
+					categories: chartData.categories,
+					legend:{
+						position:'top',
+						margin:10,
+						
+					},
+					series: chartData.series,
+					xAxis: {
+						disableGrid:true,
+					},
+					yAxis: {
+						//disabled:true
+					},
+					dataLabel: false,
+					width: _self.cWidth*_self.pixelRatio,
+					height: _self.cHeight*_self.pixelRatio,
+					extra: {
+						column: {
+							type:'stack',
+							width: _self.cWidth*_self.pixelRatio*0.5/chartData.categories.length
+						}
+					  }
+				});
+				
+			},
+			touchColumn(e){
+				canvaColumn.showToolTip(e, {
+					format: function (item, category) {
+						return category + ' ' + item.name + ':' + item.data 
+					}
+				});
+			},
+
+			// 月产量
+			getServerData_month(date){
+				this.$p_api.coalmine_one_trend({
+					type:"month",
+					date: date,
+					mine:this.mine,
+					org_num:this.org_num
+				}).then((res)=>{
+					// console.log(res.data.data)
+					let ColumnStack_month={
+						categories:[],
+						series:[
+							{
+								"name": "晚班",
+								"data": []
+							}, {
+								"name": "早班",
+								"data": []
+							}, {
+								"name": "中班",
+								"data": []
+							}
+						],
+					}
+				
+					res.data.data.map(function(item,index){
+						// console.log(item.date,index)
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.date;
+						//将项放进新的数组
+						ColumnStack_month.categories[index] = sevm
+					})
+					
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n1;
+						//将项放进新的数组
+						ColumnStack_month.series[0].data[index] = sevm
+					})
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n2;
+						//将项放进新的数组
+						ColumnStack_month.series[1].data[index] = sevm
+					})
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n3;
+						//将项放进新的数组
+						ColumnStack_month.series[2].data[index] = sevm
+					})
+					
+					
+					
+					_self.showColumnStack_month("canvasColumnStack_month",ColumnStack_month);
+				})
+							
+			},
+			showColumnStack_month(canvasId,chartData){
+				canvaColumn_month=new uCharts({
+					$this:_self,
+					canvasId: canvasId,
+					type: 'column',
+					legend:{show:true},
+					fontSize:11,
+					background:'#FFFFFF',
+					pixelRatio:_self.pixelRatio_month,
+					animation: true,
+					rotate:true,
+					categories: chartData.categories,
+					legend:{
+						show:false,
+						position:'top',
+						margin:10,
+						
+					},
+					series: chartData.series,
+					xAxis: {
+						disableGrid:true,
+					},
+					yAxis: {
+						//disabled:true
+					},
+					dataLabel: false,
+					width: _self.cWidth_month*_self.pixelRatio_month,
+					height: _self.cHeight_month*_self.pixelRatio_month,
+					extra: {
+						column: {
+							type:'stack',
+							width: _self.cWidth_month*_self.pixelRatio_month*0.5/chartData.categories.length
+						}
+					  }
+				});
+				
+			},
+			touchColumn_month(e){
+				canvaColumn_month.showToolTip(e, {
+					format: function (item, category) {
+						return item.name + ':' + item.data 
+					}
+				});
+			},
+			
+					
+
+
+			// 年产量
+			getServerData_year(date){
+				this.$p_api.coalmine_one_trend({
+					type:"year",
+					date: date,
+					mine:this.mine,
+					org_num:this.org_num
+				}).then((res)=>{
+					
+					// console.log(res.data.data)
+					
+					let ColumnStack_year={
+						categories:[],
+						series:[
+							{
+								"name": "早班",
+								"data": []
+							}, {
+								"name": "中班",
+								"data": []
+							}, {
+								"name": "晚班",
+								"data": []
+							}
+						],
+					}
+								
+					res.data.data.map(function(item,index){
+						// console.log(item.date,index)
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.date;
+						//将项放进新的数组
+						ColumnStack_year.categories[index] = sevm
+					})
+					
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n1;
+						//将项放进新的数组
+						ColumnStack_year.series[0].data[index] = sevm
+					})
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n2;
+						//将项放进新的数组
+						ColumnStack_year.series[1].data[index] = sevm
+					})
+					res.data.data.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.n3;
+						//将项放进新的数组
+						ColumnStack_year.series[2].data[index] = sevm
+					})
+					
+					_self.showColumnStack_year("canvasColumnStack_year",ColumnStack_year);
+				})
+				
+			},
+			showColumnStack_year(canvasId,chartData){
+				canvaColumn_year=new uCharts({
+					$this:_self,
+					canvasId: canvasId,
+					type: 'column',
+					legend:{show:true},
+					fontSize:11,
+					background:'#FFFFFF',
+					pixelRatio:_self.pixelRatio,
+					animation: true,
+					categories: chartData.categories,
+					legend:{
+						position:'top',
+						margin:10,
+						
+					},
+					series: chartData.series,
+					xAxis: {
+						disableGrid:true,
+					},
+					yAxis: {
+						//disabled:true
+					},
+					dataLabel: false,
+					width: _self.cWidth*_self.pixelRatio,
+					height: _self.cHeight*_self.pixelRatio,
+					extra: {
+						column: {
+							type:'stack',
+							width: _self.cWidth*_self.pixelRatio*0.5/chartData.categories.length
+						}
+					  }
+				});
+				
+			},
+			touchColumn_year(e){
+				canvaColumn_year.showToolTip(e, {
+					format: function (item, category) {
+						return item.name + ':' + item.data 
+					}
+				});
+			},
+			
+					
+		
+		}
+	}
+</script>
+
+
+<style lang="scss">
+	
+	.content{
+		width: 700rpx;
+		margin-top: 16rpx;
+		background: #FFFFFF;
+		box-shadow: 0rpx 3rpx 29rpx 0rpx rgba(59, 74, 116, 0.14);
+		border-radius: 20rpx;
+		
+		.time{
+			line-height: 94rpx;
+			padding: 0 20rpx;
+			box-sizing: border-box;
+		}
+		
+		.title{
+			line-height: 96rpx;
+			text-align: center;
+			
+			
+			font-size: 30rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #232627;
+			
+			border-bottom: 2rpx solid #f3f3f3;
+		}
+		.inner{
+			min-height: 200rpx;
+			.inner_content{
+				margin-top: 20rpx;
+			}
+		}
+		.title_box{
+			height: 96rpx;
+			border-bottom: 2rpx solid #f3f3f3;
+			
+			display: flex;
+			align-items: center;
+			.box{
+				margin-left: 22rpx;
+				height: 50rpx;
+				border-radius: 14rpx;
+				border: 1rpx solid #BDC3C7;
+				
+				box-sizing: border-box;
+				padding: 0 20rpx;
+				// 文本
+				font-size: 28rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				line-height: 50rpx;
+				
+				display: flex;
+				.icon{
+					margin-left: 10rpx;
+				}
+			}
+		}
+	}
+</style>

BIN
components/p-production-report-inner-3/icon/icon.png


+ 77 - 0
components/p-production-report-inner-3/p-production-report-inner-3.vue

@@ -0,0 +1,77 @@
+<template>
+	<view>
+		<view class="list">
+			<view class="item" v-for="(item,index) in list" :key="index" @click="go_container(item.id,item.gzm_name)">
+				<view class="left">
+					<view class="icon"></view>
+					<view class="name">{{item.gzm_name}}</view>
+				</view>
+				<view class="right">
+					<uni-icons type="arrowright"></uni-icons>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"p-production-report-inner-3",
+		props:[
+			"mine",
+			"org_num"
+		],
+		data() {
+			return {
+				list:[]
+			};
+		},
+		created() {
+			this.$p_api.coalmine_working_face({
+				mine:this.mine,
+				org_num:this.org_num
+			}).then((res)=>{
+				// console.log(res.data.data)
+				this.list = res.data.data
+			})
+		},
+		methods:{
+			go_container(id,title){
+				uni.navigateTo({
+					url:"../../production/production_report/detail/detail?id=" + id + "&title=" + title
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.list{
+		box-sizing: border-box;
+		padding: 0 20rpx;
+		.item{
+			display: flex;
+			justify-content: space-between;
+			
+			line-height: 90rpx;
+			border-bottom: 1rpx solid #eee;
+			.left{
+				display: flex;
+				align-items: baseline;
+				.icon{
+					width: 25rpx;
+					height: 27rpx;
+					background-image: url(./icon/icon.png);
+					background-size: cover;
+				}
+				.name{
+					margin-left: 12rpx;
+					
+					font-size: 28rpx;
+					color: #1e1e1e;
+				}
+			}
+			.right{}
+		}
+	}
+</style>

+ 97 - 0
components/p-production-statistics-section-1/p-production-statistics-section-1.vue

@@ -0,0 +1,97 @@
+<template>
+	<view>
+		<canvas canvas-id="canvasRing" id="canvasRing" @touchstart="touchRing" style="width: 700upx; height:500upx;" ></canvas>
+	</view>
+</template>
+
+<script>
+	import uCharts from '@/components/u-charts/u-charts.js';
+	var _self;
+	var canvaRing = null;
+
+	export default {
+		data() {
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				serverData: '',
+			}
+		},
+		mounted() {
+			_self = this;
+			this.cWidth = uni.upx2px(700);
+			this.cHeight = uni.upx2px(500);
+			this.getServerData();
+		},
+		methods: {
+			getServerData() {
+				let Ring = {
+					"series": [{
+						"name": "早班 63950.8 吨",
+						"data": 63950.8
+					}, {
+						"name": "中班 5860.8 吨",
+						"data": 5860.8
+					}, {
+						"name": "晚班 0 吨",
+						"data": 0
+					}]
+				};
+				_self.showRing("canvasRing", Ring);
+			},
+			showRing(canvasId, chartData) {
+				canvaRing = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'ring',
+					fontSize: 11,
+					legend: {
+						show: true,
+						position: 'left',
+						lineHeight: 40,
+					},
+					title: {
+						name: '69811.6吨',
+						color: '#000000',
+						fontSize: 20 * _self.pixelRatio,
+						offsetY: 20 * _self.pixelRatio,
+					},
+					subtitle: {
+						name: '总产量',
+						color: '#666666',
+						fontSize: 14 * _self.pixelRatio,
+						offsetY: -30 * _self.pixelRatio,
+					},
+					extra: {
+						pie: {
+							offsetAngle: -90,
+							ringWidth: 20 * _self.pixelRatio,
+							labelWidth: 15
+						}
+					},
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					disablePieStroke: true,
+					dataLabel: false,
+				});
+			},
+			touchRing(e) {
+				canvaRing.showToolTip(e, {
+					format: function(item) {
+						// return item.name + ' : ' + item.data + ' 吨'
+						return item.name 
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 114 - 0
components/p-production-statistics-section-2/p-production-statistics-section-2.vue

@@ -0,0 +1,114 @@
+<template>
+	<view>
+		<canvas canvas-id="canvasPie" id="canvasPie" @touchstart="touchPie" style="width: 700upx; height:700upx;"></canvas>
+	</view>
+</template>
+
+<script>
+	import uCharts from '@/components/u-charts/u-charts.js';
+	var _self;
+	var canvaPie=null;
+
+	export default {
+		data() {
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				serverData: '',
+			}
+		},
+		mounted() {
+			_self = this;
+			this.cWidth = uni.upx2px(700);
+			this.cHeight = uni.upx2px(700);
+			this.getServerData();
+		},
+		methods: {
+			getServerData() {
+				let Pie = {
+					"series": [{
+						"name": "梅花井矿 0%",
+						"data": 0
+					}, {
+						"name": "枣泉矿 15.3%",
+						"data": 10493.3
+					}, {
+						"name": "红柳矿 11.21%",
+						"data": 7837
+					}, {
+						"name": "麦垛山矿 13.91%",
+						"data": 9711.1
+					}, {
+						"name": "金凤矿 5.27%",
+						"data": 3683.7
+					}, {
+						"name": "双马矿 4.29%",
+						"data": 2999.2
+					}, {
+						"name": "石槽村矿 7.35%",
+						"data": 5138.5
+					}, {
+						"name": "灵新矿 5.72%",
+						"data": 3994.7
+					}, {
+						"name": "任家庄矿 2.22%",
+						"data": 1556.5
+					}, {
+						"name": "红石湾矿 0%",
+						"data": 0
+					}, {
+						"name": "羊二矿 1.55%",
+						"data": 1085.6
+					}, {
+						"name": "羊一矿 28.79%",
+						"data": 20104
+					}, {
+						"name": "白芨沟井 4.59%",
+						"data": 3207.9
+					}, {
+						"name": "大峰矿 0%",
+						"data": 0
+					}]
+				};
+				_self.showPie("canvasPie", Pie);
+			},
+			showPie(canvasId, chartData) {
+				canvaPie = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'pie',
+					fontSize: 11,
+					legend: {
+						show: true,
+						position: 'right',
+						lineHeight: 20,
+					},
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					dataLabel: false,
+					extra: {
+						pie: {
+							lableWidth: 15
+						}
+					},
+				});
+			},
+			touchPie(e) {
+				canvaPie.showToolTip(e, {
+					format: function(item) {
+						return item.name + ' : ' + item.data + ' 吨'
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 93 - 0
components/p-production-statistics-section-3/p-production-statistics-section-3.vue

@@ -0,0 +1,93 @@
+<template>
+	<view>
+		<canvas canvas-id="canvasColumnStack" id="canvasColumnStack" @touchstart="touchColumn" style="width: 700rpx; height: 800rpx;"></canvas>
+	</view>
+</template>
+
+<script>
+	import uCharts from '@/components/u-charts/u-charts.js';
+	var _self;
+	var canvaColumn = null;
+
+	export default {
+		data() {
+			return {
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				serverData: '',
+			};
+		},
+		mounted() {
+			_self = this;
+			this.cWidth = uni.upx2px(700);
+			this.cHeight = uni.upx2px(780);
+			this.getServerData();
+		},
+		methods: {
+			getServerData() {
+
+				let ColumnStack = {
+					 "categories": ["19日", "20日", "21日", "22日", "23日", "24日","25日"],
+					  "series": [{
+						"name": "早班",
+						"data": [96258.6, 102354.2, 87569.5, 87512.2, 79854.2, 89896.7,80666.3]
+					  }, {
+						"name": "中班",
+						"data": [15089.5, 34256.1, 30659.7, 28665.1, 27458.6, 26597.4,12658.7]
+					  }, {
+						"name": "晚班",
+						"data": [105203.2, 116542.2, 102654.2, 106598.2, 113568.2, 99685.2,0]
+					  }]
+				};
+				_self.showColumnStack("canvasColumnStack", ColumnStack);
+			},
+			showColumnStack(canvasId, chartData) {
+				canvaColumn = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'column',
+					legend: {
+						show: true,
+						position: 'top',
+						itemGap: 30,
+					},
+					fontSize: 11,
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					animation: true,
+					categories: chartData.categories,
+					series: chartData.series,
+					xAxis: {
+						disableGrid: true,
+					},
+					yAxis: {
+						//disabled:true
+					},
+					dataLabel: false,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					extra: {
+						column: {
+							type: 'stack',
+							width: _self.cWidth * _self.pixelRatio * 0.5 / chartData.categories.length
+						}
+					}
+				});
+
+			},
+			touchColumn(e) {
+				canvaColumn.showToolTip(e, {
+					format: function(item, category) {
+						// return category + ' ' + item.name + ':' + item.data
+						return item.name + ':' + item.data
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 171 - 0
components/p-production-statistics-section-4/p-production-statistics-section-4.vue

@@ -0,0 +1,171 @@
+<template>
+	<view>
+
+		<view class="list">
+			<view class="item">
+				<view class="item_title">梅花井矿</view>
+				<view class="item_content">
+					<view class="box">
+						<view class="name">早班产量</view>
+						<view class="num">0吨</view>
+					</view>
+					<view class="box">
+						<view class="name">中班产量</view>
+						<view class="num">0吨</view>
+					</view>
+					<view class="box">
+						<view class="name">晚班产量</view>
+						<view class="num">0吨</view>
+					</view>
+				</view>
+				<view class="item_bottom">
+					<view class="left">年累计产量:<text>1890691.3吨</text></view>
+					<view class="right" @click="go_container()">
+						<view class="more">更多详情</view>
+						<uni-icons type="arrowright" size="12" color="#75B8D5"></uni-icons>
+					</view>
+				</view>
+			</view>
+			<view class="item">
+				<view class="item_title">枣泉矿</view>
+				<view class="item_content">
+					<view class="box">
+						<view class="name">早班产量</view>
+						<view class="num">9781.9吨</view>
+					</view>
+					<view class="box">
+						<view class="name">中班产量</view>
+						<view class="num">711.4吨</view>
+					</view>
+					<view class="box">
+						<view class="name">晚班产量</view>
+						<view class="num">0吨</view>
+					</view>
+				</view>
+				<view class="item_bottom">
+					<view class="left">年累计产量:<text>1367859.5吨</text></view>
+					<view class="right" @click="go_container()">
+						<view class="more">更多详情</view>
+						<uni-icons type="arrowright" size="12" color="#75B8D5"></uni-icons>
+					</view>
+				</view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		},
+		methods:{
+			go_container(){
+				uni.navigateTo({
+					url:"../../production/p-statistics/p-s-container/p-s-container"
+				})
+			}
+		}
+		
+	}
+</script>
+
+<style lang="scss">
+	.list {
+		padding-bottom: 40rpx;
+
+		.item {}
+
+		.item_title {
+			text-align: center;
+			line-height: 100rpx;
+
+			font-size: 34rpx;
+			font-weight: 700;
+		}
+
+		.item_content {
+			box-sizing: border-box;
+			padding: 0 20rpx;
+
+			display: flex;
+			justify-content: space-between;
+
+			.box {
+				box-sizing: border-box;
+				width: 200rpx;
+				text-align: center;
+
+				border-radius: 6px;
+				overflow: hidden;
+
+				.name {
+					font-size: 26rpx;
+					line-height: 40rpx;
+				}
+
+				.num {
+					font-size: 26rpx;
+					line-height: 40rpx;
+				}
+			}
+
+			.box:nth-child(1) {
+				border: 1px solid #00A2E8;
+			}
+
+			.box:nth-child(1) .name {
+				background-color: #00A2E8;
+			}
+
+			.box:nth-child(2) {
+				border: 1px solid #FFBC34;
+			}
+
+			.box:nth-child(2) .name {
+				background-color: #FFBC34;
+			}
+
+			.box:nth-child(3) {
+				border: 1px solid #FFC0B2;
+			}
+
+			.box:nth-child(3) .name {
+				background-color: #FFC0B2;
+			}
+		}
+
+		.item_bottom {
+			display: flex;
+			justify-content: space-between;
+
+			box-sizing: border-box;
+			padding: 40rpx 0;
+			margin: 0 20rpx;
+			border-bottom: 1px solid #eee;
+
+			.left {
+				font-size: 24rpx;
+
+				text {
+					font-weight: 700;
+				}
+			}
+
+			.right {
+				display: flex;
+				align-items: baseline;
+
+				.more {
+					margin-right: 6rpx;
+
+					font-size: 24rpx;
+					color: #75B8D5;
+				}
+			}
+		}
+	}
+</style>

+ 242 - 0
components/p-safety-monitoring-content-1/p-safety-monitoring-content-1.vue

@@ -0,0 +1,242 @@
+<template>
+	<view>
+		<view class="p-i-s-content-1">
+			<view class="top">
+				<view class="list_item">
+					<view class="item" v-for="(item,index) in simulation" :key="index" :class="item.type"
+						@click="go_status_detail(item.type,item.name)">
+						<view class="name">{{item.name}}</view>
+						<view class="num">{{item.count}}个</view>
+					</view>
+				</view>
+			</view>
+			<view class="inner">
+				<view class="list_item">
+					<view class="item" v-for="(item,index) in simulationList" :key="index"
+						@click="go_name_detail(item.typeCodeDesc)">
+						<view class="item_title">
+							<view class="item_name">{{item.typeCodeDesc}}</view>
+						</view>
+						<view class="item_content">
+							<view class="item_content_list">
+								<view class="content_item" v-for="(inner,index) in item.normalCount" :key="index">
+									<view class="name">{{inner.name}}</view>
+									<view class="num" v-if="index == 0" :class="index==0?'normal':''">{{inner.count}}个
+									</view>
+									<view class="num" v-if="index == 1" :class="index==1?'alarm':''">{{inner.count}}个
+									</view>
+									<view class="num" v-if="index == 2" :class="index==2?'sign':''">{{inner.count}}个
+									</view>
+									<view class="num" v-if="index == 3" :class="index==3?'fault':''">{{inner.count}}个
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: [
+			"mine",
+			"simulation",
+			"simulationList"
+		],
+		data() {
+			return {
+				imglist: []
+			};
+		},
+		computed: {
+			imgUrl: function(index) {
+				console.log(index)
+			}
+		},
+		methods: {
+			go_status_detail(status, title) {
+				uni.navigateTo({
+					url: "../../production/safety_monitoring/safety_monitoring_status_detail/safety_monitoring_status_detail?status=" +
+						status + "&title=" + title + "&type=simulation" + "&mine=" + this.mine
+				})
+			},
+			go_name_detail(name) {
+				uni.navigateTo({
+					url: "../../production/safety_monitoring/safety_monitoring_name_detail/safety_monitoring_name_detail?name=" +
+						name + "&mine=" + this.mine
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.p-i-s-content-1 {
+		.top {
+			height: 202rpx;
+			background: #FFFFFF;
+
+			border-bottom: 1rpx solid #f3f3f3;
+
+			.list_item {
+				height: 202rpx;
+				display: flex;
+				justify-content: space-around;
+				align-items: center;
+
+				.item {
+					width: 106rpx;
+					height: 106rpx;
+					border-radius: 50%;
+					text-align: center;
+					line-height: 53rpx;
+
+					.name {
+						margin-top: 21rpx;
+						font-size: 25rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #FFFFFF;
+
+						line-height: 34rpx;
+					}
+
+					.num {
+						margin-top: 4rpx;
+						font-size: 21rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #FFFFFF;
+
+						line-height: 29rpx;
+					}
+				}
+
+				.item_1 {
+					background: #27AE60;
+				}
+
+				.item_2 {
+					background: #E74C3C;
+				}
+
+				.item_3 {
+					background: #2C3E50;
+				}
+
+				.item_4 {
+					background: #2873FF;
+				}
+
+				// 模拟量 统计
+				.normal {
+					background: #2C3E50;
+				}
+
+				.alarm {
+					background: #E74C3C;
+				}
+
+				.sign {
+					background: #27AE60;
+				}
+
+				.fault {
+					background: #2873FF;
+				}
+			}
+		}
+
+		.inner {
+			.list_item {
+				.item {
+					border-top: 1rpx solid #f3f3f3;
+					border-bottom: 1rpx solid #f3f3f3;
+					box-sizing: border-box;
+					padding: 0 30rpx;
+					padding-top: 28rpx;
+					padding-bottom: 26rpx;
+
+					.item_title {
+						display: flex;
+						box-sizing: border-box;
+						padding-bottom: 18rpx;
+						border-bottom: 1rpx solid #f3f3f3;
+
+						.item_icon {
+							margin-left: 6rpx;
+
+							image {
+								width: 83rpx;
+								height: 83rpx;
+							}
+						}
+
+						.item_name {
+							margin-left: 23rpx;
+							font-size: 29rpx;
+							font-family: PingFangSC-Regular, PingFang SC;
+							font-weight: 400;
+							color: #002257;
+							line-height: 83rpx;
+
+						}
+					}
+
+					.item_content {
+						.item_content_list {
+							display: flex;
+							justify-content: space-between;
+
+							.content_item {
+								width: 158rpx;
+								text-align: center;
+
+								.name {
+									margin-top: 22rpx;
+									font-size: 25rpx;
+									font-family: PingFangSC-Regular, PingFang SC;
+									font-weight: 400;
+									color: #97A3B4;
+									line-height: 33rpx;
+
+								}
+
+								.num {
+									margin-top: 6rpx;
+									font-size: 28rpx;
+									font-family: PingFangSC-Medium, PingFang SC;
+									font-weight: 500;
+									line-height: 33rpx;
+
+								}
+
+								.normal {
+									color: #2C3E50;
+								}
+
+								.alarm {
+									color: #E74C3C;
+								}
+
+								.sign {
+									color: #2ECC71;
+								}
+
+								.fault {
+									color: #2F54EB;
+								}
+							}
+						}
+					}
+				}
+			}
+
+
+		}
+	}
+</style>

+ 202 - 0
components/p-safety-monitoring-content-2/p-safety-monitoring-content-2.vue

@@ -0,0 +1,202 @@
+<template>
+	<view>
+		<view class="p-i-s-content-2">
+			<view class="top">
+				<view class="list_item">
+					<view class="item" v-for="(item,index) in sluice" :key="index" :class="item.type"  @click="go_status_detail(item.type,item.name)">
+						<view class="name">{{item.name}}</view>
+						<view class="num">{{item.count}}个</view>
+					</view>
+				</view>
+			</view>
+			<view class="inner">
+				<view class="list_item">
+					<view class="item" v-for="(item,index) in sluiceList" :key="index" @click="go_name_detail(item.typeCodeDesc)">
+						<view class="item_title">
+							<view class="item_name">{{item.typeCodeDesc}}</view>
+						</view>
+						<view class="item_content">
+							<view class="item_content_list">
+								<view class="content_item" v-for="(inner,index) in item.normalCount" :key="index">
+									<view class="name">{{inner.name}}</view>
+									<view class="num" :class="inner.type">{{inner.count}}个</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:[
+			"sluice",
+			"sluiceList",
+			"mine"
+		],
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			go_status_detail(status,title){
+				uni.navigateTo({
+					url: "../../production/safety_monitoring/safety_monitoring_status_detail/safety_monitoring_status_detail?status=" + status + "&title=" + title + "&type=sluice" + "&mine=" + this.mine
+				})
+			},
+			go_name_detail(name){
+				uni.navigateTo({
+					url: "../../production/safety_monitoring/safety_monitoring_name_detail/safety_monitoring_name_detail?name=" + name + "&mine=" + this.mine
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+	.p-i-s-content-2{
+		.top{
+			height: 202rpx;
+			background: #FFFFFF;
+			
+			border-bottom: 1rpx solid #f3f3f3;
+			.list_item{
+				height: 202rpx;
+				display: flex;
+				justify-content: space-around;
+				align-items: center;
+				.item{
+					width: 106rpx;
+					height: 106rpx;
+					border-radius: 50%;
+					text-align: center;
+					line-height: 53rpx;
+					.name{
+						margin-top: 21rpx;
+						font-size: 25rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #FFFFFF;
+						
+						line-height: 34rpx;
+					}
+					.num{
+						margin-top: 4rpx;
+						font-size: 21rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #FFFFFF;
+						
+						line-height: 29rpx;
+					}
+				}
+				.item_1{
+					background: #27AE60;
+				}
+				.item_2{
+					background: #E74C3C;
+				}
+				.item_3{
+					background: #2C3E50;
+				}
+				.item_4{
+					background: #2873FF;
+				}
+				
+				// 开关量 统计
+				.normal{
+					background: #2C3E50;
+				}
+				.alarm{
+					background: #E74C3C;
+				}
+				.open{
+					background: #27AE60;
+				}
+				.close{
+					background: #2873FF;
+				}
+			}
+		}
+		.inner{
+			.list_item{
+				.item{
+					border-top: 1rpx solid #f3f3f3;
+					border-bottom: 1rpx solid #f3f3f3;
+					box-sizing: border-box;
+					padding: 0 30rpx;
+					padding-top: 28rpx;
+					padding-bottom: 26rpx;
+					
+					.item_title{
+						display: flex;
+						box-sizing: border-box;
+						padding-bottom: 18rpx;
+						border-bottom: 1rpx solid #f3f3f3;
+						.item_icon{
+							margin-left: 6rpx;
+							image{
+								width: 83rpx;
+								height: 83rpx;
+							}
+						}
+						.item_name{
+							margin-left: 23rpx;
+							font-size: 29rpx;
+							font-family: PingFangSC-Regular, PingFang SC;
+							font-weight: 400;
+							color: #002257;
+							line-height: 83rpx;
+
+						}
+					}
+					.item_content{
+						.item_content_list{
+							display: flex;
+							justify-content: space-between;
+							.content_item{
+								width: 158rpx;
+								text-align: center;
+								.name{
+									margin-top: 22rpx;
+									font-size: 25rpx;
+									font-family: PingFangSC-Regular, PingFang SC;
+									font-weight: 400;
+									color: #97A3B4;
+									line-height: 33rpx;
+
+								}
+								.num{
+									margin-top: 6rpx;
+									font-size: 28rpx;
+									font-family: PingFangSC-Medium, PingFang SC;
+									font-weight: 500;
+									line-height: 33rpx;
+
+								}
+								.normal{
+									color: #2ECC71;
+								}
+								.alarm{
+									color: #E74C3C;
+								}
+								.sign{
+									color: #2C3E50;
+								}
+								.fault{
+									color: #2F54EB;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

BIN
components/p-safety-monitoring-navbar/icon/search.png


+ 116 - 0
components/p-safety-monitoring-navbar/p-safety-monitoring-navbar.vue

@@ -0,0 +1,116 @@
+<template>
+	<view>
+		<view class="content">
+			<view :style="{height:statusBarHeight + 'px'}">
+				<!-- 这里是状态栏 -->
+			</view>
+			<view class="navbar">
+		
+				<view class="left" @click="click_left()">
+					<uni-icons type="arrowleft" color="#fff" size="18"></uni-icons>
+				</view>
+				<view class="right" @click="go_search()">
+					<view class="input_box">
+						<view class="input_icon"></view>
+						<view class="input_text">搜索</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 占位符 -->
+		<view :style="{height: statusBarHeight + 'px'}"></view>
+		<view style="height: 93rpx;"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:["mine"],
+		data() {
+			return {
+				statusBarHeight: 20,
+				
+			};
+		},
+		created() {
+			// 获取手机系统信息
+			const info = uni.getSystemInfoSync()
+			// 设置状态栏高度
+			this.statusBarHeight = info.statusBarHeight
+			
+		},
+		methods: {
+			click_left() {
+				uni.navigateBack();
+			},
+			go_search(){
+				uni.navigateTo({
+					url:"../../production/safety_monitoring/safety_monitoring_search/safety_monitoring_search?mine=" + this.mine,
+					animationType: 'fade-in',
+					animationDuration: 200
+				})
+			}
+		}
+
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		position: fixed;
+		top: 0;
+		left: 0;
+			
+		z-index: 999;
+		background-color: #009FE8;
+	}
+
+	.navbar {
+		width: 750rpx;
+		box-sizing: border-box;
+		padding-left: 31rpx;
+		padding-right: 26rpx;
+		padding-top: 14rpx;
+		padding-bottom: 14rpx;
+		display: flex;
+		justify-content: space-between;
+
+		.left {
+			width: 42rpx;
+			line-height: 65rpx;
+		}
+
+		.right {
+			width: 620rpx;
+			height: 65rpx;
+			background: rgba(255, 255, 255, 0.2);
+			border-radius: 33rpx;
+
+			.input_box {
+				display: flex;
+
+				.input_icon {
+					margin-left: 43rpx;
+					margin-top: 16rpx;
+					width: 34rpx;
+					height: 34rpx;
+
+					background-image: url(icon/search.png);
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+
+				.input_text {
+					margin-left: 19rpx;
+
+					font-size: 24rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+					line-height: 65rpx;
+
+				}
+			}
+		}
+	}
+</style>

BIN
components/t-p-icon/icon_1.png


BIN
components/t-p-icon/icon_10.png


BIN
components/t-p-icon/icon_11.png


BIN
components/t-p-icon/icon_2.png


BIN
components/t-p-icon/icon_3.png


BIN
components/t-p-icon/icon_4.png


BIN
components/t-p-icon/icon_5.png


BIN
components/t-p-icon/icon_6.png


BIN
components/t-p-icon/icon_7.png


BIN
components/t-p-icon/icon_8.png


BIN
components/t-p-icon/icon_9.png


+ 183 - 0
components/t-p-n-section-1/t-p-n-section-1.vue

@@ -0,0 +1,183 @@
+<template>
+	<view class="content">
+		<view class="item_box" style="background-color: #009FE8;">
+			<view class="img">
+				<image src="../t-p-icon/icon_1.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">绩效排名</view>
+				<view class="tip">绩效考核分数统计</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #638BD5;" @click="go_production_statistics()">
+			<view class="img">
+				<image src="../t-p-icon/icon_2.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">生产报表</view>
+				<view class="tip">当日产量140517.8吨</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #A3A2E4;" @click="go_personnel_orientation()">
+			<view class="img">
+				<image src="../t-p-icon/icon_3.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">人员定位</view>
+				<view class="tip">井下人数3892人</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #8BC8DA;">
+			<view class="img">
+				<image src="../t-p-icon/icon_4.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">安全监测</view>
+				<view class="tip">6268监测点</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #9AE2A2;">
+			<view class="img">
+				<image src="../t-p-icon/icon_5.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">通风管理</view>
+				<view class="tip">共40个通风机</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #FBB47B;">
+			<view class="img">
+				<image src="../t-p-icon/icon_6.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">视频监控</view>
+				<view class="tip">工业视频</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #FA8B89;">
+			<view class="img">
+				<image src="../t-p-icon/icon_7.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">风险预控</view>
+				<view class="tip">分数统计</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #2C3E50;">
+			<view class="img">
+				<image src="../t-p-icon/icon_8.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">主运输</view>
+				<view class="tip">主运输皮带</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #2873FF;">
+			<view class="img">
+				<image src="../t-p-icon/icon_9.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">排水系统</view>
+				<view class="tip">中央水泵</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #8BC8DA;">
+			<view class="img">
+				<image src="../t-p-icon/icon_10.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">压风制氮</view>
+				<view class="tip">压风制氮系统 </view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #A3A2E4;">
+			<view class="img">
+				<image src="../t-p-icon/icon_11.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">设备监测</view>
+				<view class="tip">容知设备监控</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "t-p-n-section-1",
+		data() {
+			return {
+
+			};
+		},
+		methods:{
+			// 生产统计
+			go_production_statistics(){
+				uni.navigateTo({
+					url:"../../ningdongyunying/production_statistics/production_statistics"
+				})
+			},
+			// 人员定位
+			go_personnel_orientation(){
+				uni.navigateTo({
+					url:"../../ningdongyunying/personnel_orientation/personnel_orientation"
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		box-sizing: border-box;
+		padding: 20rpx 25rpx 0;
+		margin-bottom: 100rpx;
+
+		overflow: hidden;
+
+		.item_box {
+			float: left;
+
+			width: 220rpx;
+			height: 280rpx;
+
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			border-radius: 16rpx;
+
+			.img {
+				box-sizing: border-box;
+				padding-top: 40rpx;
+				text-align: center;
+
+				image {
+					width: 140rpx;
+					height: 140rpx;
+				}
+			}
+
+			.text {
+				text-align: center;
+				color: #FFFFFF;
+				line-height: 40rpx;
+
+				.name {
+					font-size: 28rpx;
+				}
+
+				.tip {
+					font-size: 24rpx;
+					white-space: nowrap;
+					overflow: hidden;
+					text-overflow: ellipsis;
+				}
+			}
+		}
+
+		.item_box:nth-child(3n) {
+			margin-right: 0;
+		}
+
+	}
+
+</style>

BIN
components/t-p-n-section-2/img/map.jpg


+ 68 - 0
components/t-p-n-section-2/t-p-n-section-2.vue

@@ -0,0 +1,68 @@
+<template>
+	<view>
+		<view class="swiper-item">
+			<image src="./img/map.jpg"></image>
+			
+			<view class="map">
+				<view class="area area_1" @click="go_map_area()"></view>
+				<view class="area area_2"></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"t-p-n-section-2",
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			go_map_area(){
+				console.log("---")
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.swiper-item{
+		overflow: hidden;
+		image{
+			width: 750rpx;
+			height: 1299rpx;
+		}
+	}
+	
+	
+	.map{
+		position: absolute;
+		left: 0;
+		top: 0;
+		z-index: 999;
+		
+		width: 750rpx;
+		height: 1299rpx;
+		// background-color: rgba(0,255,0,.2);
+		.area{
+			width: 200rpx;
+			height: 60rpx;
+		}
+		.area_1{
+			position: absolute;
+			left: 28rpx;
+			top: 62rpx;
+			
+			background-color: skyblue;
+		}
+		.area_2{
+			position: absolute;
+			left: 28rpx;
+			top: 140rpx;
+			
+			background-color: pink;
+		}
+	}
+</style>

+ 41 - 0
components/t-p-ningdongyunying/t-p-ningdongyunying.vue

@@ -0,0 +1,41 @@
+<template>
+	<view>
+		<swiper duration="500">
+			<swiper-item>
+				<scroll-view scroll-y>
+					<view class="scroll__box">
+						<t-p-n-section-1></t-p-n-section-1>
+					</view>
+				</scroll-view>
+			</swiper-item>
+			<swiper-item>
+				<scroll-view scroll-y>
+					<view class="scroll__box">
+						<t-p-n-section-2></t-p-n-section-2>
+					</view>
+				</scroll-view>
+			</swiper-item>
+		</swiper>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "t-p-ningdongyunying",
+		data() {
+			return {
+
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+	/deep/uni-swiper .uni-swiper-wrapper {
+		height: calc(100vh);
+	}
+
+	.scroll__box {
+		height: 100vh;
+	}
+</style>

+ 125 - 0
components/t-p-shicaocun/t-p-shicaocun.vue

@@ -0,0 +1,125 @@
+<template>
+	<view class="content">
+		<view class="item_box" style="background-color: #638BD5;" @click="go_production_report()">
+			<view class="img">
+				<image src="../t-p-icon/icon_2.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">生产报表</view>
+				<view class="tip">当日产量140517.8吨</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #A3A2E4;" @click="go_personnel_orientation()">
+			<view class="img">
+				<image src="../t-p-icon/icon_3.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">人员定位</view>
+				<view class="tip">井下人数3892人</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #8BC8DA;" @click="go_safety_monitoring()">
+			<view class="img">
+				<image src="../t-p-icon/icon_4.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">安全监测</view>
+				<view class="tip">6268监测点</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #FBB47B;">
+			<view class="img">
+				<image src="../t-p-icon/icon_6.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">视频监控</view>
+				<view class="tip">工业视频</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "t-p-shicaocun",
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			// 生产报表
+			go_production_report() {
+				uni.navigateTo({
+					url: "../../production/production_report/production_report"
+				})
+			},
+			// 安全监测
+			go_safety_monitoring() {
+				uni.navigateTo({
+					url: "../../production/safety_monitoring/safety_monitoring?mine=shicaocun"
+				})
+			},
+			//人员定位
+			go_personnel_orientation() {
+				uni.navigateTo({
+					url:"../../production/personnel_orientation/personnel_orientation?mine=shicaocun"
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		box-sizing: border-box;
+		padding: 20rpx 25rpx 0;
+		margin-bottom: 100rpx;
+
+		overflow: hidden;
+
+		.item_box {
+			float: left;
+
+			width: 220rpx;
+			height: 280rpx;
+
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			border-radius: 16rpx;
+
+			.img {
+				box-sizing: border-box;
+				padding-top: 40rpx;
+				text-align: center;
+
+				image {
+					width: 140rpx;
+					height: 140rpx;
+				}
+			}
+
+			.text {
+				text-align: center;
+				color: #FFFFFF;
+				line-height: 40rpx;
+
+				.name {
+					font-size: 28rpx;
+				}
+
+				.tip {
+					font-size: 24rpx;
+					white-space: nowrap;
+					overflow: hidden;
+					text-overflow: ellipsis;
+				}
+			}
+		}
+
+		.item_box:nth-child(3n) {
+			margin-right: 0;
+		}
+
+	}
+</style>

+ 165 - 0
components/u-charts/component.vue

@@ -0,0 +1,165 @@
+<template>
+	<canvas v-if="canvasId" :id="canvasId" :canvasId="canvasId" :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"
+	 @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @error="error">
+	</canvas>
+</template>
+
+<script>
+	import uCharts from './u-charts.js';
+	var canvases = {};
+	
+	export default {
+		props: {
+			chartType: {
+				required: true,
+				type: String,
+				default: 'column'
+			},
+			opts: {
+				required: true,
+				type: Object,
+				default () {
+					return null;
+				},
+			},
+			canvasId: {
+				type: String,
+				default: 'u-canvas',
+			},
+			cWidth: {
+				default: 375,
+			},
+			cHeight: {
+				default: 250,
+			},
+			pixelRatio: {
+				type: Number,
+				default: 1,
+			},
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			init() {
+				switch (this.chartType) {
+					case 'column':
+						this.initColumnChart();
+						break;
+					case 'line':
+						this.initLineChart();
+						break;
+					default:
+						break;
+				}
+			},
+			initColumnChart() {
+				canvases[this.canvasId] = new uCharts({
+					$this: this,
+					canvasId: this.canvasId,
+					type: 'column',
+					legend: true,
+					fontSize: 11,
+					background: '#FFFFFF',
+					pixelRatio: this.pixelRatio,
+					animation: true,
+					categories: this.opts.categories,
+					series: this.opts.series,
+					enableScroll: true,
+					xAxis: {
+						disableGrid: true,
+						itemCount: 4,
+						scrollShow: true
+					},
+					yAxis: {
+						//disabled:true
+					},
+					dataLabel: true,
+					width: this.cWidth * this.pixelRatio,
+					height: this.cHeight * this.pixelRatio,
+					extra: {
+						column: {
+							type: 'group',
+						}
+					}
+				});
+			},
+			initLineChart() {
+				canvases[this.canvasId] = new uCharts({
+					$this: this,
+					canvasId: this.canvasId,
+					type: 'line',
+					fontSize: 11,
+					legend: true,
+					dataLabel: false,
+					dataPointShape: true,
+					background: '#FFFFFF',
+					pixelRatio: this.pixelRatio,
+					categories: this.opts.categories,
+					series: this.opts.series,
+					animation: true,
+					enableScroll: true,
+					xAxis: {
+						type: 'grid',
+						gridColor: '#CCCCCC',
+						gridType: 'dash',
+						dashLength: 8,
+						itemCount: 4,
+						scrollShow: true
+					},
+					yAxis: {
+						gridType: 'dash',
+						gridColor: '#CCCCCC',
+						dashLength: 8,
+						splitNumber: 5,
+						min: 10,
+						max: 180,
+						format: (val) => {
+							return val.toFixed(0) + '元'
+						}
+					},
+					width: this.cWidth * this.pixelRatio,
+					height: this.cHeight * this.pixelRatio,
+					extra: {
+						line: {
+							type: 'straight'
+						}
+					}
+				});
+			},
+			// 这里仅作为示例传入两个参数,cid为canvas-id,newdata为更新的数据,需要更多参数请自行修改
+			changeData(cid,newdata) {
+				canvases[cid].updateData({
+					series: newdata.series,
+					categories: newdata.categories
+				});
+			},
+			touchStart(e) {
+				canvases[this.canvasId].showToolTip(e, {
+					format: function(item, category) {
+						return category + ' ' + item.name + ':' + item.data
+					}
+				});
+				canvases[this.canvasId].scrollStart(e);
+			},
+			touchMove(e) {
+				canvases[this.canvasId].scroll(e);
+			},
+			touchEnd(e) {
+				canvases[this.canvasId].scrollEnd(e);
+			},
+			error(e) {
+				console.log(e)
+			}
+		},
+	};
+</script>
+
+<style scoped>
+	.charts {
+		width: 100%;
+		height: 100%;
+		flex: 1;
+		background-color: #FFFFFF;
+	}
+</style>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 5662 - 0
components/u-charts/u-charts.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 0
components/u-charts/u-charts.min.js


+ 14 - 0
index.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 30 - 0
main.js

@@ -0,0 +1,30 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+
+// 基础业务api
+import api from './common/vmeitime-http/index.js'
+// 集团api 生产数据
+import p_api from './common/production-http/index.js'
+
+Vue.prototype.$api = api
+Vue.prototype.$p_api = p_api
+
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 72 - 0
manifest.json

@@ -0,0 +1,72 @@
+{
+    "name" : "智慧矿山-全矿",
+    "appid" : "__UNI__854DCD5",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 173 - 0
pages.json

@@ -0,0 +1,173 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+
+		// tabbar
+		{
+			"path": "pages/tabbar/index/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		}, {
+			"path": "pages/tabbar/workbench/workbench",
+			"style": {
+				"navigationBarTitleText": "工作台"
+			}
+
+		}, {
+			"path": "pages/tabbar/production/production",
+			"style": {
+				"navigationBarTitleText": "生产数据"
+			}
+
+		}, {
+			"path": "pages/tabbar/my/my",
+			"style": {
+				"navigationBarTitleText": "个人中心"
+			}
+
+		}, {
+			"path": "pages/production/production_report/production_report",
+			"style": {
+				"navigationBarTitleText": "生产报表"
+			}
+
+		}, {
+			"path": "pages/production/production_report/detail/detail",
+			"style": {
+				"navigationBarTitleText": " "
+			}
+
+		}, {
+			"path": "pages/production/safety_monitoring/safety_monitoring",
+			"style": {
+				"navigationStyle": "custom"
+			}
+
+		}, {
+			"path": "pages/production/safety_monitoring/safety_monitoring_name_detail/safety_monitoring_name_detail",
+			"style": {
+				"navigationBarTitleText": ""
+			}
+
+		}, {
+			"path": "pages/production/safety_monitoring/safety_monitoring_status_detail/safety_monitoring_status_detail",
+			"style": {
+				"navigationBarTitleText": ""
+			}
+
+		}, {
+			"path": "pages/production/safety_monitoring/safety_monitoring_search/safety_monitoring_search",
+			"style": {
+				"navigationStyle": "custom"
+			}
+
+		}, {
+			"path": "pages/production/personnel_orientation/personnel_orientation",
+			"style": {
+				"navigationStyle": "custom"
+			}
+
+		}
+	    ,{
+            "path" : "pages/production/personnel_orientation/search/search",
+            "style" :                                                                                    
+            {
+               "navigationStyle": "custom"
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/personnel_orientation/depart-people/depart-people",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": ""
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/personnel_orientation/depart-people-2/depart-people-2",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": ""
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/personnel_orientation/downhole_statistics/downhole_statistics",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "下井记录"
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/personnel_orientation/people_track/people_track",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "下井轨迹"
+            }
+            
+        }
+        ,{
+            "path" : "pages/ningdongyunying/production_statistics/production_statistics",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "生产统计"
+            }
+            
+        }
+        ,{
+            "path" : "pages/ningdongyunying/personnel_orientation/personnel_orientation",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/ningdongyunying/safety_monitoring/safety_monitoring",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+    ],
+	"globalStyle": {
+		"navigationBarTextStyle": "white",
+		"navigationBarTitleText": " ",
+		"navigationBarBackgroundColor": "#009FE8",
+		"backgroundColor": "#FFFFFF"
+	},
+	"tabBar": {
+		"selectedColor": "#44A0DE",
+		"list": [{
+				"text": "首页",
+				"pagePath": "pages/tabbar/index/index",
+				"iconPath": "static/tabbar/home.png",
+				"selectedIconPath": "static/tabbar/home_active.png"
+			},
+			{
+				"text": "工作台",
+				"pagePath": "pages/tabbar/workbench/workbench",
+				"iconPath": "static/tabbar/work.png",
+				"selectedIconPath": "static/tabbar/work_active.png"
+			},
+			{
+				"text": "生产数据",
+				"pagePath": "pages/tabbar/production/production",
+				"iconPath": "static/tabbar/production.png",
+				"selectedIconPath": "static/tabbar/production_active.png"
+			},
+			{
+				"text": "个人中心",
+				"pagePath": "pages/tabbar/my/my",
+				"iconPath": "static/tabbar/my.png",
+				"selectedIconPath": "static/tabbar/my_active.png"
+			}
+
+		]
+	}
+}

BIN
pages/ningdongyunying/personnel_orientation/icon/right.png


+ 159 - 0
pages/ningdongyunying/personnel_orientation/personnel_orientation.vue

@@ -0,0 +1,159 @@
+<template>
+	<view class="content">
+
+	<!-- 	<view class="charts-box">
+			<qiun-data-charts type="ring" :chartData="chartData" background="none" />
+		</view> -->
+
+		<view class="list">
+			<view class="item" v-for="item in 3">
+				<view class="title">红柳煤矿</view>
+				<view class="inner">
+					<view class="box">
+						<view class="name">井下人数</view>
+						<view class="num">286个</view>
+					</view>
+					<view class="box">
+						<view class="name">矿级领导</view>
+						<view class="num">1个</view>
+					</view>
+					<view class="box">
+						<view class="name">公司领导</view>
+						<view class="num">0个</view>
+					</view>
+				</view>
+				<view class="right_arrow">
+					<view class="text">查看详情</view>
+					<view class="icon"></view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				chartData: {
+					categories: [],
+					"series": [{
+						"data": [{
+								"name": "一班",
+								"value": 50
+							},
+							{
+								"name": "二班",
+								"value": 30
+							},
+							{
+								"name": "三班",
+								"value": 20
+							},
+							{
+								"name": "四班",
+								"value": 18
+							},
+							{
+								"name": "五班",
+								"value": 8
+							}
+						]
+					}]
+				},
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F1F1F1;
+	}
+
+	/* 请根据需求修改图表容器尺寸,如果父容器没有高度图表则会显示异常 */
+	.charts-box {
+		width: 100%;
+		height: 300px;
+	}
+
+	.content {
+		width: 750rpx;
+
+		box-sizing: border-box;
+		padding: 25rpx;
+	}
+
+	.list {
+		.item {
+			width: 700rpx;
+			background-color: #FFFFFF;
+			border-radius: 8px;
+			overflow: hidden;
+
+			margin-bottom: 25rpx;
+
+			.title {
+				line-height: 80rpx;
+				padding-left: 20rpx;
+				border-left: 8rpx solid #83DCFC;
+				border-bottom: 1px solid #eee;
+			}
+
+			.inner {
+				display: flex;
+				justify-content: space-around;
+
+				.box {
+					padding: 30rpx 0;
+					color: #999;
+					text-align: center;
+
+					.name {
+						line-height: 60rpx;
+					}
+
+					.num {
+						color: #49C27D;
+					}
+				}
+
+				.box:nth-child(2) {
+					.num {
+						color: #B85A56;
+					}
+				}
+
+				.box:nth-child(3) {
+					.num {
+						color: #34383D;
+					}
+				}
+			}
+
+			.right_arrow {
+				width: 160rpx;
+				height: 60rpx;
+				margin-left: 520rpx;
+
+				display: flex;
+				align-items: center;
+
+				.text {
+					font-size: 28rpx;
+					color: #999999;
+					margin-right: 8rpx;
+				}
+
+				.icon {
+					width: 30rpx;
+					height: 30rpx;
+					background-image: url(./icon/right.png);
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+
+			}
+		}
+	}
+</style>

+ 92 - 0
pages/ningdongyunying/production_statistics/production_statistics.vue

@@ -0,0 +1,92 @@
+<template>
+	<view class="content">
+		<view class="section">
+			<view class="title" style="text-align: center;">当日集团产量</view>
+			<view class="inner">
+				<p-production-statistics-section-1></p-production-statistics-section-1>
+			</view>
+		</view>
+		<view class="section">
+			<view class="title">当日产量分布</view>
+			<view class="inner">
+				<p-production-statistics-section-2></p-production-statistics-section-2>
+			</view>
+		</view>
+		<view class="section">
+			<view class="title">
+				<view class="text">
+					<view>周产量趋势</view>
+					<view class="right_text">单位: 吨</view>
+				</view>
+			</view>
+			<view class="inner">
+				<p-production-statistics-section-3></p-production-statistics-section-3>
+			</view>
+		</view>
+		<view class="section">
+			
+			<view class="title" style="border-bottom: 1px solid #eee;">
+				<view class="text">
+					<view>各矿产量</view>
+					<view class="right_text">单位: 吨</view>
+				</view>
+			</view>
+			<view class="inner">
+				<p-production-statistics-section-4></p-production-statistics-section-4>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background-color: #009FE8;
+	}
+	.content{
+		width: 749rpx;
+		
+		box-sizing: border-box;
+		padding: 0 24rpx;
+	}
+	.section{
+		margin: 20rpx 0;
+		
+		width: 700rpx;
+		background-color: #FFFFFF;
+		border-radius: 8px;
+		.title{
+			font-size: 36rpx;
+			color: #1e1e1e;
+			font-weight: 700;
+			
+			box-sizing: border-box;
+			padding: 30rpx 0;
+			margin: 0 20rpx;
+			.text{
+				display: flex;
+				justify-content: space-between;
+				align-items: baseline;
+				.right_text{
+					font-size: 24rpx;
+					color: #9a9a9a;
+					font-weight: 400;
+				}
+			}
+		}
+		.inner{
+			// min-height: 200px;
+			
+		
+		}
+	}
+</style>

+ 19 - 0
pages/ningdongyunying/safety_monitoring/safety_monitoring.vue

@@ -0,0 +1,19 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 134 - 0
pages/production/personnel_orientation/depart-people-2/depart-people-2.vue

@@ -0,0 +1,134 @@
+<template>
+	<view>
+		<view class="inner_box">
+			<view class="inner_title">
+				<view class="name name_1">姓名</view>
+				<view class="name name_2">部门</view>
+				<view class="name name_2">当前位置</view>
+				<view class="name name_3">下井时间</view>
+			</view>
+			<view class="list_item">
+				<view class="item" v-for="(item,index) in peoples" :key="index"  @click="go_downhole_statistics(item.people_num,item.depart_name,item.name)">
+					<view class="text text_1">{{item.name}}</view>
+					<view class="text text_2">{{item.depart_name}}</view>
+					<view class="text text_2">{{item.station_name}}</view>
+					<view class="text text_3">{{item.time}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				peoples:[],
+				
+				
+				mine:""
+			};
+		},
+		onLoad(option) {
+			// console.log(option)
+			uni.setNavigationBarTitle({
+				title:option.title
+			})
+			this.mine = option.mine
+			
+			this.getPeoples(option.title,option.mine,option.departType)
+		},
+		methods:{
+			getPeoples(name,mine,departType){
+				uni.showLoading()
+				this.$p_api.personnel_depart_people({
+					depart_id:name,
+					mine:mine,
+					departType:departType
+				}).then((res)=>{
+					uni.hideLoading()
+					// console.log(res)
+					this.peoples = res.data.data
+					// console.log(this.peoples)
+				})
+				
+			},
+			
+			go_downhole_statistics(people_num,depart_name,name){
+				uni.navigateTo({
+					url:"../downhole_statistics/downhole_statistics?people_num="+people_num+"&depart_name="+depart_name+"&name="+name+"&mine="+this.mine
+				})
+			}
+		}
+		
+
+	}
+</script>
+
+<style lang="scss">
+	.inner_box{
+		.inner_title{
+			position: fixed;
+			left: 0;
+			top: 1;
+			z-index: 999;
+			overflow: hidden;
+			
+			padding: 0 25rpx;
+			
+			height: 94rpx;
+			background: #F3F6FA;
+			
+			display: flex;
+			align-items: center;
+			.name{
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				text-align: center;
+			}
+			.name_1{
+				width: 130rpx;
+			}
+			.name_2{
+				width: 220rpx;
+			}
+			.name_3{
+				width: 130rpx;
+			}
+		}
+		.list_item{
+			padding-top: 94rpx;
+			.item{
+				padding: 0 24rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				
+				border-bottom: 1px solid #f3f3f3;
+				.text{
+					height: 94rpx;
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					text-align: center;
+					display: flex;
+					flex-flow: column;
+					justify-content: center;
+					line-height: 40rpx;
+				}
+				.text_1{
+					width: 130rpx;
+				}
+				.text_2{
+					width: 220rpx;
+				}
+				.text_3{
+					width: 130rpx;
+				}
+			}
+		}
+	}
+
+</style>

+ 145 - 0
pages/production/personnel_orientation/depart-people/depart-people.vue

@@ -0,0 +1,145 @@
+<template>
+	<view>
+		<view class="inner_box">
+			<view class="inner_title">
+				<view class="name name_1">姓名</view>
+				<view class="name name_2">部门</view>
+				<view class="name name_2">当前位置</view>
+				<view class="name name_3">下井时间</view>
+			</view>
+			<view class="list_item">
+				<view class="item" v-for="(item,index) in peoples" :key="index"  @click="go_downhole_statistics(item.people_num,item.depart_name,item.name)">
+					<view class="text text_1">{{item.name}}</view>
+					<view class="text text_2">{{item.depart_name}}</view>
+					<view class="text text_2">{{item.station_name}}</view>
+					<view class="text text_3">{{item.time}}</view>
+				</view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				peoples: [],
+
+				popup: false,
+				
+				mine:""
+			};
+		},
+		onLoad(option) {
+			// console.log(option)
+			uni.setNavigationBarTitle({
+				title: option.title
+			})
+			this.mine = option.mine
+			
+
+			this.getPeoples(option.id,option.mine)
+		},
+		methods: {
+			getPeoples(id,mine) {
+				uni.showLoading()
+				this.$p_api.personnel_depart_people({
+					depart_id: id,
+					mine: mine
+				}).then((res) => {
+					uni.hideLoading()
+					console.log(res)
+					this.peoples = res.data.data
+					console.log(this.peoples)
+				})
+
+			},
+			
+			go_downhole_statistics(people_num,depart_name,name){
+				uni.navigateTo({
+					url:"../downhole_statistics/downhole_statistics?people_num="+people_num+"&depart_name="+depart_name+"&name="+name+"&mine="+this.mine
+				})
+			}
+		}
+
+
+	}
+</script>
+
+<style lang="scss">
+	.inner_box {
+		.inner_title {
+			position: fixed;
+			left: 0;
+			top: 1;
+			z-index: 999;
+			overflow: hidden;
+
+			padding: 0 25rpx;
+
+			height: 94rpx;
+			background: #F3F6FA;
+
+			display: flex;
+			align-items: center;
+
+			.name {
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				text-align: center;
+			}
+
+			.name_1 {
+				width: 130rpx;
+			}
+
+			.name_2 {
+				width: 220rpx;
+			}
+
+			.name_3 {
+				width: 130rpx;
+			}
+		}
+
+		.list_item {
+			padding-top: 94rpx;
+
+			.item {
+				padding: 0 24rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				border-bottom: 1px solid #f3f3f3;
+
+				.text {
+					height: 94rpx;
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					text-align: center;
+					display: flex;
+					flex-flow: column;
+					justify-content: center;
+					line-height: 40rpx;
+				}
+
+				.text_1 {
+					width: 130rpx;
+				}
+
+				.text_2 {
+					width: 220rpx;
+				}
+
+				.text_3 {
+					width: 130rpx;
+				}
+			}
+		}
+	}
+</style>

+ 339 - 0
pages/production/personnel_orientation/downhole_statistics/downhole_statistics.vue

@@ -0,0 +1,339 @@
+<template>
+	<view>
+		<!-- section_info -->
+		<view class="section_info">
+			<!-- 统计信息 -->
+			<view class="left">
+				<view class="user">
+					<view class="avatar" :style="{backgroundColor:bgColor[1]}">{{name.split('').pop()}}</view>
+					<view class="info">
+						<view class="name">{{name}}</view>
+						<view class="depart_name">{{depart_name}}</view>
+					</view>
+				</view>
+				<view class="box">
+					<view class="text">{{box_title}}</view>
+					<view class="text">需下井次数: <text style="font-size: 40rpx; color: #F0AD4E;"> {{box_paln}} </text> 次
+					</view>
+					<view class="text">已下井次数: <text style="color: #3DA7FF;"> {{box_real}} </text> 次</view>
+				</view>
+			</view>
+			<!-- 统计图表 -->
+			<view class="right" v-if="box_real">
+				<view class="charts-box">
+					<qiun-data-charts type="arcbar" :chartData="chartData" background="none" :opts="arcbar" />
+				</view>
+				<view style="text-align: center;font-size: 24rpx;">月下井完成度</view>
+			</view>
+
+		</view>
+		
+		<!-- 月份 -->
+		<view class="month_list">
+			<scroll-view scroll-x>
+				<view class="list">
+					<view class="item" v-for="(item,index) in month_list" :key="index" @click="change_month(item,index)">
+						<view class="name" :class="index==active?'active':''">{{item.year}}年{{item.month}}月{{item.times}}次</view>
+					</view>
+				</view>
+			</scroll-view>
+			
+			
+		</view>
+		
+		<!-- 下井记录 -->
+		<view class="info_list">
+			<view class="list">
+				<view class="item">
+					<view class="text text_1">时间</view>
+					<view class="text text_2">下井时间</view>
+					<view class="text text_3">上井时间</view>
+					<view class="text text_4">下井时长</view>
+				</view>
+				<view class="item" v-for="(item,index) in info_list" :key="index" @click="go_people_track(item.date,item.downtime)">
+					<view class="text text_1">
+						<view>{{item.date}}</view>
+						<view>{{item.week}}</view>
+					</view>
+					<view class="text text_2">
+						<view>{{item.downtime}}</view>
+						<view>{{item.classes}}</view>
+					</view>
+					<view class="text text_3">{{item.uptime}}</view>
+					<view class="text text_4">{{item.duration}}</view>
+				</view>
+			</view>
+		</view>
+		
+		
+
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				// 用户信息
+				name: "",
+				depart_name: "",
+				// 头像随机色
+				bgColor: [],
+				// 用户id
+				people_num: 0,
+
+				// 下井统计
+				box_paln: 0,
+				box_real: 0,
+
+
+				month_list: [],
+				info_list:[],
+
+				active:0,
+
+
+				chartData: {
+					"categories": [],
+					"series": [{
+						"data": 0,
+					}]
+				},
+				arcbar: {
+					"title": {
+						"name": "",
+					},
+					"subtitle": {
+						"name": "",
+					},
+					"extra": {
+						"arcbar": {
+							"type": "circle",
+							"width": 12,
+							"linearType": "custom",
+						}
+					}
+				}
+
+			};
+		},
+		onLoad(option) {
+			// console.log(option)
+			this.mine = option.mine
+
+			// 设置用户信息
+			this.name = option.name
+			this.depart_name = option.depart_name
+			this.people_num = option.people_num
+
+			// 设置头像
+			for (let i = 0; i < 2; i++) {
+				// 获取随机色
+				let r = parseInt(Math.random() * 256)
+				let g = parseInt(Math.random() * 256)
+				let b = parseInt(Math.random() * 256)
+
+				// ES6 字符串拼接
+				// this.bgColor = `rgba(${r},${g},${b},0.3)`
+				let color = "rgba(" + r + "," + g + "," + b + "," + 0.3 + ")"
+				// console.log(color)
+				this.bgColor.push(color)
+			}
+
+			this.get_personnel_downwell_monthlist_once()
+			
+			
+		},
+		methods: {
+			get_personnel_downwell_monthlist_once() {
+				this.$p_api.personnel_downwell_monthlist_once({
+					staff_num: this.people_num,
+					mine:this.mine
+				}).then((res) => {
+					console.log(res.data.data)
+					this.month_list = res.data.data
+
+					this.get_personnel_downwell_month_once(res.data.data[0].year, res.data.data[0].month, res.data.data[0].times)
+					this.get_personnel_downwell_month_info(res.data.data[0].year, res.data.data[0].month, res.data.data[0].times)
+				})
+			},
+			// 下井统计
+			get_personnel_downwell_month_once(year, month, downtime) {
+				this.$p_api.personnel_downwell_month_once({
+					month: year + '-' + month,
+					staff_num: this.people_num,
+					downtime: downtime,
+					mine:this.mine
+				}).then((res) => {
+					console.log(res.data.data)
+					this.box_paln = res.data.data.plan
+					this.box_real = res.data.data.real
+					this.box_title = res.data.data.date
+					
+					this.arcbar.subtitle.name = (((parseInt(this.box_real) / parseInt(this.box_paln)).toFixed(4))*100).toFixed(2) + '%'
+					console.log(parseInt(this.box_real) / parseInt(this.box_paln))
+					this.chartData.series[0].data = (parseInt(this.box_real) / parseInt(this.box_paln)).toFixed(1)
+					console.log(this.chartData.series[0].data)
+				})
+			},
+			
+			// 下井记录
+			get_personnel_downwell_month_info(year, month, downtime){
+				this.$p_api.personnel_downwell_month_info({
+					month: year + '-' + month,
+					staff_num: this.people_num,
+					downtime: downtime,
+					mine:this.mine
+				}).then((res) => {
+					console.log(res.data.data)
+					this.info_list = res.data.data
+				})
+			},
+			
+			//切换月份
+			 change_month(item,index){
+				 console.log(item)
+				 this.active = index
+				 this.get_personnel_downwell_month_info(item.year, item.month, item.times)
+			 },
+			 
+			 // 下井轨迹
+			 go_people_track(date,time){
+			 	uni.navigateTo({
+			 		url:"../people_track/people_track?people_num="+this.people_num+"&time="+date+time+"&mine="+this.mine
+			 	})
+			 }
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #f0f0f0;
+	}
+	.section_info {
+		display: flex;
+		justify-content: space-between;
+		box-sizing: border-box;
+		padding: 25rpx;
+		background-color: #FFFFFF;
+
+		.left {
+			width: 380rpx;
+
+			.user {
+				display: flex;
+				align-items: center;
+
+				.avatar {
+					width: 140rpx;
+					height: 140rpx;
+					border-radius: 50%;
+					color: #FFFFFF;
+
+					font-size: 48rpx;
+					line-height: 140rpx;
+					text-align: center;
+				}
+
+				.info {
+					margin-left: 20rpx;
+
+					.name {
+						font-size: 38rpx;
+					}
+
+					.depart_name {
+						font-size: 32rpx;
+						color: #666666;
+					}
+				}
+			}
+
+			.box {
+				margin-top: 20rpx;
+				background-color: #f0f0f0;
+				border-radius: 14rpx;
+
+				box-sizing: border-box;
+				padding: 30rpx;
+
+				.text {
+					text {}
+				}
+			}
+		}
+
+		.right {
+			margin-top: 120rpx;
+			width: 300rpx;
+			
+			
+			
+			/* 请根据需求修改图表容器尺寸,如果父容器没有高度图表则会显示异常 */
+			.charts-box {
+				width: 100%;
+				height: 196rpx;
+			}
+		}
+	}
+	
+	
+	.month_list{
+		box-sizing: border-box;
+		padding: 20rpx;
+		.list{
+			display: flex;
+			.item{
+				margin-right: 20rpx;
+				.name{
+					box-sizing: border-box;
+					padding: 10rpx;
+					// background-color: #009FE8;
+					width: 280rpx;
+					text-align: center;
+					// color: #fff;
+					color: #009FE8;
+					border: 1rpx solid #009FE8;
+					font-size: 32rpx;
+					border-radius: 15rpx;
+				}
+				.active{
+					background-color: #009FE8;
+					color: #fff;
+				}
+			}
+			
+		}
+	}
+	
+	.info_list{
+		background-color: #FFFFFF;
+		margin-bottom: 50rpx;
+		.list{
+			font-size: 32rpx;
+			.item{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				
+				
+				border-bottom: 1rpx solid #f0f0f0;
+				
+				.text{
+					width: 187.5rpx;
+					text-align: center;
+					padding: 15rpx 0;
+				}
+			}
+			.item:first-child{
+				color: #009FE8;
+				border-bottom: 1rpx solid #009FE8;
+				line-height: 80rpx;
+			}
+		}
+	}
+</style>

+ 100 - 0
pages/production/personnel_orientation/people_track/people_track.vue

@@ -0,0 +1,100 @@
+<template>
+	<view>
+		<view class="inner_box">
+			<view class="inner_title">
+				<view class="name">时间</view>
+				<!-- <view class="name">区域</view> -->
+				<view class="name">位置</view>
+				<view class="name">驻留时长</view>
+			</view>
+			<view class="list_item">
+				<view class="item" v-for="(item,index) in list" :key="index">
+					<view class="text">{{item.time}}</view>
+					<!-- <view class="text">{{item.area}}</view> -->
+					<view class="text">{{item.station}}</view>
+					<view class="text">{{item.slot}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				list:[],
+				
+			};
+		},
+		onLoad(option) {
+			// console.log(option.people_num)
+			this.mine = option.mine
+			
+			this.get_info(option.people_num,option.time)
+		},
+		methods:{
+			get_info(staff_num,time){
+				this.$p_api.personnel_downwell_once_info({
+					staff_num:staff_num,
+					downtime:time,
+					mine:this.mine
+				}).then((res)=>{
+					console.log(res)
+					this.list = res.data.data
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.inner_box{
+		.inner_title{
+			position: fixed;
+			left: 0;
+			top: 1;
+			z-index: 999;
+			overflow: hidden;
+			
+			
+			height: 94rpx;
+			background: #F3F6FA;
+			
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			.name{
+				width: 250rpx;
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				text-align: center;
+			}
+		}
+		.list_item{
+			padding-top: 94rpx;
+			.item{
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				
+				border-bottom: 1px solid #f3f3f3;
+				.text{
+					width: 250rpx;
+					height: 94rpx;
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					text-align: center;
+					display: flex;
+					flex-flow: column;
+					justify-content: center;
+					line-height: 40rpx;
+				}
+			}
+		}
+	}
+</style>

+ 521 - 0
pages/production/personnel_orientation/personnel_orientation.vue

@@ -0,0 +1,521 @@
+<template>
+	<view>
+		<!-- 搜索井下人员 -->
+		<p-personnel-orientation-navbar :mine="mine"></p-personnel-orientation-navbar>
+
+		<view class="content"> 
+			
+			<!-- 当前井下人员 -->
+			<p-personnel-orientation-section-1 :mine="mine">
+				<!-- 圆环图 -->
+				<canvas style="width: 720upx; height:500upx;" canvas-id="canvasRing" id="canvasRing" @touchstart="touchRing"></canvas>
+
+			</p-personnel-orientation-section-1>
+			
+			<p-personnel-orientation-section-3>
+				<!-- 职能科室 -->
+				<view class="section_title">职能科室</view>
+				<canvas style="width: 720upx; height:800upx;" canvas-id="canvasRing2" id="canvasRing2" @touchstart="touchRing2"></canvas>
+				<!-- 基层区队 -->
+				<view class="section_title">基层区队</view>
+				<canvas style="width: 720upx; height:800upx;" canvas-id="canvasRing3" id="canvasRing3" @touchstart="touchRing3"></canvas>
+			</p-personnel-orientation-section-3>
+			<!-- 各科室下井人数 -->
+			<p-personnel-orientation-section-4 @changeDepart="changeDepart">
+				<canvas style="width: 700upx; height:2500upx;" canvas-id="canvasColumn" id="canvasColumn" class="charts-rotate" @touchstart="touchColumn"></canvas>
+			</p-personnel-orientation-section-4>
+		</view>
+	</view>
+</template>
+
+
+<script>
+	import uCharts from '@/components/u-charts/u-charts.js';
+	
+	var _self;
+	var canvaRing = null;
+	var canvaRing2 = null;
+	var canvaRing3 = null;
+
+	// 柱状图
+	var canvaColumn = null;
+
+	export default {
+		data() {
+			return {
+				// 矿编码
+				mine:"",
+				
+				cWidth: '',
+				cHeight: '',
+				pixelRatio: 1,
+				serverData: '',
+
+				cWidth2: '', //横屏图表
+				cHeight2: '', //横屏图表
+				
+				
+				// 今日部门人数统计
+				departType:"now",
+				
+				
+				lastTapTimeoutFunc:null,
+				lastTapDiffTime:0
+				
+				
+			}
+		},
+		onLoad(option) {
+			// 矿编码
+			this.mine = option.mine
+			
+			_self = this;
+			this.cWidth = uni.upx2px(720);
+			this.cHeight = uni.upx2px(500);
+			this.cHeight3 = uni.upx2px(750);
+			this.getServerData();
+			this.getServerData2();
+			this.getServerData3();
+
+			// 柱状图
+			this.cWidth2 = uni.upx2px(700);
+			this.cHeight2 = uni.upx2px(2400);
+			this.getServerData4();
+			
+			
+		},
+		methods: {
+			// 改变今日部门人数统计的参数
+			changeDepart(type){
+				// console.log(type)
+				if(type == 1){
+					this.departType = "today"
+				}else{
+					this.departType = "now"
+				}
+				console.log(this.departType)
+				this.getServerData4();
+			},
+			
+			// 当前人员统计
+			getServerData(){
+				this.$p_api.personnel_people_now({
+					mine:this.mine
+				}).then((res)=>{
+					// console.log(res)
+					
+					let Ring = {series:[{name:'',data:0}],people_total:0}
+					
+					// res.data.data.people_distribute 图例
+					Ring.people_total = res.data.data.people_total
+					
+					
+					const series = res.data.data.people_distribute
+					series.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm['name'] = item.depart_name;
+						sevm['data'] = item.pepole_num;
+						//将项放进新的数组
+						Ring.series[index] = sevm
+					})
+					
+					// console.log(Ring)
+					_self.showRing("canvasRing", Ring);
+				})
+				
+			
+			},
+			
+			// 职能科室人数统计
+			getServerData2(){
+				this.$p_api.personnel_office_total({
+					mine:this.mine
+				}).then((res)=>{
+					// console.log(res)
+					
+					let Ring2 = {series:[{name:'',data:0}],people_total:0}
+					
+					
+					Ring2.people_total = res.data.people_total
+					
+					
+					const series = res.data.data
+					series.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm['id'] = item.depart_id;
+						sevm['name'] = item.depart_name;
+						sevm['data'] = item.pepole_num;
+						//将项放进新的数组
+						Ring2.series[index] = sevm
+					})
+					
+					// console.log(Ring2)
+					_self.showRing2("canvasRing2", Ring2);
+				})
+				
+			},
+			
+			// 基层区队人数统计
+			getServerData3(){
+				this.$p_api.personnel_basic_total({
+					mine:this.mine
+				}).then((res)=>{
+					// console.log(res.data.data)
+					
+					let Ring3 = {series:[{name:'',data:0}],people_total:0}
+								
+					Ring3.people_total = res.data.people_total
+							
+					const series = res.data.data
+					series.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm['name'] = item.depart_name;
+						sevm['data'] = item.pepole_num;
+						//将项放进新的数组
+						Ring3.series[index] = sevm
+					})
+					
+					// console.log(Ring3)
+					_self.showRing3("canvasRing3", Ring3);
+				})
+			},
+			
+			
+			showRing(canvasId, chartData) {
+				canvaRing = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'ring',
+					fontSize: 12,
+					// 图例配置
+					// legend: true,
+					legend: {
+						position: "right",
+						lineHeight: 30,
+					},
+					title: {
+						name: '总人数',
+						color: '#666666',
+						fontSize: 15 * _self.pixelRatio,
+						offsetY: 0 * _self.pixelRatio,
+					},
+					subtitle: {
+						name: chartData.people_total + '人',
+						color: '#666666',
+						fontSize: 15 * _self.pixelRatio,
+						offsetY: 0 * _self.pixelRatio,
+					},
+					extra: {
+						pie: {
+							offsetAngle: -45,
+							ringWidth: 30 * _self.pixelRatio,
+							labelWidth: 20
+						}
+					},
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight * _self.pixelRatio,
+					disablePieStroke: true,
+					// 百分比指示 关
+					dataLabel: false,
+				});
+			},
+			touchRing(e) {
+				canvaRing.showToolTip(e, {
+					format: function(item) {
+						
+						return item.name + ':' + item.data + '人'
+					}
+				});
+			},
+
+
+			showRing2(canvasId, chartData) {
+				canvaRing2 = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'ring',
+					fontSize: 12,
+					// 图例配置
+					legend: true,
+					legend: {
+						position: "bottom",
+						lineHeight: 30,
+					},
+					title: {
+						name: '总人数',
+						color: '#666666',
+						fontSize: 15 * _self.pixelRatio,
+						offsetY: 0 * _self.pixelRatio,
+					},
+					subtitle: {
+						name: chartData.people_total + '人',
+						color: '#666666',
+						fontSize: 15 * _self.pixelRatio,
+						offsetY: 0 * _self.pixelRatio,
+					},
+					extra: {
+						pie: {
+							offsetAngle: -45,
+							ringWidth: 30 * _self.pixelRatio,
+							labelWidth: 5
+						}
+					},
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight3 * _self.pixelRatio,
+					disablePieStroke: true,
+					// 百分比指示 关
+					dataLabel: true,
+				});
+			},
+			touchRing2(e) {
+				canvaRing2.showToolTip(e, {
+					
+					format: (item) => {
+						
+						this.go_depart_people(item)
+						
+						return item.name + ':' + item.data + '人'
+					}
+				});
+				
+				console.log(e)
+				
+			},
+			
+			go_depart_people(item){
+				setTimeout(()=>{
+					uni.navigateTo({
+						url:"./depart-people/depart-people?title="+item.name+"&id="+item.id+"&mine="+this.mine
+					})
+				},1000)
+			},
+
+
+			showRing3(canvasId, chartData) {
+				canvaRing3 = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'ring',
+					fontSize: 12,
+					// 图例配置
+					legend: true,
+					legend: {
+						position: "bottom",
+						lineHeight: 30,
+					},
+					title: {
+						name: '总人数',
+						color: '#666666',
+						fontSize: 15 * _self.pixelRatio,
+						offsetY: 0 * _self.pixelRatio,
+					},
+					subtitle: {
+						name:  chartData.people_total + '人',
+						color: '#666666',
+						fontSize: 15 * _self.pixelRatio,
+						offsetY: 0 * _self.pixelRatio,
+					},
+					extra: {
+						pie: {
+							offsetAngle: -45,
+							ringWidth: 30 * _self.pixelRatio,
+							labelWidth: 15
+						}
+					},
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					series: chartData.series,
+					animation: true,
+					width: _self.cWidth * _self.pixelRatio,
+					height: _self.cHeight3 * _self.pixelRatio,
+					disablePieStroke: true,
+					// 百分比指示 关
+					dataLabel: true,
+				});
+			},
+			touchRing3(e) {
+				canvaRing3.showToolTip(e, {
+					format: (item) => {
+						// console.log(item)
+						
+						this.go_depart_people_2(item)
+						
+						return item.name + ':' + item.data + '人'
+					}
+				});
+			},
+			
+			go_depart_people_2(item){
+				setTimeout(()=>{
+					uni.navigateTo({
+						url:"./depart-people-2/depart-people-2?title="+item.name+"&mine="+this.mine
+					})
+				},1000)
+			},
+
+
+			// 今日各部门人数统计
+			getServerData4(){
+				// console.log(this.departType)
+				this.$p_api.personnel_depart_today({
+					type:this.departType,
+					mine:this.mine
+				}).then((res)=>{
+					// console.log(res.data.data)
+								
+					let ColumnColumn = {
+						"categories": [],
+						"seriesData": []
+					}
+					
+					const categories = res.data.data
+					categories.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.depart_name;
+						//将项放进新的数组
+						ColumnColumn.categories[index] = sevm
+					})
+					
+					const seriesData = res.data.data
+					seriesData.map(function(item,index){
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm = item.pepole_num;
+						//将项放进新的数组
+						ColumnColumn.seriesData[index] = sevm
+					})
+					
+					// console.log(ColumnColumn)
+					
+					_self.showColumnColumn("canvasColumn",ColumnColumn);
+				})
+				
+			},
+			
+			showColumnColumn(canvasId, chartData) {
+				canvaColumn = new uCharts({
+					$this: _self,
+					canvasId: canvasId,
+					type: 'column',
+					legend: {
+						show: false,
+					},
+					fontSize: 9,
+					background: '#FFFFFF',
+					pixelRatio: _self.pixelRatio,
+					animation: true,
+					rotate: true,
+					padding:[20,15,4,15],
+					// #ifdef MP-ALIPAY || MP-BAIDU
+					rotateLock: true, //百度及支付宝需要锁定旋转
+					// #endif
+					categories: chartData.categories,
+					series:[{
+						"name":'',
+						"data": chartData.seriesData
+					}],
+					xAxis: {
+						disableGrid: true,
+						rotateLabel:true,
+						
+					},
+					yAxis: {
+						// disabled:true
+					},
+					dataLabel: true,
+					width: _self.cWidth2 * _self.pixelRatio,
+					height: _self.cHeight2 * _self.pixelRatio,
+					extra: {
+						column: {
+							type: 'group',
+							// width: _self.cWidth * _self.pixelRatio * 0.45 / chartData.categories.length,
+							width: _self.cWidth * _self.pixelRatio * 2 / chartData.categories.length,
+							// seriesGap:12,
+							meter: {
+								//这个是外层边框的宽度
+								border: 4,
+								//这个是内部填充颜色
+								fillColor: '#E5FDC3'
+							}
+						}
+					}
+					
+				});
+
+			},
+			touchColumn(e) {
+				canvaColumn.showToolTip(e, {
+					format: (item, category) => {
+					
+						
+						let _this = this;
+						let curTime = new Date().getTime();
+						let lastTime = _this.lastTapDiffTime;
+						_this.lastTapDiffTime = curTime;
+						//两次点击间隔小于300ms, 认为是双击
+						let diff = curTime - lastTime;
+						if (diff < 300) {
+							console.log("双击")
+						
+							uni.navigateTo({
+								url: "./depart-people-2/depart-people-2?title=" + category + "&departType=" + this.departType+"&mine="+this.mine
+							})
+						
+							//_this.handleVideo('screen',index)自定义事件
+							clearTimeout(_this.lastTapTimeoutFunc); // 成功触发双击事件时,取消单击事件的执行
+						} else {
+							// 单击事件延时300毫秒执行
+							_this.lastTapTimeoutFunc = setTimeout(function() {
+								console.log("单击")
+								//_this.handleVideo('playOrStop',index)自定义事件
+							}, 300);
+						}
+						
+						
+						return category + ':' + item.data +  item.name
+					}
+				});
+			},
+		
+		}
+	}
+</script>
+
+
+<style lang="scss">
+	page {
+		background-color: #f3f3f3;
+	}
+
+	.content {
+		box-sizing: border-box;
+		padding: 0 15rpx;
+		background-color: #f3f3f3;
+
+		.section_title {
+			text-align: center;
+			line-height: 96rpx;
+			font-size: 28rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #232627;
+		}
+	}
+</style>

BIN
pages/production/personnel_orientation/search/icon/search.png


+ 275 - 0
pages/production/personnel_orientation/search/search.vue

@@ -0,0 +1,275 @@
+<template>
+	<view>
+		<view class="content">
+			<view :style="{height:statusBarHeight + 'px'}"></view>
+			<view class="navbar">
+
+				<view class="left" @click="click_left()">
+					<uni-icons type="arrowleft" color="#fff" size="18"></uni-icons>
+				</view>
+				<view class="right">
+					<view class="input_box">
+						<view class="input_icon"></view>
+						<view class="input_text">
+							<input type="text" v-model="search_text" placeholder="搜索井下人员"
+								placeholder-style="color:#fff;" />
+						</view>
+					</view>
+				</view>
+				<view class="btn" @click="search()">搜索</view>
+			</view>
+		</view>
+		<!-- 占位符 -->
+		<view :style="{height: statusBarHeight + 'px'}"></view>
+		<view style="height: 93rpx;"></view>
+
+
+		<!-- 搜索列表 -->
+		<view class="list">
+			<view class="item" v-for="(item,index) in list" :key="index" v-if="index < 100" @click="open(item.people_id)">
+				<view class="avatar" :style="{backgroundColor:bgColor[index]}">{{item.remark.split('').pop()}}</view>
+				<view class="info">
+					<view class="name">{{item.remark}}</view>
+					<view class="dept">{{item.dept_name}}</view>
+				</view>
+				<view class="position">({{item.position}})</view>
+			</view>
+		</view>
+		
+		<uni-popup ref="popup" type="center">
+			<view class="popup_box">
+				<view class="item">定位信息</view>
+				<view class="item">
+					<view class="text">姓名:</view>
+					<view class="text">{{info.name}}</view>
+				</view>
+				<view class="item">
+					<view class="text">所属区队:</view>
+					<view class="text">{{info.depart_name}}</view>
+				</view>
+				<view class="item">
+					<view class="text">下井时间:</view>
+					<view class="text">{{info.down_time}}</view>
+				</view>
+				<view class="item">
+					<view class="text">当前位置:</view>
+					<view class="text">{{info.station_name}}</view>
+				</view>
+				<view class="item">
+					<view class="text">班次:</view>
+					<view class="text">{{info.classes}}</view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				statusBarHeight: 20,
+
+				// 搜索关键词
+				search_text: "",
+				
+				// 头像随机色
+				bgColor:[],
+				list:[],
+				
+				mine:"",
+				// 定位信息
+				info:{}
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+			// 获取手机系统信息
+			const info = uni.getSystemInfoSync()
+			// 设置状态栏高度
+			this.statusBarHeight = info.statusBarHeight
+			
+			// 设置头像
+			for(let i=0;i<100;i++){
+				// 获取随机色
+				let r = parseInt(Math.random() * 256)
+				let g = parseInt(Math.random() * 256)
+				let b = parseInt(Math.random() * 256)
+				
+				// ES6 字符串拼接
+				// this.bgColor = `rgba(${r},${g},${b},0.3)`
+				let color = "rgba(" + r + "," + g + "," + b + "," + 0.3 + ")"
+				// console.log(color)
+				this.bgColor.push(color)
+			}
+
+		},
+		methods: {
+			click_left() {
+				uni.navigateBack();
+			},
+			search() {
+				uni.showLoading()
+				// console.log(this.search_text)
+				
+				this.$p_api.personnel_people_search({
+					name:this.search_text,
+					mine:this.mine
+				}).then((res)=>{
+					console.log(res)
+					uni.hideLoading()
+					this.list = res.data.data
+				})
+				
+			},
+			
+			open(people_id) {
+				console.log(people_id)
+				// 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center']
+				this.$refs.popup.open('center')
+					
+				this.$p_api.personnel_people_info({
+					people_id:people_id
+				}).then((res)=>{
+					console.log(res.data.data)
+					this.info = res.data.data
+				})
+			}
+		}
+
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		position: fixed;
+		top: 0;
+		left: 0;
+
+		background-color: #009FE8;
+		z-index: 999;
+	}
+
+	.navbar {
+		width: 750rpx;
+		box-sizing: border-box;
+		padding-left: 31rpx;
+		padding-right: 26rpx;
+		padding-top: 14rpx;
+		padding-bottom: 14rpx;
+		display: flex;
+		// justify-content: space-between;
+
+		.left {
+			width: 42rpx;
+			line-height: 65rpx;
+			margin-right: 15rpx;
+		}
+
+		.right {
+			width: 500rpx;
+			height: 65rpx;
+			background: rgba(255, 255, 255, 0.2);
+			border-radius: 33rpx;
+
+			.input_box {
+				display: flex;
+
+				.input_icon {
+					margin-left: 43rpx;
+					margin-top: 16rpx;
+					width: 34rpx;
+					height: 34rpx;
+
+					background-image: url(icon/search.png);
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+
+				.input_text {
+					margin-left: 19rpx;
+
+					font-size: 24rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+					line-height: 65rpx;
+
+					input {
+						font-size: 24rpx;
+						height: 65rpx;
+						line-height: 65rpx;
+					}
+				}
+			}
+		}
+
+		.btn {
+			margin-left: 20rpx;
+			width: 120rpx;
+			text-align: center;
+			height: 65rpx;
+			line-height: 65rpx;
+			background: rgba(255, 255, 255, 0.2);
+			border-radius: 33rpx;
+			font-size: 24rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #FFFFFF;
+		}
+	}
+
+
+	.list {
+		.item{
+			height: 120rpx;
+			display: flex;
+			align-items: center;
+			border-bottom: 1rpx solid #F1F1F1;
+			box-sizing: border-box;
+			padding: 0 25rpx;
+			.avatar{
+				font-size: 46rpx;
+				width: 90rpx;
+				height: 90rpx;
+				text-align: center;
+				line-height: 90rpx;
+				color: #FFFFFF;
+				border-radius: 50%;
+			}
+			.info{
+				margin-left: 40rpx;
+				min-width: 200rpx;
+				font-size: 28rpx;
+				.name{
+					
+				}
+				.dept{
+					color: #999;
+					font-size: 24rpx;
+				}
+			}
+			.position{
+				font-size: 28rpx;
+			}
+		}
+	}
+	
+	.popup_box{
+		width: 600rpx;
+		height: 600rpx;
+		background-color: #FFFFFF;
+		border-radius: 16rpx;
+		.item{
+			line-height: 100rpx;
+			box-sizing: border-box;
+			padding: 0rpx 20rpx;
+			border-bottom: 2rpx solid #F1F1F1;
+			
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+		}
+	}
+	
+</style>

+ 75 - 0
pages/production/production_report/detail/detail.vue

@@ -0,0 +1,75 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="list">
+				<view class="item" v-for="(item,index) in list" :key="index">
+					<view class="label">{{item.name}}</view>
+					<view class="inner">{{item.value}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list:[],
+			};
+		},
+		onLoad(option) {
+			// console.log(option.id)
+			uni.setNavigationBarTitle({
+				title:option.title
+			})
+			
+			this.title = option.title
+			
+			this.$p_api.coalmine_working_face_info({
+				id:option.id
+			}).then((res)=>{
+				console.log(res)
+				this.list = res.data.data
+			})
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background-color: #009FE8;
+	}
+	.content{
+		width: 750rpx;
+		
+		box-sizing: border-box;
+		padding: 10rpx 25rpx;
+		
+		.list{
+			width: 700rpx;
+			background-color: #FFFFFF;
+			border-radius: 16rpx;
+			box-sizing: border-box;
+			padding: 10rpx 30rpx;
+			.item{
+				display: flex;
+				
+				font-size: 28rpx;
+				box-sizing: border-box;
+				padding: 30rpx 0;
+				border-bottom: 1rpx solid #eee;
+				.label{
+					width: 256rpx;
+					
+					color: #1e1e1e;
+				}
+				.inner{
+					width: 380rpx;
+					
+					color: #666;
+				}
+			}
+		}
+	}
+</style>

+ 92 - 0
pages/production/production_report/production_report.vue

@@ -0,0 +1,92 @@
+<template>
+	<view class="content">
+		<view class="section">
+			<view class="title">
+				<view class="text">
+					<view>今日产量</view>
+					<view class="right_text">单位: 吨</view>
+				</view>
+			</view>
+			<view class="inner">
+				<p-production-report-inner-1 :mine="mine" :org_num="org_num"></p-production-report-inner-1>
+			</view>
+		</view>
+
+
+		<!-- 产量趋势 -->
+		<p-production-report-inner-2 :mine="mine" :org_num="org_num"></p-production-report-inner-2>
+
+
+		<view class="section">
+			<view class="title">
+				工作面详情
+			</view>
+			<view class="inner">
+				<p-production-report-inner-3 :mine="mine" :org_num="org_num"></p-production-report-inner-3>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine: "",
+				org_num: ""
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+			this.org_num = option.org_num
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #009FE8;
+	}
+
+	.content {
+		width: 750rpx;
+
+		box-sizing: border-box;
+		padding: 0 25rpx;
+	}
+
+	.section {
+		margin: 20rpx 0;
+
+		width: 700rpx;
+		background-color: #FFFFFF;
+		border-radius: 16rpx;
+
+		.title {
+			font-size: 36rpx;
+			color: #1e1e1e;
+			font-weight: 700;
+
+			box-sizing: border-box;
+			padding: 30rpx 0;
+			margin: 0 20rpx;
+
+			.text {
+				display: flex;
+				justify-content: space-between;
+				align-items: baseline;
+
+				.right_text {
+					font-size: 24rpx;
+					color: #9a9a9a;
+					font-weight: 400;
+				}
+			}
+		}
+
+		.inner {
+			// min-height: 200px;
+
+		}
+	}
+</style>

BIN
pages/production/safety_monitoring/icon/ss1.png


BIN
pages/production/safety_monitoring/icon/ss2.png


BIN
pages/production/safety_monitoring/icon/work.png


BIN
pages/production/safety_monitoring/icon/work_active.png


+ 160 - 0
pages/production/safety_monitoring/safety_monitoring.vue

@@ -0,0 +1,160 @@
+<template>
+	<view>
+		<!-- navbar -->
+		<p-safety-monitoring-navbar :mine="mine"></p-safety-monitoring-navbar>
+		
+		<view style="margin-bottom: 200rpx;">
+			<!-- 模拟量 -->
+			<view v-if="active == 1">
+				<p-safety-monitoring-content-1 :mine="mine" :simulation="simulation" :simulationList="simulationList"></p-safety-monitoring-content-1>
+			</view>
+			<!-- 开关量 -->
+			<view v-if="active == 2">
+				<p-safety-monitoring-content-2 :mine="mine" :sluice="sluice" :sluiceList="sluiceList"></p-safety-monitoring-content-2>
+			</view>
+		</view>
+		
+		<!-- tabbar -->
+		<view class="tabbar">
+			<view class="list_item">
+				<view class="item" :class="active === 1 ? 'active':''" @click="click_item(1)">
+					<view class="item_icon icon_one"></view>
+					<view class="item_name">
+						模拟量
+					</view>
+				</view>
+				<view class="item" :class="active === 2 ? 'active':''" @click="click_item(2)">
+					<view class="item_icon icon_two"></view>
+					<view class="item_name">
+						开关量
+					</view>
+				</view>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				
+				active:1,
+				
+				// 模拟量
+				// 监测统计
+				simulation:[],
+				simulationList:[],
+				
+				
+				// 开关量
+				sluice:[],
+				sluiceList:[],
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+			
+			
+			// 模拟量统计
+			this.getSimulation()
+			
+			
+			// 开关量统计
+			this.getSluice()
+			
+		},
+		methods:{
+			click_item(item){
+				this.active = item
+			
+			},
+			// 模拟量统计
+			getSimulation(){
+				uni.showLoading()
+				this.$p_api.jt_safety_simulation_total({
+					mine:this.mine,
+					mine_code:this.mine
+				}).then((res)=>{
+					uni.hideLoading()
+					// console.log(res)
+					this.simulation = res.data.content.total
+					this.simulationList = res.data.content.data
+				})
+			},
+			
+			// 开关量统计
+			getSluice(){
+				uni.showLoading()
+				this.$p_api.jt_safety_sluice_total({
+					mine:this.mine,
+					mine_code:this.mine
+				}).then((res)=>{
+					uni.hideLoading()
+					// console.log(res.data.content)
+					this.sluice = res.data.content.total
+					this.sluiceList = res.data.content.data
+				})
+				
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tabbar{
+		z-index: 999;
+		background-color: #fff;
+		position: fixed;
+		bottom: 0;
+		width: 750rpx;
+		.list_item{
+			width: 100%;
+			border-top: 2rpx solid #f3f3f3;
+			box-sizing: border-box;
+			padding: 12rpx 0;
+			
+			.item{
+				float: left;
+				width: 50%;
+				.item_icon{
+					margin: 0 auto;
+					width: 45rpx;
+					height: 45rpx;
+					
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+				.icon_one{
+					background-image: url(icon/ss1.png);
+				}
+				.icon_two{
+					background-image: url(icon/work.png);
+				}
+				.item_name{
+					text-align: center;
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #929292;
+					line-height: 40rpx;
+
+				}
+			}
+			.active{
+				.icon_one{
+					background-image: url(icon/ss2.png);
+				}
+				.icon_two{
+					background-image: url(icon/work_active.png);
+				}
+				.item_name{
+					color: #3498DB;
+				}
+			}
+		}
+	}
+</style>

+ 257 - 0
pages/production/safety_monitoring/safety_monitoring_name_detail/safety_monitoring_name_detail.vue

@@ -0,0 +1,257 @@
+<template>
+	<view>
+		<view class="top">
+			<view class="list_item">
+				<view class="item" v-for="(item,index) in items" :key="index" :class="item.type"
+					@click="click_item(item.type)">
+					<view class="name">{{item.name}}</view>
+					<view class="num">{{item.count}}个</view>
+				</view>
+			</view>
+		</view>
+		<view class="inner_box">
+			<view class="inner_title">
+				<view class="name name_1">序号</view>
+				<view class="name name_2">安装地点</view>
+				<view class="name name_3">数值/状态</view>
+			</view>
+			<view class="list_item">
+				<view class="item" :class="item.status" v-for="(item,index) in List" :key="index">
+					<view class="text text_1">{{item.id}}</view>
+					<view class="text text_2">{{item.position}}</view>
+					<view class="text text_3">{{item.value}}{{item.unit}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				name: '',
+				status: '',
+				items: [],
+				List: []
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+			this.name = option.name
+			
+			uni.setNavigationBarTitle({
+				title: this.name
+			});
+			
+			this.get_detail()
+		},
+		methods: {
+			get_detail() {
+				uni.showLoading()
+				this.$p_api.jt_safety_info_total({
+					sensor_name: this.name,
+					mine_code:this.mine
+				}).then((res) => {
+					uni.hideLoading()
+					// console.log(res.data.content)
+					this.items = res.data.content.total
+					this.List = res.data.content.data
+				})
+			},
+			click_item(type) {
+				this.List = []
+				uni.showLoading()
+				this.$p_api.jt_safety_info_total({
+					sensor_name: this.name,
+					status:type,
+					mine_code:this.mine
+				}).then((res) => {
+					uni.hideLoading()
+					// console.log(res.data.content)
+					this.List = res.data.content.data
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top {
+		height: 202rpx;
+		background: #FFFFFF;
+
+		border-bottom: 1rpx solid #f3f3f3;
+
+		.list_item {
+			height: 202rpx;
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+
+			.item {
+				width: 106rpx;
+				height: 106rpx;
+				border-radius: 50%;
+				text-align: center;
+				line-height: 53rpx;
+
+				.name {
+					margin-top: 21rpx;
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+
+					line-height: 34rpx;
+				}
+
+				.num {
+					margin-top: 4rpx;
+					font-size: 21rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+
+					line-height: 29rpx;
+				}
+			}
+
+			.item_1 {
+				background: #27AE60;
+			}
+
+			.item_2 {
+				background: #E74C3C;
+			}
+
+			.item_3 {
+				background: #2C3E50;
+			}
+
+			.item_4 {
+				background: #2873FF;
+			}
+
+			// 模拟量 统计
+			.normal {
+				background: #2C3E50;
+			}
+
+			.alarm {
+				background: #E74C3C;
+			}
+
+			.sign {
+				background: #27AE60;
+			}
+
+			.fault {
+				background: #2873FF;
+			}
+			
+			// 开关量
+			.open {
+				background: #27AE60;
+			}
+			.close {
+				background: #2873FF;
+			}
+		}
+	}
+
+	.inner_box {
+		.inner_title {
+
+			padding: 0 25rpx;
+
+			height: 94rpx;
+			background: #F3F6FA;
+
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+
+			.name {
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				text-align: center;
+			}
+
+			.name_1 {
+				width: 125rpx;
+			}
+
+			.name_2 {
+				margin: 0 15rpx;
+				width: 420rpx;
+			}
+
+			.name_3 {
+				width: 125rpx;
+			}
+		}
+
+		.list_item {
+			.item {
+				padding: 0 24rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				border-bottom: 1rpx solid #f3f3f3;
+
+				.text {
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					line-height: 94rpx;
+					text-align: center;
+				}
+
+				.text_1 {
+					width: 125rpx;
+				}
+
+				.text_2 {
+					margin: 0 15rpx;
+					width: 420rpx;
+
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+				}
+
+				.text_3 {
+					width: 125rpx;
+				}
+			}
+
+			.normal {
+				color: #2C3E50;
+			}
+
+			.alarm {
+				color: #E74C3C;
+			}
+
+			.sign {
+				color: #27AE60;
+			}
+
+			.fault {
+				color: #2873FF;
+			}
+			// 开关量
+			.open {
+				background: #27AE60;
+			}
+			.close {
+				background: #2873FF;
+			}
+		}
+	}
+</style>

BIN
pages/production/safety_monitoring/safety_monitoring_search/icon/search_black.png


+ 237 - 0
pages/production/safety_monitoring/safety_monitoring_search/safety_monitoring_search.vue

@@ -0,0 +1,237 @@
+<template>
+	<view>
+		<view class="content">
+			<view :style="{height:statusBarHeight + 'px'}">
+				<!-- 这里是状态栏 -->
+			</view>
+			<view class="navbar">
+		
+				<view class="left" @click="click_left()">
+					<uni-icons type="arrowleft" color="#fff" size="18"></uni-icons>
+				</view>
+				<view class="right">
+					<view class="input_box">
+						<view class="input_icon"></view>
+						<input type="text" value="" v-model="search_text" placeholder="搜索" />
+					</view>
+				</view>
+				<view class="search_btn" @click="search()">
+					<text>搜索</text>
+				</view>
+			</view>
+		</view>
+		<!-- 占位符 -->
+		<view :style="{height: statusBarHeight + 'px'}"></view>
+		<view style="height: 93rpx;"></view>
+		
+		<view class="inner_box">
+			<view class="inner_title">
+				<view class="name name_1">序号</view>
+				<view class="name name_2">安装地点</view>
+				<view class="name name_3">数值/状态</view>
+			</view>
+			<view class="list_item">
+				<view class="item" :class="item.status" v-for="(item,index) in searchList" :key="index">
+					<view class="text text_1">{{item.id}}</view>
+					<view class="text text_2">{{item.position}}</view>
+					<view class="text text_3">{{item.value}}{{item.unit}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				
+				statusBarHeight: 20,
+				// 查询关键词
+				search_text:'',
+				
+				//查询结果列表
+				searchList:[]
+				
+				
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+		},
+		created() {
+			// 获取手机系统信息
+			const info = uni.getSystemInfoSync()
+			// 设置状态栏高度
+			this.statusBarHeight = info.statusBarHeight
+			
+		},
+		methods: {
+			click_left() {
+				uni.navigateBack();
+			},
+			search(){
+				// console.log(this.search_text)
+				this.$p_api.jt_safety_info_search({
+					survey_name:this.search_text,
+					mine_code:this.mine,
+				}).then((res)=>{
+					console.log(res)
+					this.searchList = res.data.content.data
+				})
+				
+			},
+		}
+
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		position: fixed;
+		top: 0;
+		left: 0;
+			
+		background-color: #009FE8;
+	}
+
+	.navbar {
+		width: 750rpx;
+		box-sizing: border-box;
+		padding-left: 31rpx;
+		padding-right: 26rpx;
+		padding-top: 14rpx;
+		padding-bottom: 14rpx;
+		display: flex;
+		justify-content: space-between;
+
+		.left {
+			width: 42rpx;
+			line-height: 65rpx;
+		}
+
+		.right {
+			margin-left: 30rpx;
+			width: 620rpx;
+			height: 65rpx;
+			background-color: #fff;
+			border-radius: 33rpx;
+			
+			
+			.input_box {
+				display: flex;
+
+				.input_icon {
+					margin-left: 43rpx;
+					margin-top: 16rpx;
+					width: 34rpx;
+					height: 34rpx;
+
+					background-image: url(./icon/search_black.png);
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+				input{
+					margin-left: 19rpx;
+					height: 65rpx;
+					font-size: 24rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #232627;
+				}
+			}
+			
+			
+		}
+		
+		.search_btn{
+			margin-left: 30rpx;
+			margin-top: 2rpx;
+			width: 108rpx;
+			height: 60rpx;
+			
+			line-height: 60rpx;
+			text-align: center;
+			background: #FFFFFF;
+			border-radius: 33rpx;
+			font-size: 24rpx;
+			font-family: PingFangSC-Regular, PingFang SC;
+			font-weight: 400;
+			color: #232627;
+			
+		}
+	}
+
+	.inner_box{
+		.inner_title{
+			
+			padding: 0 24rpx;
+			
+			height: 94rpx;
+			background: #F3F6FA;
+			
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			.name{
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				text-align: center;
+			}
+			.name_1{
+				width: 125rpx;
+			}
+			.name_2{
+				margin: 0 15rpx;
+				width: 420rpx;
+			}
+			.name_3{
+				width: 125rpx;
+			}
+		}
+		.list_item{
+			.item{
+				padding: 0 24rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				
+				border-bottom: 1px solid #f3f3f3;
+				.text{
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					box-sizing: border-box;
+					padding: 30rpx 0;
+					text-align: center;
+				}
+				.text_1{
+					width: 125rpx;
+				}
+				.text_2{
+					margin: 0 15rpx;
+					width: 420rpx;
+				}
+				.text_3{
+					width: 125rpx;
+				}
+			}
+			.normal{
+				color: #2C3E50;
+			}
+			.alarm{
+				color: #E74C3C;
+			}
+			.sign{
+				color: #27AE60;
+			}
+			.fault{
+				color: #2873FF;
+			}
+		}
+	}
+
+</style>

+ 138 - 0
pages/production/safety_monitoring/safety_monitoring_status_detail/safety_monitoring_status_detail.vue

@@ -0,0 +1,138 @@
+<template>
+	<view>
+		<view class="inner_box">
+			<view class="inner_title">
+				<view class="name name_1">序号</view>
+				<view class="name name_2">安装地点</view>
+				<view class="name name_3">数值/状态</view>
+			</view>
+			<view class="list_item">
+				<view class="item" :class="item.status" v-for="(item,index) in List" :key="index">
+					<view class="text text_1">{{item.id}}</view>
+					<view class="text text_2">{{item.position}}</view>
+					<view class="text text_3">{{item.value}}{{item.unit}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				status:'',
+				List:[],
+				title:""
+				
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+			this.status = option.status
+			
+			uni.setNavigationBarTitle({
+			    title: option.title
+			});
+			this.get_List(option.type)
+		},
+		methods:{
+			get_List(type){
+				uni.showLoading()
+				// console.log(type)
+				this.$p_api.jt_safety_info_detail({
+					type:type,
+					status:this.status,
+					mine_code:this.mine
+				}).then((res)=>{
+					uni.hideLoading()
+					console.log(res)
+					this.List = res.data.content.data
+				})				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.inner_box{
+		.inner_title{
+			
+			padding: 0 24rpx;
+			
+			height: 94rpx;
+			background: #F3F6FA;
+			
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			.name{
+				font-size: 27rpx;
+				font-family: PingFangSC-Regular, PingFang SC;
+				font-weight: 400;
+				color: #232627;
+				text-align: center;
+			}
+			.name_1{
+				width: 125rpx;
+			}
+			.name_2{
+				margin: 0 15rpx;
+				width: 420rpx;
+			}
+			.name_3{
+				width: 125rpx;
+			}
+		}
+		.list_item{
+			.item{
+				padding: 0 25rpx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				
+				border-bottom: 1rpx solid #f3f3f3;
+				.text{
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					line-height: 94rpx;
+					text-align: center;
+				}
+				.text_1{
+					width: 125rpx;
+				}
+				.text_2{
+					margin: 0 15rpx;
+					width: 420rpx;
+					
+					overflow: hidden;
+					text-overflow:ellipsis;
+					white-space: nowrap;
+				}
+				.text_3{
+					width: 125rpx;
+				}
+			}
+			.normal{
+				color: #2C3E50;
+			}
+			.alarm{
+				color: #E74C3C;
+			}
+			.sign{
+				color: #27AE60;
+			}
+			.fault{
+				color: #2873FF;
+			}
+			.open{
+				color: #27AE60;
+			}
+			.close{
+				color: #2873FF;
+			}
+		}
+	}
+</style>

+ 27 - 0
pages/tabbar/index/index.vue

@@ -0,0 +1,27 @@
+<template>
+	<view>
+		
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+				
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+</style>

+ 19 - 0
pages/tabbar/my/my.vue

@@ -0,0 +1,19 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 41 - 0
pages/tabbar/production/production.vue

@@ -0,0 +1,41 @@
+<template>
+	<view>
+		<!-- 宁东运营部 -->
+		<view v-if="mine_code == 'ningdongyunying'">
+			<t-p-ningdongyunying></t-p-ningdongyunying>
+		</view>
+		<!-- 石槽村 -->
+		<view v-if="mine_code == 'shicaocun'">
+			<t-p-shicaocun></t-p-shicaocun>
+		</view>
+		
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 当前煤矿编码
+				mine_code:"",
+				
+				
+				
+			}
+		},
+		onLoad() {
+			console.log(uni.getStorageSync('mine_code'))
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+</style>

+ 19 - 0
pages/tabbar/workbench/workbench.vue

@@ -0,0 +1,19 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 58 - 0
read.md

@@ -0,0 +1,58 @@
+# 此文件为代码规范规则文件动手项目前先阅读
+
+## 关于各矿编码问题
+
+	> 由于此APP代码为全矿共用,因此使用矿编码来鉴别各矿不同模块的展示需求
+	
+	### 各矿编码参照表
+	
+		1.宁东运营部 --> ningdongyunying
+		2.梅花井煤矿 --> meihuajing
+		3.石槽村煤矿 --> shicaocun
+
+
+## 关于各矿APP客户端打包问题
+
+	### 打包前应注意的问题
+
+	1.修改manifest.json文件中的应用名称(应用名称修改为当前需更新的APP客户端名称)
+	2.修改App.vue文件中煤矿编码(修改为当前需更新客户端的矿编码)
+	3.修改基础业务接口封装文件中的基础路径
+	
+	
+## 关于接口封装文件问题
+
+	> 接口封装为两个文件:1(common/production-http)是关于生产数据的所有接口、2(common/vmeitime-http)是关于各矿其他业务的接口
+
+	1.由于各矿的生产数据都是由集团信息中心提供,所以有关生产数据的接口都是统一的请求地址:[](http://nmjt.nxjiewei.com:8011/api)。
+	2.关于其他业务请求接口的封装文件,应在打包前修改(vmeitime-http/interface.js)中的基础路径baseUrl。
+	
+	
+	
+	
+> 面临的问题
+> 1.更新时由于代码都在同一个项目中,项目具有唯一的AppID,一个矿需要更新时所有矿都将更新
+
+> 解决方案
+> 1.单另创建各矿的项目文件
+> 2.使用同一份代码文件,当其中一个矿需要更新时,在统一代码文件中修改,修改完成后粘贴到对应矿项目文件中,单另更新(弊端:不如各矿使用各矿的代码)
+> 3.每个项目有各自的AppID,面临管理更新的问题
+> 4.解决矿差异在各矿的组件里开发,共同点综合目录里开发
+
+
+## 系统结构目录
+
+	> 创建页面是根据业务创建层级目录(方便定位问题根源)
+	> 命名规范:i-\w-\p-\m-
+
+	1.tabbar --> 原生tab目录
+	2.index --> 此目录放置所有在原生tab:index 中的页面文件
+	3.workbench --> 此目录放置所有在原生tab:workbench 中的页面文件
+	4.production --> 此目录放置所有在原生tab:production 中的页面文件
+	5.my --> 此目录放置所有在原生tab:my 中的页面文件
+	
+	
+## 页面及组件创建命名规范
+	
+	> 页面命名规范:在相应层级目录下创建页面文件,遵循语义化标准创建目录(非特定名称外不要使用拼音!);命名遵循下划线连字符命名法,使用‘_’连接(如:personnel-orientation;人员定位)。
+	> 组件命名规范:层级目录首字母-页面全名-组件名称。(如:t-p-ningdongyunying;p-personnel-orientation-navbar)

BIN
static/tabbar/home.png


BIN
static/tabbar/home_active.png


BIN
static/tabbar/my.png


BIN
static/tabbar/my_active.png


BIN
static/tabbar/news.png


BIN
static/tabbar/news_active.png


BIN
static/tabbar/production.png


BIN
static/tabbar/production_active.png


BIN
static/tabbar/work.png


BIN
static/tabbar/work_active.png


+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;

+ 177 - 0
uni_modules/qiun-data-charts/changelog.md

@@ -0,0 +1,177 @@
+## 2.3.6-20211201(2021-12-01)
+- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug
+## 2.3.5-20211014(2021-10-15)
+- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新)
+## 2.3.4-20211012(2021-10-12)
+- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug
+## 2.3.3-20210706(2021-07-06)
+- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示
+## 2.3.2-20210627(2021-06-27)
+- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug
+## 2.3.1-20210616(2021-06-16)
+- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug
+## 2.3.0-20210612(2021-06-12)
+- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts)
+- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件
+- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数
+- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法
+## 2.2.1-20210603(2021-06-03)
+- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug
+- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置
+## 2.2.0-20210529(2021-05-29)
+- uCharts.js 增加条状图type="bar"
+- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo
+## 2.1.7-20210524(2021-05-24)
+- uCharts.js 修复大数据量模式下曲线图不平滑的bug
+## 2.1.6-20210523(2021-05-23)
+- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug
+## 2.1.5-2021051702(2021-05-17)
+- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug
+## 2.1.5-20210517(2021-05-17)
+- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug
+## 2.1.4-20210516(2021-05-16)
+- 秋云图表组件 优化onWindowResize防抖方法
+- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug
+- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug
+- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表
+## 2.1.3-20210513(2021-05-13)
+- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点
+- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ 
+- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug
+- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法
+- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false
+- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug
+- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug
+- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug
+- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index
+- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo
+- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo
+## 2.1.2-20210509(2021-05-09)
+秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug
+## 2.1.1-20210509(2021-05-09)
+- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。
+- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。
+- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。
+## 2.1.0-20210507(2021-05-07)
+- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug
+- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug
+- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug
+## 2.1.0-20210506(2021-05-06)
+- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug
+- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug
+- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid")
+- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例
+- uCharts.js 升级至v2.1.0版本
+- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug
+- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug
+- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug
+- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug
+- uCharts.js 修复 词云图获取点击索引偶尔不准的bug
+- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter)
+- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid")
+- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble")
+- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。
+## 2.0.0-20210502(2021-05-02)
+- uCharts.js 修复词云图获取点击索引不正确的bug
+## 2.0.0-20210501(2021-05-01)
+- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug
+## 2.0.0-20210426(2021-04-26)
+- 秋云图表组件 修复QQ小程序不支持canvas2d的bug
+- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug
+- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距
+- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移
+- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移
+- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px
+## 2.0.0-20210422-2(2021-04-22)
+秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug
+## 2.0.0-20210422(2021-04-22)
+- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug
+## 2.0.0-20210421(2021-04-21)
+- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug
+## 2.0.0-20210420(2021-04-20)
+- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug
+- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件
+## 2.0.0-20210419(2021-04-19)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug
+- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug
+## 2.0.0-20210418(2021-04-18)
+- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug
+## 2.0.0-20210416(2021-04-16)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug
+## 2.0.0-20210415(2021-04-15)
+- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug
+- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug
+## 2.0.0-20210414(2021-04-14)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug
+- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue)
+- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor
+- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug
+## 2.0.0-20210413(2021-04-13)
+- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug
+- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug
+- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件
+- uCharts.js 修复饼图类数据格式series属性不生效的bug
+- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue
+## 2.0.0-20210412-2(2021-04-12)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug
+- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例
+## 2.0.0-20210412(2021-04-12)
+- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化
+- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug
+## 2.0.0-20210411(2021-04-11)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue
+- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug
+- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug
+## 2.0.0-20210410(2021-04-10)
+- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug
+- 增加标记线及柱状图自定义颜色的demo
+## 2.0.0-20210409(2021-04-08)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug
+- 修复组件在支付宝小程序端点击位置不准确的bug
+## 2.0.0-20210408(2021-04-07)
+- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复)
+- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug
+## 2.0.0-20210407(2021-04-06)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode`
+## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+## 2.0.0-20210406(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
+## 2.0.0(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1541 - 0
uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 46 - 0
uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue


+ 162 - 0
uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue

@@ -0,0 +1,162 @@
+<template>
+	 <view class="container loading1">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading1',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+.container.loading1 {
+  -webkit-transform: rotate(45deg);
+          transform: rotate(45deg);
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading1 .shape1 {
+  -webkit-animation: animation1shape1 0.5s ease 0s infinite alternate;
+          animation: animation1shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, 16px);
+            transform: translate(16px, 16px);
+  }
+}
+
+@keyframes animation1shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, 16px);
+            transform: translate(16px, 16px);
+  }
+}
+.loading1 .shape2 {
+  -webkit-animation: animation1shape2 0.5s ease 0s infinite alternate;
+          animation: animation1shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, 16px);
+            transform: translate(-16px, 16px);
+  }
+}
+
+@keyframes animation1shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, 16px);
+            transform: translate(-16px, 16px);
+  }
+}
+.loading1 .shape3 {
+  -webkit-animation: animation1shape3 0.5s ease 0s infinite alternate;
+          animation: animation1shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, -16px);
+            transform: translate(16px, -16px);
+  }
+}
+
+@keyframes animation1shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, -16px);
+            transform: translate(16px, -16px);
+  }
+}
+.loading1 .shape4 {
+  -webkit-animation: animation1shape4 0.5s ease 0s infinite alternate;
+          animation: animation1shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, -16px);
+            transform: translate(-16px, -16px);
+  }
+}
+
+@keyframes animation1shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, -16px);
+            transform: translate(-16px, -16px);
+  }
+}
+
+
+</style>

+ 170 - 0
uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue

@@ -0,0 +1,170 @@
+<template>
+	 <view class="container loading2">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading2',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+.container.loading2 {
+  -webkit-transform: rotate(10deg);
+          transform: rotate(10deg);
+}
+.container.loading2 .shape {
+  border-radius: 5px;
+}
+.container.loading2{
+  -webkit-animation: rotation 1s infinite;
+          animation: rotation 1s infinite;
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+
+.loading2 .shape1 {
+  -webkit-animation: animation2shape1 0.5s ease 0s infinite alternate;
+          animation: animation2shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, 20px);
+            transform: translate(20px, 20px);
+  }
+}
+
+@keyframes animation2shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, 20px);
+            transform: translate(20px, 20px);
+  }
+}
+.loading2 .shape2 {
+  -webkit-animation: animation2shape2 0.5s ease 0s infinite alternate;
+          animation: animation2shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, 20px);
+            transform: translate(-20px, 20px);
+  }
+}
+
+@keyframes animation2shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, 20px);
+            transform: translate(-20px, 20px);
+  }
+}
+.loading2 .shape3 {
+  -webkit-animation: animation2shape3 0.5s ease 0s infinite alternate;
+          animation: animation2shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, -20px);
+            transform: translate(20px, -20px);
+  }
+}
+
+@keyframes animation2shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, -20px);
+            transform: translate(20px, -20px);
+  }
+}
+.loading2 .shape4 {
+  -webkit-animation: animation2shape4 0.5s ease 0s infinite alternate;
+          animation: animation2shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, -20px);
+            transform: translate(-20px, -20px);
+  }
+}
+
+@keyframes animation2shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, -20px);
+            transform: translate(-20px, -20px);
+  }
+}
+
+</style>

+ 173 - 0
uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue

@@ -0,0 +1,173 @@
+<template>
+	 <view class="container loading3">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading3',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+ .container.loading3 {
+  -webkit-animation: rotation 1s infinite;
+          animation: rotation 1s infinite;
+}
+.container.loading3 .shape1 {
+  border-top-left-radius: 10px;
+}
+.container.loading3 .shape2 {
+  border-top-right-radius: 10px;
+}
+.container.loading3 .shape3 {
+  border-bottom-left-radius: 10px;
+}
+.container.loading3 .shape4 {
+  border-bottom-right-radius: 10px;
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading3 .shape1 {
+  -webkit-animation: animation3shape1 0.5s ease 0s infinite alternate;
+          animation: animation3shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, 5px);
+            transform: translate(5px, 5px);
+  }
+}
+
+@keyframes animation3shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, 5px);
+            transform: translate(5px, 5px);
+  }
+}
+.loading3 .shape2 {
+  -webkit-animation: animation3shape2 0.5s ease 0s infinite alternate;
+          animation: animation3shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, 5px);
+            transform: translate(-5px, 5px);
+  }
+}
+
+@keyframes animation3shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, 5px);
+            transform: translate(-5px, 5px);
+  }
+}
+.loading3 .shape3 {
+  -webkit-animation: animation3shape3 0.5s ease 0s infinite alternate;
+          animation: animation3shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, -5px);
+            transform: translate(5px, -5px);
+  }
+}
+
+@keyframes animation3shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, -5px);
+            transform: translate(5px, -5px);
+  }
+}
+.loading3 .shape4 {
+  -webkit-animation: animation3shape4 0.5s ease 0s infinite alternate;
+          animation: animation3shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, -5px);
+            transform: translate(-5px, -5px);
+  }
+}
+
+@keyframes animation3shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, -5px);
+            transform: translate(-5px, -5px);
+  }
+}
+</style>

+ 222 - 0
uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue

@@ -0,0 +1,222 @@
+<template>
+	 <view class="container loading5">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading5',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+.container.loading5 .shape {
+  width: 15px;
+  height: 15px;
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading5 .shape1 {
+  animation: animation5shape1 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+  50% {
+    -webkit-transform: translate(15px, 15px);
+            transform: translate(15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+}
+
+@keyframes animation5shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+  50% {
+    -webkit-transform: translate(15px, 15px);
+            transform: translate(15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+}
+.loading5 .shape2 {
+  animation: animation5shape2 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-15px, 15px);
+            transform: translate(-15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+}
+
+@keyframes animation5shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-15px, 15px);
+            transform: translate(-15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+}
+.loading5 .shape3 {
+  animation: animation5shape3 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(15px, -15px);
+            transform: translate(15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+}
+
+@keyframes animation5shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(15px, -15px);
+            transform: translate(15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+}
+.loading5 .shape4 {
+  animation: animation5shape4 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+  50% {
+    -webkit-transform: translate(-15px, -15px);
+            transform: translate(-15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+}
+
+@keyframes animation5shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+  50% {
+    -webkit-transform: translate(-15px, -15px);
+            transform: translate(-15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+}
+
+</style>

+ 229 - 0
uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue

@@ -0,0 +1,229 @@
+<template>
+	 <view class="container loading6">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading6',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+.container.loading6 {
+  -webkit-animation: rotation 1s infinite;
+          animation: rotation 1s infinite;
+}
+.container.loading6 .shape {
+  width: 12px;
+  height: 12px;
+  border-radius: 2px;
+}
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+
+.loading6 .shape1 {
+  -webkit-animation: animation6shape1 2s linear 0s infinite normal;
+          animation: animation6shape1 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+  50% {
+    -webkit-transform: translate(18px, 18px);
+            transform: translate(18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+}
+
+@keyframes animation6shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+  50% {
+    -webkit-transform: translate(18px, 18px);
+            transform: translate(18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+}
+.loading6 .shape2 {
+  -webkit-animation: animation6shape2 2s linear 0s infinite normal;
+          animation: animation6shape2 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-18px, 18px);
+            transform: translate(-18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+}
+
+@keyframes animation6shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-18px, 18px);
+            transform: translate(-18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+}
+.loading6 .shape3 {
+  -webkit-animation: animation6shape3 2s linear 0s infinite normal;
+          animation: animation6shape3 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(18px, -18px);
+            transform: translate(18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+}
+
+@keyframes animation6shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(18px, -18px);
+            transform: translate(18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+}
+.loading6 .shape4 {
+  -webkit-animation: animation6shape4 2s linear 0s infinite normal;
+          animation: animation6shape4 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+  50% {
+    -webkit-transform: translate(-18px, -18px);
+            transform: translate(-18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+}
+
+@keyframes animation6shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+  50% {
+    -webkit-transform: translate(-18px, -18px);
+            transform: translate(-18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+}
+</style>

+ 36 - 0
uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue

@@ -0,0 +1,36 @@
+<template>
+	<view>
+	 <Loading1 v-if="loadingType==1"/>
+	 <Loading2 v-if="loadingType==2"/>
+	 <Loading3 v-if="loadingType==3"/>
+	 <Loading4 v-if="loadingType==4"/>
+	 <Loading5 v-if="loadingType==5"/>
+	</view>
+</template>
+
+<script>
+	import Loading1 from "./loading1.vue";
+	import Loading2 from "./loading2.vue";
+	import Loading3 from "./loading3.vue";
+	import Loading4 from "./loading4.vue";
+	import Loading5 from "./loading5.vue";
+	export default {
+		components:{Loading1,Loading2,Loading3,Loading4,Loading5},
+		name: 'qiun-loading',
+		props: {
+			loadingType: {
+				type: Number,
+				default: 2
+			},
+		},
+		data() {
+			return {
+				
+			};
+		},
+	}
+</script>
+
+<style>
+
+</style>

+ 422 - 0
uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js

@@ -0,0 +1,422 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ * 
+ * uCharts®官方网站
+ * https://www.uCharts.cn
+ * 
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ * 
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ * 
+ */
+
+// 通用配置项
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
+
+const cfe = {
+  //demotype为自定义图表类型
+	"type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"],
+  //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
+	"categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"],
+  //instance为实例变量承载属性,option为eopts承载属性,不要删除
+	"instance": {},
+	"option": {},
+  //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+  "formatter":{
+    "tooltipDemo1":function(res){
+      let result = ''
+      for (let i in res) {
+      	if (i == 0) {
+      		result += res[i].axisValueLabel + '年销售额'
+      	}
+      	let value = '--'
+      	if (res[i].data !== null) {
+      		value = res[i].data
+      	}
+      	// #ifdef H5
+      	result += '\n' + res[i].seriesName + ':' + value + ' 万元'
+      	// #endif
+      	
+      	// #ifdef APP-PLUS
+      	result += '<br/>' + res[i].marker + res[i].seriesName + ':' + value + ' 万元'
+      	// #endif
+      }
+      return result;
+    },
+    legendFormat:function(name){
+      return "自定义图例+"+name;
+    },
+    yAxisFormatDemo:function (value, index) {
+      return value + '元';
+    },
+    seriesFormatDemo:function(res){
+      return res.name + '年' + res.value + '元';
+    }
+  },
+  //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
+  "demotype":{
+    "color": color,
+    //在这里填写echarts的option即可
+    
+  },
+  //下面是自定义配置,请添加项目所需的通用配置
+	"column": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'axis'
+		},
+		"grid": {
+			"top": 30,
+			"bottom": 50,
+			"right": 15,
+			"left": 40
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"toolbox": {
+			"show": false,
+		},
+		"xAxis": {
+			"type": 'category',
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+			"boundaryGap": true,
+			"data": []
+		},
+		"yAxis": {
+			"type": 'value',
+			"axisTick": {
+				"show": false,
+			},
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'bar',
+			"data": [],
+			"barwidth": 20,
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"line": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'axis'
+		},
+		"grid": {
+			"top": 30,
+			"bottom": 50,
+			"right": 15,
+			"left": 40
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"toolbox": {
+			"show": false,
+		},
+		"xAxis": {
+			"type": 'category',
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+			"boundaryGap": true,
+			"data": []
+		},
+		"yAxis": {
+			"type": 'value',
+			"axisTick": {
+				"show": false,
+			},
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'line',
+			"data": [],
+			"barwidth": 20,
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"area": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'axis'
+		},
+		"grid": {
+			"top": 30,
+			"bottom": 50,
+			"right": 15,
+			"left": 40
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"toolbox": {
+			"show": false,
+		},
+		"xAxis": {
+			"type": 'category',
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+			"boundaryGap": true,
+			"data": []
+		},
+		"yAxis": {
+			"type": 'value',
+			"axisTick": {
+				"show": false,
+			},
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'line',
+			"data": [],
+			"areaStyle": {},
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"pie": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item'
+		},
+		"grid": {
+			"top": 40,
+			"bottom": 30,
+			"right": 15,
+			"left": 15
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'pie',
+			"data": [],
+			"radius": '50%',
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"ring": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item'
+		},
+		"grid": {
+			"top": 40,
+			"bottom": 30,
+			"right": 15,
+			"left": 15
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'pie',
+			"data": [],
+			"radius": ['40%', '70%'],
+			"avoidLabelOverlap": false,
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+			"labelLine": {
+				"show": true
+			},
+		},
+	},
+	"rose": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item'
+		},
+		"legend": {
+			"top": 'bottom'
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'pie',
+			"data": [],
+			"radius": "55%",
+			"center": ['50%', '50%'],
+			"rosetype": 'area',
+		},
+	},
+	"funnel": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item',
+			"formatter": "{b} : {c}%"
+		},
+		"legend": {
+			"top": 'bottom'
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'funnel',
+			"left": '10%',
+			"top": 60,
+			"bottom": 60,
+			"width": '80%',
+			"min": 0,
+			"max": 100,
+			"minSize": '0%',
+			"maxSize": '100%',
+			"sort": 'descending',
+			"gap": 2,
+			"label": {
+				"show": true,
+				"position": 'inside'
+			},
+			"labelLine": {
+				"length": 10,
+				"lineStyle": {
+					"width": 1,
+					"type": 'solid'
+				}
+			},
+			"itemStyle": {
+				"bordercolor": '#fff',
+				"borderwidth": 1
+			},
+			"emphasis": {
+				"label": {
+					"fontSize": 20
+				}
+			},
+			"data": [],
+		},
+	},
+	"gauge": {
+		"color": color,
+		"tooltip": {
+        "formatter": '{a} <br/>{b} : {c}%'
+    },
+		"seriesTemplate": {
+			"name": '业务指标',
+      "type": 'gauge',
+      "detail": {"formatter": '{value}%'},
+      "data": [{"value": 50, "name": '完成率'}]
+		},
+	},
+	"candle": {
+		"xAxis": {
+			"data": []
+		},
+		"yAxis": {},
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"dataZoom": [{
+				"type": 'inside',
+				"xAxisIndex": [0, 1],
+				"start": 10,
+				"end": 100
+			},
+			{
+				"show": true,
+				"xAxisIndex": [0, 1],
+				"type": 'slider',
+				"bottom": 10,
+				"start": 10,
+				"end": 100
+			}
+		],
+		"seriesTemplate": {
+			"name": '',
+			"type": 'k',
+			"data": [],
+		},
+	}
+}
+
+export default cfe;

+ 0 - 0
uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels