소스 검색

no message

xiaoxin 1 년 전
부모
커밋
bf6372f682
100개의 변경된 파일8664개의 추가작업 그리고 1개의 파일을 삭제
  1. BIN
      .DS_Store
  2. 2 0
      .gitignore
  3. 20 0
      .hbuilderx/launch.json
  4. 42 0
      App.vue
  5. 1 1
      README.md
  6. 86 0
      api/index.js
  7. 98 0
      components/c-disk/index.vue
  8. 430 0
      components/c-form-item/c-form-item.vue
  9. 93 0
      components/c-img/index.vue
  10. 40 0
      components/c-search/index.vue
  11. 109 0
      components/c-yuan/index.vue
  12. 97 0
      components/slectdicsk/index.vue
  13. 14 0
      index.html
  14. 29 0
      main.js
  15. 80 0
      manifest.json
  16. 79 0
      package-lock.json
  17. 20 0
      package.json
  18. 266 0
      pages.json
  19. 250 0
      pages/assetsear/assetsear.vue
  20. 55 0
      pages/company/company.vue
  21. 55 0
      pages/datasys/datasys.vue
  22. 111 0
      pages/evaluate/evaluate.vue
  23. 166 0
      pages/login/forgetpwd/index.vue
  24. 234 0
      pages/login/login/index.vue
  25. 119 0
      pages/myteam/myteam.vue
  26. 218 0
      pages/numsear/numsear.vue
  27. 335 0
      pages/onsitpection/home/index.vue
  28. 149 0
      pages/onsitpection/person/person.vue
  29. 87 0
      pages/onsitpection/selectplain/selectplain.vue
  30. 234 0
      pages/writeoff/exitwritoff/exitwritoff.vue
  31. 497 0
      pages/writeoff/register/register.vue
  32. 278 0
      scan_pages/checkdetail/checkdetail.vue
  33. 186 0
      scan_pages/checkpoint/checkpoint.vue
  34. 52 0
      scan_pages/components/c-dropdown/index.vue
  35. 235 0
      scan_pages/patrol/patrol.vue
  36. 450 0
      scan_pages/patroldetail/patroldetail.vue
  37. 256 0
      scan_pages/patrolrecored/patrolrecored.vue
  38. 100 0
      scan_pages/scanning/protow.vue
  39. 78 0
      scan_pages/scanning/scanItem/scanchebox.vue
  40. 135 0
      scan_pages/scanning/scanItem/scanimg.vue
  41. 82 0
      scan_pages/scanning/scanItem/scannum.vue
  42. 65 0
      scan_pages/scanning/scanItem/scanradio.vue
  43. 61 0
      scan_pages/scanning/scanItem/scantex.vue
  44. 617 0
      scan_pages/scanning/scanning.vue
  45. 181 0
      scan_pages/seemore/seemore.vue
  46. 37 0
      static/css/chj.css
  47. BIN
      static/img/bhg.png
  48. BIN
      static/img/devi.png
  49. BIN
      static/img/feij.png
  50. BIN
      static/img/hege.png
  51. BIN
      static/img/homelogo.png
  52. BIN
      static/img/jia.png
  53. BIN
      static/img/logo.png
  54. BIN
      static/img/navbar/nav1.png
  55. BIN
      static/img/navbar/nav2.png
  56. BIN
      static/img/navbar/nav3.png
  57. BIN
      static/img/navbar/nav4.png
  58. BIN
      static/img/navbar/nav5.png
  59. BIN
      static/img/navbar/nav6.png
  60. BIN
      static/img/navbar/nav7.png
  61. BIN
      static/img/navbar/nav8.png
  62. BIN
      static/img/partrol/back.png
  63. BIN
      static/img/password.png
  64. BIN
      static/img/person/pwd.png
  65. BIN
      static/img/person/qh.png
  66. BIN
      static/img/person/td.png
  67. BIN
      static/img/phone.png
  68. BIN
      static/img/proj.png
  69. BIN
      static/img/renwu/chaos.png
  70. BIN
      static/img/renwu/chuli.png
  71. BIN
      static/img/renwu/quxiao.png
  72. BIN
      static/img/renwu/wanchen.png
  73. BIN
      static/img/tzicon.png
  74. BIN
      static/img/wks.png
  75. BIN
      static/uview/common/favicon.ico
  76. BIN
      static/uview/common/logo.png
  77. BIN
      static/uview/example/component.png
  78. 4 0
      static/uview/example/component.svg
  79. BIN
      static/uview/example/component_select.png
  80. 4 0
      static/uview/example/component_select.svg
  81. BIN
      static/uview/example/js.png
  82. BIN
      static/uview/example/template.png
  83. 4 0
      static/uview/example/template.svg
  84. BIN
      static/uview/example/template_select.png
  85. 4 0
      static/uview/example/template_select.svg
  86. 13 0
      store/index.js
  87. 31 0
      store/modules/tabbar.js
  88. 97 0
      store/modules/user.js
  89. 121 0
      task_pages/addppeople/addppeople.vue
  90. 356 0
      task_pages/guarantee/guarantee.vue
  91. 236 0
      task_pages/taskarrment/feebacklist/feebacklist.vue
  92. 198 0
      task_pages/taskarrment/taskarrment.vue
  93. 106 0
      task_pages/taskarrment/taskfeeback/taskfeeback.vue
  94. 228 0
      task_pages/taskarrment/tasklist/tasklist.vue
  95. 179 0
      task_pages/taskarrment/viewtask/viewtask.vue
  96. 76 0
      uni.scss
  97. 10 0
      util/debounce/debounce.js
  98. 81 0
      util/request/eror.js
  99. 87 0
      util/request/index.js
  100. 0 0
      util/request/index.md

BIN
.DS_Store


+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+node_modules
+unpackage/

+ 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": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"h5" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 42 - 0
App.vue

@@ -0,0 +1,42 @@
+<script>
+	export default {
+		globalData: {
+			tabhei: 100
+		},
+		data() {},
+		onLaunch: function() {
+          this.init()
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		},
+		methods: {
+			init() {
+				let xh = uni.getSystemInfoSync().platform
+				switch (uni.getSystemInfoSync().platform) {
+					case 'android':
+						this.globalData.tabhei = 100
+						console.log('运行Android上')
+						break;
+					case 'ios':
+						console.log('运行iOS上')
+						this.globalData.tabhei = 120
+						break;
+					default:
+						this.globalData.tabhei = 100
+						console.log('运行在开发者工具上')
+						break;
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "uview-ui/index.scss";
+	@import '/static/css/chj.css'
+	/*每个页面公共css */
+</style>

+ 1 - 1
README.md

@@ -1 +1 @@
-#xunjian_app
+#DataCenterOperationMiniProgram

+ 86 - 0
api/index.js

@@ -0,0 +1,86 @@
+import api from '@/util/request/index.js'
+import qs from 'qs'
+
+export const code = (data) => { return api({ method: 'Get', url: `/system/user/code`, data: data, auth: false })} // 获取验证码
+
+export const login = (data) => { return api({ method: 'Post', url: `/system/user/login`, data: data, auth: false })} //登录
+
+export const updatapwsele = (data) => { return api({ method: 'Put', url: `/system/user/update/password?`, data: data })} //修改密码
+
+export const syslist2 = (data) => { return api({ method: 'Get', url: `/system/user/list/option`, data }) } //通过用户名或手机号查询用户选项
+
+export const syslist = (data) => { return api({ method: 'Get', url: `/system/user/list/dept/user`, data }) } //查询部门用户
+
+export const building = (data) => { return api({ method: 'Get', url: `/device/building/list/option`, data: data })} //资产楼栋
+
+export const floor = (buildingId) => { return api({ method: 'Get', url: `/device/floor/list/option/${buildingId}`, data: {} })} //资产层
+
+export const room = (floorId) => { return api({ method: 'Get', url: `/device/room/list/option/${floorId}`, data: {} }) } //房间
+
+export const device = (data) => { return api({ method: 'Get', url: `/device/list`, data: data })} //设备
+
+export const numType = (data) => { return api({ method: 'Get', url: `/stock/classify/list`, data: data })} //库存类别
+
+export const num = (data) => { return api({ method: 'Get', url: `/stock/goods/list`, data: data })} //库存
+
+export const partlist = (data) => { return api({ method: 'Get', url: `/api/check/patrolPoint/min/list?${qs.stringify(data)}`, data: {} }) } //团队列表
+
+//访客系列接口
+export const loginWeixin = (data) => { return api({ method: 'Get', url: `/wechat/login`, data: data, auth: false })} //微信授权登录
+
+export const getMachineInstitu = (data) => { return api({ method: 'Get', url: `/visitor/regulation/query`, data: {},auth: false }) } //获取机房制度
+
+export const visitorsave = (data) => { return api({ method: 'Post', url: `/visitor/audit/add`, data:{...data}, auth: false }) } //访客登记提交
+
+export const visitorlast = (openid) => { return api({ method: 'Get', url: `/visitor/audit/query/${openid}`, data: {},auth: false }) } //访客记录
+
+export const visitorupdate = (data) => { return api({ method: 'Put', url: `/visitor/audit/update`, data: { ...data },auth: false}) } //访客确认核销
+
+//临时任务系列接口
+export const tasknewst = (data) => { return api({ method: 'Get', url: `/temporary/task/query/newest`, data }) } //最新任务
+
+export const taskecl = () => { return api({ method: 'Get', url: `/temporary/task/list/receive/statistical` }) } //我收到的临时任务统计-完成
+
+export const publishcl = () => { return api({ method: 'Get', url: `/temporary/task/list/publish/statistical` }) } //我发出的临时任务统计-完成
+
+export const addTask = (data) => { return api({ method: 'Post', url: `/temporary/task/add`, data }) } //添加临时任务—完成
+
+export const execlist = (data) => { return api({ method: 'Get', url: `/temporary/task/list/receive`, data }) } //我收到的临时任务列表—完成
+
+export const publishlist = (data) => { return api({ method: 'Get', url: `/temporary/task/list/publish`, data }) } //我发出的任务列表—完成
+
+export const taskupdate = (data) => { return api({ method: 'Put', url: `/temporary/task/update`, data }) } //更新临时任务—完成
+
+export const taskfeedback = (data) => { return api({ method: 'Get', url: `/temporary/task/feedback/list`, data }) } //分页查询临时任务反馈—完成
+
+export const taskfeedbacksave = (data) => { return api({ method: 'Post', url: `/temporary/task/feedback/add`, data }) } //添加临时任务反馈—完成
+
+export const commentsave = (data) => { return api({ method: 'Post', url: `/system/user/comment/add`, data, auth: false }) } //添加用户评价
+
+export const allList = (data) => { return api({ method: 'Get', url: `/temporary/task/list`, data }) } //分页查询临时任务
+
+//巡检系列接口
+export const pointDetailForMobile = (data) => { return api({ method: 'Get', url: `/device/room/query`, data: data }) } //房间详情
+
+export const pointDetail = (data) => { return api({ method: 'Get', url: `/patrol/task/room`, data: data }) } //未巡检房间详情
+
+export const listForMobile = (data) => { return api({ method: 'Get', url: `/patrol/task/list/record/room`, data }) } //巡检_记录(巡检)
+
+export const partinfo1 = (data) => { return api({ method: 'Get', url: `/patrol/task/list/record`, data }) } //巡检记录
+
+export const partinfo = (data) => { return api({ method: 'Get', url: `/patrol/task/query/record`, data }) } //巡检记录(主页)
+
+export const patrolTask = (data) => { return api({ method: 'Get', url: `/patrol/task/list`, data }) } //巡检计划
+
+export const patrolTaskinfo = (id) => { return api({ method: 'Get', url: `/patrol/task/query/rate/${id}` }) } //巡检进度
+
+export const getTaskPageOfScan = (data) => { return api({ method: 'Get', url: `/patrol/task/list/room`, data: { ...data } }) } //选择计划
+
+export const checkItemlist = (data) => { return api({ method: 'Get', url: `/patrol/task/query`, data: { ...data } }) } //巡检_巡检
+
+export const patrolRecord = (data) => { return api({ method: 'Put', url: `/patrol/task/update`, data: { ...data } }) } //巡检提交
+
+export const checkOption = (data) => { return api({ method: 'Get', url: `/check/route/list/option`, data: data }) }//巡检路线选项
+
+export const checkRooms = (data) => { return api({ method: 'Get', url: `/device/room/list`, data: data }) }//路线中的房间
+

+ 98 - 0
components/c-disk/index.vue

@@ -0,0 +1,98 @@
+<template>
+	<!-- 巡检计划项 -->
+	<navigator hover-class="none" :url="prourl" class="u-border-top  u-flex mes-block">
+	<!-- 	<u-circle-progress  border-width="18" active-color="#2979ff" :percent="parobj.finishNum/parobj.pointNum">
+			<view class="u-progress-content">
+				<view class="u-progress-dot"></view>
+				<text class='u-progress-info'>{{(parobj.finishNum/parobj.pointNum)*100}}% </text>
+			</view>
+		</u-circle-progress> -->
+		<cyuan :percent="parobj.completed/parobj.total"/>
+		<view class="u-m-l-14">
+			<view class="mes-rig-tile  u-f-30">{{parobj.name}}</view>
+			<view v-if="more == 1" class="mes-rig-blue u-m-t-30">任务日期:{{beginTime.slice(0,10)}}</view>
+			<view  class="u-flex u-m-t-28">
+				<view class="mes-rig-blue  u-m-r-18">开始时间:{{beginTime.slice(10,-3)}}</view>
+				<view class="">
+					<u-tag  :type="parobj.status == 1 || parobj.status == 3 ? 'success' : parobj.status==2?'warning':'error' "  :text="status[parobj.status]" size="mini" mode="dark" />
+				</view>
+			</view>
+			<view class="mes-rig-blue u-m-t-30">截至时间:{{endTime.slice(10,-3)}}</view>
+			<view class="mes-rig-blue u-m-t-30">今日巡检:{{`${parobj.completed}/${parobj.total}`}}</view>
+		
+		</view>
+		<view class="u-absolute " style="right: 15rpx">
+			<u-icon name="arrow-right" color="rgba(229, 229, 229, 1)" size="40"></u-icon>
+		</view>
+			
+	</navigator>
+</template>
+
+<script>
+	import cyuan from '../c-yuan/index.vue'
+	import dayjs from "dayjs";
+	export default {
+		props:{
+			prourl:{
+				type:String
+			},
+			more:{
+				type:Number
+			},
+			parobj:{
+				type:Object,
+			}
+		},
+		components:{
+			cyuan
+		},
+		data(){
+			return {
+				status: ["", '未开始', '进行中', '已完成',"超时漏检","超时完成"]
+			}
+		},
+		created() {
+		},
+		computed:{
+			beginTime(){
+				return dayjs(this.parobj.beginTime).format("YYYY-MM-DD HH:mm:ss")
+			},
+			endTime(){
+				return dayjs(this.parobj.endTime).format("YYYY-MM-DD HH:mm:ss")
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	.mes-block {
+		padding: 34rpx;
+		text-align: left;
+		font-size: 28rpx;
+	
+		.mes-rig-tile {
+			font-size: 30rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #333333;
+		}
+	
+		.mes-rig-blue {
+			font-size: 26rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #999999;
+		}
+	
+		.mes-rig-grey {
+			color: rgba(128, 128, 128, 1);
+		}
+		.u-progress-info{
+			font-size: 36rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #4A8BFF;
+		}
+	}
+	
+</style>

+ 430 - 0
components/c-form-item/c-form-item.vue

@@ -0,0 +1,430 @@
+<template>
+	<view class="u-form-item" :class="{'u-border-bottom': elBorderBottom, 'u-form-item__border-bottom--error': validateState === 'error' && showError('border-bottom')}">
+		<view class="u-form-item__body" :style="{
+			flexDirection: elLabelPosition == 'left' ? 'row' : 'column'
+		}">
+			<!-- 微信小程序中,将一个参数设置空字符串,结果会变成字符串"true" -->
+			<view class="u-form-item--left" :style="{
+				width: uLabelWidth,
+				flex: `0 0 ${uLabelWidth}`,
+				marginBottom: elLabelPosition == 'left' ? 0 : '10rpx',
+			}">
+				<!-- 为了块对齐 -->
+				<view class="u-form-item--left__content" v-if="required || leftIcon || label">
+					<!-- nvue不支持伪元素before -->
+					<text v-if="required" class="u-form-item--left__content--required">*</text>
+					<view class="u-form-item--left__content__icon" v-if="leftIcon">
+						<u-icon :name="leftIcon" :custom-style="leftIconStyle"></u-icon>
+					</view>
+					<view class="u-form-item--left__content__label" :style="[elLabelStyle, {
+						'justify-content': elLabelAlign == 'left' ? 'flex-start' : elLabelAlign == 'center' ? 'center' : 'flex-end'
+					}]">
+						{{label}}
+					</view>
+				</view>
+			</view>
+			<view class="u-form-item--right u-flex">
+				<view class="u-form-item--right__content">
+					<view class="u-form-item--right__content__slot ">
+						<slot />
+					</view>
+					<view class="u-form-item--right__content__icon u-flex" v-if="$slots.right || rightIcon">
+						<u-icon :custom-style="rightIconStyle" v-if="rightIcon" :name="rightIcon"></u-icon>
+						<slot name="right" />
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="u-form-item__message" v-if="validateState === 'error' && showError('message')" :style="{
+			paddingLeft: elLabelPosition == 'left' ? $u.addUnit(elLabelWidth) : '0',
+		}">{{validateMessage}}</view>
+	</view>
+</template>
+
+<script>
+	import Emitter from '@/uview-ui/libs/util/emitter.js';
+	import schema from '@/uview-ui/libs/util/async-validator';
+	// 去除警告信息
+	schema.warning = function() {};
+
+	/**
+	 * form-item 表单item
+	 * @description 此组件一般用于表单场景,可以配置Input输入框,Select弹出框,进行表单验证等。
+	 * @tutorial http://uviewui.com/components/form.html
+	 * @property {String} label 左侧提示文字
+	 * @property {Object} prop 表单域model对象的属性名,在使用 validate、resetFields 方法的情况下,该属性是必填的
+	 * @property {Boolean} border-bottom 是否显示表单域的下划线边框
+	 * @property {String} label-position 表单域提示文字的位置,left-左侧,top-上方
+	 * @property {String Number} label-width 提示文字的宽度,单位rpx(默认90)
+	 * @property {Object} label-style lable的样式,对象形式
+	 * @property {String} label-align lable的对齐方式
+	 * @property {String} right-icon 右侧自定义字体图标(限uView内置图标)或图片地址
+	 * @property {String} left-icon 左侧自定义字体图标(限uView内置图标)或图片地址
+	 * @property {Object} left-icon-style 左侧图标的样式,对象形式
+	 * @property {Object} right-icon-style 右侧图标的样式,对象形式
+	 * @property {Boolean} required 是否显示左边的"*"号,这里仅起展示作用,如需校验必填,请通过rules配置必填规则(默认false)
+	 * @example <u-form-item label="姓名"><u-input v-model="form.name" /></u-form-item>
+	 */
+
+	export default {
+		name: 'u-form-item',
+		mixins: [Emitter],
+		inject: {
+			uForm: {
+				default () {
+					return null
+				}
+			}
+		},
+		props: {
+			// input的label提示语
+			label: {
+				type: String,
+				default: ''
+			},
+			// 绑定的值
+			prop: {
+				type: String,
+				default: ''
+			},
+			// 是否显示表单域的下划线边框
+			borderBottom: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// label的位置,left-左边,top-上边
+			labelPosition: {
+				type: String,
+				default: ''
+			},
+			// label的宽度,单位rpx
+			labelWidth: {
+				type: [String, Number],
+				default: ''
+			},
+			// lable的样式,对象形式
+			labelStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// lable字体的对齐方式
+			labelAlign: {
+				type: String,
+				default: ''
+			},
+			// 右侧图标
+			rightIcon: {
+				type: String,
+				default: ''
+			},
+			// 左侧图标
+			leftIcon: {
+				type: String,
+				default: ''
+			},
+			// 左侧图标的样式
+			leftIconStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 左侧图标的样式
+			rightIconStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置
+			required: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				initialValue: '', // 存储的默认值
+				// isRequired: false, // 是否必填,由于人性化考虑,必填"*"号通过props的required配置,不再通过rules的规则自动生成
+				validateState: '', // 是否校验成功
+				validateMessage: '', // 校验失败的提示语
+				// 有错误时的提示方式,message-提示信息,border-如果input设置了边框,变成呈红色,
+				errorType: ['message'],
+				fieldValue: '', // 获取当前子组件input的输入的值
+				// 父组件的参数,在computed计算中,无法得知this.parent发生变化,故将父组件的参数值,放到data中
+				parentData: {
+					borderBottom: true,
+					labelWidth: 90,
+					labelPosition: 'left',
+					labelStyle: {},
+					labelAlign: 'left',
+				}
+			};
+		},
+		watch: {
+			validateState(val) {
+				this.broadcastInputError();
+			},
+			// 监听u-form组件的errorType的变化
+			"uForm.errorType"(val) {
+				this.errorType = val;
+				this.broadcastInputError();
+			},
+		},
+		computed: {
+			// 计算后的label宽度,由于需要多个判断,故放到computed中
+			uLabelWidth() {
+				// 如果用户设置label为空字符串(微信小程序空字符串最终会变成字符串的'true'),意味着要将label的位置宽度设置为auto
+				return this.elLabelPosition == 'left' ? (this.label === 'true' || this.label === '' ? 'auto' : this.$u.addUnit(this
+					.elLabelWidth)) : '100%';
+			},
+			showError() {
+				return type => {
+					// 如果errorType数组中含有none,或者toast提示类型
+					if (this.errorType.indexOf('none') >= 0) return false;
+					else if (this.errorType.indexOf(type) >= 0) return true;
+					else return false;
+				}
+			},
+			// label的宽度
+			elLabelWidth() {
+				// label默认宽度为90,优先使用本组件的值,如果没有(如果设置为0,也算是配置了值,依然起效),则用u-form的值
+				return (this.labelWidth != 0 || this.labelWidth != '') ? this.labelWidth : (this.parentData.labelWidth ? this.parentData
+					.labelWidth :
+					90);
+			},
+			// label的样式
+			elLabelStyle() {
+				return Object.keys(this.labelStyle).length ? this.labelStyle : (this.parentData.labelStyle ? this.parentData.labelStyle :
+					{});
+			},
+			// label的位置,左侧或者上方
+			elLabelPosition() {
+				return this.labelPosition ? this.labelPosition : (this.parentData.labelPosition ? this.parentData.labelPosition :
+					'left');
+			},
+			// label的对齐方式
+			elLabelAlign() {
+				return this.labelAlign ? this.labelAlign : (this.parentData.labelAlign ? this.parentData.labelAlign : 'left');
+			},
+			// label的下划线
+			elBorderBottom() {
+				// 子组件的borderBottom默认为空字符串,如果不等于空字符串,意味着子组件设置了值,优先使用子组件的值
+				return this.borderBottom !== '' ? this.borderBottom : this.parentData.borderBottom ? this.parentData.borderBottom :
+					true;
+			}
+		},
+		methods: {
+			broadcastInputError() {
+				// 子组件发出事件,第三个参数为true或者false,true代表有错误
+				this.broadcast('u-input', 'on-form-item-error', this.validateState === 'error' && this.showError('border'));
+			},
+			// 判断是否需要required校验
+			setRules() {
+				let that = this;
+				// 由于人性化考虑,必填"*"号通过props的required配置,不再通过rules的规则自动生成
+				// 从父组件u-form拿到当前u-form-item需要验证 的规则
+				// let rules = this.getRules();
+				// if (rules.length) {
+				// 	this.isRequired = rules.some(rule => {
+				// 		// 如果有必填项,就返回,没有的话,就是undefined
+				// 		return rule.required;
+				// 	});
+				// }
+
+				// blur事件
+				this.$on('on-form-blur', that.onFieldBlur);
+				// change事件
+				this.$on('on-form-change', that.onFieldChange);
+			},
+
+			// 从u-form的rules属性中,取出当前u-form-item的校验规则
+			getRules() {
+				// 父组件的所有规则
+				let rules = this.parent.rules;
+				rules = rules ? rules[this.prop] : [];
+				// 保证返回的是一个数组形式
+				return [].concat(rules || []);
+			},
+
+			// blur事件时进行表单校验
+			onFieldBlur() {
+				this.validation('blur');
+			},
+
+			// change事件进行表单校验
+			onFieldChange() {
+				this.validation('change');
+			},
+
+			// 过滤出符合要求的rule规则
+			getFilteredRule(triggerType = '') {
+				let rules = this.getRules();
+				// 整体验证表单时,triggerType为空字符串,此时返回所有规则进行验证
+				if (!triggerType) return rules;
+				// 历遍判断规则是否有对应的事件,比如blur,change触发等的事件
+				// 使用indexOf判断,是因为某些时候设置的验证规则的trigger属性可能为多个,比如['blur','change']
+				// 某些场景可能的判断规则,可能不存在trigger属性,故先判断是否存在此属性
+				return rules.filter(res => res.trigger && res.trigger.indexOf(triggerType) !== -1);
+			},
+
+			// 校验数据
+			validation(trigger, callback = () => {}) {
+				// 检验之间,先获取需要校验的值
+				this.fieldValue = this.parent.model[this.prop];
+				// blur和change是否有当前方式的校验规则
+				let rules = this.getFilteredRule(trigger);
+				// 判断是否有验证规则,如果没有规则,也调用回调方法,否则父组件u-form会因为
+				// 对count变量的统计错误而无法进入上一层的回调
+				if (!rules || rules.length === 0) {
+					return callback('');
+				}
+				// 设置当前的装填,标识为校验中
+				this.validateState = 'validating';
+				// 调用async-validator的方法
+				let validator = new schema({
+					[this.prop]: rules
+				});
+				validator.validate({
+					[this.prop]: this.fieldValue
+				}, {
+					firstFields: true
+				}, (errors, fields) => {
+					// 记录状态和报错信息
+					this.validateState = !errors ? 'success' : 'error';
+					this.validateMessage = errors ? errors[0].message : '';
+					// 调用回调方法
+					callback(this.validateMessage);
+				});
+			},
+
+			// 清空当前的u-form-item
+			resetField() {
+				this.parent.model[this.prop] = this.initialValue;
+				// 设置为`success`状态,只是为了清空错误标记
+				this.validateState = 'success';
+			}
+		},
+
+		// 组件创建完成时,将当前实例保存到u-form中
+		mounted() {
+			// 支付宝、头条小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环应用
+			this.parent = this.$u.$parent.call(this, 'u-form');
+			if (this.parent) {
+				// 历遍parentData中的属性,将parent中的同名属性赋值给parentData
+				Object.keys(this.parentData).map(key => {
+					this.parentData[key] = this.parent[key];
+				});
+				// 如果没有传入prop,或者uForm为空(如果u-form-input单独使用,就不会有uForm注入),就不进行校验
+				if (this.prop) {
+					// 将本实例添加到父组件中
+					this.parent.fields.push(this);
+					this.errorType = this.parent.errorType;
+					// 设置初始值
+					this.initialValue = this.fieldValue;
+					// 添加表单校验,这里必须要写在$nextTick中,因为u-form的rules是通过ref手动传入的
+					// 不在$nextTick中的话,可能会造成执行此处代码时,父组件还没通过ref把规则给u-form,导致规则为空
+					this.$nextTick(() => {
+						this.setRules();
+					})
+				}
+			}
+		},
+
+		// 组件销毁前,将实例从u-form的缓存中移除
+		beforeDestroy() {
+			// 如果当前没有prop的话表示当前不要进行删除(因为没有注入)
+			if (this.parent && this.prop) {
+				this.parent.fields.map((item, index) => {
+					if (item === this) this.parent.fields.splice(index, 1);
+				})
+			}
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../uview-ui/libs/css/style.components.scss";
+
+	.u-form-item {
+		@include vue-flex;
+		// align-items: flex-start;
+		padding: 20rpx 0;
+		font-size: 28rpx;
+		color: $u-main-color;
+		box-sizing: border-box;
+		line-height: $u-form-item-height;
+		flex-direction: column;
+
+		&__border-bottom--error:after {
+			border-color: $u-type-error;
+		}
+
+		&__body {
+			@include vue-flex;
+		}
+
+		&--left {
+			@include vue-flex;
+			align-items: center;
+
+			&__content {
+				position: relative;
+				@include vue-flex;
+				align-items: center;
+				padding-right: 10rpx;
+				flex: 1;
+
+				&__icon {
+					margin-right: 8rpx;
+				}
+
+				&--required {
+				
+					vertical-align: middle;
+					color: rgba(74, 139, 255, 1);
+					padding-top: 6rpx;
+				}
+
+				&__label {
+					@include vue-flex;
+					align-items: center;
+					flex: 1;
+				}
+			}
+		}
+
+		&--right {
+			flex: 1;
+
+			&__content {
+				@include vue-flex;
+				align-items: center;
+				flex: 1;
+
+				&__slot {
+					flex: 1;
+					/* #ifndef MP */
+					@include vue-flex;
+					align-items: center;
+					/* #endif */
+				}
+
+				&__icon {
+					margin-left: 10rpx;
+					color: $u-light-color;
+					font-size: 30rpx;
+				}
+			}
+		}
+
+		&__message {
+			font-size: 24rpx;
+			line-height: 24rpx;
+			color: $u-type-error;
+			margin-top: 12rpx;
+		}
+	}
+</style>

+ 93 - 0
components/c-img/index.vue

@@ -0,0 +1,93 @@
+<template>
+	<view>
+		<view class="img_box">
+				<u-upload @on-list-change="change" upload-text="上传图片" width="139" height="139"
+					:max-size="10 * 1024 * 1024" max-count="6" ref="uUpload" :action="action" :auto-upload="false">
+				</u-upload>
+		</view>
+		<u-toast ref="uToast" />
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				uploadlist:[],//上传图片数组
+				value: '', //提交图片数组
+				action: 'https://www.jxydyw.cn/patrol-app/v1/file/upload' //没用到的
+			}
+		},
+		created() {},
+		methods: {
+			change() {
+				this.uploadlist = []
+				this.value = ''
+				this.$nextTick(() => {
+					let lists =  this.$refs.uUpload.lists;
+					lists.forEach(val => {
+						this.upload(val.url)
+					})
+				})
+			},
+			//上传图片
+			upload(item){
+				uni.uploadFile({
+					url: 'https://www.jxydyw.cn/patrol-app/v1/file/upload', //仅为示例,非真实的接口地址
+					filePath: item,
+					name: 'file',
+					success: (uploadFileRes) => {
+						let data= JSON.parse(uploadFileRes.data)
+					    let showUrl=data.data
+						this.uploadlist.push(showUrl)
+						this.$nextTick(() => {
+							let value = '';
+							let len = this.uploadlist.length
+							if( len > 0 ) {
+								if (len > 1) {
+									value = this.uploadlist[0];
+									for (let i = 1; i < len; i++) {
+										value = value + "," + this.uploadlist[i];
+									}
+								} else {
+									value = this.uploadlist[0];
+								}
+								this.value = value
+								this.$nextTick(() => {
+									this.$emit('changeImg',this.value)
+								})
+							}
+						})
+					},
+					fail(data) {
+						this.$refs.uToast.show({
+							title: data.message,
+							type: 'warning',
+						})
+					}
+				});
+				
+			},
+			//提交
+			submit() {
+					let newarr = JSON.parse(JSON.stringify(this.value))
+					let item = {
+						id: this.scan_id,
+						value: JSON.stringify(newarr)
+					} //提交数据
+					this.$store.state.user.items.push(item)
+			},
+			reset() {
+				this.$nextTick(() => {
+					let len = this.$refs.uUpload.lists.length
+					this.$refs.uUpload.lists.splice(0,len)
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 40 - 0
components/c-search/index.vue

@@ -0,0 +1,40 @@
+<template>
+	<u-search 
+		:action-style="{'background':'#4A8BFF','color':'#ffffff','width':'142rpx','border-radius':'35rpx',	'position':' absolute','right':'15rpx',' line-height':'64rpx','z-index':'10000000000'}"
+		:placeholder="sear"
+		 @custom="subtext" 
+		 v-model="keyword"
+		 @blur="blur"
+		 ></u-search>
+</template>
+
+<script>
+	export default {
+		props:{
+			sear:{
+				type:String,
+				default:"搜索我的队友"
+			}
+		},
+		data(){
+			return {
+				keyword:""
+			}
+		},
+		methods:{
+			subtext(val){
+				this.$emit('serbtn',{"text":this.keyword})
+			},
+			blur(val){
+				if(val) {
+				this.$emit('serbtn',{"text":this.keyword})
+				} else {
+				this.$emit('serbtn',{"text":0})
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 109 - 0
components/c-yuan/index.vue

@@ -0,0 +1,109 @@
+<template>
+	<view class="content">
+		<view class="circleprogress">
+			<view class="progresstext">{{progresstext}}%</view>
+			<view class="wrapper left">
+				<view class="leftprogress" :style="{ transform: leftprogress}"></view>
+			</view>
+			<view class="wrapper right">
+				<view class="rightprogress" :style="{ transform: rightprogress}"></view>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			percent: {
+				type: Number,
+				default: 50
+			}
+		},
+		data() {
+			return {
+				leftprogress: 'rotate(-45deg)',
+				rightprogress: 'rotate(45deg)',
+				progresstext: 30
+			}
+		},
+		created() {
+			let percent = Math.round(this.percent * 100)
+			this.sliderchange(percent)
+		},
+		methods: {
+			sliderchange(event) {
+				var val = event
+				this.progresstext = val;
+				var deg = val / 100 * 360;
+				if (deg <= 180) {
+					this.rightprogress = 'rotate(' + (45 + deg) + 'deg)'
+					this.leftprogress = 'rotate(' + (-45) + 'deg)'
+				} else {
+					this.rightprogress = 'rotate(' + (45 + 180) + 'deg)'
+					this.leftprogress = 'rotate(' + (-45 + (deg - 180)) + 'deg)'
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.circleprogress {
+		width: 200rpx;
+		height: 200rpx;
+		display: flex;
+		justify-content: center;
+
+
+	}
+
+	.content {
+		box-sizing: content-box !important;
+	}
+
+	.progresstext {
+		position: absolute;
+		font-size: 40rpx;
+		width: 200rpx;
+		height: 200rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 10;
+		color: #4A8BFF;
+	}
+
+	.wrapper {
+		width: 100rpx;
+		height: 200rpx;
+		overflow: hidden;
+	}
+
+	.leftprogress,
+	.rightprogress {
+		width: 160rpx;
+		height: 160rpx;
+		border: 20rpx solid #E6E6E6;
+		border-bottom: 20rpx solid #4A8BFF;
+		border-radius: 50%;
+
+	}
+
+	.leftprogress {
+		border-right: 20rpx solid #4A8BFF;
+		box-sizing: initial;
+	}
+
+	.rightprogress {
+		border-left: 20rpx solid #4A8BFF;
+		margin-left: -100rpx;
+		box-sizing: initial;
+	}
+
+	.section {
+		width: 80%;
+		margin-top: 50rpx;
+	}
+</style>

+ 97 - 0
components/slectdicsk/index.vue

@@ -0,0 +1,97 @@
+<template>
+	<navigator hover-class="none" :url="prourl" class="u-border-top  u-flex mes-block">
+		<!-- <u-circle-progress  border-width="18" active-color="#2979ff" :percent="parobj.finishNum/parobj.pointNum">
+			<view class="u-progress-content">
+				<view class="u-progress-dot"></view>
+				<text class='u-progress-info'>{{(parobj.finishNum/parobj.pointNum)*100}}% </text>
+			</view>
+		
+		</u-circle-progress> -->
+		<cyuan :percent="Math.round(parobj.completed/parobj.total)" />
+		<view class="u-m-l-14">
+			<view class="mes-rig-tile  u-f-30">{{parobj.name}}</view>
+			<view  class="mes-rig-blue u-m-t-24">任务日期:{{beginTime.slice(0,10)}}</view>
+			<view class="u-flex u-m-t-28">
+				<view class="mes-rig-blue  u-m-r-18">开始时间:{{beginTime.slice(10,-3)}}</view>
+				<view class="">
+					<u-tag :type="parobj.status==1?'primary':parobj.status==2?'warning':'error' "
+						:text="status[parobj.status]" size="mini" mode="dark" />
+				</view>
+			</view>
+			<view class="mes-rig-blue u-m-t-28">截至时间:{{endTime.slice(10,-3)}}</view>
+			<view class="mes-rig-blue u-m-t-28">今日巡检:{{`${parobj.completed}/${parobj.total}`}}</view>
+			<!-- <view class="mes-rig-grey u-m-t-14">计划巡查:50</view> -->
+		</view>
+		<view class="u-absolute " style="right: 15rpx">
+			<u-icon name="arrow-right" color="rgba(229, 229, 229, 1)" size="40"></u-icon>
+		</view>
+	</navigator>
+</template>
+
+<script>
+	import dayjs from "dayjs";
+	import cyuan from '../c-yuan/index.vue'
+	export default {
+		props: {
+			prourl: {
+				type: String
+			},
+			parobj: {
+				type: Object,
+
+			}
+		},
+		components: {
+			cyuan
+		},
+		data() {
+			return {
+				status: ["", '未开始', '进行中', '已结束',"超时漏检","超时完成"]
+			}
+		},
+		created() {
+		},
+		computed:{
+			beginTime(){
+				return dayjs(this.parobj.beginTime).format("YYYY-MM-DD HH:mm:ss")
+			},
+			endTime(){
+				return dayjs(this.parobj.endTime).format("YYYY-MM-DD HH:mm:ss")
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.mes-block {
+		padding: 34rpx;
+		padding-bottom: 8rpx;
+		text-align: left;
+		font-size: 28rpx;
+
+		.mes-rig-tile {
+			font-size: 30rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #333333;
+		}
+
+		.mes-rig-blue {
+			font-size: 26rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #999999;
+		}
+
+		.mes-rig-grey {
+			color: rgba(128, 128, 128, 1);
+		}
+
+		.u-progress-info {
+			font-size: 36rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #4A8BFF;
+		}
+	}
+</style>

+ 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>

+ 29 - 0
main.js

@@ -0,0 +1,29 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+import Vuex from 'vuex'
+import uView from "uview-ui";
+import dayjs from "dayjs";
+App.mpType = 'app'
+import store from './store'
+Vue.use(uView);
+Vue.config.productionTip = false
+Vue.prototype.$store = store
+Vue.prototype.dayjs = dayjs;
+const app = new Vue({
+    ...App,
+	Vuex
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 80 - 0
manifest.json

@@ -0,0 +1,80 @@
+{
+	"name": "opationsure",
+	"appid": "__UNI__F4BA5C4",
+	"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": "wx8d5939add086588f",
+		"setting": {
+			"ignoreDevUnusedFiles": false,
+			"urlCheck": false,
+			"es6": false,
+			"minified": true,
+			"postcss": true
+		},
+		"component": true,
+		"usingComponents": {},
+		"optimization": {
+			"subPackages": true
+		}
+	},
+	"mp-alipay": {
+		"usingComponents": true
+	},
+	"mp-baidu": {
+		"usingComponents": true
+	},
+	"mp-toutiao": {
+		"usingComponents": true
+	},
+	"uniStatistics": {
+		"enable": false
+	},
+	"vueVersion": "2"
+}

+ 79 - 0
package-lock.json

@@ -0,0 +1,79 @@
+{
+  "name": "opationsure",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz",
+      "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "dayjs": {
+      "version": "1.10.7",
+      "resolved": "https://registry.nlark.com/dayjs/download/dayjs-1.10.7.tgz",
+      "integrity": "sha1-LPX5Gt0oEWdIRAhmoKHSbzps5Gg="
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.nlark.com/function-bind/download/function-bind-1.1.1.tgz",
+      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
+    },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.1.1.tgz?cache=0&sync_timestamp=1612364352840&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-intrinsic%2Fdownload%2Fget-intrinsic-1.1.1.tgz",
+      "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.nlark.com/has/download/has-1.0.3.tgz",
+      "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz",
+      "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM="
+    },
+    "js-md5": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz",
+      "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==",
+      "dev": true
+    },
+    "object-inspect": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmmirror.com/object-inspect/download/object-inspect-1.11.1.tgz",
+      "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA=="
+    },
+    "qs": {
+      "version": "6.10.2",
+      "resolved": "https://registry.npmmirror.com/qs/download/qs-6.10.2.tgz",
+      "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==",
+      "requires": {
+        "side-channel": "^1.0.4"
+      }
+    },
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.nlark.com/side-channel/download/side-channel-1.0.4.tgz",
+      "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=",
+      "requires": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    }
+  }
+}

+ 20 - 0
package.json

@@ -0,0 +1,20 @@
+{
+  "name": "opationsure",
+  "version": "1.0.0",
+  "description": "",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "dayjs": "^1.10.7",
+    "qs": "^6.10.2"
+  },
+  "devDependencies": {
+    "js-md5": "^0.7.3"
+  }
+}

+ 266 - 0
pages.json

@@ -0,0 +1,266 @@
+{
+	"easycom": {
+		"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [{
+			"path": "pages/onsitpection/home/index",
+			"style": {
+				"navigationBarTitleText": "首页",
+				"navigationBarBackgroundColor": "#FFFFFF",
+				"enablePullDownRefresh": true,
+				"onReachBottomDistance": 50
+			}
+		},{
+			"path": "pages/login/login/index",
+			"style": {
+				"navigationBarTitleText": "登录",
+				"navigationBarBackgroundColor": "#2a82e4",
+				"navigationBarTextStyle": "white",
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/onsitpection/selectplain/selectplain",
+			"style": {
+				"navigationBarTitleText": "选择计划",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#FFFFFF"
+			}
+		},
+		{
+			"path": "pages/onsitpection/person/person",
+			"style": {
+				"navigationBarBackgroundColor": "#4A8BFF",
+				"navigationBarTitleText": "我的",
+				"enablePullDownRefresh": false,
+				"navigationBarTextStyle": "white"
+			}
+		}, 
+		{
+			"path": "pages/login/forgetpwd/index",
+			"style": {
+				"navigationBarTitleText": "忘记密码",
+				"navigationBarBackgroundColor": "#2a82e4",
+				"navigationBarTextStyle": "white"
+			}
+		},
+		{
+			"path": "pages/company/company",
+			"style": {
+				"navigationBarTitleText": "公司简介",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/datasys/datasys",
+			"style": {
+				"navigationBarTitleText": "数据中心",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/assetsear/assetsear",
+			"style": {
+				"navigationBarTitleText": "资产查询",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/numsear/numsear",
+			"style": {
+				"navigationBarTitleText": "库存查询",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/evaluate/evaluate",
+			"style": {
+				"navigationBarBackgroundColor": "#2a82e4",
+				"navigationBarTitleText": "评价",
+				"enablePullDownRefresh": false,
+				"navigationBarTextStyle": "white"
+			}
+		},
+		{
+			"path": "pages/myteam/myteam",
+			"style": {
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTitleText": "我的团队",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/writeoff/exitwritoff/exitwritoff",
+			"style": {
+				"navigationBarTitleText": "出场核销",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#4a8bff",
+				"navigationBarTextStyle": "white"
+			}
+		},
+		{
+			"path": "pages/writeoff/register/register",
+			"style": {
+				"navigationBarTitleText": "进入登记",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#4a8bff",
+				"navigationBarTextStyle": "white"
+			}
+		}
+	],
+	"subPackages": [{
+			"root": "scan_pages",
+			"pages": [{
+					"path": "scanning/scanning",
+					"style": {
+						"navigationBarBackgroundColor": "#FFFFFF",
+						"navigationBarTitleText": "巡检",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black"
+					}
+				},
+				{
+					"path": "seemore/seemore",
+					"style": {
+						"navigationBarTitleText": "巡检计划",
+						"navigationBarBackgroundColor": "#FFFFFF",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black"
+					}
+				},
+				{
+					"path": "checkpoint/checkpoint",
+					"style": {
+						"navigationBarTitleText": "巡检线路",
+						"navigationBarBackgroundColor": "#FFFFFF",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black"
+					}
+				},
+				{
+					"path": "checkdetail/checkdetail",
+					"style": {
+						"navigationBarTitleText": "房间详情",
+						"navigationBarBackgroundColor": "#FFFFFF",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black"
+					}
+				},
+				{
+					"path": "patrolrecored/patrolrecored",
+					"style": {
+						"navigationBarBackgroundColor": "#FFFFFF",
+						"navigationBarTitleText": "巡检记录",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black"
+					}
+				},
+				{
+					"path": "patroldetail/patroldetail",
+					"style": {
+						"navigationBarTitleText": "巡检详情",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#FFFFFF"
+					}
+				},
+				{
+					"path": "patrol/patrol",
+					"style": {
+						"navigationBarTitleText": "巡检进度",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#4a8bff",
+						"navigationBarTextStyle": "white"
+					}
+				}
+			]
+		},
+		{
+			"root": "task_pages",
+			"pages": [{
+					"path": "guarantee/guarantee",
+					"style": {
+						"navigationBarTitleText": "发布任务",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "addppeople/addppeople",
+					"style": {
+						"navigationBarTitleText": "选择执行人",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#FFFFFF"
+					}
+				},
+				{
+					"path": "taskarrment/taskarrment",
+					"style": {
+						"navigationBarTitleText": "任务安排",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "taskarrment/tasklist/tasklist",
+					"style": {
+						"navigationBarTitleText": "任务列表",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "taskarrment/viewtask/viewtask",
+					"style": {
+						"navigationBarTitleText": "查看任务",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "taskarrment/taskfeeback/taskfeeback",
+					"style": {
+						"navigationBarTitleText": "任务反馈",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "taskarrment/feebacklist/feebacklist",
+					"style": {
+						"navigationBarTitleText": "反馈列表",
+						"enablePullDownRefresh": false
+					}
+				}
+			]
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8",
+		"app-plus": {
+			"titleNView": {
+				"splitLine": {
+					"color": "#EEEEEE"
+				}
+			}
+		}
+	},
+	"tabBar": {
+		"color": "#7A7E83",
+		"selectedColor": "#3cc51f",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		"list": [{
+				"pagePath": "pages/onsitpection/home/index",
+				"text": "首页"
+			},
+			{
+				"pagePath": "pages/onsitpection/selectplain/selectplain",
+				"text": "扫描"
+			},
+			{
+				"pagePath": "pages/onsitpection/person/person",
+				"text": "个人中心"
+			}
+		]
+	}
+}

+ 250 - 0
pages/assetsear/assetsear.vue

@@ -0,0 +1,250 @@
+<template>
+	<view class="container">
+		<label class="sel_event" @click="sel_show()">
+			<view class="sel_point">
+				<view class="sel_field" v-if="sel_item1 != ''">
+					{{sel_item1 + "/" + sel_item2 + "/" + (sel_item3.name || sel_item3.label)}}
+				</view>
+				<view class="triangle" :style="tri_style">
+				</view>
+			</view>
+		</label>
+		<u-select v-model="show" value-name="id" label-name="name" mode="mutil-column-auto" :list="list"
+			@confirm="confirm"></u-select>
+		<view class="content">
+			<view class="table_hed">
+				<view class="table_cell_h">
+					<span>名称</span>
+					<span>编号</span>
+					<span>类型</span>
+					<span>关联项目数</span>
+				</view>
+			</view>
+			<scroll-view  :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" @scrolltolower="lower">
+				<view class="table_cell" v-for="( item, i) in tabArr" :key="item.id">
+					<span>{{item.name}}</span>
+					<span>{{item.number}}</span>
+					<span>{{item.type == 1 ? '机柜' : '其他'}}</span>
+					<span>{{item.checkItemTotal}}</span>
+				</view>
+			</scroll-view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		building,
+		floor,
+		room,
+		device
+	} from '@/api/index.js'
+	export default {
+		data() {
+			return {
+				sel_item1: '', //选择列1值
+				sel_item2: '', //选择列2值
+				sel_item3: {}, //选择列3值
+				tri_style: '', //小三角样式
+				show: false, //选择框弹出
+				tabArr: [], //设备列表
+				list: [], //选择框列表
+				scrollnum: 2 //页码(懒加载)
+			}
+		},
+		onLoad() {
+			this.getBuilding()
+		},
+		watch: {
+			sel_item3: {
+				deep: true,
+				handler(newOption, oldOption) {
+					if (newOption.value) {
+						this.getTotleDevice(newOption.value);
+					} else {
+						this.getTotleDevice(newOption.id);
+					}
+
+				},
+			},
+			show(newOption, oldOption) {
+				if (!newOption) {
+					this.tri_style =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color:transparent;';
+				}
+			}
+
+		},
+		methods: {
+			//选择框弹出
+			sel_show() {
+				this.show = !this.show;
+				this.tri_style =
+					'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+			},
+			//获取楼栋
+			async getBuilding() {
+				let {
+					data
+				} = await building();
+				this.list.length = 0;
+				data.forEach(i => {
+					this.list.push(i)
+				});
+				for (let i = 0, len = this.list.length; i < len; i++) {
+					await this.getFloor(this.list[i].id, i)
+					for (let j = 0, len = this.list[i].children.length; j < len; j++) {
+						await this.getRoom(this.list[i].children[j].id, i, j)
+					}
+				}
+				//选择框默认值
+				this.$nextTick(function() {
+					this.sel_item1 = this.list[0].name;
+					this.sel_item2 = this.list[0].children[0].name;
+					this.sel_item3 = this.list[0].children[0].children[0];
+				})
+			},
+			//获取楼层
+			async getFloor(buildingId, i) {
+				let {
+					data
+				} = await floor(buildingId)
+				this.list[i].children = [];
+				data.forEach(ite => {
+					this.list[i].children.push(ite)
+				})
+			},
+			//获取房间
+			async getRoom(roomId, i, j) {
+				let {
+					data
+				} = await room(roomId)
+				this.list[i].children[j].children = [];
+				data.forEach(ite => {
+					this.list[i].children[j].children.push(ite)
+				})
+			},
+			//获取房间所有设备
+			async getTotleDevice(roomId, page, size) {
+				page || (page = 1)
+				size || (size = 10)
+				let {
+					data
+				} = await device({
+					roomId,
+					page,
+					size
+				})
+				this.tabArr = data.list;
+			},
+			// 选择框确认(回调参数为包含多个元素的数组,每个元素分别反应每一列的选择情况)
+			confirm(e) {
+				this.sel_item1 = e[0].label;
+				this.sel_item2 = e[1].label;
+				this.sel_item3 = e[2]
+				this.getTotleDevice(e[2].value);
+			},
+			//懒加载
+			lower() {
+				this.getTotleDevice(this.sel_item3, this.scrollnum, 10);
+				this.scrollnum += 1;
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	.container {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		width: 100%;
+		height: 100%;
+		background-color: #FFFFFF;
+	}
+
+	.sel_point {
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+		width: 690rpx;
+		height: 30rpx;
+		margin: 29rpx 0 38rpx 0;
+		text-align: left;
+	}
+
+	.sel_field {
+		margin-right: 30rpx;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+		text-indent: 10rpx;
+	}
+
+	.triangle {
+		margin-top: 10rpx;
+		display: inline-block;
+		/* Base Style */
+		border: solid 10rpx transparent;
+		border-top-color: #808080;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+		align-items: center;
+		width: 690rpx;
+		height: 100%;
+		background: #FFFFFF;
+		box-shadow: 0px 0px 24px 0px rgba(6, 0, 1, 0.1);
+		border-radius: 10px 10px 0px 0px;
+		overflow: hidden;
+
+		.table_hed {
+			width: 690rpx;
+			height: 70rpx;
+			background: #EBF8FF;
+		}
+
+		.table_cell,
+		.table_cell_h {
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+			width: 630rpx;
+			height: 70rpx;
+			margin: 0 auto;
+			border-bottom: solid 1rpx #E6E6E6;
+
+			span {
+				width: 140rpx;
+				font-size: 28rpx;
+				font-family: Microsoft YaHei-3970(82674968);
+				font-weight: 400;
+				color: #333333;
+				text-align: center;
+			}
+		}
+
+		.table_cell span {
+			max-width: 140rpx;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+
+		.table_cell_h {
+			border-bottom: none;
+		}
+
+		.scroll-Y {
+			height: calc( 100vh - 180rpx );
+			width: 690rpx;
+			
+		}
+	}
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 55 - 0
pages/company/company.vue


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 55 - 0
pages/datasys/datasys.vue


+ 111 - 0
pages/evaluate/evaluate.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="u-flex u-f-d-c">
+		<!-- 	<view class="u-font-24 u-m-t-14" style="color: #a6a6a6;">我的评价 </view> -->
+		<view class="u-m-t-60">
+			<u-rate size="56" gutter="18" active-color="#f6db4d" :count="count" v-model="form.score"></u-rate>
+			<view class="u-font-28 u-flex u-box-active6" style="color: #a6a6a6;">
+				<view v-for="(index,key) in text" :key="key" :class="key==0?'':'u-m-l-20'">{{index}}</view>
+			</view>
+		</view>
+		<!-- <view class="u-m-t-26 u-m-b-14 m-w" style="height: 1px;  background: #d9d9d9;"></view> -->
+		<view class="  m-w textar u-m-l-6" style=" background:#FFFFFF;">
+			<textarea v-model="form.content" maxlength="300" placeholder="请输入300字以内的评价" />
+		</view>
+		<view class="eva-btn" @click="submit"> 评论</view>
+		<u-toast ref="evast" />
+	</view>
+</template>
+
+<script>
+	import {
+		commentsave
+	} from '@/api/index'
+	export default {
+		data() {
+			return {
+				count: 5,
+				text: ['极差', '较差', '一般', '不错', '很棒'],
+				form: {
+					score: undefined,
+					respondentUserId: null,
+					respondentUsername: null,
+					content: undefined,
+				}
+			}
+		},
+		onLoad(option) {
+			this.form.respondentUserId = option.userId
+			this.form.respondentUsername = option.username
+		},
+		methods: {
+			submit() {
+				const {
+					content,
+					score
+				} = this.form
+				if (content && score) {
+					commentsave(this.form)
+						.then(({
+							data,
+							message,
+							code
+						}) => {
+							if (code == 200) {
+								this.$refs.evast.show({
+									title: "评价成功",
+									type: 'success',
+									callback: () => {
+										uni.navigateBack(1)
+									}
+								})
+							} else {
+								this.$refs.evast.show({
+									title: "评价失败",
+									type: 'info',
+								})
+							}
+						})
+				} else {
+					this.$refs.evast.show({
+						title: '请评价和评论',
+						type: 'error',
+					})
+				}
+			},
+		}
+	}
+</script>
+
+<style>
+	.textar {
+		box-sizing: border-box;
+		width: 690rpx !important;
+		height: 300rpx;
+		background: #F2F2F2;
+		margin-top: 65rpx;
+
+	}
+
+	.textar textarea {
+		box-sizing: border-box;
+		width: 100%;
+		height: 300rpx;
+		background: #F2F2F2;
+		padding: 30rpx;
+
+	}
+
+	.eva-btn {
+		width: 690rpx;
+		height: 90rpx;
+		background: #4A8BFF;
+		border-radius: 4rpx;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: bold;
+		color: #FFFFFF;
+		line-height: 90rpx;
+		text-align: center;
+		margin-top: 36rpx;
+	}
+</style>

+ 166 - 0
pages/login/forgetpwd/index.vue

@@ -0,0 +1,166 @@
+<template>
+	<view class="u-p-l-20 u-p-r-20">
+		<u-form :error-type="['toast']" ref="uForm" label-width="100" :model="form">
+			<!-- 	<u-form-item label="账号" prop="name">
+				<u-input v-model="form.name" />
+			</u-form-item>
+			<u-form-item label="验证码" prop="vertion">
+				<u-input v-model="form.vertion" />
+				<view slot="right">
+					<u-verification-code :seconds="seconds" @end="end" @start="start" ref="uCode" @change="codeChange">
+					</u-verification-code>
+					<view @tap="getCode" class="vertion-info">{{tips}}</view>
+				</view>
+			</u-form-item> -->
+			<u-form-item label="旧密码" prop="oldPassword">
+				<u-input v-model="form.oldPassword" />
+			</u-form-item>
+			<u-form-item label="新密码" prop="newPassword">
+				<u-input v-model="form.newPassword" />
+			</u-form-item>
+			<button class="sumit" @click="sumit()">确认修改</button>
+		</u-form>
+		<u-toast ref="uToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	import md5 from 'js-md5';
+	import {
+		updatapwsele
+	} from '@/api/index.js'
+	export default {
+		data() {
+			return {
+				form: {
+					oldPassword: undefined,
+					newPassword: undefined
+				},
+				rules: {
+					oldPassword: [{
+						required: true,
+						message: '请输入旧密码',
+						// 可以单个或者同时写两个触发验证方式
+						trigger: 'blur,change'
+					}],
+					newPassword: [{
+						required: true,
+						message: '请输入新密码',
+						// 可以单个或者同时写两个触发验证方式
+						trigger: 'blur,change'
+					}],
+					vertion: [{
+						required: true,
+						message: '请输入验证码',
+						trigger: 'blur,change'
+					}],
+					password: [{
+						required: true,
+						message: '请输入新的密码',
+						trigger: 'blur,change'
+					}]
+				},
+				seconds: 10,
+				tips: ''
+			};
+		},
+		// 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
+		onReady() {
+			this.$refs.uForm.setRules(this.rules);
+		},
+		methods: {
+			sumit() {
+				let {
+					oldPassword,
+					newPassword
+				} = this.form
+				oldPassword = md5(`${oldPassword}`)
+				newPassword = md5(`${newPassword}`)
+				oldPassword = String(oldPassword)
+				newPassword = String(newPassword)
+				this.$refs.uForm.validate(valid => {
+					if (valid) {
+						updatapwsele({
+								passwordOld: oldPassword,
+								password: newPassword
+							})
+							.then(({
+								code,
+								message
+							}) => {
+								if (code == "200") {
+									this.$refs.uToast.show({
+										title: "修改成功",
+										type: 'success',
+										callback: () => {
+											this.form = {
+												oldPassword: undefined,
+												newPassword: undefined
+											}
+											uni.redirectTo({
+												url: '../login/index'
+											})
+										}
+									})
+								} else {
+									this.$u.toast(message);
+								}
+							})
+					} else {
+						this.$refs.uToast.show({
+							title: "输入格式错误",
+							type: 'warning',
							})
+					}
+				});
+			},
+			codeChange(text) {
+				this.tips = text;
+			},
+			getCode() {
+				if (this.$refs.uCode.canGetCode) {
+					// 模拟向后端请求验证码
+					uni.showLoading({
+						title: '正在获取验证码'
+					})
+					setTimeout(() => {
+						uni.hideLoading();
+						// 这里此提示会被this.start()方法中的提示覆盖
+						this.$u.toast('验证码已发送');
+						// 通知验证码组件内部开始倒计时
+						this.$refs.uCode.start();
+					}, 2000);
+				} else {
+					this.$u.toast('倒计时结束后再发送');
+				}
+			},
+			end() {
+				//this.$u.toast('倒计时结束');
+			},
+			start() {
+				//this.$u.toast('倒计时开始');
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.vertion-info {
+		color: rgba(0, 186, 173, 1);
+		font-size: 28rpx;
+		border-left: 2rpx solid rgba(229, 229, 229, 1);
+		text-align: left;
+		padding-left: 46rpx;
+	}
+
+	.sumit {
+		width: 704rpx;
+		height: 88rpx;
+		margin-top: 98rpx;
+		color: rgba(255, 255, 255, 1);
+		background-color: rgba(42, 130, 228, 1);
+		border-radius: 5px;
+		font-size: 16px;
+		line-height: 88rpx;
+		text-align: center;
+	}
+</style>

+ 234 - 0
pages/login/login/index.vue

@@ -0,0 +1,234 @@
+<template>
+	<view class=" login-confg u-flex f-d-c ">
+		<view class="logo-back u-flex u-row-center u-col-bottom">
+			<view class="logo"><u-image width="102" height="102" :src="icon.homelogo"></u-image></view>
+		</view>
+		<view style="margin-top: 208rpx;" class="u-flex u-d-c">
+			<view class="loin-from u-p-l-26 u-p-r-26 ">
+				<u-form :error-type="['toast']" :model="form" ref="uForm">
+					<u-form-item :left-icon="icon.phone" prop="telephone" :left-icon-style="{ width: '33rpx', height: '33rpx', position: 'relative', top: '8rpx', marginRight: '66rpx' }"><u-input placeholder="请输入账号" v-model="form.telephone" /></u-form-item>
+					<u-form-item :left-icon="icon.pwd" prop="name" :left-icon-style="{ width: '33rpx', height: '33rpx', position: 'relative', top: '8rpx', marginRight: '66rpx' }"><u-input placeholder="请输入密码" type="password" v-model="form.password" /></u-form-item>
+					<u-form-item prop="identify">
+						<view style="display: flex; align-items: center; justify-content: space-between;">
+							<u-input style="flex1" placeholder="请输入验证码" v-model="form.identify" />
+							<image :src="codeSrc" style="width: 200rpx; height:60rpx;" @click="getCode()"></image>
+						</view>
+					</u-form-item>
+				</u-form>
+
+				<!-- <navigator hover-class="none"  url="../forgetpwd/index" class="no-pwd u-m-t-14 u-p-b-40 no-pwd">忘记密码?</navigator> -->
+				<button class="login_btn u-m-t-40 u-" @click="submit">登录</button>
+			</view>
+			<!-- 	<view class="u-m-40 u-p-t-40"  >
+				<u-divider bg-color="rgba(0,0,0,0)" fontSize="28rpx">微信登录</u-divider>
+			</view> -->
+
+			<!-- 	<view class="u-flex wxlogoin" @click="wechatlogin">
+				<view class="logoicon"><u-icon  name="weixin-fill" color="#ffffff" size="60"></u-icon></view>
+				
+			</view> -->
+		</view>
+		<u-toast ref="lToast"></u-toast>
+	</view>
+</template>
+
+<script>
+import md5 from 'js-md5';
+import phone from '@/static/img/phone.png';
+import password from '@/static/img/password.png';
+import homelogo from '@/static/img/homelogo.png';
+import { login, code } from '@/api/index.js';
+export default {
+	data() {
+		return {
+			codeSrc: '',
+			code: '', // 正确的验证码
+			form: {
+				telephone: undefined,
+				password: undefined,
+				identify: undefined
+			},
+			rules: {
+				telephone: [
+					{
+						required: true,
+						message: '请输入账号',
+						trigger: ['change',  'blur']
+					}
+				],
+				password: [
+					{
+						required: true,
+						message: '请输入密码',
+						trigger: ['change', 'blur']
+					}
+				],
+				identify: [
+					{
+						required: true,
+						message: '请输入验证码',
+						trigger: ['change', 'blur']
+					}
+				]
+			},
+			icon: {
+				phone: phone,
+				pwd: password,
+				homelogo: homelogo
+			}
+		};
+	},
+	mounted() {
+		this.getCode();
+	},
+	methods: {
+		getCode() {
+			code().then(reponse => {
+				console.log(reponse);
+				const { code, message, data } = reponse;
+				if (code == 200) {
+					this.codeSrc = data.image;
+					this.code = data.code;
+				} else {
+					this.$u.toast(message);
+				}
+			});
+		},
+		wechatlogin() {
+			uni.navigateTo({
+				url: '../../writeoff/register/register'
+			});
+		},
+		async submit() {
+			let { telephone, password } = this.form;
+			let username = String(telephone);
+			password = md5(`${password}`);
+			password = String(password);
+			this.$refs.uForm.validate((valid, e) => {
+				if (valid) {
+					if (this.form.identify == this.code) {
+						login({
+							username,
+							password,
+							code: this.form.identify
+						}).then(reponse => {
+							const { code, message, data } = reponse;
+							if (code == 200) {
+								uni.setStorageSync('token', data.token);
+								uni.setStorageSync('user', data);
+								uni.switchTab({
+									url: '../../../pages/onsitpection/home/index'
+								});
+							} else {
+								this.$u.toast(message);
+							}
+						});
+					} else {
+						this.$u.toast('验证码错误');
+					}
+				} else {
+					console.log('验证失败', valid, e);
+				}
+			});
+		}
+	},
+	onReady() {
+		this.$refs.uForm.setRules(this.rules);
+	}
+};
+</script>
+
+<style lang="scss">
+page {
+	width: 100%;
+	height: 100%;
+}
+
+.login-confg {
+	width: 100%;
+	height: 100%;
+
+	.logo-back {
+		width: 100%;
+		height: 444rpx;
+		position: relative;
+		z-index: -1;
+
+		&::after {
+			content: '';
+			width: 140%;
+			height: 444rpx;
+			position: absolute;
+			left: -20%;
+			top: 0;
+			z-index: -1;
+			border-radius: 0 0 45% 45%;
+			background: #1496f1;
+		}
+
+		.logo {
+			width: 168rpx;
+			height: 168rpx;
+			background: #ffffff;
+			box-shadow: 0px 13rpx 46rpx 0rpx rgba(120, 103, 255, 0.16);
+			border-radius: 32rpx;
+			position: relative;
+			top: 94rpx;
+			padding: 34rpx;
+		}
+	}
+}
+
+.loin-from {
+	width: 610rpx;
+	color: rgba(80, 80, 80, 1);
+	background-color: rgba(255, 255, 255, 1);
+	font-size: 14px;
+	text-align: center;
+
+	.u-form-item {
+		padding: 10rpx !important;
+	}
+
+	.no-pwd {
+		font-size: 28rpx;
+		font-weight: 400;
+		color: #4a8bff;
+	}
+}
+
+.u-d-c {
+	flex-direction: column;
+}
+
+.login_btn {
+	width: 100%;
+	height: 79rpx;
+	background: #4a8bff;
+	box-shadow: 0px 17rpx 40rpx 0px rgba(123, 102, 255, 0.22);
+	border-radius: 40rpx;
+	font-size: 30rpx;
+	font-family: inpinheiti;
+	font-weight: 400;
+	color: #ffffff;
+	line-height: 79rpx;
+}
+
+.no-pwd {
+	color: rgba(166, 166, 166, 1);
+	font-size: 28rpx;
+	text-align: left;
+}
+
+.wxlogoin {
+	.logoicon {
+		width: 83rpx;
+		height: 83rpx;
+		background: #04be02;
+		border-radius: 50%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+}
+</style>

+ 119 - 0
pages/myteam/myteam.vue

@@ -0,0 +1,119 @@
+<template>
+	<view>
+		<view class="u-p-t-12 u-p-b-20  u-p-l-20 u-p-r-10" style="background: #FFFFFF;">
+			<cSearch @serbtn="setbtn" />
+		</view>
+		<scroll-view class="scheight" :scroll-y="true">
+			<view v-for="(item,itemkey) in xobj" :key="itemkey">
+				<view style="background: #FFFFFF;" class="u-p-t-20 u-p-b-20 u-p-l-46  u-p-r-60 u-flex u-row-between">
+					<view class="u-flex">
+						<view class="left-ku"></view>
+						<view>{{item.name}}</view>
+					</view>
+					<view>
+						<!-- <u-icon name="arrow-right"></u-icon> -->
+					</view>
+				</view>
+				<view v-for="(staff,index) in item.users"
+					class="tam-item u-flex u-row-between u-m-l-30 u-p-b-30 u-p-t-30" :key="index">
+					<view class="u-flex">
+						<u-avatar size="90" mode="circle"></u-avatar>
+						<view class="u-m-l-26 u-font-28">
+							<view>{{staff.username}}</view>
+							<view class="u-m-t-18">{{staff.telephone}}</view>
+						</view>
+					</view>
+					<navigator hover-class="none"
+						:url="`../evaluate/evaluate?userId=${staff.id}&username=${staff.username}`" class="pj-btn">去评价
+					</navigator>
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import cSearch from '@/components/c-search/index'
+	import {
+		syslist
+	} from '@/api/index.js'
+	export default {
+		name: "myteam",
+		components: {
+			cSearch
+		},
+		data() {
+			return {
+				username: "", //搜索关键字
+				xobj: [] //数据列表
+			}
+		},
+		onLoad(option) {
+			this.crelist()
+		},
+		methods: {
+			setbtn({
+				text
+			}) {
+				if (text == 10000000000) {
+					this.username = ""
+					this.$nextTick(() => {
+						this.crelist()
+					})
+				} else {
+					this.username = text
+					this.$nextTick(() => {
+						this.crelist()
+					})
+				}
+			},
+			async crelist() {
+				let {
+					data
+				} = await syslist({
+					username: this.username
+				})
+				this.xobj = data
+			}
+		}
+	}
+</script>
+
+<style>
+	page {
+		width: 100%;
+		height: 100%;
+		background: rgba(242, 242, 242, 1);
+	}
+
+	.scheight {
+		height: calc(100vh - 100rpx);
+		background: #FFFFFF;
+	}
+
+	.tam-item {
+		width: 690rpx;
+		background: #FFFFFF;
+		border-bottom: 1px solid #e6e6e6;
+	}
+
+	.pj-btn {
+		width: 120rpx;
+		height: 60rpx;
+		background: #4A8BFF;
+		border-radius: 4rpx;
+		line-height: 60rpx;
+		text-align: center;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #FFFFFF;
+	}
+
+	.left-ku {
+		width: 10rpx;
+		height: 38rpx;
+		background: #4A8BFF;
+		margin-right: 19rpx;
+	}
+</style>

+ 218 - 0
pages/numsear/numsear.vue

@@ -0,0 +1,218 @@
+<template>
+	<view class="container">
+		<label class="sel_event" @click="sel_show ()">
+			<view class="sel_point">
+				<view class="sel_field">
+					{{sel_item}}
+				</view>
+				<view class="triangle" :style="tri_style">
+				</view>
+			</view>
+		</label>
+		<u-select v-model="show" value-name="id" label-name="name" mode="single-column" :list="list" @confirm="confirm">
+		</u-select>
+		<view class="content">
+			<view class="table_hed">
+				<view class="table_cell_h">
+					<span>编号</span>
+					<span>名称</span>
+					<span class="introduce">介绍</span>
+					<span>库存</span>
+				</view>
+			</view>
+			<scroll-view :scroll-top="scrollTop" @scrolltolower="lower()" scroll-y="true" class="scroll-Y"
+				v-if="numList != null">
+				<view class="table_cell" v-for="(item,i) in numList" :key="item.id">
+					<span>{{item.id}}</span>
+					<span>{{item.name}}</span>
+					<span class="introduce u-line-1">{{item.description}}</span>
+					<span>{{item.count}}</span>
+				</view>
+			</scroll-view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import {
+		num,
+		numType
+	} from '@/api/index.js'
+	export default {
+		data() {
+			return {
+				sel_item: '', //选择框值
+				show: false, //选择框弹出
+				tri_style: '', //三角样式
+				//物品类别列表
+				list: [{
+						value: '1',
+						label: '电子产品'
+					},
+					{
+						value: '2',
+						label: '抗疫物资'
+					},
+				],
+				numList: [], //库存物品列表
+				scrollnum: 2, //页码(懒加载)
+
+			}
+		},
+		onLoad() {
+			this.getNumType()
+		},
+		watch: {
+			sel_item(newOption, oldOption) {
+				this.getNum(newOption);
+			},
+			show(newOption, oldOption) {
+				if (!newOption) {
+					this.tri_style =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color:transparent;';
+				}
+			}
+		},
+	
+		methods: {
+			sel_show() {
+				this.show = !this.show;
+				this.tri_style =
+					'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+			},
+
+			lower() {
+				this.getNum(this.sel_item, this.scrollnum, 10);
+				this.scrollnum += 1;
+			},
+			//获取库存类别
+			async getNumType() {
+				let {
+					data
+				} = await numType()
+				this.list.length = 0
+				data.list.forEach(ite => {
+					this.list.push(ite)
+				})
+				this.$nextTick(function() {
+					this.sel_item = this.list[0].name;
+				})
+			},
+			async getNum(type, page, size) {
+				page || (page = 1)
+				size || (size = 10)
+				let {
+					data
+				} = await num({
+					type,
+					page,
+					size
+				})
+				data.list.forEach(ite => {
+					this.numList.push(ite)
+				})
+			},
+			// 回调参数为包含多个元素的数组,每个元素分别反应每一列的选择情况
+			confirm(e) {
+				this.$nextTick(function() {
+					this.sel_item = e[0].label;
+				})
+			
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.container {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		width: 100%;
+		height: 100%;
+		background-color: #FFFFFF;
+	}
+
+	.sel_point {
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+		width: 690rpx;
+		height: 30rpx;
+		margin: 29rpx 0 38rpx 0;
+		text-align: left;
+	}
+
+	.sel_field {
+		margin-right: 30rpx;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+		text-indent: 10rpx;
+	}
+
+	.triangle {
+		margin-top: 10rpx;
+		display: inline-block;
+		/* Base Style */
+		border: solid 10rpx transparent;
+		border-top-color: #808080;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+		align-items: center;
+		width: 690rpx;
+		height: 100%;
+		background: #FFFFFF;
+		box-shadow: 0px 0px 24px 0px rgba(6, 0, 1, 0.1);
+		border-radius: 10px 10px 0px 0px;
+		overflow: hidden;
+
+		.table_hed {
+			width: 690rpx;
+			height: 70rpx;
+			background: #EBF8FF;
+		}
+
+		.table_cell,
+		.table_cell_h {
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+			width: 630rpx;
+			height: 70rpx;
+			margin: 0 auto;
+			border-bottom: solid 1rpx #E6E6E6;
+
+			span {
+				width: 140rpx;
+				font-size: 28rpx;
+				font-family: Microsoft YaHei-3970(82674968);
+				font-weight: 400;
+				color: #333333;
+				text-align: center;
+			}
+
+			.introduce {
+				max-width: 308rpx;
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+		}
+
+		.table_cell_h {
+			border-bottom: none;
+		}
+
+		.scroll-Y {
+			width: 690rpx;
+			height: calc( 100vh - 180rpx );
+		}
+	}
+</style>

+ 335 - 0
pages/onsitpection/home/index.vue

@@ -0,0 +1,335 @@
+<template>
+	<view class="u-flex u-f-d-c home u-p-l-30 u-p-r-30">
+		<view class="u-flex u-f-d-c m-w min-hei">
+			<view class="u-m-18">
+				<u-image width="690rpx" height="300rpx" src="https://xj.chuanghai-tech.com/image/f6ac3cbb2d2d2f29d769cec3b051e05.png"></u-image>
+			</view>
+			<view @click="tsanavtask()" class="info-swiper u-m-b-40 u-flex u-col-center">
+				<view class="info-ti"></view>
+				<view class="info-icon u-flex u-row-center u-col-center">
+					<u-image width="40" height="40" :src="tzicon"></u-image>
+				</view>
+				<view class="u-m-l-16 u-flex f-d-c u-col-top">
+					<view class="annou-title">{{ taskdetail.title || '最新任务' }}</view>
+					<view class="annou-cig">{{ taskdetail.content || '内容' }}</view>
+				</view>
+				<view class="right-icon u-flex u-row-right">
+					<view v-show="taskCount != 0" class="hint">
+						{{ taskCount }}
+					</view>
+					<u-icon name="arrow-right" color="rgba(153, 153, 153, 1)" size="25"></u-icon>
+				</view>
+			</view>
+			<view class="u-flex f-d-c u-col-top m-w">
+				<view class="u-font-32 u-m-b-30" style="color: #000000">主要功能</view>
+				<view class="to-menus u-p-t-28 u-p-b-28">
+					<view class="nav-itm">
+						<navigator hover-class="none" :url="index.url" class="u-flex u-f-d-c" v-for="(index, key) in nav_obj1" :key="key">
+							<view class="menu-icon">
+								<u-image :width="index.size" :height="index.size" :src="index.imgurl"></u-image>
+							</view>
+							<view class="u-m-t-16 u-f-26">{{ index.name }}</view>
+						</navigator>
+					</view>
+					<view class="nav-itm">
+						<navigator hover-class="none" :url="index.url" class="u-flex u-f-d-c" v-for="(index, key) in nav_obj2" :key="key">
+							<view class="menu-icon">
+								<u-image :width="index.size" :height="index.size" :src="index.imgurl"></u-image>
+							</view>
+							<view class="u-m-t-16 u-f-28">{{ index.name }}</view>
+						</navigator>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="u-m-t-46 mai-color u-p-l-16 u-p-r-16 sc-view">
+			<view class="u-flex u-row-between u-m-b-30">
+				<view class="u-font-32" style="color: #000000">当日巡检</view>
+				<navigator hover-class="none" url="/scan_pages/seemore/seemore" class="u-f-24 u-flex" style="font-weight: 400; color: #4a8bff">
+					<view class="u-m-r-8">查看更多</view>
+					<u-icon name="arrow-right"></u-icon>
+				</navigator>
+			</view>
+
+			<view class="scr-hei">
+				<block v-if="partlist.length > 0">
+					<block v-for="(index, key) in partlist" :key="key">
+						<cDisk :more="0" :parobj="index" :prourl="`/scan_pages/patrol/patrol?taskId=${index.id}&status=${index.status}`" />
+					</block>
+				</block>
+				<block v-else>
+					<u-empty text="暂无数据" mode="list"></u-empty>
+				</block>
+			</view>
+		</view>
+		<u-tabbar :before-switch="beforeSwitch" :height="tabheight" :list="tabbar" :mid-button="true"></u-tabbar>
+	</view>
+</template>
+
+<script>
+import { mapState } from 'vuex'
+import { taskecl, patrolTask, tasknewst } from '@/api/index.js'
+// import banner from "@/static/img/banner.png";
+import tzicon from '@/static/img/tzicon.png'
+import nav1 from '@/static/img/navbar/nav1.png'
+import nav2 from '@/static/img/navbar/nav2.png'
+import nav3 from '@/static/img/navbar/nav3.png'
+import nav4 from '@/static/img/navbar/nav4.png'
+import nav5 from '@/static/img/navbar/nav5.png'
+import nav6 from '@/static/img/navbar/nav6.png'
+import nav7 from '@/static/img/navbar/nav7.png'
+import nav8 from '@/static/img/navbar/nav8.png'
+import cDisk from '@/components/c-disk/index.vue'
+export default {
+	components: {
+		cDisk
+	},
+	data() {
+		return {
+			ifOnShow: false, //页面刷新
+			taskCount: 0, //我收到的处理中的任务
+			//导航栏
+			nav_obj1: [
+				{
+					name: '公司简介',
+					icon: 'company',
+					url: '/pages/company/company',
+					imgurl: nav1,
+					size: 82.9
+				},
+				{
+					name: '数据中心',
+					icon: 'data_sys',
+					url: '/pages/datasys/datasys',
+					imgurl: nav2,
+					size: 82.9
+				},
+				{
+					name: '巡检路线',
+					icon: 'polling',
+					url: '/scan_pages/checkpoint/checkpoint',
+					imgurl: nav3,
+					size: 82.9
+				},
+				{
+					name: '巡检记录',
+					icon: 'polling_rcd',
+					url: '/scan_pages/patrolrecored/patrolrecored',
+					imgurl: nav4,
+					size: 82.9
+				}
+			],
+			nav_obj2: [
+				{
+					name: '临时任务',
+					icon: 'temporary_task',
+					url: '/task_pages/taskarrment/taskarrment',
+					imgurl: nav5,
+					size: 82.9
+				},
+				{
+					name: '任务查询',
+					icon: 'task_sear',
+					url: `/task_pages/taskarrment/tasklist/tasklist`,
+					imgurl: nav6,
+					size: 82.9
+				},
+				{
+					name: '资产查询',
+					icon: 'assert_sear',
+					url: '/pages/assetsear/assetsear',
+					imgurl: nav7,
+					size: 82.9
+				},
+				{
+					name: '库存查询',
+					icon: 'num_sear',
+					url: '/pages/numsear/numsear',
+					imgurl: nav8,
+					size: 82.9
+				}
+			],
+			//背景图
+			// banner: banner,
+			tzicon: tzicon, //图片
+			partlist: null,
+			taskdetail: null,
+			tabheight: null
+		}
+	},
+	computed: {
+		...mapState({
+			tabbar: (state) => state.tabbar.tabbar,
+			timer: (state) => state.user.timer
+		})
+	},
+	onHide() {
+		this.ifOnShow = true
+	},
+	onShow() {
+		if (this.ifOnShow) {
+			this.init()
+		}
+	},
+	onLoad() {
+		this.init()
+		this.tabheight = getApp().globalData.tabhei
+	},
+	//下拉刷新
+	onPullDownRefresh() {
+		this.init()
+		setTimeout(function () {
+			uni.stopPullDownRefresh()
+		}, 1000)
+	},
+	methods: {
+		//底部导航栏
+		beforeSwitch(id) {
+			if (id == 1) {
+				this.$store.dispatch('user/gettasklist')
+				return false
+			} else {
+				return true
+			}
+		},
+		//查看处理中任务列表
+		tsanavtask() {
+			this.$store.state.user.taskdetail = this.taskdetail
+			if (this.taskCount !== 0) {
+				uni.navigateTo({
+					url: `/task_pages/taskarrment/tasklist/tasklist?staus=${0}&id=${1}`
+				})
+			} else {
+				//只有一条任务跳转任务详情
+				uni.navigateTo({
+					url: '/task_pages/taskarrment/viewtask/viewtask'
+				})
+			}
+		},
+		//获取当日巡检列表与最新一条任务讯息
+		init() {
+			//获取当日巡检计划
+			patrolTask(this.timer).then(({ data }) => {
+				this.partlist = data.list
+			})
+			//获取最新任务
+			tasknewst().then(({ data }) => {
+				this.taskdetail = data
+			})
+			//获取我收到处理中的任务个数
+			taskecl().then(({ data }) => {
+				this.taskCount = 0
+				data.forEach((Element) => {
+					if (Element.status == 1) {
+						this.taskCount = Element.count
+					}
+				})
+			})
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+@import '@/static/css/chj.css';
+
+.home {
+	width: 100%;
+	background: #ffffff;
+	// border-top: 1rpx solid #000000;
+}
+
+.mai-color {
+	width: 100%;
+	background: #ffffff;
+}
+
+.info-swiper {
+	width: 100%;
+	height: 120rpx;
+	box-sizing: border-box;
+	background: #ffffff;
+	box-shadow: 0px 0px 13rpx 0px rgba(6, 0, 1, 0.11);
+	border-radius: 6rpx;
+	position: relative;
+
+	.info-ti {
+		width: 9rpx;
+		height: 44rpx;
+		background: #4a8bff;
+	}
+
+	.info-icon {
+		width: 58rpx;
+		height: 58rpx;
+		background: #ffffff;
+		box-shadow: 0px 0px 5rpx 0px rgba(6, 0, 1, 0.11);
+		border-radius: 50%;
+		margin-left: 15rpx;
+	}
+
+	.annou-title {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #000000;
+	}
+
+	.annou-cig {
+		font-size: 24rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #999999;
+		margin-top: 10rpx;
+	}
+
+	.hint {
+		width: 30rpx;
+		height: 30rpx;
+		margin-right: 30rpx;
+		border-radius: 50%;
+		background-color: #f19536;
+		font-size: 24rpx;
+		text-align: center;
+		line-height: 30rpx;
+		color: #fbeee5;
+	}
+
+	.right-icon {
+		position: absolute;
+		right: 14rpx;
+		width: 80rpx;
+	}
+}
+
+.to-menus {
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	background: #ffffff;
+	box-shadow: 0px 0px 13rpx 0px rgba(6, 0, 1, 0.11);
+	border-radius: 6rpx;
+
+	.nav-itm {
+		display: flex;
+		justify-content: space-around;
+		width: 100%;
+		height: 90px;
+	}
+}
+
+.scr-hei {
+	background: #ffffff;
+	box-shadow: 0px 0px 13rpx 0px rgba(6, 0, 1, 0.11);
+	border-radius: 6rpx;
+	position: relative;
+}
+
+.sc-view {
+	.u-progress-info {
+		font-size: 36rpx;
+		font-weight: 400;
+		color: #4a8bff;
+	}
+}
+</style>

+ 149 - 0
pages/onsitpection/person/person.vue

@@ -0,0 +1,149 @@
+<template>
+	<view class="u-flex f-d-c u-col-center u-relative person-config" style="overflow: hidden;">
+		<view class="u-flex user-box u-p-l-30 u-p-r-20 u-p-b-30 u-col-top">
+			<view class="u-flex u-m-t-30">
+				<view class="u-m-r-10 ">
+					<u-avatar mode="circle" size="110"></u-avatar>
+				</view>
+				<view v-if="user != null" class="u-flex-1">
+					<view class="u-font-18 u-p-b-10 rigt-font u-font-32">{{user.username}}</view>
+					<view class=" rigt-font u-font-24">部门:{{user.deptName}}</view>
+				</view>
+			</view>
+
+		</view>
+		<view class="u-m-t-20 meu-list u-relative">
+			<u-cell-group>
+				<navigator hover-class="none" :url="index.url" v-for="(index,key) in obj" :key="key">
+					<u-cell-item :title="index.title" :icon-style="{color:'#000000'}"
+						:title-style="{margin:'0rpx 0rpx 0rpx 14rpx',fontSize:'32rpx',color:'#000000'}" :icon-size='50'>
+						<u-icon slot="icon" size="50" :name="index.img"></u-icon>
+					</u-cell-item>
+				</navigator>
+			</u-cell-group>
+		</view>
+		<u-tabbar v-if="tabbar" :before-switch="beforeSwitch" :height="tabheight" :list="tabbar" :mid-button="true">
+		</u-tabbar>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex'
+	import pwd from '@/static/img/person/pwd.png'
+	import td from '@/static/img/person/td.png'
+	import qh from '@/static/img/person/qh.png'
+	export default {
+		data() {
+			return {
+				ifOnShow:false,
+				user: null,
+				obj: [
+					{
+						title: "我的团队",
+						icon: 'man-add-fill',
+						url: '/pages/myteam/myteam',
+						img: td,
+					}, {
+						title: "修改密码",
+						icon: 'lock-fill',
+						url: '/pages/login/forgetpwd/index',
+						img: pwd
+					}, {
+						title: "切换账户",
+						icon: 'coupon',
+						url: '/pages/login/login/index',
+						img: qh
+					}
+				],
+				tabheight: 0
+			}
+		},
+		computed: {
+			...mapState({
+				tabbar: state => state.tabbar.tabbar
+			})
+		},
+		onHide(){
+		
+		this.ifOnShow=true
+		
+		},
+		
+		onShow(){
+		
+		if(this.ifOnShow){
+			this.user = uni.getStorageSync("user")
+			this.tabheight = getApp().globalData.tabhei
+		}
+		
+		},
+		onShow() {
+				this.user = uni.getStorageSync("user")
+				this.tabheight = getApp().globalData.tabhei
+			},
+		methods: {
+			beforeSwitch(id) {
+				if (id == 1) {
+					this.$store.dispatch("user/gettasklist");
+					return false
+				} else {
+					return true
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #ededed;
+		overflow: hidden;
+	}
+
+	.person-config {
+		overflow: hidden;
+
+	}
+
+	.rigt-font {
+		color: #FFFFFF;
+	}
+
+	.camera {
+		width: 54px;
+		height: 44px;
+
+		&:active {
+			background-color: #ededed;
+		}
+	}
+
+	.user-box {
+		width: 751rpx;
+		height: 300rpx;
+		position: relative;
+		z-index: -1;
+
+		&::after {
+			content: '';
+			width: 140%;
+			height: 350rpx;
+			position: absolute;
+			left: -20%;
+			top: 0;
+			z-index: -1;
+			border-radius: 0 0 45% 45%;
+			background: #4A8BFF;
+		}
+	}
+
+	.meu-list {
+		width: 690rpx;
+		top: -100rpx;
+		height: 100vh;
+		background: #FFFFFF;
+
+	}
+</style>

+ 87 - 0
pages/onsitpection/selectplain/selectplain.vue

@@ -0,0 +1,87 @@
+<template>
+	<view class=" m-w u-flex f-d-c ">
+		<view class="scr-hei">
+			<!-- <scroll-view v-if="taskList != null && taskList.length > 0" @scrolltolower="getlist" :scroll-y="true" class="scr-hei "> -->
+			<view v-if="taskList.length > 0 " v-for="(index,key) in taskList" :key="key">
+				<slectdicsk :parobj="index"
+					:prourl="`/scan_pages/scanning/scanning?roomId=${roomId}&taskId=${index.id}`" />
+			</view>
+			<!-- </scroll-view> -->
+			<view v-if="taskList.length == 0">
+				<u-empty margin-top="400" text="暂无数据" mode="list"></u-empty>
+			</view>
+		</view>
+
+		<u-tabbar :height="tabheight" :before-switch="beforeSwitch" :list="tabbar" :mid-button="true"></u-tabbar>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+	} from 'vuex'
+	import slectdicsk from '@/components/slectdicsk/index.vue'
+	export default {
+		components: {
+			slectdicsk
+		},
+		data() {
+			return {
+				tabheight: 0,
+				taskList: []
+			}
+		},
+		computed: {
+			...mapState({
+				tabbar: state => state.tabbar.tabbar,
+				roomId: state => state.user.roomId
+			})
+		},
+		watch: {
+			taskList: {
+				deep: true,
+				immediate: true,
+				handler(n, o) {
+					// console.log('taskList', n)
+				}
+			}
+		},
+		onLoad() {
+			this.taskList = this.$store.state.user.taskList
+			this.tabheight = getApp().globalData.tabhei
+			this.getlist()
+		},
+		methods: {
+			//底部导航栏
+			beforeSwitch(id) {
+				if (id == 1) {
+					// this.taskList = this.$store.state.user.taskList
+					this.$store.dispatch("user/gettasklist");
+					return false;
+				} else {
+					return true;
+				}
+			},
+			//判定房间计划是否为一条 一条则直接跳转去巡检
+			async getlist() {
+				if (this.taskList.length == 1) {
+					const index = this.taskList[0]
+					uni.redirectTo({
+						url: `/scan_pages/scanning/scanning?roomId=${this.roomId}&taskId=${index.id}`,
+					})
+				}
+				// this.taskList.length == 0 && (this.taskList = null)
+			},
+		}
+	}
+</script>
+
+<style>
+	.scr-hei {
+		/* height: calc( 100vh - 74rpx ); */
+		background: #FFFFFF;
+		/* 	box-shadow: 0px 0px 6rpx 0px rgba(6, 0, 1,.3); */
+		border-radius: 10rpx 10rpx 0px 0px;
+		width: 750rpx;
+	}
+</style>

+ 234 - 0
pages/writeoff/exitwritoff/exitwritoff.vue

@@ -0,0 +1,234 @@
+<template>
+	<view class="m-w partol ">
+		<view class="logo-back">
+		</view>
+		<view class="title-font u-p-l-30 u-p-r-30">
+			<scroll-view class="cell-item">
+				<u-cell-group>
+					<u-cell-item title="访客姓名" :arrow="false"
+						:title-style="{fontSize:'28rpx',color:'#333333',fontWeight: 'bold'}">
+						<view slot="right-icon" class="rig-font">{{menulist.username}}</view>
+					</u-cell-item>
+					<u-cell-item title="访客手机号" :arrow="false"
+						:title-style="{fontSize:'28rpx',color:'#333333',fontWeight: 'bold'}">
+						<view slot="right-icon" class="rig-font">{{menulist.userPhone}}</view>
+					</u-cell-item>
+					<u-cell-item title="访客公司" :arrow="false"
+						:title-style="{fontSize:'28rpx',color:'#333333',fontWeight: 'bold'}">
+						<view slot="right-icon" class="rig-font">{{menulist.company}}</view>
+					</u-cell-item>
+					<u-cell-item title="进入事由" :arrow="false"
+						:title-style="{fontSize:'28rpx',color:'#333333',fontWeight: 'bold'}">
+						<view slot="right-icon" class="rig-font">{{menulist.reason}}</view>
+					</u-cell-item>
+				</u-cell-group>
+				<view class="u-m-l-30">
+					<view class="valabel  u-m-t-28  u-m-b-20">出厂备注</view>
+					<view class="span-textra ">
+						<textarea v-model="remark" style="width: 100%; height: 100%;"></textarea>
+					</view>
+					<view class="subscribe" @click="temporary">确定核销 </view>
+				</view>
+			</scroll-view>
+		</view>
+		<!-- 消息提示组件 -->
+		<u-toast ref="exToast" />
+	</view>
+</template>
+
+<script>
+	import {
+		visitorlast,
+		visitorupdate,
+		loginWeixin
+	} from '@/api/index'
+	export default {
+		data() {
+			return {
+				menulist: null,
+				textarea: "测试测试",
+				remark: ""
+			}
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			//获取openid
+			init() {
+				let openid = uni.getStorageSync("openid");
+				if (openid) {
+					this.getRecord()
+				} else {
+					uni.login({
+						provider: 'weixin',
+						success: loginRes => {
+							loginWeixin({
+									code: loginRes.code
+								})
+								.then(({
+									data,
+									code,
+									message
+								}) => {
+									if (code == 200) {
+										uni.setStorageSync('openid', data)
+										this.getRecord()
+									} else {
+										this.$refs.exToast.show({
+											title: code == 200 ? '查询成功' : message,
+											type: code == 200 ? "success" : "warning",
+										})
+									}
+
+								})
+						}
+					});
+				}
+			},
+			//获取登记记录
+			getRecord() {
+				let openid = uni.getStorageSync("openid");
+				visitorlast(openid)
+					.then(({
+						code,
+						data,
+						message
+					}) => {
+						this.menulist = data
+						this.$refs.exToast.show({
+							title: code == 200 ? '查询成功' : message,
+							type: code == 200 ? "success" : "warning",
+						})
+					})
+					.catch((err) => {
+						this.$refs.exToast.show({
+							title: err,
+							type: "error",
+						})
+					})
+			},
+			//核销按钮
+			temporary() {
+				visitorupdate({
+						id: this.menulist.id,
+						remark: this.remark
+					})
+					.then(({
+						data,
+						code,
+						message
+					}) => {
+						this.$refs.exToast.show({
+							title: code == 200 ? '核销成功' : message,
+							type: code == 200 ? "success" : "info",
+						})
+						setTimeout(() => {
+							uni.redirectTo({
+								url: "/pages/onsitpection/home/index"
+							})
+						}, 2000)
+					})
+					.catch((err) => {
+						this.$refs.exToast.show({
+							title: err,
+							type: "warning"
+						})
+					})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.partol {
+		height: 100vh;
+		background: #f0f2f5;
+
+		.subscribe {
+			width: 650rpx;
+			height: 90rpx;
+			background: #4A8BFF;
+			border-radius: 4rpx;
+			font-size: 28rpx;
+			text-align: center;
+			line-height: 90rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: bold;
+			color: #FFFFFF;
+			margin-top: 337rpx;
+		}
+
+		.logo-back {
+			width: 751rpx;
+			height: 350rpx;
+			position: relative;
+
+			&::after {
+				content: '';
+				width: 140%;
+				height: 350rpx;
+				position: absolute;
+				left: -20%;
+				top: 0;
+				border-radius: 0 0 45% 45%;
+				background: #4a8bff !important;
+			}
+
+		}
+
+		.valabel {
+			font-size: 28rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: bold;
+			color: #333333;
+		}
+
+		.span-textra {
+			width: 650rpx;
+			height: 160rpx;
+			border: 1px solid #AAAAAA;
+			border-radius: 4rpx;
+			padding: 22rpx;
+
+			textarea {
+				width: 100%;
+				height: 100%;
+				color: #000000;
+			}
+
+		}
+
+		.title-font {
+			width: 100%;
+			font-size: 28rpx;
+			font-weight: 400;
+			color: #FFFFFF;
+			position: absolute;
+			top: 75rpx;
+
+			.cell-item {
+				width: 690rpx;
+
+				height: calc(100vh - 70rpx);
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 0px 0px;
+				padding: 1rpx;
+				overflow-x: hidden;
+				box-sizing: border-box;
+
+			}
+
+			.rig-font {
+				font-size: 28rpx;
+				font-family: Microsoft YaHei-3970(82674968);
+				font-weight: 400;
+				color: #808080;
+			}
+		}
+
+		view {
+			line-height: 1;
+		}
+	}
+</style>

+ 497 - 0
pages/writeoff/register/register.vue

@@ -0,0 +1,497 @@
+<template>
+	<view class="m-w partol ">
+		<!-- logo -->
+		<view class="logo-back"></view>
+		<!-- 机房制度弹窗 -->
+		<u-popup :mask-close-able="false" mode="top" v-model="explain_show" width="650rpx">
+			<scroll-view scroll-y="true" style="height: 900rpx;">
+				<view class="content u-p-l-24 u-p-r-24 u-p-t-22">
+					<view v-html="content">
+						{{content}}
+					</view>
+					<view class="confrim-btn1">
+						<u-button type="primary" @click="explain_show = false;">已阅读并同意执行
+						</u-button>
+					</view>
+				</view>
+			</scroll-view>
+		</u-popup>
+		<!-- 表单 -->
+		<view class=" m-w title-font u-p-l-30 u-p-r-30">
+			<view class=" m-w u-flex u-m-t-30 u-col-center">
+				<u-image :src="logo" width="70" height="70"></u-image>
+				<view class="u-m-l-14">
+					<view class="u-font-32">赣西云出入系统</view>
+					<view class="u-font-28 u-m-t-14" style="color: rgba(255, 255, 255, .4);">带*号为必填项</view>
+				</view>
+			</view>
+			<scroll-view class="cell-item u-p-l-20 u-p-r-20">
+				<u-form ref="uForm" label-position="top" :model="form">
+					<c-form-item :required="true" label="姓名" prop="username">
+						<u-input placeholder="请输入名字" :border="true" v-model="form.username" />
+					</c-form-item>
+					<c-form-item :required="true" label="手机号" prop="userPhone">
+						<u-input type="number" placeholder="请输入手机号" :border="true" v-model="form.userPhone" />
+					</c-form-item>
+					<c-form-item :required="true" label="访客时长(h)" prop="duration">
+						<u-input type="number" placeholder="请输入访客时长" :border="true" v-model="form.duration" />
+					</c-form-item>
+					<c-form-item :required="true" label="访客公司" prop="company">
+						<u-input placeholder="请输入访客公司" :border="true" v-model="form.company" />
+					</c-form-item>
+					<c-form-item :required="true" label="事由" prop="reason">
+						<u-input placeholder="请选择事由" :border="true" v-model="form.reason" />
+					</c-form-item>
+					<c-form-item label="是否高风险" prop="highRiskname">
+						<u-input placeholder="请选择" @click="highRisktshow = true" type="select" :border="true"
+							v-model="form.highRiskname" />
+						<u-select :default-value="[1]" v-model="highRisktshow" :list="actionSheetList"
+							@confirm="highRisonok"></u-select>
+					</c-form-item>
+					<c-form-item label="上传行程码" prop="contactname">
+						<view>
+							<view class="u-p-l-20 u-p-r-10 u-m-t-20 u-m-b-20 u-flex ">
+								<c-img ref="img1" @changeImg="changeImg1($event)"></c-img>
+							</view>
+						</view>
+					</c-form-item>
+					<c-form-item label="上传健康码" prop="confirmname">
+						<view>
+							<view class="u-p-l-20 u-p-r-10 u-m-t-20 u-m-b-20 u-flex ">
+								<c-img ref="img2" @changeImg="changeImg2($event)"></c-img>
+							</view>
+						</view>
+					</c-form-item>
+					<c-form-item label="上传相关审核资料" prop="uploadimg">
+						<view>
+							<view class="u-p-l-20 u-p-r-10 u-m-t-20 u-m-b-20  u-flex  ">
+								<c-img ref="img3" @changeImg="changeImg3($event)"></c-img>
+							</view>
+						</view>
+					</c-form-item>
+				</u-form>
+				<view class="procol u-flex u-row-left u-m-t-20 u-m-b-20">
+					<u-radio-group v-model="value">
+						<u-radio label-size="28rpx" shape="square" v-for="(item, index) in fa_list" :key="index"
+							:name="item.name" :disabled="item.disabled">
+							已阅读并同意{{item.name}}
+						</u-radio>
+					</u-radio-group>
+					<view class="detail_procol" @click="show = true">查看</view>
+				</view>
+				<view class="sumit u-m-b-32" @click="resbtn()">提交申请</view>
+			</scroll-view>
+		</view>
+		<!-- 隐私协议弹窗 -->
+		<u-popup border-radius="15" mode="center" v-model="show" width="650rpx">
+			<view class="content">
+				<scroll-view scroll-y="true" style="height: 900rpx;">
+					<view>
+						<h2 style="text-align: center; margin-top: 20rpx; margin-bottom: 20rpx; font-weight: 700;">
+							《运维智慧掌中宝小程序隐私保护指引》</h2>
+						<p>本指引是运维智慧掌中宝小程序开发者 "江西省邮电建设工程有限公司"(以下简称“开发者”)为处理你的个人信息而制定。</p>
+						<p>开发者处理的信息</p>
+						<p>根据法律规定,开发者仅处理实现小程序功能所必要的信息。</p>
+						<p>为了方便对访问者进行电话回访,开发者将在获取你的明示同意后,收集你的手机号。</p>
+						<p>你的权益:</p>
+						<p>关于你的个人信息,你可以通过以下方式与开发者联系,行使查阅、复制、更正、删除等法定权利。</p>
+						<p>邮箱:3182863831@qq.com</p>
+						<p>开发者对信息的存储</p>
+						<p>开发者承诺,除法律法规另有规定外,开发者对你的信息的保存期限应当为实现处理目的所必要的最短时间。</p>
+						<p>信息的使用规则:</p>
+						<p>开发者将会在本指引所明示的用途内使用收集的信息</p>
+						<p>如开发者使用你的信息超出本指引目的或合理范围,开发者必须在变更使用目的或范围前,再次以短信方式告知并征得你的明示同意。</p>
+						<p>信息对外提供</p>
+						<p>开发者承诺,不会主动共享或转让你的信息至任何第三方,如存在确需共享或转让时,开发者应当直接征得或确认第三方征得你的单独同意。</p>
+						<p>开发者承诺,不会对外公开披露你的信息,如必须公开披露时,开发者应当向你告知公开披露的目的、披露信息的类型及可能涉及的信息,并征得你的单独同意。</p>
+						<p>你认为开发者未遵守上述约定,或有其他的投诉建议、或未成年人个人信息保护相关问题,可通过以下方式与开发者联系;或者向微信进行投诉。</p>
+					</view>
+				</scroll-view>
+				<view class="confrim-btn">
+					<u-button type="primary" @click="topup1()">已阅读</u-button>
+				</view>
+			</view>
+		</u-popup>
+		<!-- 消息提示组件 -->
+		<u-toast ref="regToast" />
+	</view>
+</template>
+
+<script>
+	import cImg from '@/components/c-img/index.vue'
+	import logo from '@/static/img/logo.png'
+	import {
+		loginWeixin,
+		visitorsave,
+		getMachineInstitu
+	} from '@/api/index.js'
+	export default {
+		components: {
+			cImg,
+		},
+		data() {
+			return {
+				logo,
+				show: false, //用户隐私协议弹窗
+				explain_show: true, //规章制度弹窗
+				form: {
+					openid: undefined, //微信openid
+					username: undefined, //用户名
+					userPhone: undefined, //手机
+					company: undefined, //公司
+					reason: undefined, //事由
+					duration: undefined, //时长
+					highRisk: undefined, //高风险
+					highRiskname: undefined, //高风险文字
+					itineraryCode: undefined, //行程码
+					healthCode: undefined, //健康码
+					information: undefined, //审核资料
+				},
+				highRisktshow: false, //高风险选择弹窗
+				//选择列表
+				actionSheetList: [{
+						value: true,
+						label: '是'
+					},
+					{
+						value: false,
+						label: '否'
+					}
+				],
+				//校验规则
+				rules: {
+					username: [{
+						required: true,
+						message: '请输入名字',
+						// 可以单个或者同时写两个触发验证方式
+						trigger: 'blur,change'
+					}],
+					userPhone: [{
+							required: true,
+							message: '请输入手机号',
+							trigger: 'change'
+						},
+						{
+							// 自定义验证函数,见上说明
+							validator: (rule, value, callback) => {
+								// 上面有说,返回true表示校验通过,返回false表示不通过
+								// this.$u.test.mobile()就是返回true或者false的
+								return this.$u.test.mobile(value);
+							},
+							message: '手机号码不正确',
+							// 触发器可以同时用blur和change
+							trigger: ['change', 'blur'],
+						}
+					],
+					duration: [{
+							required: true,
+							message: '请输入访问时长',
+							trigger: 'change',
+							type: 'number'
+						},
+						{
+							// 自定义验证函数,见上说明
+							validator: (rule, value, callback) => {
+								// 上面有说,返回true表示校验通过,返回false表示不通过
+								// this.$u.test.mobile()就是返回true或者false的
+								return 0 < value && value <= 24;
+							},
+							message: '访问时长必须0~24小时以内',
+							// 触发器可以同时用blur和change
+							trigger: ['change', 'blur'],
+						}
+					],
+					company: [{
+						required: true,
+						message: '请输入来访公司',
+						trigger: 'change'
+					}],
+					reason: [{
+						required: true,
+						message: '请选择事由',
+						trigger: 'change'
+					}],
+				},
+				//用户协议选择
+				fa_list: [{
+					name: '《用户服务协议》及《隐私政策》',
+					disabled: false
+				}],
+				value: '', //用户协议按钮文字
+				content: '' //机房制度
+			}
+		},
+		onReady() {
+			this.$refs.uForm.setRules(this.rules);
+		},
+		onLoad() {
+			this.autoWrite(); //缓存访客信息
+			this.getInstitu(); // 机房制度信息获取
+			this.init(); //获取openid
+		},
+		methods: {
+			//填写访客信息缓存
+			autoWrite() {
+				let visitor = uni.getStorageSync("visitor");
+				if(visitor) {
+					this.form.username = visitor.username;
+					this.form.userPhone = visitor.userPhone;
+					this.form.company = visitor.company;
+					this.form.reason = visitor.reason;
+					this.form.duration = visitor.duration;
+				} else{
+					return false
+				}
+			},
+			//获取机房制度
+			async getInstitu() {
+				let {
+					data,
+					code,
+					message
+				} = await getMachineInstitu();
+				if (code === 200) {
+					this.content = data.content;
+				} else {
+					this.$refs.regToast.show({
+						title: message,
+						type: "info",
+					})
+				}
+			},
+			//用户保护协议弹窗
+			topup1() {
+				this.show = !this.show;
+				this.value = '《用户服务协议》及《隐私政策》';
+			},
+			changeImg1(img) {
+				this.form.itineraryCode = img;
+			},
+			changeImg2(img) {
+				this.form.healthCode = img;
+			},
+			changeImg3(img) {
+				this.form.information = img;
+			},
+			//获取openid
+			init() {
+				uni.login({
+					provider: 'weixin',
+					success: loginRes => {
+						loginWeixin({
+								code: loginRes.code
+							})
+							.then(({
+								data,
+								code,
+								message
+							}) => {
+								if (code == 200) {
+									uni.setStorageSync('openid', data)
+									this.form.openid = data
+								} else {
+									this.$refs.regToast.show({
+										title: message,
+										type: "info",
+									})
+								}
+							})
+					}
+				});
+			},
+			resbtn() {
+				//提交访客信息
+				if (this.value == '') {
+					this.$refs.regToast.show({
+						title: "未勾选用户隐私协议",
+						type: "info",
+					})
+				} else {
+					this.$refs.uForm.validate(valid => {
+						if (valid) {
+							visitorsave(
+								this.form
+							).then(({
+								data,
+								code,
+								message
+							}) => {
+								this.$refs.regToast.show({
+									title: code == 200 ? '提交成功' : message,
+									type: code == 200 ? "success" : "info",
+								})
+								if (code == 200) {
+									this.setWrite();
+									this.reset();
+								} else {
+									console.log('验证失败');
+								}
+							})
+
+						};
+					})
+				}
+			},
+			//重置表单
+			reset() {
+				this.form = {
+					username: '',
+					userPhone: '',
+					company: '',
+					reason: '',
+					duration: '', 
+					highRiskname: '',
+					highRisk: '',
+					itineraryCode: [],
+					healthCode: [],
+					informationv: [],
+				}
+				this.$refs.img1.reset()
+				this.$refs.img2.reset()
+				this.$refs.img3.reset()
+			},
+			//缓存访客信息
+			setWrite() {
+				let visitor = {
+					username: this.form.username,
+					userPhone: this.form.userPhone,
+					company: this.form.company,
+					reason: this.form.reason,
+					duration: this.form.duration
+				}
+				uni.setStorageSync("visitor", visitor);
+			},
+			//是否风险区选择
+			highRisonok(e) {
+				this.form.highRisk = e[0].value
+				this.form.highRiskname = e[0].label
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.partol {
+		background: #f0f2f5;
+		overflow: hidden;
+
+		.logo-back {
+			width: 751rpx;
+			height: 300rpx;
+			position: relative;
+
+			&::after {
+				content: '';
+				width: 140%;
+				height: 300rpx;
+				position: absolute;
+				left: -20%;
+				top: 0;
+				border-radius: 0 0 45% 45%;
+				background: #4a8bff !important;
+			}
+
+		}
+
+		.title-font {
+			width: 690rpx;
+			font-size: 28rpx;
+			font-weight: 400;
+			color: #FFFFFF;
+			position: absolute;
+			top: 0;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+
+			.cell-item {
+				width: 690rpx;
+
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 0px 0px;
+				padding: 1rpx;
+				margin-top: 35rpx;
+				box-sizing: border-box;
+			}
+
+			.rig-font {
+				font-size: 28rpx;
+				font-family: Microsoft YaHei-3970(82674968);
+				font-weight: 400;
+				color: #808080;
+			}
+		}
+
+		view {
+			line-height: 1;
+		}
+
+		.sumit {
+			width: 650rpx;
+			height: 90rpx;
+			background: #4A8BFF;
+			border-radius: 4rpx;
+			font-size: 28rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: bold;
+			color: #FFFFFF;
+			text-align: center;
+			line-height: 90rpx;
+		}
+
+		.procol {
+			width: 690rpx;
+			height: 90rpx;
+			text-align: center;
+			line-height: 90rpx;
+		}
+
+		.detail_procol {
+			font-size: 28rpx;
+			color: #4A8BFF;
+		}
+
+		.upload-image {
+			line-height: 32px !important;
+		}
+
+		.content {
+			display: flex;
+			flex-direction: column;
+			justify-content: flex-start;
+			align-items: center;
+		}
+
+		.content p {
+			margin-left: 10rpx;
+			margin-bottom: 10rpx !important;
+			font-size: 28rpx;
+			line-height: 30rpx;
+			text-align: left;
+		}
+
+		.confrim-btn1 {
+			width: 620rpx;
+			height: 100rpx;
+			font-size: 24rpx;
+			font-weight: 400;
+			text-align: center;
+			margin-bottom: 20rpx;
+			margin-top: 30rpx;
+		}
+
+		.confrim-btn {
+			width: 400rpx;
+			height: 100rpx;
+			text-align: center;
+			margin-bottom: 20rpx;
+			margin-top: 30rpx;
+			// margin-left: 125rpx;
+		}
+
+		.u-radio__label {
+			margin-left: 10rpx !important;
+			margin-right: 0rpx !important;
+		}
+	}
+</style>

+ 278 - 0
scan_pages/checkdetail/checkdetail.vue

@@ -0,0 +1,278 @@
+<template>
+	<view class="u-flex f-d-c m-w">
+		<view class="m-w u-m-t-30 u-p-l-20 u-p-r-20 " v-if="conten != null">
+			<!-- 基本信息 -->
+			<view @click="lintext(conten.name)" class="u-flex u-row-between border-bottom u-p-b-20 u-p-t-20">
+				<view style="font-weight: bold;color: #333333;" class=" u-f-28">点位名称</view>
+				<view class="u-line-1  u-text-right u-f-28" style="width: 342rpx;color: #808080;">{{conten.name}}
+				</view>
+			</view>
+			<view @click="lintext(conten.number)" class="u-flex u-row-between border-bottom u-p-b-20 u-p-t-20">
+				<view style="font-weight: bold;color: #333333;" class=" u-f-28">房间编号</view>
+				<view class="u-line-1  u-text-right u-f-28" style="width: 342rpx;color: #808080;">{{conten.number}}
+				</view>
+			</view>
+			<view @click="lintext()" class="u-flex u-row-between border-bottom u-p-b-20 u-p-t-20">
+				<view style="font-weight: bold;color: #333333;" class=" u-f-28">房间位置</view>
+				<view class="u-line-1  u-text-right u-f-28" style="width: 342rpx;color: #808080;">
+					{{conten.buildingName + conten.floorName}}
+				</view>
+			</view>
+			<view @click="lintext(conten.routeName)" class="u-flex u-row-between border-bottom u-p-b-20 u-p-t-20">
+				<view style="font-weight: bold;color: #333333;" class=" u-f-28">巡检路线</view>
+				<view class="u-line-1  u-text-right u-f-28" style="width: 342rpx;color: #808080;">{{conten.routeName}}
+				</view>
+			</view>
+			<!-- 巡检项目头 -->
+			<view class="collect_tit u-flex u-row-left u-col-center">
+				<view class="tit">
+					巡检项目
+				</view>
+				<image :src="icon1"></image>
+				<span>设备:{{conten.devices.length + 1}}件</span>
+				<image :src="icon2"></image>
+				<span>项目:{{checkItemCount}}个</span>
+			</view>
+			<block>
+				<!--自带项目巡检-设备名 -->
+				<label class="sel_point u-flex u-row-between" @click="sel_show1">
+					<view class="sel_tit u-flex u-row-left u-m-l-26">
+						<span>{{conten.name}}自带项目</span>
+						<!-- <sup class="sup">*</sup> -->
+					</view>
+					<view class="triangle u-m-r-26" :style="tri_style1">
+					</view>
+				</label>
+				<!-- 检查项 -->
+				<block class="scan_itm1" v-if="itm1_show" >
+					<view v-for="(iam,i) in conten.checkItems" :key="i">
+						<view @click="lintext(iam.name)" class="u-flex u-row-between border-bottom u-p-b-34 u-p-t-34">
+							<view class="item-name">{{show_itemType(iam.itemType)}}</view>
+							<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{iam.name}}</view>
+						</view>
+					</view>
+				</block>
+			</block>
+			
+			
+			<block v-for="(item,i) in conten.devices" :key="item.id">
+				<!-- 设备巡检-设备名 -->
+				<label class="sel_point u-flex u-row-between" @click="sel_show(i)">
+					<view class="sel_tit u-flex u-row-left u-m-l-26">
+						<span>{{item.name}}</span>
+						<!-- <sup class="sup">*</sup> -->
+					</view>
+					<view class="triangle u-m-r-26" :style="sel_style[i].tri_style">
+					</view>
+				</label>
+				<!-- 检查项 -->
+					<block class="scan_itm1"  v-if="sel_style[i].it_show">
+						<view v-for="ite in item.checkItems" :key="ite.id">
+							<view @click="lintext(ite.name)" class="u-flex u-row-between border-bottom u-p-b-34 u-p-t-34">
+								<view class="item-name">{{show_itemType(ite.itemType)}}</view>
+								<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{ite.name}}</view>
+							</view>
+						</view>
+					</block>
+			</block>
+			
+		</view>
+		<u-top-tips ref="chektost"></u-top-tips>
+	</view>
+</template>
+
+<script>
+	import icon1 from '@/static/img/devi.png'
+	import icon2 from '@/static/img/proj.png'
+	import {
+		pointDetailForMobile,
+		pointDetail
+	} from '@/api/index.js'
+	export default {
+		data() {
+			return {
+				icon1: icon1,
+				icon2: icon2,
+				tri_style1: '', //自带项目三角形样式变化
+				itm1_show: true,//自带项目三角形样式变化
+				sel_style:[],
+				conten: undefined,
+				checkItemCount:0
+			}
+		},
+		onLoad(option) {
+			if(option.routeId) {
+				this.pointdetail(option.id, option.routeId)
+			} else {
+				this.unstartPointdetail(option.roomId, option.taskId)
+			}
+			
+		},
+		methods: {
+			//自带项目三角样式变化
+			sel_show1() {
+				this.itm1_show = !this.itm1_show;
+				if (!this.itm1_show) {
+					this.tri_style1 =
+						'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+				} else {
+					this.tri_style1 =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;';
+				}
+			},
+			//设备三角形样式变化
+			sel_show(index) {
+				this.sel_style[index].it_show = !this.sel_style[index].it_show
+				
+				if (!this.sel_style[index].it_show) {
+					this.sel_style[index].tri_style =
+						'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+				} else {
+					this.sel_style[index].tri_style =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;';
+				}
+			},
+			show_itemType(type) {
+				switch (type) {
+					case 1:
+						return "选择项"
+						break;
+					case 2:
+						return "数字项"
+						break;
+					case 3:
+						return "文本项"
+						break;
+					default:
+						return "拍照项"
+						break;
+				}
+			},
+			//巡检路线跳转过来-房间详情
+			pointdetail(id, routeId) {
+				pointDetailForMobile({
+						id,
+						routeId
+					})
+					.then(({
+						data
+					}) => {
+						this.conten = data
+						//计算设备数量以及生成虚拟选择下拉样式变更表
+						 data.devices.forEach(i => {
+							this.checkItemCount += i.checkItems.length 
+							let obj = {}
+							obj.tri_style = 'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;'
+							obj.it_show = true
+							this.sel_style.push(obj)
+						})
+						this.checkItemCount +=  data.checkItems.length
+					})
+			},
+			//未巡检房间跳转过来-房间详情
+			unstartPointdetail(roomId, taskId) {
+				pointDetail({
+						roomId,
+						taskId
+					})
+					.then(({
+						data
+					}) => {
+						this.conten = data
+						//计算设备数量以及生成虚拟选择下拉样式变更表
+						 data.devices.forEach(i => {
+							this.checkItemCount += i.checkItems.length 
+							let obj = {}
+							obj.tri_style = 'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;'
+							obj.it_show = true
+							this.sel_style.push(obj)
+						})
+						this.checkItemCount +=  data.checkItems.length
+					})
+			},
+			lintext(text) {
+				this.$refs.chektost.show({
+					title: text,
+					type: 'primary',
+					duration: '2300'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		width: 100%;
+		height: 100%;
+		background: #FFFFFF
+	}
+
+	.item-name {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+		box-sizing: border-box;
+	}
+
+	.item-config {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #808080;
+		box-sizing: border-box;
+	}
+
+	.border-bottom {
+		border-bottom: 3rpx solid #d7d1d1;
+	}
+
+	.collect_tit {
+		width: 710rpx;
+		height: 104rpx;
+
+		.tit {
+			width: 128rpx;
+			height: 33rpx;
+			margin-left: 30rpx;
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #010101;
+		}
+
+		image {
+			max-width: 24rpx;
+			max-height: 24rpx;
+			margin-left: 42rpx;
+			margin-top: 12rpx;
+		}
+
+		span {
+			height: 24rpx;
+			margin-left: 10rpx;
+			font-size: 24rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #808080;
+		}
+	}
+
+	.sel_point {
+		width: 710rpx;
+		height: 70rpx;
+		background: #EBF8FF;
+
+		.sup {
+			color: red;
+		}
+
+		.triangle {
+			margin-top: 10rpx;
+			display: inline-block;
+			/* Base Style */
+			border: solid 10rpx transparent;
+			border-top-color: #808080;
+		}
+	}
+</style>

+ 186 - 0
scan_pages/checkpoint/checkpoint.vue

@@ -0,0 +1,186 @@
+<template>
+	<view class="u-flex f-d-c m-w" style="border-top: 1px solid #CCCCCC;">
+		<!-- <view style="background: #FFFFFF;" class="m-w u-p-l-20 u-p-r-20 u-p-t-24  u-p-b-24 ">
+			<cSearch placeholder="查询" @serbtn="setrch()"  ></cSearch>
+		</view> -->
+		<view class="m-w">
+			<cDropdow :options="options1" title="全部巡检路线" @getroomList="getCheckRooms"></cDropdow>
+		</view>
+		<!-- <u-dropdown style="width: 50%;">
+			<u-dropdown-item v-model="value1" title="全部巡检路线" :options="options1"></u-dropdown-item>
+		</u-dropdown> -->
+		<scroll-view @scrolltolower="lazyGetRooms()" :scroll-y="true" class="sc-view u-p-l-10 u-p-r-10">
+			<u-cell-group style="width: 100%;">
+				<navigator class="u-border-bottom" style="border: solid 3rpx #FFFFFF;" hover-class="none" :url="`../checkdetail/checkdetail?id=${item.id}&routeId=${item.routeId}`"
+					v-for="(item,index) in cellmenu" :key="item.number">
+					<u-cell-item  :border-top="false" :border-bottom="false" bg-color="#ffffff" :key="index"
+						:label-style="{'fontSize':'28rpx', 'color':'rgba(80, 80, 80, 1)'}"
+						:icon-style="{'color':'#B3B3B3'}"
+						:title-style="{'color':'#000','fontSize':'32rpx','fontWeight':' blod'}" :arrow="false"
+						:label="item.name" :title="item.number">
+						<u-icon name="arrow-right" slot="right-icon" color="#B3B3B3" size="38"></u-icon>
+					</u-cell-item>
+					<!-- <view style=" height: 3rpx;width: 100%; background: #FFFFFF;"></view> -->
+				</navigator>
+			</u-cell-group>
+			<view style="overflow: hidden;">
+				<u-loadmore :status="status" :icon-type="iconType" :load-text="loadText" />
+			</view>
+		</scroll-view>
+		<u-toast ref="chckToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	import cSearch from '@/components/c-search/index'
+	import cDropdow from '../components/c-dropdown/index'
+	import debounce from '@/util/debounce/debounce.js'
+	import {
+		checkOption,
+		checkRooms
+	} from '@/api/index.js'
+	export default {
+		name: "checkpoint",
+		components: {
+			cSearch,
+			cDropdow
+		},
+		data() {
+			return {
+				option_name: '',//子组件传的路线选项值
+				options1: [], //路线选项数组
+				cellmenu: [], //房间数组
+				//请求数据
+				queryform: {
+					pageSize: 10,
+					currPage: 1,
+					pointName: ""
+				},
+				currentPage: 0,//当前页
+				totalCount: -1,//总个数
+				//下拉加载配置
+				status: 'loadmore',
+				iconType: 'flower',
+				loadText: {
+					loadmore: '轻轻上拉',
+					loading: '努力加载中',
+					nomore: '实在没有了'
+				}
+			}
+		},
+		onLoad() {
+			this.getCheckOption()
+			this.getCheckRooms(null, -1)
+		},
+		methods: {
+			//获取巡检路线选项
+			async getCheckOption() {
+				let {
+					data
+				} = await checkOption()
+				this.options1.length = 0;
+				data.forEach(i => {
+					let obj = new Object;
+					obj.label = i.name;
+					obj.value = i.id;
+					this.options1.push(obj)
+				})
+				this.options1.push({
+					label: '全部巡检路线',
+					value: null
+				})
+			},
+			//获取路线所有房间
+			async getCheckRooms(option_name, index) {
+				this.option_name = option_name
+				if (index == -1 || this.totalCount == -1) {
+					this.cellmenu = []
+					this.currentPage = 1
+					if (option_name) {
+						let {
+							data
+						} = await checkRooms({
+							id: option_name,
+							page: 1,
+							size: 10,
+						})
+						this.cellmenu = data.list
+						this.totalCount = data.total
+					} else {
+						let {
+							data
+						} = await checkRooms({
+							page: 1,
+							size: 10,
+						})
+						this.cellmenu = data.list
+						this.totalCount = data.total
+					}
+				} else {
+					let curPage = this.currentPage + 1
+					if (this.cellmenu.length < this.totalCount) {
+						if (option_name) {
+							let {
+								data
+							} = await checkRooms({
+								id: option_name,
+								page: curPage,
+								size: 10,
+							})
+							data.list.forEach(i => {
+								this.cellmenu.push(i)
+							})
+							this.currentPage = this.currentPage + 1
+						} else {
+							let {
+								data
+							} = await checkRooms({
+								page: curPage,
+								size: 10,
+							})
+							data.list.forEach(i => {
+								this.cellmenu.push(i)
+							})
+							this.currentPage = this.currentPage + 1
+						}
+					} else if (this.cellmenu.length = this.totalCount) {
+						this.$refs.chckToast.show({
+							title: '没有更多了',
+							type: 'info',
+						})
+					}
+				}
+			},
+			//懒加载房间数据
+			lazyGetRooms() {
+				let timer = null
+				return (() => {
+					if (this.cellmenu.length == this.totalCount) this.status = 'nomore';
+					this.status = 'loading';
+					if(timer) {
+						 clearTimeout(timer)
+					}
+				 timer = setTimeout(() => {
+					 this.getCheckRooms(this.option_name,1)
+					 if (this.cellmenu.length == this.totalCount) this.status = 'nomore';
+					 else this.status = 'loading';
+				 }, 2000)
+				})()
+			}
+		}
+	}
+</script>
+
+<style>
+	page {
+		background: #ffffff;
+	}
+
+	.sc-view {
+		height: calc(100vh - 84rpx);
+		width: 690rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 0px 6rpx 0px rgba(6, 0, 1, 0.26);
+		border-radius: 10rpx 10rpx 0px 0px;
+	}
+</style>

+ 52 - 0
scan_pages/components/c-dropdown/index.vue

@@ -0,0 +1,52 @@
+<template>
+	<view>
+		<u-dropdown v-if="options != null"   style="width:100%; display: flex;">
+			<u-dropdown-item height="450"  @change="changitem" v-model="value" :title="ctitle" :options="options"></u-dropdown-item>
+		</u-dropdown>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			title: {
+				type: String,
+			},
+			options: {
+				type: Array
+			},
+
+		},
+		data() {
+			return {
+				ctitle: "",
+				value:''
+			}
+
+		},
+		created() {
+			this.ctitle = this.title
+		},
+		
+		methods: {
+			changitem(val) {
+				let item = this.itemfind(val)
+				this.ctitle = item.label
+				this.$emit("getroomList", val,-1)
+			},
+			//查找标题
+			itemfind(index) {
+				return this.options.find(e => e.value == index)
+			},
+		}
+	}
+</script>
+
+<style>
+	.u-dropdown {
+	display: flex;
+	}
+	.u-dropdown__menu{
+		border: 1px solid red;
+	}
+</style>

+ 235 - 0
scan_pages/patrol/patrol.vue

@@ -0,0 +1,235 @@
+<template>
+	<!-- 巡检进度页 -->
+	<view class="m-w partol ">
+		<view class="logo-back">
+		</view>
+		<view class="title-font m-w  u-p-l-30 u-p-r-30">
+			<view class=" m-w u-m-t-10">
+				<view class="u-f-32 f-w-b">{{parobj.name}}</view>
+				<view class="u-m-t-16 u-flex">
+					<view class="u-m-r-14">开始时间:{{beginTime.slice(0,-3)}}</view>
+					<view class="u-m-r-14">
+						<u-tag :text="status[statusType].text" :color="status[statusType].color" />
+					</view>
+				</view>
+				<view class="u-m-t-16">截至时间:{{endTime.slice(0,-3)}}</view>
+				<view class="u-m-t-20">今日巡查:{{parobj.completed}}/{{parobj.total}}</view>
+				<view class="u-m-t-20 u-flex">
+					<view>完成进度:</view>
+					<view style="width: 255rpx; height: 30rpx;">
+						<u-line-progress :show-percent="false" active-color="#ffffff" :round="true"
+							inactive-color="rgba(255, 255, 255, .3)" :percent="Math.round((parobj.completed/parobj.total)*100)">
+						</u-line-progress>
+					</view>
+					<view class="u-m-l-20">{{Math.round((parobj.completed/parobj.total)*100)}}%</view>
+				</view>
+			</view>
+			<scroll-view :scroll-y="true" class="cell-item u-m-t-40 u-p-l-20 u-p-r-20 ">
+				<view @click="checkdeatal(index,parobj.id)" class="u-flex menu-list" v-for="(index,key) in parobj.rooms"
+					:key="key">
+					<view class="item-left-title">{{key+1}}</view>
+					<block v-if="!index.completed">
+						<u-image :src="imgstatus[3]" width="80" height="80"></u-image>
+					</block>
+					<block v-else>
+						<u-image :src="imgstatus[index.qualified==true?1:2]" width="80" height="80"></u-image>
+					</block>
+
+					<view class="item-right-font">
+						<view>点编号:{{index.name}}</view>
+						<view class="u-m-t-20">设备名称:{{index.number}}</view>
+					</view>
+					<view class="uicon">
+						<u-icon name="arrow-right" size="30" color="rgba(153, 153, 153, 1)"></u-icon>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+		<view class="sumit" @click="saoma(1)">扫码巡检</view>
+	</view>
+</template>
+
+<script>
+	import dayjs from "dayjs";
+	import backtitle from '@/static/img/partrol/back.png'
+	import hege from '@/static/img/hege.png'
+	import bhg from '@/static/img/bhg.png'
+	import wks from '@/static/img/wks.png'
+	import {
+		patrolTaskinfo,
+		pointDetailForMobile,
+		getPointInfoOfScanaa
+	} from '@/api/index.js'
+	export default {
+		data() {
+			return {
+				backtitle,
+				imgstatus: ["", hege, bhg, wks],
+				parobj: "",
+				status: ["", {
+					text: "暂未巡检",
+					color: "#002AC5"
+				}, {
+					text: "进行中",
+					color: "#CF6100"
+				}, {
+					text: "已结束",
+					color: "#009C33"
+				}, {
+					text: "超时漏检",
+					color: "red"
+				},{
+					text: "超时完成",
+					color: "yellow"
+				}],
+				taskId: -1,
+				statusType: ''
+			}
+		},
+		onLoad({
+			taskId,
+			status
+		}) {
+			this.taskId = taskId
+			this.statusType = status
+			this.init(taskId)
+		},
+		methods: {
+			saoma(id) {
+				if(id==1){
+					this.$store.dispatch("user/gettasklist"); 
+					return false
+				}else{
+					return true
+				}
+			},
+			checkdeatal(row, renwuid) {
+				const {
+					completed,
+					id,
+					qualified
+				} = row
+				if (completed) {
+					uni.navigateTo({
+						url: `../patroldetail/patroldetail?roomId=${id}&taskId=${renwuid}`
+					})
+				} else  {
+					uni.navigateTo({
+						url: `../checkdetail/checkdetail?roomId=${id}&taskId=${renwuid}`
+					})
+				}
+			},
+			async init(id) {
+				let {
+					data
+				} = await patrolTaskinfo(id)
+				this.parobj = data
+			}
+		},
+		computed: {
+			beginTime() {
+				return dayjs(this.parobj.beginTime).format("YYYY-MM-DD HH:mm:ss")
+			},
+			endTime() {
+				return dayjs(this.parobj.endTime).format("YYYY-MM-DD HH:mm:ss")
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.partol {
+		height: 100vh;
+		background: #f0f2f5;
+
+		.logo-back {
+			width: 751rpx;
+			height: 350rpx;
+			position: relative;
+
+			&::after {
+				content: '';
+				width: 140%;
+				height: 350rpx;
+				position: absolute;
+				left: -20%;
+				top: 0;
+
+				border-radius: 0 0 45% 45%;
+				background: #4a8bff !important;
+			}
+
+		}
+
+		.title-font {
+			height: 100rpx;
+			font-size: 28rpx;
+			font-weight: 400;
+			color: #FFFFFF;
+			position: absolute;
+			top: 0;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+
+			.cell-item {
+				width: 690rpx;
+				height: calc(100vh - 347rpx);
+				background: #FFFFFF;
+				border-radius: 20rpx 20rpx 0px 0px;
+				padding: 1rpx;
+				box-sizing: border-box;
+			}
+
+			.menu-list {
+				margin-top: 28rpx;
+				align-items: center;
+				padding-bottom: 30rpx;
+				border-bottom: 1rpx solid #E6E6E6;
+				;
+
+				.item-left-title {
+					width: 40rpx;
+					height: 40rpx;
+					background: #4A8BFF;
+					border-radius: 50%;
+					text-align: center;
+					line-height: 40rpx;
+					margin-right: 40rpx;
+				}
+
+				.item-right-font {
+					margin-left: 21rpx;
+					font-size: 28rpx;
+					font-family: Microsoft YaHei-3970(82674968);
+					font-weight: 400;
+					color: #333333;
+				}
+
+				.uicon {
+					position: absolute;
+					right: 23rpx;
+				}
+			}
+		}
+
+		view {
+			line-height: 1;
+		}
+
+		.sumit {
+			position: fixed;
+			bottom: 20rpx;
+			width: 600rpx;
+			height: 88rpx;
+			margin-top: 98rpx;
+			color: white;
+			background-color: #2a82e4;
+			border-radius: 5px;
+			font-size: 16px;
+			line-height: 88rpx;
+			text-align: center;
+			left: 75rpx;
+		}
+	}
+</style>

+ 450 - 0
scan_pages/patroldetail/patroldetail.vue

@@ -0,0 +1,450 @@
+<template>
+	<view class="u-flex f-d-c m-w ccc ">
+		<view class="m-w u-m-t-30 u-p-l-20 u-p-r-20  " style="background: #FFFFFF;">
+			<!-- <view @click="lintext(content.pointNo)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">记录单号</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.pointNo}}</view>
+			</view> -->
+			<view @click="lintext(content.roomName)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">房间名称</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.roomName}}</view>
+			</view>
+			<view @click="lintext(content.roomNumber)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">房间编号</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.roomNumber}}</view>
+			</view>
+			<view @click="lintext(content.buildingName+content.floorName)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">房间位置</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.buildingName}}{{content.floorName}}</view>
+			</view>
+			<view @click="lintext(content.name)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">巡检计划</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.name}}</view>
+			</view>
+			<view @click="lintext(content.time)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">巡检时间</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.time}}</view>
+			</view>
+			<view @click="lintext(content.username)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">巡检人员</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.username}}</view>
+			</view>
+			<view @click="lintext(content.qualified)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">是否合格</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.qualified==true?"合格":"不合格"}}</view>
+			</view>
+			<view @click="lintext(content.score)" class="u-flex u-row-between border-bottom u-p-b-28 u-p-t-28">
+				<view class="item-name">评分</view>
+				<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{content.score}}</view>
+			</view>
+			
+			<!-- 巡检项目头 -->
+				<view class="collect_tit u-flex u-row-left u-col-center">
+					<view class="tit">
+						巡检项目
+					</view>
+					<image :src="icon1"></image>
+					<span>设备:{{content.devices.length + 1}}件</span>
+					<image :src="icon2"></image>
+					<span>项目:{{checkItemCount}}个</span>
+				</view>
+				<block>
+					<!--自带项目-设备名 -->
+					<label class="sel_point u-flex u-row-between u-m-b-34" @click="sel_show1">
+						<view class="sel_tit u-flex u-row-left u-m-l-26">
+							<span>{{content.roomName}}自带项目</span>
+							<!-- <sup class="sup">*</sup> -->
+						</view>
+						<view class="triangle u-m-r-26" :style="tri_style1">
+						</view>
+					</label>
+					<!-- 检查项 -->
+					<block class="scan_itm1" v-if="itm1_show" >
+						<view v-for="(iam,i) in content.checkItems" :key="i">
+							<!-- <view @click="lintext(iam.value)" class="u-flex u-row-between border-bottom u-p-b-34 u-p-t-34">
+								<view class="item-name">{{iam.checkItemName}}</view>
+								<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{iam.value}}</view>
+							</view> -->
+							<!-- 数字项与选择项 -->
+							<view v-if="iam.checkItemType == 2 || iam.checkItemType == 1" @click="lintext(iam.value)" class="u-flex u-row-between border-bottom u-m-b-34 u-p-b-34 ">
+								<view class="item-name">{{iam.checkItemName}}</view>
+								<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{iam.value == '' ? "暂无数据" : iam.value }}</view>
+							</view>
+							<!-- 文本项 -->
+							<view v-else-if="iam.checkItemType == 3" @click="lintext(iam.value)" class=" border-bottom u-m-b-34">
+								<view class="item-name" >{{iam.checkItemName}}:</view>
+								<view v-if="iam.value != ''" class="text_box u-m-t-18">{{iam.value}}</view>
+								<block v-else>
+									<u-empty text="数据为空" ></u-empty>
+								</block>
+							</view>
+							<!-- 图片项 -->
+							<view v-else class="img_box  u-m-b-34  u-p-b-2">
+								<view class="item-name">{{iam.checkItemName}}</view>
+								<!-- <view v-if="iam.value != ''"  class="img_itms u-m-t-18">
+									<view class="img_itm" v-for="(index,key) in iam.value" :key="key">
+										<u-image @click="previewImage(key,iam.value)" width="139rpx" height="139rpx" :src="index"></u-image>
+									</view>
+								</view> -->
+								<view v-if="iam.value != ''" class=" u-m-t-18" v-for="(index,key) in iam.value" :key="key">
+									<view class="titl  u-flex u-row-left u-m-t-12  u-m-l-8">
+										<span>{{key + 1}}.{{index.name}}</span>
+									</view>
+									<view class="img_itms">
+										<view class="img_itm" v-for="(img,imgIndex) in index.value" :key="key">
+											<u-image  @click="previewImage(imgIndex,index.value)" width="139rpx" height="139rpx" :src="img"></u-image>
+										</view>	
+									</view>
+								</view>
+								<block v-else>
+									<u-empty text="数据为空" ></u-empty>
+								</block>
+							</view>
+						</view>
+					</block>
+				</block>
+				
+				<block v-for="(item,i) in content.devices" :key="item.id">
+					<!--巡检设备-设备名 -->
+					<label class="sel_point u-flex u-row-between u-m-b-40" @click="sel_show(i)">
+						<view class="sel_tit u-flex u-row-left u-m-l-26">
+							<span>{{item.deviceName}}</span>
+							<!-- <sup class="sup">*</sup> -->
+						</view>
+						<view class="triangle u-m-r-26" :style="sel_style[i].tri_style">
+						</view>
+					</label>
+					<!-- 检查项 -->
+						<block class="scan_itm1" v-if="sel_style[i].it_show">
+							<view v-for="ite in item.checkItems" :key="ite.id">
+								<!-- 选择项或数字项 -->
+								<view v-if="ite.checkItemType == 1 || ite.checkItemType == 2" @click="lintext(ite.value)" class="u-flex u-row-between border-bottom u-p-b-34 u-m-b-34">
+									<view class="item-name">{{ite.checkItemName}}</view>
+									<view class="u-line-1 item-config  u-text-right" style="width: 342rpx;">{{ite.value == '' ? "数据为空" : ite.value }}</view>
+								</view>
+								<!-- 文本项 -->
+								<view v-else-if="ite.checkItemType == 3" @click="lintext(ite.value)" class=" u-m-b-34  border-bottom">
+									<view class="item-name" >{{ite.checkItemName}}:</view>
+									<view v-if="iam.value != ''" class="text_box u-m-t-18">{{ite.value}}</view>
+									<block v-else>
+										<u-empty text="数据为空" ></u-empty>
+									</block>
+								</view>
+								<!-- 图片项 -->
+								<view v-else class="img_box u-m-b-34">
+									<view class="item-name" >{{ite.checkItemName}}</view>
+										<view v-if="ite.value != ''" class=" u-m-t-18" v-for="(index,key) in ite.value" :key="key">
+											<view class="titl  u-flex u-row-left u-m-t-12  u-m-l-8">
+												<span>{{key + 1}}.{{index.name}}</span>
+											</view>
+											<view class="img_itms">
+												<view class="img_itm" v-for="(img,imgIndex) in index.value" :key="key">
+													<u-image  @click="previewImage(imgIndex,index.value)" width="139rpx" height="139rpx" :src="img"></u-image>
+												</view>	
+											</view>
+										</view>
+										<block v-else>
+											<u-empty text="数据为空" ></u-empty>
+										</block>
+									</view>
+								</view>
+						</block>
+				</block>
+			</view>
+		<u-top-tips ref="chektost"></u-top-tips>
+
+	</view>
+</template>
+
+<script>
+	import icon1 from '@/static/img/devi.png'
+	import icon2 from '@/static/img/proj.png'
+	import dayjs from "dayjs";
+	import {
+		partinfo
+	} from '@/api/index.js'
+	export default {
+		data() {
+			return {
+				icon1: icon1,
+				icon2: icon2,
+				checkItemCount:0,//项目数量
+				tri_style1: '', //自带项目三角形样式变化
+				itm1_show: true,//自带项目三角形样式变化
+				// tri_style: '',
+				// it_show: true,
+				sel_style:[],
+				content: null, //列表数据
+				finishStatus: ["", '按时完成', '尚未巡检(正常时效内未检)', '超时漏检(超过时效后未检)', '提前完成', '延时完成']
+			}
+		},
+		onLoad(option) {
+			this.init(option.taskId, option.roomId)
+		},
+
+		methods: {
+			//自带项目三角样式变化
+			sel_show1() {
+				this.itm1_show = !this.itm1_show;
+				if (!this.itm1_show) {
+					this.tri_style1 =
+						'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+				} else {
+					this.tri_style1 =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;';
+				}
+			},
+			//设备三角形样式变化
+			sel_show(index) {
+				// obj.tri_style
+				// obj.it_show
+				this.sel_style[index].it_show = !this.sel_style[index].it_show
+				
+				if (!this.sel_style[index].it_show) {
+					this.sel_style[index].tri_style =
+						'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+				} else {
+					this.sel_style[index].tri_style =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;';
+				}
+			},
+			//预览图片
+			previewImage(index,i){
+						 uni.previewImage({
+						            current:index, //预览图片的下标
+						            urls: i//预览图片的地址,必须要数组形式,如果不是数组形式就转换成数组形式就可以
+						    })
+					},
+			// 获取页面数据
+			async init(taskId, roomId) {
+				let {
+					data,
+					code,
+					message
+				} = await partinfo({
+					taskId,
+					roomId
+				})
+				if(code != 200) {
+					uni.showToast({
+						title:message,
+						type:"warning"
+					})
+				}
+				data.time=dayjs(data.time).format("YYYY-MM-DD HH:mm:ss")
+				//一、自带巡检项目-数据处理
+				data.checkItems.forEach(i => {
+					let checkItem = JSON.parse(i.checkItem)
+					//图片数据处理
+					if (i.checkItemType == 4) {
+						let imgValue = JSON.parse(i.value)
+						i.value = []
+						let b = undefined //查找项
+						imgValue.forEach(j => {
+						let a =	j.value.match(/[^\,]+/g) //	图片数组
+						b = checkItem.photoPoints.find((ite,index) => {
+							return ite.id == j.id
+							})
+						if(a && b) {
+								let imgItem = {}
+								imgItem.name = b.name
+								imgItem.value = a
+								i.value.push(imgItem)
+						} else{
+							return i.value 
+						}
+						})
+					}
+					//选择项数据处理
+					if(i.checkItemType == 1) {
+						if(i.value !== '') {
+							let selArr =i.value.match(/[^\,]+/g)
+							let resStr = ''
+							let rightItem = undefined
+							selArr.forEach(sel => {
+								 rightItem = checkItem.options.find((ite) => {
+								return ite.id == sel
+								})
+								resStr == '' ? resStr = rightItem.optionName : resStr = resStr + ',' + rightItem.optionName
+							})
+							i.value = resStr
+						}
+						else {
+							i.value = ''
+						}
+					}
+				})
+				//二、巡检设备-数据处理
+				data.devices.forEach(item => {
+					//计算巡检项目数
+					this.checkItemCount += item.checkItems.length 
+					//收缩框虚拟DOM
+					let obj = {}
+					obj.tri_style = 'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;'
+					obj.it_show = true
+					this.sel_style.push(obj)
+					//数据
+					item.checkItems.forEach(i => {
+						let checkItem = JSON.parse(i.checkItem)
+						//处理图片数据
+						if (i.checkItemType == 4) {
+							let imgValue = JSON.parse(i.value)
+							i.value = []
+							let rightItem = undefined //查找项
+							imgValue.forEach(j => {
+							let imgArr = j.value.match(/[^\,]+/g) //	图片数组
+							rightItem = checkItem.options.find((ite,index) => {
+								return ite.id == j.id
+								})
+							if(imgArr && rightItem) {
+									let imgItem = {}
+									imgItem.name = rightItem.name
+									imgItem.value = imgArr
+									i.value.push(imgItem)
+							} else{
+								return i.value 
+							}
+							})
+						}
+						//选择项数据处理
+						if(i.checkItemType == 1) {
+							if(i.value != '') {
+								let selArr =i.value.match(/[^\,]+/g)
+								let resStr = ''
+								let a = undefined //查找项
+								selArr.forEach(sel => {
+									 a = checkItem.options.find((ite,index) => {
+									return ite.id == sel
+									})
+									resStr == '' ? resStr = a.optionName : resStr = resStr + ',' + a.optionName
+								})
+								i.value = resStr
+							}
+							else {
+								i.value = ''
+							}
+						}
+					})
+				})
+				//三、巡检项目数
+				this.checkItemCount +=  data.checkItems.length
+				this.content = data
+			},
+			// 点击顶部提示文字
+			lintext(text) {
+				this.$refs.chektost.show({
+					title: text,
+					type: 'primary',
+					duration: '2300'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		width: 100%;
+		height: 100%;
+		background: #FFFFFF
+	}
+
+	.border-bottom {
+		border-bottom: 2rpx solid #E6E6E6;
+	}
+
+	.item-name {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+		box-sizing: border-box;
+	}
+
+	.item-config {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #808080;
+		box-sizing: border-box;
+	}
+
+	.reacakye {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+	}
+
+	.collect_tit {
+		width: 710rpx;
+		height: 104rpx;
+
+		.tit {
+			width: 128rpx;
+			height: 33rpx;
+			margin-left: 30rpx;
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #010101;
+		}
+
+		image {
+			max-width: 24rpx;
+			max-height: 24rpx;
+			margin-left: 42rpx;
+			margin-top: 12rpx;
+		}
+
+		span {
+			height: 24rpx;
+			margin-left: 10rpx;
+			font-size: 24rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #808080;
+		}
+	}
+
+	.sel_point {
+		width: 710rpx;
+		height: 70rpx;
+		background: #EBF8FF;
+
+		.sup {
+			color: red;
+		}
+
+		.triangle {
+			margin-top: 10rpx;
+			display: inline-block;
+			/* Base Style */
+			border: solid 10rpx transparent;
+			border-top-color: #808080;
+		}
+	}
+	.img_box {
+		// width: 690rpx;
+	}
+	.img_itms{
+		display: flex;
+		flex-direction: row;
+		flex-wrap: wrap;
+		justify-content: flex-start;
+		align-items: center;
+		align-content:space-between;
+	}
+	.img_itm {
+		display: inline-block;
+		width: 139rpx;
+		height: 139rpx;
+		margin-right: 20rpx;
+	}
+	.text_box{
+		height: 150rpx;
+		max-height:210rpx ;
+		color: #808080;
+		text-indent: 40rpx;
+	}
+	
+</style>

+ 256 - 0
scan_pages/patrolrecored/patrolrecored.vue

@@ -0,0 +1,256 @@
+<template>
+	<view >
+		<view  class="u-p-t-12 u-p-b-20  u-p-l-20 u-p-r-10" style="background: #FFFFFF;">
+			<cSearch @serbtn="setbtn" :sear="'搜索巡检记录'"/>
+		</view>
+		<u-dropdown style="width: 100%; background: #ffffff">
+			<u-dropdown-item @change="drowcitem1" :title="title" :options="options1">
+			</u-dropdown-item>
+			<u-dropdown-item @change="drowclick" :title="title1" :options="options2">
+			</u-dropdown-item>
+		</u-dropdown>
+		<view class="u-flex f-d-c m-w">
+			<scroll-view :scroll-y="true" @scrolltolower="lazyGetRooms()" class=" sc-view   ">
+				<u-cell-group v-if="cellmenu.length > 0">
+						<navigator hover-class="none" v-for="(item,index) in cellmenu" :key="index"
+							:url="`../patroldetail/patroldetail?taskId=${item.id}&roomId=${item.roomId}`">
+							<u-cell-item :use-label-slot="true" :border-bottom="true" :border-top="false" :key="index"
+								:label-style="{'fontSize':'28rpx', 'color':'rgba(80, 80, 80, 1)' ,'marginBottom':'30rpx'}"
+								:icon-style="{'color':'#000'}"
+								:title-style="{'color':'#000','fontSize':'32rpx','fontWeight':' blod'}" :arrow="false"
+								:label="item.roomName" :title="item.name">
+								<u-icon name="arrow-right" slot="right-icon" color="#B3B3B3" size="38"></u-icon>
+								<div solt="label" class="left-boto-txt">{{item.username}}:{{item.time}}</div>
+							</u-cell-item>
+							<view style=" height: 3.5rpx;width: 100%; background: #FFFFFF;"></view>
+						</navigator>
+						<view style="overflow: hidden;">
+							<u-loadmore :status="status" :icon-type="iconType" :load-text="loadText" />
+						</view>
+				</u-cell-group>
+				<block v-else>
+					<view v-if="loashow" class="u-text-center" style="margin-top: 400rpx;">
+						<u-loading  loashow color="blue" size="50"></u-loading>
+					</view>
+					<view v-else>
+						<u-empty margin-top="400" text="数据为空"  mode="list"></u-empty>
+					</view>
+				</block>
+			</scroll-view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import {
+		partinfo1
+	} from '@/api/index.js'
+	import {
+		mapState
+	} from 'vuex'
+	import dayjs from "dayjs";
+	import cSearch from '@/components/c-search/index.vue'
+	export default {
+		components: {
+			cSearch,
+		},
+		data() {
+			return {
+				options1: [{
+						label: '今天',
+						value: [dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime())).format(
+							"YYYY-MM-DD HH:mm:ss"), dayjs(new Date(new Date(new Date().toLocaleDateString())
+							.getTime() + 24 * 60 * 60 * 1000 - 1)).format("YYYY-MM-DD HH:mm:ss")],
+					},
+					{
+						label: '昨天',
+						value: [dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime() - 24 * 60 * 60 *
+							1000)).format("YYYY-MM-DD HH:mm:ss"), dayjs(new Date(new Date(new Date()
+							.toLocaleDateString()).getTime() - 1)).format("YYYY-MM-DD HH:mm:ss")],
+					},
+					{
+						label: '近7日',
+						value: [dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime() - (24 * 60 * 60 *
+							1000) * 3)).format("YYYY-MM-DD HH:mm:ss"), dayjs(new Date(new Date(new Date()
+							.toLocaleDateString()).getTime() + (24 * 60 * 60 * 1000) * 3)).format(
+							"YYYY-MM-DD HH:mm:ss")],
+					}
+				],
+				options2: [{
+						label: '全部状态',
+						value: 1,
+					},
+					{
+						label: '合格',
+						value: 2,
+					},
+					{
+						label: '不合格',
+						value: 3,
+					},
+				],
+				cellmenu: [], //数据列表
+				queryform: {},//请求对象
+				//下拉框标题
+				title: "时间",
+				title1: "状态",
+				totalCount: -1, //总项目数
+				curPage: 1, //当前页数
+				loashow: false,
+				//下拉加载配置
+				status: 'loadmore',
+				iconType: 'flower',
+				loadText: {
+					loadmore: '轻轻上拉',
+					loading: '努力加载中',
+					nomore: '实在没有了'
+				}
+			}
+		},
+		// 计算属性,从仓库获取timer数据
+		computed: {
+			...mapState({
+				timer: state => state.user.timer
+			})
+		},
+		onLoad() {
+			this.getlist(-1)
+		},
+		methods: {
+			//关键字模糊查询
+			 setbtn(keyWord) {
+				 if(keyWord.text == 0) {
+					  this.queryform.keyword = ''
+					 this.$nextTick(() => {
+					 	this.getlist(-1)
+					 })
+				 } else {
+					 this.queryform.keyword = keyWord.text
+					 this.$nextTick(() => {
+					 	this.getlist(-1)
+					 })
+				 }
+			},
+			// 改变时间筛选数据
+			drowcitem1(row) {
+				let option1 = JSON.parse(JSON.stringify(this.options1))
+				let optiontext = option1.find((index) => {
+					if (index.value.toString() == row.toString()) {
+						return index
+					}
+				})
+				this.title = optiontext.label
+				this.queryform.beginTimeStart = row[0]
+				this.queryform.beginTimeEnd = row[1]
+				this.$nextTick(() => {
+					this.getlist(-1)
+				})
+			},
+			// 改变状态筛选数据
+			drowclick(row) {
+				if (row == 2) {
+					this.queryform.qualified = true
+					this.title1 = "合格"
+					this.$nextTick(() => {
+						this.getlist(-1)
+					})
+				} else if (row == 3) {
+					this.queryform.qualified = false
+					this.title1 = "不合格"
+					this.$nextTick(() => {
+						this.getlist(-1)
+					})
+				} else {
+					this.queryform.qualified = ''
+					this.title1 = "全部状态"
+					this.$nextTick(() => {
+						this.getlist(-1)
+					})
+				}
+			},
+			// 获取巡检记录数据
+			async getlist(index) {
+				if (this.totalCount == -1 || index == -1) {
+					this.loashow = true
+					this.cellmenu = []
+					let data = await partinfo1({
+						page: 1,
+						size: 10,
+						...this.queryform
+					})
+					this.loashow = false
+					const {
+						list,
+						total,
+					} = data.data
+					this.totalCount = total //总个数
+					this.cellmenu = list.map(Element => {
+						Element.time = dayjs(Element.time).format("YYYY-MM-DD HH:mm:ss")
+						return Element
+					})
+				} else {
+					let curPage = this.curPage + 1
+					if (this.cellmenu.length < this.totalCount) {
+						let {
+							data
+						} = await partinfo1({
+							page: curPage,
+							size: 10,
+							...this.queryform
+						})
+						data.list.forEach(Element => {
+							Element.time = dayjs(Element.time).format("YYYY-MM-DD HH:mm:ss")
+						})
+						data.list.forEach(i => {
+							this.cellmenu.push(i)
+						})
+						this.curPage = this.curPage + 1
+					} else if (this.cellmenu.length == this.totalCount) {
+						this.$refs.sacast.show({
+							title: '没有更多了',
+							type: 'info',
+						})
+					}
+				}
+			},
+			//懒加载房间数据
+			lazyGetRooms() {
+				var timer = null;
+				if (this.cellmenu.length == this.totalCount) this.status = 'nomore';
+				this.status = 'loading';
+				clearTimeout(timer)
+				timer = setTimeout(() => {
+					this.getlist(1)
+					if (this.cellmenu.length == this.totalCount) this.status = 'nomore';
+					else this.status = 'loading';
+				}, 2000)
+			}
+		}
+	}
+</script>
+
+<style>
+	page {
+		background: #ffffff;
+	}
+
+	.sc-view {
+		height: calc(100vh - 200rpx);
+		width: 690rpx;
+		box-shadow: 0px 0px 6rpx 0px rgba(6, 0, 1, 0.26);
+		border-radius: 10rpx 10rpx 0px 0px;
+	}
+
+	.left-boto-txt {
+		position: absolute;
+		left: 30rpx;
+		top: 125rpx;
+		font-size: 28rpx;
+	}
+	.blo {
+		width: 100%;
+		margin-top: 50rpx;
+		height: 400rpx;
+	}
+</style>

+ 100 - 0
scan_pages/scanning/protow.vue

@@ -0,0 +1,100 @@
+
+<template>
+	<scroll-view  :scroll-y="true" class="scrll-height">
+	<u-cell-group v-if="itemdata.length != 0">
+		<view  v-for="(item,index) in itemdata"  :key="index" @click="toPartcodetal(item.roomId,item.id)"  >
+			<u-cell-item  
+			:use-label-slot="true" 
+			:border-bottom="true" 
+			:border-top="false" 
+			:key="index" 
+			:label-style="{'fontSize':'28rpx', 'color':'rgba(80, 80, 80, 1)' ,'marginBottom':'30rpx'}"
+			:icon-style="{'color':'#000'}" 
+			:title-style="{'color':'#000','fontSize':'32rpx','fontWeight':' blod'}" 
+			:arrow="false" 
+			:label="taskName"  
+			:title="item.roomName + `  ${position}`"
+			>
+			<u-icon name="arrow-right" slot="right-icon" color="#B3B3B3" size="38"></u-icon>
+			<div solt="label" class="left-boto-txt"  >{{item.username}}:{{item.time}}</div>
+			</u-cell-item>
+			<view style=" height: 3.5rpx;width: 100%; background: #FFFFFF;"></view>
+		</view>
+	</u-cell-group>
+	<block v-else class="u-m-t-34">
+		<u-empty  text="数据为空" mode="list"></u-empty>
+	</block>
+	</scroll-view>
+</template>
+
+<script>
+	import {
+		listForMobile
+	} from '@/api/index.js'
+	import dayjs from "dayjs";
+	export default {
+		props:{
+			option:{
+				type:Object
+			},
+			taskName:{
+				type:String
+			},
+			position:{
+				type:String
+			}
+		},
+		data(){
+			return {
+				itemdata:[]
+			}
+		},
+		created() {
+			this.getItemdata() 
+		},
+		methods:{
+			getItemdata() {
+				let {
+					taskId,
+					roomId
+				} = this.option
+				listForMobile({
+						taskId,
+						roomId
+					})
+					.then(({
+						data
+					}) => {
+						if(data.list.length == 0) {
+							uni.showToast({
+								title: '巡检记录列表为空',
+								icon: "none",
+								duration: 2000
+							});
+						}
+						else if(data.list.length == 1) {
+							data.list.forEach(i => {
+								i.time = dayjs(i.time).format("YYYY-MM-DD HH:mm:ss")
+							})
+							this.itemdata = data.list
+							//直接跳转巡检详情
+							this.toPartcodetal(data.list[0].roomId,data.list[0].id)
+						} else {
+							data.list.forEach(i => {
+								i.time = dayjs(i.time).format("YYYY-MM-DD HH:mm:ss")
+							})
+							this.itemdata = data.list
+						}
+					})
+			},
+			toPartcodetal(roomId,taskId) {
+				uni.navigateTo({
+					url:`../patroldetail/patroldetail?roomId=${roomId}&taskId=${taskId}`
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 78 - 0
scan_pages/scanning/scanItem/scanchebox.vue

@@ -0,0 +1,78 @@
+<template>
+	<view>
+		<!-- 选择类巡检操作 -->
+		<u-checkbox-group size="40" wrap="true" width="690">
+			<u-checkbox icon-size="28" label-size="28" shape="circle" active-color="orange" @change="checkboxChange"
+				v-model="item.checked" v-for="(item, index) in list" :key="index" :name="item.id">{{item.name}}
+			</u-checkbox>
+		</u-checkbox-group>
+		<!-- <u-toast ref="sacast" /> -->
+	</view>
+</template>
+
+<script>
+	export default {
+
+		props: {
+			// 巡检项规则
+			options: {
+				type: Array
+			},
+			//拍照选项项目巡检id
+			scan_id: {
+				type: Number
+			},
+			
+		},
+		data() {
+			return {
+				list: [],
+				value: ''
+			}
+		},
+		created() {
+			// console.log("option", this.options)
+			this.setData()
+		},
+		methods: {
+			//处理选项数据
+			setData() {
+				this.options.forEach(j => {
+					let obj = {}
+					obj.name = j.optionName
+					obj.id = j.id
+					obj.checked = j.defaultSelect
+					this.list.push(obj)
+				})
+			},
+			//选中某个复选框时,由checkbox时触发
+			checkboxChange(e) {
+			},
+			//巡检数据处理
+			submit() {
+			let item = {
+				id: this.scan_id,
+				value: null
+			} //提交数据
+			let newarr = JSON.parse(JSON.stringify(this.list))
+			newarr.forEach(i => {
+				if(i.checked === true) {
+					if(item.value) {
+						item.value =item.value + "," + `${i.id}`
+					} else {
+						item.value = `${i.id}`
+					}
+				}
+			})
+				this.$store.state.user.items.push(item)
+		},
+		//重置表单
+		reset() {
+			this.list = []
+		}
+	}
+	}
+</script>
+
+<style>
+</style>

+ 135 - 0
scan_pages/scanning/scanItem/scanimg.vue

@@ -0,0 +1,135 @@
+<template>
+	<view>
+		<view class="img_box u-m-t-24">
+			<view v-for="(imgItem,im) in photoPoints" :key="imgItem.id">
+				<view class="titl  u-flex u-row-left u-m-t-12  u-m-l-8">
+					<span>{{im + 1}}.{{imgItem.name}}</span>
+					<sup class="sup" v-if="imgItem.isRequired">*</sup>
+				</view>
+				<u-upload :source-type="['camera']" @on-list-change="change(imgItem.id,im)" upload-text="拍照" width="139"
+					height="139" :max-size="10 * 1024 * 1024" max-count="6" ref="uUpload" :action="action"
+					:auto-upload="false">
+				</u-upload>
+			</view>
+		</view>
+		
+		<u-toast ref="sacast" />
+	</view>
+
+</template>
+
+<script>
+	export default {
+		props: {
+			//照片点数组
+			photoPoints: {
+				type: [Object, Array]
+			},
+			//拍照选项项目巡检id
+			scan_id: {
+				type: Number
+			},
+		},
+		data() {
+			return {
+				uploadlist: [], //已上传图片数组
+				images: [], //本地图片数组
+				value: [], //提交图片数组
+				action: 'https://www.jxydyw.cn/patrol-app/v1/file/upload', //没用到的
+				load: false
+			}
+		},
+		methods: {
+			// 选择图片-暂存本地图片
+			change(id, index) {
+				// 重置待上传图片数组
+				this.images[index] = {};
+				this.images[index].id = id;
+				this.images[index].imgArr = [];
+				this.$nextTick(() => {
+					let lists = this.$refs.uUpload[index].lists;
+					lists.forEach(val => {
+						this.images[index].imgArr.push(val.url)
+					})
+				})
+			},
+			//提交
+			async submit() {
+				for (var index = 0; index < this.images.length; index++) {
+					const item = this.images[index];
+					this.uploadlist[index] = {};
+					this.uploadlist[index].imgArr = [];
+					this.uploadlist[index].id = item.id;
+
+					await Promise.all(item.imgArr.map(url => this.upload(url, item.id, index)));
+					
+					console.log("全部图片上传完成",JSON.stringify(this.uploadlist))
+				}
+				
+				console.log("执行了后续操作")
+				
+				//生成图片字符串
+				let uploadArr = JSON.parse(JSON.stringify(this.uploadlist));
+				let imgStr = '';
+				for (let i = 0; i < uploadArr.length; i++) {
+					let len = uploadArr[i].imgArr.length;
+					if (len > 1) {
+						imgStr = uploadArr[i].imgArr[0];
+						for (let j = 1; j < len; j++) {
+							imgStr = imgStr + "," + uploadArr[i].imgArr[j];
+						}
+					} else if (len == 1) {
+						imgStr = uploadArr[i].imgArr[0];
+					} else {
+						return imgStr = ''
+					}
+					let obj = {};
+					obj.id = uploadArr[i].id;
+					obj.value = imgStr;
+					this.value[i] = obj;
+				}
+				//巡检图片数据提交
+				let newarr = JSON.parse(JSON.stringify(this.value));
+				let item = {
+					id: this.scan_id,
+					value: JSON.stringify(newarr)
+				} //提交数据
+				this.$store.state.user.items.push(item);
+			},
+			//上传图片API
+			upload(item, id, index) {
+				return new Promise((resolve, reject) => {
+					uni.uploadFile({
+						url: 'https://www.jxydyw.cn/patrol-app/v1/file/upload', //仅为示例,非真实的接口地址
+						filePath: item,
+						name: 'file',
+						success: (uploadFileRes) => {
+							let data = JSON.parse(uploadFileRes.data);
+							let showUrl = data.data;
+							this.uploadlist[index].imgArr.push(showUrl);
+							resolve()
+						},
+						fail: (err) => {
+							this.$refs.sacast.show({
+								title: "图片不得超过10M",
+								type: 'warning',
+							})
+							reject()
+						}
+					});
+				})
+			},
+			//重置表单数据
+			reset() {
+				this.$nextTick(() => {
+					this.$refs.uUpload.forEach(i => {
+						i.lists.length = 0;
+					})
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 82 - 0
scan_pages/scanning/scanItem/scannum.vue

@@ -0,0 +1,82 @@
+<template>
+	<view class="u-m-t-32 inp">
+		<input :placeholder="'请输入含' + `${places}` + '位小数点的数值'"  @blur="handleDi" placeholder-style="color: #B3B3B3; magin-top: 10rpx;" type="digit"  v-model="numb_value" />
+	</view>
+</template>
+<script>
+	export default {
+		props: {
+			
+			//拍照选项项目巡检id
+			scan_id: {
+				type: Number
+			},
+			//小数位数
+			places: {
+				type: Number
+			},
+			//最小值
+			min: {
+				type:Number
+			},
+			//最大值
+			max: {
+				type:Number
+			}
+		},
+		data() {
+			return {
+				numb_value:'',
+			
+			}
+		},
+		methods: {
+			//处理巡检提交数据
+			submit() {
+			let item = {
+				id: this.scan_id,
+				value: this.numb_value
+			} //提交数据
+			this.$store.state.user.items.push(item)
+			// }
+			},
+			//input修改
+			handleDi(e) {
+				if(this.min != 0 && this.max != 0) {
+					if(e.detail.value > this.max) {
+						this.$refs.sacast.show({
+							title: "数值超过最大值",
+							type: 'info',
+						})
+					} else if(e.detail.value < this.min) {
+						this.$refs.sacast.show({
+							title: "数值不得小于最小值",
+							type: 'info',
+						})
+					}
+				}
+			},
+			//重置表单
+			reset() {
+				this.numb_value = ''
+			}
+		}
+	}
+</script>
+
+<style>
+	input {
+		width: 100%;
+		height: 100%;
+		 /* text-indent: 20rpx; */
+	}
+	
+	.inp {
+		width: 690rpx;
+		height: 80rpx;
+		padding: 18rpx;
+		border: 1rpx solid #BFBFBF;
+		border-radius: 6rpx;
+	}
+	
+</style>

+ 65 - 0
scan_pages/scanning/scanItem/scanradio.vue

@@ -0,0 +1,65 @@
+<template>
+	<view>
+		<!-- 选择类巡检操作 -->
+		<u-radio-group size="40" wrap="true" width="690">
+			<u-radio :disabled="false" icon-size="28" label-size="28" active-color="orange" @change="radioChange" style="width: 100%;"
+				v-for="(item, index) in list" :key="index" :name="item.id">
+				{{item.name}}
+			</u-radio>
+		</u-radio-group>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			// 巡检项规则
+			options: {
+				type: Array,
+				default: []
+			},
+			//拍照选项项目巡检id
+			scan_id: {
+				type: Number
+			},
+		},
+		data() {
+			return {
+				list: [],
+				value: 0
+			}
+		},
+		created() {
+			this.setData()
+		},
+		methods: {
+			setData() {
+				this.options.forEach(j => {
+					let obj = {}
+					obj.name = j.optionName
+					obj.id = j.id
+					this.list.push(obj)
+				})
+			},
+			submit() {
+			let item = {
+				id: this.scan_id,
+				value: this.value
+			} //提交数据
+			this.$store.state.user.items.push(item)
+			},
+			//重置表单
+			reset() {
+				this.list = []
+			},
+			//选中某一radio时,由redio触发
+			radioChange(e) {
+				this.value = e
+			},
+			
+		}
+	}
+</script>
+
+<style>
+</style>

+ 61 - 0
scan_pages/scanning/scanItem/scantex.vue

@@ -0,0 +1,61 @@
+<template>
+	<view class="u-m-t-32 tex">
+		<textarea placeholder-style="color: #B3B3B3; magin-top: 10rpx;" placeholder="请输入描述内容" v-model="text_value" />
+	</view>
+</template>
+
+<script>
+	export default {
+
+		props: {
+			
+			
+			//拍照选项项目巡检id
+			scan_id: {
+				type: Number
+			},
+			defaultValue: {
+				type: String
+			}
+		},
+		data() {
+			return {
+				text_value: ''
+			}
+		},
+		created() {
+				this.defaultValue != null && (this.text_value = this.defaultValue)
+		},
+		methods: {
+			//处理巡检提交数据
+			submit() {
+				let item = {
+					id: this.scan_id,
+					value: this.text_value
+				} //提交数据
+
+				this.$store.state.user.items.push(item)
+				
+			},
+			//重置表单
+			reset() {
+				this.text_value = ''
+			}
+		}
+	}
+</script>
+
+<style>
+	input {
+		width: 100%;
+		height: 100%;
+		/* text-indent: 20rpx; */
+	}
+
+	.tex {
+		width: 690rpx;
+		height: 210rpx;
+		border: 1rpx solid #BFBFBF;
+		border-radius: 6rpx;
+	}
+</style>

+ 617 - 0
scan_pages/scanning/scanning.vue

@@ -0,0 +1,617 @@
+<template>
+	<view class=" ccc scning ">
+		<view style="width: 200rpx;">
+			<u-tabs bar-width="80" item-width="80" :list="list" :is-scroll="false" :current="current" @change="change">
+			</u-tabs>
+		</view>
+
+		<scroll-view :scroll-y="true" class="u-p-l-30 u-p-r-30 u-p-b-48 scrll-height u-p-t-26">
+			<block v-if="current == 0">
+				<u-cell-group>
+					<u-cell-item :value="scmdata.name" bg-color="#ffffff" :border-bottom="true" :border-top="false"
+						:title-style="{'fontSize':'28rpx','color':'#333333','fontWeight':'bold'}"
+						:value-style="{'fontSize':'28rpx','color':'#808080'}" :arrow="false" title="点位名称">
+					</u-cell-item>
+					<u-cell-item :value="scmdata.id" bg-color="#ffffff" :border-bottom="true" :border-top="false"
+						:title-style="{'fontSize':'28rpx','color':'#333333','fontWeight':'bold'}"
+						:value-style="{'fontSize':'28rpx','color':'#808080'}" :arrow="false" title="房间编号">
+					</u-cell-item>
+					<u-cell-item :value="scmdata.buildingName + scmdata.floorName" bg-color="#ffffff"
+						:border-bottom="true" :border-top="false"
+						:title-style="{'fontSize':'28rpx','color':'#333333','fontWeight':'bold'}"
+						:value-style="{'fontSize':'28rpx','color':'#808080'}" :arrow="false" title="房间位置">
+					</u-cell-item>
+					<u-cell-item :value="scmdata.taskName" bg-color="#ffffff" :border-bottom="true" :border-top="false"
+						:title-style="{'fontSize':'28rpx','color':'#333333','fontWeight':'bold'}"
+						:value-style="{'fontSize':'28rpx','color':'#808080'}" :arrow="false" title="巡检计划">
+					</u-cell-item>
+				</u-cell-group>
+				<view class="collect_tit u-row-left u-flex">
+					<view class="tit">
+						巡检项目
+					</view>
+					<image :src="icon1"></image>
+					<span>设备:{{scmdata.devices.length}}件</span>
+					<image :src="icon2"></image>
+					<span>项目:{{checkItemCount}}个</span>
+				</view>
+				<!-- 自带项目巡检-设备名 -->
+				<view class="zidai_xiangmu">
+					<label class="sel_point u-flex u-row-between" @click="sel_show1 ()">
+						<view class="sel_tit u-flex u-row-left u-m-l-26">
+							<span>{{scmdata.name}}自带项目</span>
+							<sup class="sup">*</sup>
+						</view>
+						<view class="triangle u-m-r-26" :style="tri_style1">
+						</view>
+					</label>
+					<!-- 巡检项目名 -->
+					<view class="scan_itm1" v-show="itm1_show" v-for="(item1,i) in scmdata.checkItems" :key="item1.id">
+						<view class="tit  u-m-t-32 ">
+							<view class=" u-flex u-row-left u-col-center">
+								<span>{{i + 1}}.{{item1.checkItem.checkItem.itemName}}</span>
+								<sup class="sup" v-if="item1.checkItem.checkItem.isRequired">*</sup>
+							</view>
+							<view class="u-m-t-12">
+								<span style="color: #B3B3B3; font-size: 24rpx;"
+									v-if="item1.checkItem.extra.validMinValue != null">{{"填值范围:" + item1.checkItem.extra.validMinValue + '~' +item1.checkItem.extra.validMaxValue}}</span>
+							</view>
+						</view>
+						<!-- 选择类巡检操作 -->
+						<!-- 单选 -->
+						<block v-if="item1.checkItem.checkItem.itemType == 1 && item1.checkItem.allowMultiple == false">
+							<scaradio ref="scarad" :scan_id="item1.id" :options="item1.checkItem.options" />
+						</block>
+						<!-- 多选 -->
+						<block v-if="item1.checkItem.checkItem.itemType == 1 && item1.checkItem.allowMultiple == true">
+							<scachebox v-if="item1" ref="scachb" :scan_id="item1.id"
+								:options="item1.checkItem.options" />
+						</block>
+						<!-- 数字类巡检操作 -->
+						<block v-if="item1.checkItem.checkItem.itemType == 2">
+							<scanum v-if="item1" ref="scanum" :scan_id="item1.id"
+								:min="item1.checkItem.extra.validMinValue" :max="item1.checkItem.extra.validMaxValue"
+								:places="item1.checkItem.extra.decimalPlaces" />
+						</block>
+						<!-- 文本类巡检操作 -->
+						<block v-if="item1.checkItem.checkItem.itemType == 3">
+							<scatex v-if="item1" :defaultValue="item1.checkItem.checkItem.defaultValue" ref="scatex"
+								:scan_id="item1.id" />
+						</block>
+						<!-- 拍照类巡检操作 -->
+						<block v-if="item1.checkItem.checkItem.itemType == 4">
+							<scaimg v-if="item1" ref="scaimg" :scan_id="item1.id"
+								:photoPoints="item1.checkItem.photoPoints" />
+						</block>
+					</view>
+				</view>
+
+				<!-- 巡检设备-设备名 -->
+				<block class="xunjain_shebei" v-for="(item3,j) in scmdata.devices" :key="j">
+					<label class="sel_point u-flex u-row-between u-m-t-40" @click="sel_show(j)">
+						<view class="sel_tit u-flex u-row-left u-m-l-26">
+							<span>{{item3.deviceName}}</span>
+							<sup class="sup">*</sup>
+						</view>
+						<view class="triangle u-m-r-26" :style="sel_style[j].tri_style">
+						</view>
+					</label>
+					<!-- 巡检项目名 -->
+					<view v-show="sel_style[j].it_show">
+						<block class="scan_itm1" v-for="(item4,i) in item3.checkItems" :key="item4.id">
+							<view class="tit  u-m-t-32 ">
+								<view class=" u-flex u-row-left u-col-center">
+									<span>{{i + 1}}.{{item4.checkItem.checkItem.itemName}}</span>
+									<sup class="sup" v-if="item4.checkItem.checkItem.isRequired">*</sup>
+								</view>
+								<view class="u-m-t-12">
+									<span style="color: #B3B3B3; font-size: 24rpx;"
+										v-if="item4.checkItem.extra.validMinValue != null">{{"填值范围:" + item4.checkItem.extra.validMinValue + '~' + item4.checkItem.extra.validMaxValue}}</span>
+								</view>
+							</view>
+							<!-- 选择类巡检操作 -->
+							<!-- 单选 -->
+							<block
+								v-if="item4.checkItem.checkItem.itemType == 1 && item4.checkItem.allowMultiple == false">
+								<scaradio v-if="item4" ref="scarad" :scan_id="item4.id"
+									:options="item4.checkItem.options" />
+							</block>
+							<!-- 多选 -->
+							<block
+								v-if="item4.checkItem.checkItem.itemType == 1 && item4.checkItem.allowMultiple == true">
+								<scachebox v-if="item4" ref="scachb" :scan_id="item4.id"
+									:options="item4.checkItem.options" />
+							</block>
+							<!-- 数字类巡检操作 -->
+							<block v-if="item4.checkItem.checkItem.itemType == 2">
+								<scanum v-if="item4" ref="scanum" :scan_id="item4.id"
+									:min="item4.checkItem.extra.validMinValue"
+									:max="item4.checkItem.extra.validMaxValue"
+									:places="item4.checkItem.extra.decimalPlaces" />
+							</block>
+							<!-- 文本类巡检操作 -->
+							<block v-if="item4.checkItem.checkItem.itemType == 3">
+								<scatex v-if="item4" :defaultValue="item4.checkItem.checkItem.defaultValue" ref="scatex"
+									:scan_id="item4.id" />
+							</block>
+							<!-- 拍照类巡检操作 -->
+							<block v-if="item4.checkItem.checkItem.itemType == 4">
+								<scaimg v-if="item4" ref="scaimg" :scan_id="item4.id"
+									:photoPoints="item4.checkItem.photoPoints" />
+							</block>
+						</block>
+					</view>
+
+				</block>
+				<u-button  :hair-line="false" ripple-bg-color="blue" :disabled="guan" @click="scabtnclick"
+					:custom-style="customStyle">确定</u-button>
+			</block>
+			<block v-else>
+				<protow :option="option" :taskName="scmdata.taskName"
+					:position="scmdata.buildingName + scmdata.floorName" />
+			</block>
+		</scroll-view>
+		<!-- <u-tabbar :list="tabbar" :mid-button="true"></u-tabbar> -->
+		<!-- 记录页面 -->
+
+		<u-toast ref="sacast" />
+	</view>
+
+</template>
+
+<script>
+	import icon1 from '@/static/img/devi.png'
+	import icon2 from '@/static/img/proj.png'
+	// import jia from '@/static/img/jia.png'
+	import {
+		mapState
+	} from 'vuex'
+	import {
+		partinfo,
+		checkItemlist,
+		patrolRecord,
+		listForMobile
+	} from '@/api/index.js'
+	import dayjs from "dayjs";
+	import scaradio from './scanItem/scanradio.vue'
+	import scachebox from './scanItem/scanchebox.vue'
+	import scanum from './scanItem/scannum.vue'
+	import scatex from './scanItem/scantex.vue'
+	import scaimg from './scanItem/scanimg.vue'
+	import protow from './protow'
+	export default {
+		name: "sacnning",
+		components: {
+			scaradio,
+			scachebox,
+			scanum,
+			scatex,
+			scaimg,
+			protow
+		},
+		data() {
+			return {
+				icon1: icon1,
+				icon2: icon2,
+				tri_style1: '', //自带项目三角形样式变化
+				itm1_show: true, //自带项目三角形样式变化
+				sel_style: [], //设备巡检下拉虚拟DOM数组
+				//上方导航项
+				list: [{
+					name: '巡检'
+				}, {
+					name: '记录'
+				}],
+				current: 0, //跳转栏
+				option: undefined, //跳转页面的option
+				scmdata: undefined, //巡检数据
+				checkItemCount: 0, //项目数
+				guan: false,
+				uploadlist: [],
+				// uploadlist1:[],
+				dataindex: 1,
+				fromcasl: {},
+				timerefs: new Date().getTime(), //因为用了$set的原因 多列表会不刷新 加入一个key 会让子组件重新渲染
+				finishStatus: ["", "按时完成", "尚未巡检", "超时漏检", "提前完成", "延时完成"],
+				fromarray: [],
+				user: uni.getStorageSync('user'),
+				customStyle: {
+					width: '690rpx',
+					height: '90rpx',
+					marginBottom: '48rpx',
+					background: '#4A8BFF',
+					borderRadius: '4rpx',
+					border: "none",
+					fontSize: '28rpx',
+					fontFamily: 'Microsoft YaHei-3970(82674968)',
+					fontWeight: 'bold',
+					color: '#FFFFFF',
+					textAlign: 'center',
+					lineHeight: '90rpx !important',
+					marginTop: '48rpx',
+				}
+			}
+		},
+		computed: {
+			...mapState({
+				tabbar: state => state.tabbar.tabbar,
+				timer: state => state.user.timer,
+			})
+		},
+		onLoad(option) {
+
+			if (this.option) {
+				this.init(option.roomId, option.taskId)
+			} else {
+				this.option = option
+
+				this.init(option.roomId, option.taskId)
+			}
+		},
+		methods: {
+			//自带项目三角样式变化
+			sel_show1() {
+				this.itm1_show = !this.itm1_show;
+				if (!this.itm1_show) {
+					this.tri_style1 =
+						'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+				} else {
+					this.tri_style1 =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;';
+				}
+			},
+			//设备三角形样式变化
+			sel_show(index) {
+				// obj.tri_style
+				// obj.it_show
+				this.sel_style[index].it_show = !this.sel_style[index].it_show
+				if (!this.sel_style[index].it_show) {
+					this.sel_style[index].tri_style =
+						'margin-top: 0rpx;margin-bottom:10rpx;border-top-color:transparent;border-bottom-color: #808080;';
+				} else {
+					this.sel_style[index].tri_style =
+						'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;';
+				}
+			},
+			// 顶部跳转栏
+			change(index) {
+				this.current = index
+			},
+			//处理提交数据
+			async scabtnclick() {
+				this.guan = true;
+				this.customStyle.background = "grey";
+				try {
+					await this.sumitComponent()
+					console.log("数据提交前确认", this.$store.state.user.items); // TODO isRequired
+					this.scanSubmit()
+				} catch {
+					this.$refs.sacast.show({
+						title: '提交失败,请稍后再试',
+					})
+					//开启按钮
+					this.customStyle.background = '#4A8BFF';
+					this.guan = false;
+				}
+				
+			},
+			async sumitComponent() {
+				if (this.$refs.scaimg) {
+					for (let i = 0; i < this.$refs.scaimg.length; i++) {
+						await this.$refs.scaimg[i].submit()
+					}
+					this.$refs.sacast.show({
+						title: '图片上传中...',
+						// 如果不传此type参数,默认为default,也可以手动写上 type: 'default'
+						// type: 'success', 
+						// 如果不需要图标,请设置为false
+						// icon: false
+					})
+				}
+				if (this.$refs.scatex) {
+					this.$refs.scatex.forEach(i => {
+						i.submit()
+					});
+				}
+				if (this.$refs.scanum) {
+					this.$refs.scanum.forEach(i => {
+						i.submit()
+					});
+				}
+				if (this.$refs.scarad) {
+					this.$refs.scarad.forEach(i => {
+						i.submit()
+					});
+				}
+				if (this.$refs.scachb) {
+					this.$refs.scachb.forEach(i => {
+						i.submit()
+					});
+				}
+				
+			},
+			//提交数据接口
+			async scanSubmit() {
+				//能改
+				setTimeout(() => {
+					//开启按钮
+					this.customStyle.background = '#4A8BFF';
+					this.guan = false;
+				}, 3000)
+				let {
+					message,
+					code,
+					data
+				} = await patrolRecord({
+					roomId: this.option.roomId,
+					taskId: this.option.taskId,
+					items: this.$store.state.user.items
+				})
+				if (code == 200) {
+					//清空提交巡检数据数组
+					this.$store.state.user.items = [];
+					this.$refs.sacast.show({
+						title: '巡检完成',
+						type: 'success',
+					})
+					//跳转巡检记录
+					this.change(1)
+				} else {
+					//清空提交巡检数据数组
+					console.log('this.$store.state.user.items',this.$store.state.user.items)
+					this.$store.state.user.items = [];
+					this.$refs.sacast.show({
+						title: message,
+						type: 'warning',
+					})
+				}
+			},
+			//重置表单(未用到,只需更新items为空数组,其他会随组件刷新)
+			scanReset() {
+				this.$nextTick(() => {
+					if (this.$refs.scatex) {
+						this.$refs.scatex.forEach(i => {
+							i.reset()
+						});
+					}
+					if (this.$refs.scanum) {
+						this.$refs.scanum.forEach(i => {
+							i.reset()
+						});
+					}
+					if (this.$refs.scarad) {
+						this.$refs.scarad.forEach(i => {
+							i.reset()
+						});
+					}
+					if (this.$refs.scaimg) {
+						this.$refs.scaimg.forEach(i => {
+							i.reset()
+						});
+					}
+					if (this.$refs.scachb) {
+						this.$refs.scachb.forEach(i => {
+							i.reset()
+						});
+					}
+				})
+			},
+			//获取巡检房间信息与巡检检查项目规则
+			init(roomId, taskId) {
+				checkItemlist({
+						taskId,
+						roomId
+					})
+					.then(({
+						data
+					}) => {
+						//处理自带巡检项目数据
+						if (data.checkItems.length != 0) {
+							//处理自带巡检项JSON数据
+							data.checkItems.forEach(i => {
+								i.checkItem = JSON.parse(i.checkItem)
+							})
+						}
+						//计算巡检项目数量
+						this.checkItemCount += data.checkItems.length
+						//处理设备巡检项目数据
+						if (data.devices.length != 0) {
+							data.devices.forEach(i => {
+								this.checkItemCount += i.checkItems.length
+								let obj = {}
+								obj.tri_style =
+									'margin-top: 10rpx;margin-bottom:0rpx;border-top-color:#808080;border-bottom-color: transparent;'
+								obj.it_show = true
+								this.sel_style.push(obj)
+								//处理设备巡检项JSON数据
+								i.checkItems.forEach(h => {
+									h.checkItem = JSON.parse(h.checkItem)
+								})
+							})
+						}
+						this.scmdata = data
+					})
+			},
+			recyle(e) {
+				const {
+					key,
+					boll,
+					name
+				} = e
+
+				this.$set(this.from.aircondparol, key, {
+					name,
+					boll: !boll,
+				}); //与组件那边同步刷新
+				this.timerefs = new Date().getTime() //刷新父组件
+				// this.$forceUpdate()
+
+			},
+			raidodx(index) {
+				let fromarray = this.fromarray
+				if (fromarray.length == 0) {
+					this.fromarray.push(index)
+				} else {
+					let sum
+					let a = fromarray.find((index2, key) => {
+						sum = -1
+
+						if (index2.itemId == index.itemId) {
+							sum = key
+							return key
+						} else {
+							sum = -1
+						}
+					})
+
+					if (sum != -1) {
+						this.fromarray.splice(sum, 1)
+					}
+					this.fromarray.push(index)
+				}
+
+			},
+
+		},
+	}
+</script>
+
+<style lang="scss">
+	.scning .scrll-height {
+		width: 100%;
+		box-sizing: border-box;
+		height: calc(100vh - 78rpx);
+		background: #FFFFFF;
+	}
+
+	// .scning view {
+	// 	line-height: 1;
+	// }
+
+	.left-boto-txt {
+		position: absolute;
+		left: 30rpx;
+		top: 107rpx;
+		font-size: 28rpx;
+	}
+
+	.xianchang {
+		width: auto;
+		font-size: 14px;
+		color: #333333;
+		font-weight: bold;
+		padding: 26rpx 32rpx;
+	}
+
+
+	.collect_tit {
+		width: 690rpx;
+		height: 104rpx;
+
+		.tit {
+			width: 128rpx;
+			// height: 33rpx;
+			line-height: 33rpx;
+			margin-left: 30rpx;
+			font-size: 32rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: bold;
+			color: #010101;
+
+		}
+
+		image {
+			max-width: 24rpx;
+			max-height: 24rpx;
+			margin-left: 42rpx;
+		}
+
+		span {
+			line-height: 33rpx;
+			// height: 24rpx;
+			margin-left: 10rpx;
+			font-size: 24rpx;
+			font-family: Microsoft YaHei-3970(82674968);
+			font-weight: 400;
+			color: #808080;
+		}
+	}
+
+
+	.sup {
+		color: red;
+	}
+
+	.sel_point {
+		width: 690rpx;
+		height: 70rpx;
+		background: #EBF8FF;
+
+
+
+		.triangle {
+			margin-top: 10rpx;
+			display: inline-block;
+			/* Base Style */
+			border: solid 10rpx transparent;
+			border-top-color: #808080;
+		}
+	}
+
+	.u-radio,
+	.u-checkbox {
+		margin-top: 29rpx;
+	}
+
+	.u-radio__label,
+	.u-checkbox__label {
+		color: #333333 !important;
+		width: 100%;
+	}
+
+	input {
+		width: 100%;
+		height: 100%;
+		// text-indent: 20rpx;
+	}
+
+	.inp {
+		width: 690rpx;
+		height: 80rpx;
+		padding: 18rpx;
+		border: 1rpx solid #BFBFBF;
+		border-radius: 6rpx;
+	}
+
+	.tex {
+		width: 690rpx;
+		height: 210rpx;
+		border: 1rpx solid #BFBFBF;
+		border-radius: 6rpx;
+	}
+
+	textarea {
+		width: 100%;
+		height: 100%;
+		margin-top: 10rpx;
+		text-indent: 20rpx;
+	}
+
+	.upload-image {
+		width: 139rpx;
+		height: 139rpx;
+		margin-right: 45rpx;
+		// background-image: url(../../static/img/jia.png);
+		// background-repeat: no-repeat;
+		// background-size: 100%;
+		// line-height: 32px !important;
+	}
+
+	.scan-item-hidden {
+		display: none;
+	}
+
+	.scan-form-item-show {
+		display: block;
+	}
+</style>

+ 181 - 0
scan_pages/seemore/seemore.vue

@@ -0,0 +1,181 @@
+<template>
+	<view class="u-flex f-d-c m-w u-p-l-30 u-p-r-30">
+		<view class="m-w">
+			<u-dropdown>
+				<u-dropdown-item @change="drowcitem1" :title="title" :options="options1"></u-dropdown-item>
+			</u-dropdown>
+		</view>
+		<scroll-view v-if="!opendata" :scroll-y="true" @scrolltolower="lazyGetRooms()" class="scr-height">
+			<block v-for="(index,key) in list" :key="key">
+				<cDisk :more="1" :parobj="index"
+					:prourl="`/scan_pages/patrol/patrol?taskId=${index.id}&status=${index.status}`" />
+			</block>
+			<view style="overflow: hidden;">
+				<u-loadmore :status="status" :icon-type="iconType" :load-text="loadText" />
+			</view>
+		</scroll-view>
+		<u-empty text="正在搜索中" v-else mode="list"></u-empty>
+		<u-toast ref="sacast" />
+	</view>
+</template>
+
+<script>
+	import cDisk from '@/components/c-disk/index.vue'
+	import {
+		getTaskPageOfScan,
+		patrolTask
+	} from '@/api/index.js'
+	import dayjs from "dayjs";
+	import {
+		mapState
+	} from 'vuex'
+	export default {
+		components: {
+			cDisk
+		},
+		data() {
+			return {
+				options1: [{
+						label: '今天',
+						value: [dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime())).format(
+							"YYYY-MM-DD HH:mm:ss"), dayjs(new Date(new Date(new Date().toLocaleDateString())
+							.getTime() + 24 * 60 * 60 * 1000 - 1)).format("YYYY-MM-DD HH:mm:ss")],
+					},
+					{
+						label: '昨天',
+						value: [dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime() - 24 * 60 * 60 *
+							1000)).format("YYYY-MM-DD HH:mm:ss"), dayjs(new Date(new Date(new Date()
+							.toLocaleDateString()).getTime() - 1)).format("YYYY-MM-DD HH:mm:ss")],
+					},
+					{
+						label: '近7日',
+						value: [dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime() - (24 * 60 * 60 *
+							1000) * 3)).format("YYYY-MM-DD HH:mm:ss"), dayjs(new Date(new Date(new Date()
+							.toLocaleDateString()).getTime() + (24 * 60 * 60 * 1000) * 3)).format(
+							"YYYY-MM-DD HH:mm:ss")],
+					}
+				],
+				options2: [{
+						label: '合格的',
+						value: 1,
+					},
+					{
+						label: '不合格',
+						value: 2,
+					},
+				],
+				list: [],
+				totalCount: -1,
+				curPage: 1,
+				totalPage: 0, //总页数
+				queryform: {
+					// value1:undefined,
+					// beginTimeStart:undefined,
+					// beginTimeEnd:undefined,
+					// pointId: 0	,
+				},
+				opendata: false,
+				title: "时间",
+				//下拉加载配置
+				status: 'loadmore',
+				iconType: 'flower',
+				loadText: {
+					loadmore: '轻轻上拉',
+					loading: '努力加载中',
+					nomore: '实在没有了'
+				}
+			}
+		},
+		computed: {
+			...mapState({
+				timer: state => state.user.timer
+			})
+		},
+		onLoad() {
+			// this.queryform.beginTimeStart = this.timer.beginTimeStart
+			// this.queryform.beginTimeEnd =  this.timer.beginTimeEnd
+			this.getlist(-1)
+		},
+		methods: {
+			// open(){
+			// 	this.opendata=true
+			// },
+			// close(){
+			// 	this.opendata=false
+			// },
+			drowcitem1(row) {
+				let row1 = (JSON.parse(JSON.stringify(row))).toString()
+				let text = this.options1.find(e => {
+					let _evalue = (JSON.parse(JSON.stringify(e.value))).toString()
+					return _evalue == row1
+				})
+				this.title = text.label
+				this.queryform.beginTimeStart = row[0]
+				this.queryform.beginTimeEnd = row[1]
+				this.$nextTick(() => {
+					this.getlist(-1)
+				})
+			},
+			async getlist(index) {
+				if (this.totalCount == -1 || index == -1) {
+					this.list = []
+					this.curPage = 1
+					let data = await patrolTask({
+						page: 1,
+						size: 10,
+						...this.queryform
+					})
+					const {
+						list,
+						total,
+					} = data.data
+					this.totalCount = total //总个数
+					this.list = list //列表
+				} else {
+					let curPage = this.curPage + 1
+					if (this.list.length < this.totalCount) {
+						let {
+							data
+						} = await patrolTask({
+							page: curPage,
+							size: 10,
+							...this.queryform
+						})
+						this.curPage = this.curPage + 1
+						data.list.forEach(i => {
+							this.list.push(i)
+						})
+					} else if (this.list.length == this.totalCount) {
+						this.$refs.sacast.show({
+							title: '没有更多了',
+							type: 'info',
+						})
+					}
+				}
+			},
+			//懒加载房间数据
+			lazyGetRooms() {
+				var timer = null;
+				if (this.list.length == this.totalCount) this.status = 'nomore';
+				this.status = 'loading';
+				clearTimeout(timer)
+				timer = setTimeout(() => {
+					this.getlist(1)
+					if (this.list.length == this.totalCount) this.status = 'nomore';
+					else this.status = 'loading';
+				}, 2000)
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.scr-height {
+		height: calc(100vh - 74rpx);
+		background: #FFFFFF;
+		box-shadow: 0px 0px 6rpx 0px rgba(6, 0, 1, .3);
+		border-radius: 10rpx 10rpx 0px 0px;
+		width: 690rpx;
+		/* padding-bottom: 10rpx; */
+	}
+</style>

+ 37 - 0
static/css/chj.css

@@ -0,0 +1,37 @@
+.u-f-d-c{
+		 flex-direction: column !important;
+	 }
+.f-d-c{
+	flex-direction: column !important;
+}	 
+.m-w{
+	width: 100% !important;
+}	
+ .ccc{
+	 border-top: 1px solid #cccccc;
+ }
+ .f-w-b{
+	 font-weight: bold;
+ }
+ .bb{
+	 width: 10rpx;
+	 height: 38rpx;
+	 background: #4A8BFF
+ }
+ 
+ .upload-image{
+ 	display: flex;
+ 	line-height:60rpx;
+ 	justify-content: center;
+ 	width: 76rpx;
+ 	height: 76rpx;
+ 	background: #e3e2e2 !important;
+ 	font-size: 74rpx;
+	color: #838383;
+ }
+
+::-webkit-scrollbar {
+  width: 0;
+  height: 0;
+  color: transparent;
+}

BIN
static/img/bhg.png


BIN
static/img/devi.png


BIN
static/img/feij.png


BIN
static/img/hege.png


BIN
static/img/homelogo.png


BIN
static/img/jia.png


BIN
static/img/logo.png


BIN
static/img/navbar/nav1.png


BIN
static/img/navbar/nav2.png


BIN
static/img/navbar/nav3.png


BIN
static/img/navbar/nav4.png


BIN
static/img/navbar/nav5.png


BIN
static/img/navbar/nav6.png


BIN
static/img/navbar/nav7.png


BIN
static/img/navbar/nav8.png


BIN
static/img/partrol/back.png


BIN
static/img/password.png


BIN
static/img/person/pwd.png


BIN
static/img/person/qh.png


BIN
static/img/person/td.png


BIN
static/img/phone.png


BIN
static/img/proj.png


BIN
static/img/renwu/chaos.png


BIN
static/img/renwu/chuli.png


BIN
static/img/renwu/quxiao.png


BIN
static/img/renwu/wanchen.png


BIN
static/img/tzicon.png


BIN
static/img/wks.png


BIN
static/uview/common/favicon.ico


BIN
static/uview/common/logo.png


BIN
static/uview/example/component.png


+ 4 - 0
static/uview/example/component.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 48 48" fill="rgba(128, 128, 128, 1)">
+    <path d="M20 40V28h8v12h10V24h6L24 6 4 24h6v16z"></path>
+    <path d="M0 0h48v48H0z" fill="none"></path>
+</svg>

BIN
static/uview/example/component_select.png


+ 4 - 0
static/uview/example/component_select.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 48 48" fill="rgba(42, 130, 228, 1)">
+    <path d="M20 40V28h8v12h10V24h6L24 6 4 24h6v16z"></path>
+    <path d="M0 0h48v48H0z" fill="none"></path>
+</svg>

BIN
static/uview/example/js.png


BIN
static/uview/example/template.png


+ 4 - 0
static/uview/example/template.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 48 48" fill="rgba(128, 128, 128, 1)">
+    <path d="M24 24c4.42 0 8-3.59 8-8 0-4.42-3.58-8-8-8s-8 3.58-8 8c0 4.41 3.58 8 8 8zm0 4c-5.33 0-16 2.67-16 8v4h32v-4c0-5.33-10.67-8-16-8z"></path>
+    <path d="M0 0h48v48H0z" fill="none"></path>
+</svg>

BIN
static/uview/example/template_select.png


+ 4 - 0
static/uview/example/template_select.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 48 48" fill="rgba(37, 129, 233, 1)">
+    <path d="M24 24c4.42 0 8-3.59 8-8 0-4.42-3.58-8-8-8s-8 3.58-8 8c0 4.41 3.58 8 8 8zm0 4c-5.33 0-16 2.67-16 8v4h32v-4c0-5.33-10.67-8-16-8z"></path>
+    <path d="M0 0h48v48H0z" fill="none"></path>
+</svg>

+ 13 - 0
store/index.js

@@ -0,0 +1,13 @@
+import tabbar from './modules/tabbar.js';
+import user from './modules/user.js';
+import Vuex from 'vuex'
+import Vue from 'vue'
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+	modules:{
+		tabbar,
+		user,
+		
+	}	
+})

+ 31 - 0
store/modules/tabbar.js

@@ -0,0 +1,31 @@
+const state = {
+	tabbar: [{
+			iconPath: "/static/uview/example/component.png",
+			selectedIconPath: "/static/uview/example/component_select.png",
+			text: '巡检',
+			pagePath: "/pages/onsitpection/home/index"
+		},
+		{
+			iconPath: "/static/uview/example/js.png",
+			selectedIconPath: "/static/uview/example/js.png",
+			text: '扫一扫',
+			midButton: true,
+			pagePath:"/pages/onsitpection/selectplain/selectplain"
+			//pagePath: "/pages/onsitpection/scanning/scanning"
+		},
+		{
+			iconPath: "/static/uview/example/template.png",
+			selectedIconPath: "/static/uview/example/template_select.png",
+			text: '我的',
+			pagePath: "/pages/onsitpection/person/person"
+		},
+	]
+}
+
+
+
+export default {
+  namespaced: true, //解决命名冲突(使用时需要备注模块名)
+  state,
+ 
+};

+ 97 - 0
store/modules/user.js

@@ -0,0 +1,97 @@
+import dayjs from "dayjs";
+import {
+	getTaskPageOfScan
+} from '@/api/index.js'
+const state = {
+	timer: {
+		beginTimeStart: dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime())).format("YYYY-MM-DD HH:mm:ss"),
+		beginTimeEnd: dayjs(new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1)).format("YYYY-MM-DD HH:mm:ss")
+	},
+	people: [], //执行人数组
+	taskdetail: null,// 最新任务详情
+	taskList: [],// 选择计划列表
+	roomId: null, // 扫码获取的房间id
+	items:[] // 巡检提交数据
+}
+const actions = {
+	//扫一扫
+	gettasklist({ commit }) {
+		uni.scanCode({
+			onlyFromCamera: true,
+			success: async (res) => {
+			
+				let url =res.result; // 获取URL
+				
+				let id = url.match(/[^\=]\d/g)
+				//有id则跳转巡检
+				if (id) {
+
+					let data = await getTaskPageOfScan({
+						roomId: id[0]
+					})
+					
+					state.roomId =id[0];
+					
+					if (data.code == 200) {
+						commit("SET_TESK", data.data)
+					} else {
+						uni.showToast({
+							title: data.message,
+							icon: "none",
+							duration: 2000
+						});
+					}
+				//没有id则登入或核销
+				}  else{
+					
+					let reg = url.match(/register/)
+					
+					reg || (reg = false)
+					
+					if(reg[0] == 'register') {
+						uni.navigateTo({
+								url: '/pages/writeoff/register/register',
+								complete(data) {
+									console.log("to_register", data)
+								}						
+							})
+						} else {
+							uni.navigateTo({
+									url: '/pages/writeoff/exitwritoff/exitwritoff',
+									complete(data) {
+										console.log("to_exitwritoff", data)
+									}						
+								})
+						}
+					} 
+			},
+			fail() {
+				console.log("失败了")
+				uni.switchTab({
+					url: '../home/index'
+				})
+			}
+		});
+	}
+}
+const mutations = {
+	SET_TESK(state, payload) {
+		state.taskList = payload;
+		uni.reLaunch({
+			url: '/pages/onsitpection/selectplain/selectplain',
+			complete(data) {
+				console.log("err", data)
+			}
+		})
+	}
+	
+
+}
+
+
+export default {
+	namespaced: true, //解决命名冲突(使用时需要备注模块名)
+	state,
+	actions,
+	mutations
+};

+ 121 - 0
task_pages/addppeople/addppeople.vue

@@ -0,0 +1,121 @@
+<template>
+	<view style="height: 100vh;" class=" ccc u-p-l-30 u-p-r-30 u-p-t-28 u-relative">
+		<c-search @serbtn="serbtn()" />
+		<view class="m-w u-m-t-34 ">
+			<view class="m-w">
+				<scroll-view class="m-w u-m-t-35 addscheight" :scroll-y="true">
+						<block v-for="(item,index) in list" :key="index">
+							<label @click="reove(item)" class="u-flex u-p-b-32 u-m-b-32 "
+								style="border-bottom: 1px solid #E6E6E6;">
+								<u-checkbox class="che" @click="reove(item)" :disabled="false" v-model="item.boll">
+									{{item.name}}
+								</u-checkbox>
+							</label>
+						</block>
+				</scroll-view>
+				<view @click="sumit" class="submit">确定</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import cSearch from '@/components/c-search/index.vue'
+	import {
+		syslist2
+	} from '@/api/index.js'
+	export default {
+		components: {
+			cSearch
+		},
+		data() {
+			return {
+				list: [],
+				querform: {
+					keyword: "",
+					page: 1,
+					size: 50,
+				}
+			}
+		},
+		onLoad() {
+			this.init()
+		},
+		methods: {
+			init() {
+				syslist2(this.querform)
+					.then(({
+						data
+					}) => {
+						this.list = []
+						data.list.forEach(Element => {
+							this.list.push({
+								boll: false,
+								id: Element.id,
+								name: Element.name
+							})
+						})
+					})
+			},
+			reove(row) {
+					row.boll = !row.boll
+			},
+			sumit() {
+				let arr = [];
+				this.list.forEach(Element => {
+					if (Element.boll) {
+						arr.push(
+						{
+							execUserId: Element.id,
+							execUserName: Element.name
+						}
+						)
+					}
+				})
+				this.$store.state.user.people = arr;
+				uni.navigateBack(1)
+			},
+			serbtn({
+				text
+			}) {
+				if (text == 10000000000) {
+					this.querform.keyword = ""
+				} else {
+					this.querform.keyword = text
+				}
+				this.$nextTick(() => {
+					this.init()
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.title-back {
+		width: 10rpx;
+		height: 38rpx;
+		background: #4A8BFF;
+	}
+
+	.addscheight {
+		height: calc(100vh - 315rpx);
+	}
+	.che {
+		width: 100%;
+	}
+	
+	.submit {
+		width: 690rpx;
+		height: 90rpx;
+		background: #4A8BFF;
+		border-radius: 4rpx;
+		font-size: 28rpx;
+		line-height: 90rpx;
+		text-align: center;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: bold;
+		color: #FFFFFF;
+		margin-top: 50rpx;
+	}
+</style>

+ 356 - 0
task_pages/guarantee/guarantee.vue

@@ -0,0 +1,356 @@
+<template>
+	<!-- 发布任务 -->
+	<view class="u-padding-30">
+		<u-form>
+			<u-form-item>
+				<view class="item-title">任务标题</view>
+				<u-input placeholder="任务标题" border :customStyle="{paddingRight:'22rpx'}" v-model="form.title" />
+			</u-form-item>
+			<u-form-item>
+				<view class="item-title">任务类型</view>
+				<u-input @click="selceshow=true" type="select" border v-model="selectValue" placeholder="任务类型"
+					:customStyle="{paddingRight:'22rpx'}" />
+				<u-select v-model="selceshow" :list="list" @confirm="confirm"></u-select>
+			</u-form-item>
+			<u-form-item>
+				<view class="item-title">具体位置</view>
+				<u-input @click="pointShow=true" type="select" border v-model="pointValue" placeholder="具体位置"
+					:customStyle="{paddingRight:'22rpx'}" />
+				<u-select v-model="pointShow" mode="mutil-column-auto" value-name="id" label-name="name" :list="pointList" @confirm="confirmPoint"></u-select>
+			</u-form-item>
+			<u-form-item>
+				<view class="item-title">所属系统</view>
+				<u-input @click="systemShow=true" type="select" border v-model="systemValue" placeholder="所属系统"
+					:customStyle="{paddingRight:'22rpx'}" />
+				<u-select v-model="systemShow" :list="systemList" @confirm="confirmSystem"></u-select>
+			</u-form-item>
+			<u-form-item>
+				<view class="item-title">要求完成时间</view>
+				<u-picker @confirm="pickermeth" :params="params" v-model="show" mode="time"></u-picker>
+				<u-input placeholder="要求完成时间" type="select" @click="show=true" border v-model="form.finishTime"
+					:customStyle="{paddingRight:'22rpx'}" />
+			</u-form-item>
+
+			<u-form-item>
+				<view class="item-title">任务内容</view>
+				<u-input type="Textarea" :customStyle="{paddingRight:'22rpx'}" height="60" border
+					v-model="form.content" />
+			</u-form-item>
+			<u-form-item>
+				<view class="item-title">任务图片</view>
+				<view class="item-images u-padding-10">
+					<c-img @changeImg="changeImg($event)"></c-img>
+				</view>
+			</u-form-item>
+			<u-form-item>
+				<view class="u-flex">
+					<view class="item-title">执行人员</view>
+					<navigator hover-class="none" url="../addppeople/addppeople" class="u-m-l-30 u-f-28 u-flex "
+						style="color: #333333;">
+						<view class="add">+</view>
+						<view v-for="(index,key) in peopleList" :key="key" style="margin-right: 5px;">
+							{{index.execUserName}}
+						</view>
+						<view class="u-m-l-20" style="color: #4A8BFF;">添加</view>
+					</navigator>
+				</view>
+			</u-form-item>
+			<u-form-item>
+				<view @click="sumit" class="submit">确定</view>
+			</u-form-item>
+		</u-form>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	import cImg from '@/components/c-img/index.vue'
+	import dayjs from "dayjs";
+	import {
+		addTask,
+		building,
+		floor,
+		room
+	} from "@/api/index.js";
+	export default {
+		components: {
+			cImg,
+		},
+		data() {
+			return {
+				show: false,
+				selceshow: false,
+				pointShow: false,
+				systemShow:false,
+				form: {
+					title: undefined,
+					type: undefined,
+					roomId:undefined,
+					belongSystem:undefined,
+					content: undefined,
+					finishTime: undefined,
+					images: undefined,
+					executors: [],
+				},
+				peopleList: "",
+				params: {
+					year: true,
+					month: true,
+					day: true,
+					hour: true,
+					minute: true,
+					second: true,
+					province: true,
+					city: true,
+					area: true,
+					timestamp: true,
+				},
+				list: [{
+						value: 1,
+						label: "一般任务",
+
+					},
+					{
+						value: 2,
+						label: "较急任务",
+
+					},
+					{
+						value: 3,
+						label: "紧急任务",
+
+					},
+				],
+				systemList:[{
+						value: "配电",
+						label: "配电",
+					},
+					{
+						value: "照明",
+						label: "照明",
+
+					},
+					{
+						value: "监控",
+						label: "监控",
+					
+					},
+					{
+						value: "电梯",
+						label: "电梯",
+					
+					},
+					{
+						value: "BA",
+						label: "BA",
+					
+					},
+					{
+						value: "门禁",
+						label: "门禁",
+					
+					},
+					{
+						value: "给排水",
+						label: "给排水",
+					
+					},
+					{
+						value: "消防",
+						label: "消防",
+					
+					},
+					{
+						value: "空调",
+						label: "空调",
+					
+					},
+					{
+						value: "综合土建",
+						label: "综合土建",
+					
+					},
+					{
+						value: "动环",
+						label: "动环",
+					
+					},
+					{
+						value: "工器具",
+						label: "工器具",
+					
+					},
+					{
+						value: "机柜",
+						label: "机柜",
+					
+					},
+				],
+				pointList:[],//具体位置数组
+				selectValue: "",
+				pointValue:'',
+				systemValue:''
+			};
+		},
+		onLoad() {
+		  this.getBuilding()
+		},
+		onShow() {
+			this.peopleList = this.$store.state.user.people;
+			
+			this.form.executors = []
+			if (this.peopleList) {
+				this.peopleList.forEach(Element => {
+					this.form.executors.push(Element.execUserId)
+				})
+				this.form.executors = JSON.parse(JSON.stringify(this.form.executors))
+			}
+			this.$store.state.user.people = "";
+		},
+		methods: {
+			//获取楼栋
+			async getBuilding() {
+				let {
+					data
+				} = await building();
+				this.pointList.length = 0;
+				data.forEach(i => {
+					this.pointList.push(i)
+				});
+				for (let i = 0, len = this.pointList.length; i < len; i++) {
+					await this.getFloor(this.pointList[i].id, i)
+					for (let j = 0, len = this.pointList[i].children.length; j < len; j++) {
+						await this.getRoom(this.pointList[i].children[j].id, i, j)
+					}
+				}
+				
+			},
+			//获取楼层
+			async getFloor(buildingId, i) {
+				let {
+					data
+				} = await floor(buildingId)
+				this.pointList[i].children = [];
+				data.forEach(ite => {
+					this.pointList[i].children.push(ite)
+				})
+			},
+			//获取房间
+			async getRoom(roomId, i, j) {
+				let {
+					data
+				} = await room(roomId)
+				this.pointList[i].children[j].children = [];
+				data.forEach(ite => {
+					this.pointList[i].children[j].children.push(ite)
+				})
+			},
+			//获取图片组件穿过来的图片
+			changeImg(img) {
+				this.form.images = img;
+			},
+			//发布任务
+			sumit() {
+				addTask(
+					this.form
+				).then((data) => {
+					const {
+						code,
+						message
+					} = data;
+					if (code == 200) {
+						this.$refs.uToast.show({
+							title: "发布成功",
+							type: 'success',
+							callback: () => {
+								uni.navigateBack(1);
+							},
+						});
+					} else {
+						this.$refs.uToast.show({
+							title: message,
+						});
+					}
+				});
+			},
+			//时间选择器
+			pickermeth(timer) {
+				const {
+					timestamp
+				} = timer;
+				let ti = dayjs(timestamp * 1000).format("YYYY-MM-DD HH:mm:ss");
+				this.form.finishTime = ti;
+			},
+			//任务类型确认
+			confirm(e) {
+				this.form.type = e[0].value;
+				this.selectValue = e[0].label;
+			},
+			//所属系统确认
+			confirmSystem(e) {
+				this.form.belongSystem = e[0].value;
+				this.systemValue = e[0].label;
+			},
+			//具体位置确认
+			confirmPoint(e) {
+				this.form.roomId = e[2].value;
+				this.pointValue = `${e[0].label}/${e[1].label}/${e[2].label}` 
+			}
+		},
+	};
+</script>
+
+<style>
+	.item-title {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+	}
+
+	.item-images {
+		width: 690rpx;
+
+		border: 1rpx solid #dcdfe6;
+		border-radius: 4rpx;
+	}
+
+	.upload-image {
+		display: flex;
+		line-height: 60rpx;
+		justify-content: center;
+		width: 76rpx;
+		height: 76rpx;
+		background: #a9a9a9;
+		font-size: 74rpx;
+	}
+
+	.add {
+		width: 47rpx;
+		height: 47rpx;
+		border-radius: 50%;
+		line-height: 31rpx;
+		text-align: center;
+		color: #4a8bff;
+		border: 2px solid #4a8bef;
+		font-size: 45rpx;
+		position: relative;
+		display: flex;
+
+		justify-content: center;
+	}
+
+	.submit {
+		width: 690rpx;
+		height: 90rpx;
+		background: #4a8bff;
+		border-radius: 4rpx;
+		font-size: 28rpx;
+		line-height: 90rpx;
+		text-align: center;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: bold;
+		color: #ffffff;
+		margin-top: 50rpx;
+	}
+</style>

+ 236 - 0
task_pages/taskarrment/feebacklist/feebacklist.vue

@@ -0,0 +1,236 @@
+<template>
+	<view class="u-flex f-d-c ">
+		<scroll-view @scrolltolower="init(id)" :scroll-y="true" class="cs-heig">
+			<view class="comment" v-for="(res, index) in list" :key="res.id">
+				<view class="left">
+					<u-avatar width="90" height="90" mode="circle" />
+				</view>
+				<view class="right">
+					<view class="top">
+						<view class="name">{{ res.userId }}</view>
+					</view>
+					<view class="content">{{ res.content }}</view>
+					<view class="u-flex">
+						<view class="u-m-r-10" :key="key" v-for="(index,key) in res.imagear">
+							<u-image @click="previewImage(index)" :src="index " width="150" height="150"></u-image>
+						</view>
+					</view>
+					<view class="bottom">
+						{{res.createTime}}
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		<navigator hover-class="none" :url="`../taskfeeback/taskfeeback?id=${id}&title=${title}`" class="feebtn">我要反馈
+		</navigator>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+	import {
+		taskfeedback
+	} from '@/api/index.js'
+	import dayjs from "dayjs";
+	export default {
+		data() {
+			return {
+				commentList: [],
+				title: "",
+				id: "",
+				list: [],
+				totalCount: -1,
+				curPage: 1,
+				totalPage: 0 //总页数
+			};
+		},
+		onLoad(option) {
+			this.title = option.title
+			this.id = option.id
+		},
+		onShow() {
+			this.totalCount = -1
+			this.curPage = -1
+			this.$nextTick(() => {
+				this.init(this.id)
+			})
+		},
+		methods: {
+			// 点击图片事件
+			previewImage(index) {
+				uni.previewImage({
+					current: index, //预览图片的下标
+					urls: [index] //预览图片的地址,必须要数组形式,如果不是数组形式就转换成数组形式就可以
+				})
+			},
+			// createimg(arr) {
+			// 	arr.map((index) => {
+			// 		index.imagear = index.images.split(",")
+			// 		return index
+			// 	})
+			// },
+			
+			// 处理图片数据格式
+			spliteimage(datastring) {
+				let ar = datastring.split(',')
+				return ar
+			},
+			// 获取页面数据
+			async init(id) {
+				if (this.totalCount == -1) {
+					let data = await taskfeedback({
+						taskId: id,
+					})
+					let {
+						list,
+						total,
+					} = data.data
+					list = list.map((index) => {
+						index.createTime = dayjs(index.createTime).format("YYYY-MM-DD HH:mm:ss")
+						index.imagear = this.spliteimage(index.images)
+						return index
+					})
+					this.list = list //列表
+				} else {
+					if (this.curPage <= this.totalPage) {
+						let data = await taskfeedback({
+							taskId: id,
+							// page: this.curPage
+						})
+						let list = JSON.parse(JSON.stringify(this.list))
+						list = list.map((index) => {
+							index.imagear = this.spliteimage(index.images)
+							return index
+						})
+						this.list = [
+							...list, ...data.data.list
+						]
+						this.curPage = this.curPage + 1
+					} else {
+						this.$refs.uToast.show({
+							title: '没有更多了',
+
+						})
+					}
+				}
+
+			},
+
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	.comment {
+		display: flex;
+		padding: 30rpx;
+
+		.left {
+			image {
+				width: 64rpx;
+				height: 64rpx;
+				border-radius: 50%;
+				background-color: #f2f2f2;
+			}
+		}
+
+		.right {
+			flex: 1;
+			padding-left: 20rpx;
+			font-size: 30rpx;
+
+			.top {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				margin-bottom: 10rpx;
+
+				.name {
+					color: #5677fc;
+				}
+
+				.like {
+					display: flex;
+					align-items: center;
+					color: #9a9a9a;
+					font-size: 26rpx;
+
+					.num {
+						margin-right: 4rpx;
+						color: #9a9a9a;
+					}
+				}
+
+				.highlight {
+					color: #5677fc;
+
+					.num {
+						color: #5677fc;
+					}
+				}
+			}
+
+			.content {
+				margin-bottom: 10rpx;
+			}
+
+			.reply-box {
+				background-color: rgb(242, 242, 242);
+				border-radius: 12rpx;
+
+				.item {
+					padding: 20rpx;
+					border-bottom: solid 2rpx $u-border-color;
+
+					.username {
+						font-size: 24rpx;
+						color: #999999;
+					}
+				}
+
+				.all-reply {
+					padding: 20rpx;
+					display: flex;
+					color: #5677fc;
+					align-items: center;
+
+					.more {
+						margin-left: 6rpx;
+					}
+				}
+			}
+
+			.bottom {
+				margin-top: 20rpx;
+				display: flex;
+				font-size: 28rpx;
+				font-weight: 400;
+				color: #999999;
+
+				.reply {
+					color: #5677fc;
+					margin-left: 10rpx;
+				}
+			}
+		}
+	}
+
+	.feebtn {
+		width: 690rpx;
+		height: 90rpx;
+		background: #4A8BFF;
+		border-radius: 4rpx;
+		font-size: 28rpx;
+		text-align: center;
+		line-height: 90rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: bold;
+		color: #FFFFFF;
+		margin-top: 20rpx;
+	}
+
+	.cs-heig {
+		height: calc(100vh - 140rpx);
+
+	}
+</style>

+ 198 - 0
task_pages/taskarrment/taskarrment.vue

@@ -0,0 +1,198 @@
+<template>
+	<!-- 临时任务首页 -->
+	<view class=" u-relative u-flex u-p-l-30 u-p-r-30 f-d-c">
+		<navigator hover-class="none" url="../guarantee/guarantee" class="m-w u-m-t-30 u-flex u-row-right ">
+			<u-image :src="feij" width="40" height="40" />
+			<view class="u-m-l-8">派发任务</view>
+		</navigator>
+		<!-- guarantee -->
+		<view class="m-w">
+			<view style="width: 300rpx;">
+				<u-tabs bar-width="80" :list="list" :is-scroll="false" :current="current" @change="change"></u-tabs>
+			</view>
+		</view>
+		<view class="u-flex u-m-t-30 u-flex-wrap u-row-between">
+			<navigator hover-class="none" :url="`./tasklist/tasklist?staus=${current}&id=${1}`" 
+				class="u-relative u-com-ite  ">
+				<image class="back-img" :src="imgs.chaos"></image>
+				<view class="item-pdi u-flex f-d-c u-clo-vew">
+					<view class="m-w">处理中</view>
+					<view class="item-center"></view>
+					<view class="u-text-right m-w">{{count1}}</view>
+				</view>
+			</navigator>
+			<navigator hover-class="none" :url="`./tasklist/tasklist?staus=${current}&id=${4}`"
+				class="u-relative  u-com-ite  " style=" width: 335rpx;height: 129rpx;  ;">
+				<image class="back-img" :src="imgs.chuli"></image>
+				<view class="item-pdi u-flex f-d-c u-clo-vew">
+					<view class="m-w">已超时</view>
+					<view class="item-center"></view>
+					<view class="u-text-right m-w">{{count4}}</view>
+				</view>
+			</navigator>
+			<navigator hover-class="none" :url="`./tasklist/tasklist?staus=${current}&id=${2}`"
+				class="u-relative u-m-t-30  u-com-ite  " style=" width: 335rpx;height: 129rpx;  ;">
+				<image class="back-img" :src="imgs.quxiao"></image>
+				<view class="item-pdi u-flex f-d-c u-clo-vew">
+					<view class="m-w">已完成</view>
+					<view class="item-center"></view>
+					<view class="u-text-right m-w">{{count2}}</view>
+				</view>
+			</navigator>
+			<navigator hover-class="none" :url="`./tasklist/tasklist?staus=${current}&id=${3}`"
+				class="u-relative u-m-t-30  u-com-ite " style="  width: 335rpx;height: 129rpx;  ;">
+				<image class="back-img" :src="imgs.wanchen"></image>
+				<view class="item-pdi u-flex f-d-c u-clo-vew">
+					<view class="m-w">已取消</view>
+					<view class="item-center"></view>
+					<view class="u-text-right m-w">{{count3}}</view>
+				</view>
+			</navigator>
+		</view>
+	</view>
+</template>
+
+<script>
+	import feij from "@/static/img/feij.png";
+	import chaos from "@/static/img/renwu/chaos.png";
+	import chuli from "@/static/img/renwu/chuli.png";
+	import quxiao from "@/static/img/renwu/quxiao.png";
+	import wanchen from "@/static/img/renwu/wanchen.png";
+	import {
+		taskecl,
+		publishcl
+	} from "@/api/index.js";
+	export default {
+		data() {
+			return {
+				ifOnShow:false,
+				feij: feij,
+				list: [{
+						name: "我收到的",
+					},
+					{
+						name: "我发布的",
+					},
+				],
+				imgs: {
+					chaos,
+					chuli,
+					quxiao,
+					wanchen,
+				},
+				userId: "",
+				current: 0,
+				count1: 0,
+				count2: 0,
+				count3: 0,
+				count4: 0,
+			};
+		},
+		onHide(){
+		
+		this.ifOnShow=true
+		
+		},
+		
+		onShow(){
+		
+		if(this.ifOnShow){
+		
+			this.change(this.current);
+		
+		}
+		
+		},
+		onLoad() {
+			this.change(0);
+		},
+		methods: {
+			change(index) {
+				this.current = index;
+				if (index == 0) {
+					taskecl().then(({
+						data
+					}) => {
+						this.count1=0;
+						this.count2=0;
+						this.count3=0;
+						this.count4=0;
+						data.forEach(Element => {
+							if (Element.status == 1) {
+								this.count1 = Element.count
+							} else if (Element.status == 2) {
+								this.count2 = Element.count
+							} else if (Element.status == 3) {
+								this.count3 = Element.count
+							} else if (Element.status == 4) {
+								this.count4 = Element.count
+							}
+						})
+					});
+				} else {
+					publishcl().then(({
+						data
+					}) => {
+						this.count1=0;
+						this.count2=0;
+						this.count3=0;
+						this.count4=0;
+						data.forEach(Element => {
+							if (Element.status == 1) {
+								this.count1 = Element.count
+							} else if (Element.status == 2) {
+								this.count2 = Element.count
+							} else if (Element.status == 3) {
+								this.count3 = Element.count
+							} else if (Element.status == 4) {
+								this.count4 = Element.count
+							}
+						})
+						
+					});
+				}
+			},
+		},
+	};
+</script>
+
+<style lang="scss">
+	.back-img {
+		position: absolute;
+		width: 335rpx;
+		height: 129rpx;
+		z-index: -1; // 设置z-index层级,将image标签置于底层
+	}
+
+	.u-com-ite {
+		width: 335rpx;
+		height: 129rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.item-pdi {
+		color: #ffffff;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		align-items: inherit;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		line-height: 1;
+
+		view {
+			line-height: 1;
+		}
+	}
+
+	.item-center {
+		width: 270rpx;
+		height: 1rpx;
+		margin-top: 20rpx;
+		margin-bottom: 20rpx;
+		background: #e6e6e6;
+	}
+</style>

+ 106 - 0
task_pages/taskarrment/taskfeeback/taskfeeback.vue

@@ -0,0 +1,106 @@
+<template>
+	<view class="u-p-30 backconfig  ">
+		<view class="u-f-28 u-p-b-28" style="font-weight: 400;color: #333333">任务标题:{{taskdetail.title}}</view>
+		<view class="text-span">
+			<textarea style="width: 100%;height: 180rpx;" v-model="form.content" placeholder="请输入你反馈的内容"></textarea>
+			<view class="m-w u-flex">
+				<!-- <block>
+					<view class="u-m-l-6" v-for="(item,index) in uploadlist4" :key="index">
+						<u-image @click="previewImage(index,uploadlist4)" width="76" height="76" :src="item"></u-image>
+					</view>
+				</block>
+				<view @click="unloadimg(3)" class="upload-image ">+</view> -->
+				<c-img class="u-border" @changeImg="changeImg($event)"></c-img>
+			</view>
+			<view @click="submit" class="task-btn">提交</view>
+			<u-toast ref="uToast" />
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import cImg from '@/components/c-img/index.vue'
+	import {
+		taskfeedbacksave
+	} from "@/api/index.js"
+	export default {
+		components: {
+			cImg,
+		},
+		data() {
+			return {
+				taskdetail: "", //任务详情
+				//反馈提交表单
+				form: {
+					content: "",
+					images:''
+				},
+				
+			}
+		},
+		onLoad() {
+			this.taskdetail = this.$store.state.user.taskdetail
+		},
+		methods: {
+			changeImg(img){
+				this.form.images = img;
+			},
+			// 提交反馈请求
+			submit() {
+				const id = this.taskdetail.id
+				
+				taskfeedbacksave({
+						taskId: id,
+						...this.form
+					})
+					.then(({
+						code,
+						message
+					}) => {
+						this.$refs.uToast.show({
+							title: code == 200 ? "提交成功" : message,
+							type: code == 200 ? 'success' : 'info',
+							callback() {
+								if (code == 200) {
+									uni.navigateBack(1)
+								}
+							}
+						})
+					})
+
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.backconfig {
+		height: 100vh;
+		position: relative;
+	}
+
+	.text-span {
+		width: 690rpx;
+		height: 400rpx;
+		background: #F2F2F2;
+		border-radius: 10rpx;
+		margin-top: 28rpx;
+		padding: 21rpx;
+	}
+
+	.task-btn {
+		width: 690rpx;
+		height: 90rpx;
+		background: #4A8BFF;
+		border-radius: 4rpx;
+		position: absolute;
+		bottom: 30rpx;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: bold;
+		text-align: center;
+		line-height: 90rpx;
+		color: #FFFFFF;
+	}
+</style>

+ 228 - 0
task_pages/taskarrment/tasklist/tasklist.vue

@@ -0,0 +1,228 @@
+<template>
+	<view class="u-p-l-30 u-p-r-30 u-flex f-d-c m-w">
+		<scroll-view class=" sc-view  u-p-l-10 u-p-r-10" @scrolltolower="init()" :scroll-y="true" >
+			<view>
+				<u-cell-group v-if="list.length > 0">
+					<u-cell-item @click="tsanavtask(item)" v-for="(item,index) in list" :key="index"
+						:label-style="{fontWeight: '400',marginTop:'15rpx'}"
+						:title-style="{fontSize:'28rpx',fontWeight: 'bold',color:'#333333',}"
+						:label="`发起人:${item.executors[0]}   ${item.publishTime}`" :title="item.title"></u-cell-item>
+				</u-cell-group>
+				<block v-else>
+					<u-empty text="暂无数据" mode="list"></u-empty>
+				</block>
+			</view>
+		</scroll-view>
+		<u-toast ref="sacast" />
+	</view>
+</template>
+
+<script>
+	import {
+		execlist,
+		publishlist,
+		allList
+	} from "@/api/index.js";
+	import dayjs from "dayjs";
+	export default {
+		data() {
+			return {
+				ifOnShow: false,
+				list: [],
+				statid: 0,
+				totalCount: -1,
+				curPage: 1,
+				queryform: {
+					page: 1,
+					size: 10,
+				},
+				status: undefined,
+				cameFrom: '', //判断来自哪个页面
+			};
+		},
+		onHide() {
+
+			this.ifOnShow = true
+
+		},
+
+		onShow() {
+			//回到处理中的列表才刷新列表
+			if (this.ifOnShow && this.statid == 1) {
+				this.curPage = 1
+				this.$nextTick(() => this.getTypeList(this.status, 1))
+			} 
+
+		},
+		onLoad(params) {
+			if (!params.id) {
+				this.cameFrom = '首页'
+				this.$nextTick(() => {
+					this.init()
+				})
+			} else {
+				this.cameFrom = '临时'
+				this.statid = params.id;
+				this.status = params.staus
+				this.$nextTick(() => {
+					this.init()
+				})
+			}
+		},
+		methods: {
+			tsanavtask(row) {
+				this.$store.state.user.taskdetail = row;
+				uni.navigateTo({
+					url: "../viewtask/viewtask",
+				});
+			},
+
+			// 从子界面进入
+			init() {
+				if (this.cameFrom == '首页') {
+					this.init1()
+				} else if (this.cameFrom == '临时') {
+					this.init2();
+				}
+
+			},
+			//全部任务列表-首页进入
+			 init1() {
+				if (this.totalCount == -1) {
+					this.getAllList(1)
+				} else {
+					if (this.list.length < this.totalCount) {
+						this.getAllList(0)
+						} 
+					else if (this.list.length == this.totalCount) {
+							this.$refs.sacast.show({
+								title: '没有更多了',
+								type: 'info',
+							})
+						}
+				}
+			},
+			//获取全部任务列表-首页进入
+			async getAllList(page) {
+				let res = await allList({
+					page: this.curPage,
+					size: 10,
+				})
+				const {
+					list,
+					total
+				} = res.data;
+				list.forEach((item) => {
+					item.publishTime = dayjs(item.publishTime).format(
+						"YYYY-MM-DD HH:mm:ss"
+					);
+					item.finishTime = dayjs(item.finishTime).format(
+						"YYYY-MM-DD HH:mm:ss"
+					);
+
+				});
+				if (page == 1) {
+					this.totalCount = total
+					this.list = list
+				} else {
+				let list1 = JSON.parse(JSON.stringify(this.list));
+				this.list = [...list1, ...list];
+				}
+				this.curPage = this.curPage + 1
+			},
+			//任务列表-临时任务页进入
+			init2() {
+				if (this.totalCount == -1) {
+					this.getTypeList(this.status, 1)
+				} else {
+					if (this.list.length < this.totalCount) {
+						this.getTypeList(this.status, 0)
+						} 
+					else if (this.list.length == this.totalCount) {
+							this.$refs.sacast.show({
+								title: '没有更多了',
+								type: 'info',
+							})
+						}
+				}
+			},
+			//获取任务列表-临时任务页进入
+			getTypeList(status, page) {
+				if (status == 0) {
+					//我收到的
+					execlist({
+						status: this.statid,
+						page: this.curPage,
+						size: 10,
+					}).then(
+						({
+							data
+						}) => {
+							const {
+								list,
+								total
+							} = data;
+							list.forEach((item) => {
+								item.publishTime = dayjs(item.publishTime).format(
+									"YYYY-MM-DD HH:mm:ss"
+								);
+								item.finishTime = dayjs(item.finishTime).format(
+									"YYYY-MM-DD HH:mm:ss"
+								);
+							});
+							if (page == 1) {
+								this.list = []
+								this.list = list;
+								this.totalCount = total
+							} else {
+								let list1 = JSON.parse(JSON.stringify(this.list));
+								this.list = [...list1, ...list];
+							}
+							this.curPage = this.curPage + 1;
+						}
+					);
+				} else {
+					publishlist({
+							status: this.statid,
+							page: this.curPage,
+							size: 10,
+						}) //我发布的
+						.then(({
+							data
+						}) => {
+							const {
+								list,
+								total
+							} = data;
+							let lista = list.map((item) => {
+								item.finishTimeformate = dayjs(item.finishTime).format(
+									"YYYY-MM-DD HH:mm:ss"
+								);
+								return item;
+							});
+							if (page == 1) {
+								this.list = []
+								this.list = lista;
+								this.totalCount = total
+							} else {
+								let list1 = JSON.parse(JSON.stringify(this.list));
+								this.list = [...list1, ...lista];
+							}
+							this.curPage = this.curPage + 1;
+						});
+				}
+			},
+		}
+	};
+</script>
+
+<style>
+	
+	.sc-view {
+		height: calc(100vh - 94rpx);
+		width: 690rpx;
+	/* 	background: #FFFFFF;
+		box-shadow: 0px 0px 6rpx 0px rgba(6, 0, 1, 0.26);
+		border-radius: 10rpx 10rpx 0px 0px; */
+	}
+</style>

+ 179 - 0
task_pages/taskarrment/viewtask/viewtask.vue

@@ -0,0 +1,179 @@
+<template>
+	<!-- 临时任务详情 -->
+	<view class="u-p-l-30 u-p-r-30">
+		<u-cell-group>
+			<u-cell-item :arrow="false" :title-style="{fontSize:'28rpx',fontWeight: '600',color:'#333333',position: 'relative',
+			left: '-26rpx'}" title="任务名称">
+				<view class="item" slot="right-icon">{{taskdetail.title}}</view>
+			</u-cell-item>
+			<u-cell-item :arrow="false" :title-style="{fontSize:'28rpx',fontWeight: '600',color:'#333333',position: 'relative',
+						left: '-26rpx'}" title="任务类型">
+				<view class="item" slot="right-icon">{{typeList[taskdetail.type]}}</view>
+			</u-cell-item>
+			<u-cell-item :arrow="false" :title-style="{fontSize:'28rpx',fontWeight: '600',color:'#333333',position: 'relative',
+			left: '-26rpx'}" title="发起人 ">
+				<view class="item" slot="right-icon">{{taskdetail.username}}</view>
+			</u-cell-item>
+			<u-cell-item :arrow="false" :title-style="{fontSize:'28rpx',fontWeight: '600',color:'#333333',position: 'relative',
+			left: '-26rpx'}" title="执行人 ">
+				<view class="item" slot="right-icon">
+				{{executorsName}}
+				</view>
+			</u-cell-item>
+			<u-cell-item :arrow="false" :title-style="{fontSize:'28rpx',fontWeight: '600',color:'#333333',position: 'relative',
+			left: '-26rpx'}" title="发起时间	">
+				<view class="item" slot="right-icon">{{publishTime}}</view>
+			</u-cell-item>
+			<u-cell-item :arrow="false" :title-style="{fontSize:'28rpx',fontWeight: '600',color:'#333333',position: 'relative',
+			left: '-26rpx'}" title="完成时间	">
+				<view class="item" slot="right-icon">{{finishTime}}</view>
+			</u-cell-item>
+		</u-cell-group>
+		<view class="m-w">
+			<view class="task-content"> 任务内容</view>
+			<view class="span-textce">
+				<textarea disabled="disabled" v-model="taskdetail.content" style="width: 100%; height: 100%;"></textarea>
+			</view>
+		</view>
+		<view class="m-w">
+			<view class="task-content"> 任务图片</view>
+			<view class="span-textce u-flex">
+				<view v-if="taskdetail.executorimgs != null" class="u-m-r-8 " v-for="(item,index) in taskdetail.executorimgs" :key="index">
+					<u-image @click="previewImg(item)" :src="item" width="100" height="100"></u-image>
+				</view>
+				<block v-if="taskdetail.executorimgs == null">
+					暂无图片
+				</block>
+			</view>
+		</view>
+		<view class="u-flex u-row-between u-m-t-62 u-p-b-32">
+			<navigator hover-class="none" :url="`../feebacklist/feebacklist?id=${taskdetail.id}&title=${taskdetail.title}`"
+				class="btn">反馈</navigator>
+			<block v-if="taskdetail.status==1">
+				<view class="btn" @click="sumok(1)" style="background: #4A8BFF;">完成</view>
+				<view class="btn" @click="sumok(2)" style="background: #939393;">取消</view>
+			</block>
+		</view>
+		<u-toast ref="viewToast" />
+	</view>
+</template>
+
+<script>
+	import {
+		taskupdate,
+		taklist
+	} from '@/api/index.js'
+	import dayjs from "dayjs";
+	export default {
+		data() {
+			return {
+				taskdetail: "",
+				executorsName:'',
+				typeList: ["", "一般任务", "较急任务", "紧急任务"]
+			}
+		},
+		onLoad() {
+			// 从仓库获取 taskdatail 数据并处理
+			let taskdetail = this.$store.state.user.taskdetail
+			// 图片
+			if(taskdetail.images != '') {
+				taskdetail.executorimgs = taskdetail.images.split(',')
+				taskdetail.executornames = (taskdetail.executors.map((index) => {
+					return index
+				})).toString()
+			} else{
+				taskdetail.executorimgs = null
+			}
+			// 执行人
+			if(taskdetail.executors.length == 1) {
+				this.executorsName = taskdetail.executors[0]
+			} else if(taskdetail.executors.length > 1) {
+				this.executorsName = taskdetail.executors.join('、')
+			} else {
+				this.executorsName = '未选择执行人员'
+			}
+			this.taskdetail = taskdetail
+		},
+		methods: {
+			// 点击图片事件
+			previewImg(logourl) {
+				let _this = this;
+				let imgsArray = [];
+				imgsArray[0] = logourl
+				uni.previewImage({
+					current: 0,
+					urls: imgsArray
+				});
+			},
+			sumok(status) {
+				taskupdate({
+						id: this.taskdetail.id,
+						status
+					})
+					.then(({
+						code,
+						message
+					}) => {
+						this.$refs.viewToast.show({
+							title: code == 200  ? '操作成功' : message,
+							type: code == 200 ? 'success' : 'info',
+							callback: () => {
+								if (code == 200) {
+									uni.navigateBack(1)
+								}
+							}
+						})
+
+					})
+			}
+		},
+		// 计算属性
+		computed: {
+			// 计算出开始时间和结束时间(格式转换)
+			finishTime() {
+				return dayjs(this.taskdetail.finishTime).format("YYYY-MM-DD HH:mm:ss")
+			},
+			publishTime() {
+				return dayjs(this.taskdetail.publishTime).format("YYYY-MM-DD HH:mm:ss")
+			},
+		}
+	}
+</script>
+
+<style>
+	.item {
+		position: relative;
+		right: -26rpx;
+	}
+
+	.task-content {
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: 400;
+		color: #333333;
+		margin-top: 28rpx;
+	}
+
+	.span-textce {
+		width: 690rpx;
+		height: 160rpx;
+		border: 1rpx solid #AAAAAA;
+		border-radius: 4rpx;
+		margin-top: 24rpx;
+		padding: 20rpx;
+	}
+
+	.btn {
+		flex: 1;
+		margin: 10rpx;
+		height: 90rpx;
+		background: #FFA11A;
+		border-radius: 4rpx;
+		font-size: 28rpx;
+		font-family: Microsoft YaHei-3970(82674968);
+		font-weight: bold;
+		color: #FFFFFF;
+		text-align: center;
+		line-height: 90rpx;
+	}
+</style>

+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+@import 'uview-ui/theme.scss';
+/* 行为相关颜色 */
+$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;

+ 10 - 0
util/debounce/debounce.js

@@ -0,0 +1,10 @@
+export const debounce = (() => {
+    let timer = null
+    return (callback, wait) => {
+		if(timer) {
+			 clearTimeout(timer)
+		}
+     timer = setTimeout(callback, wait)
+    }
+})()
+

+ 81 - 0
util/request/eror.js

@@ -0,0 +1,81 @@
+ export const errordata = {
+	500:"系统繁忙",
+   100001: "网络繁忙",
+   110000: "excel生成错误",
+   100003: "获取验证码失败",
+   100004:"验证码失效",
+   100005:"验证失败",
+   100006:"用户输入数据错误",
+   100007:"密码格式错误",
+   100008:"密码和交易密码不能一致",
+   100009:"手机号格式错误",
+   100010:"手机号注册账户已到达上限",
+   100011:"code填写错误",
+   100012:"用户昵称重复",
+   100013:"账号不存在",
+   100014:"密码错误",
+   100015:"无权限/token不存在",
+   100016:"校验签名错误",
+   100017:"修改失败",
+   100018:"对象为空",
+   100019:"没有权限",
+   100020:"交易密码设置失败",
+   100021:"交易密码未设置",
+   100022:"支付密码错误",
+   100023:"非法用户",
+   100024:"账户已停用",
+   100025:"输入数据有误",
+   100026:"暂无此权限",
+   100027:"系统维护中,请稍后重试",
+   100028:"账户不存在",
+   100029:"已存在该标识会员等级",
+   100030:"数据错误",
+   100031:"已存在该标识数据",
+   100032:"输入手机号和账号注册手机号不一致",
+   100033:"用户不存在/密码错误",
+   100034:"账户未实名认证",
+   100035:"账户已停用或不存在",
+   100038:"售出已达到总量的70%",
+   100039:"输入参数不能为空",
+   100040:"模板已经启用",
+   100041:"交易失败",
+   100042:"账户实名认证中",
+   100043:"参数错误,身份证号码格式不正确",
+   100044:"操作错误",
+   
+   
+   
+   202001:"微信支付前置业务未实现,请实现",
+   202002:"微信支付回调业务未实现,请实现",
+   202003:"微信未绑定",
+   202004:"微信已绑定",
+   202005:"定手机号账号不存在",
+   202006:"参数错误",
+   202007:"支付类型不能为空",
+   202008:"未找到对应类型处理方法",
+   202009:"微信网页授权网络/配置错误",
+   203009:"未查询到指定地图信息 或 此地区暂不支持",
+   204000:"修改时 状态不正确",
+   204001:"用户名已存在",
+   
+   600000:"添加的分类层级超过限制",
+   600001:"请填写收货地址",
+   600002:"购买失败,请重新下单",
+   600003:"订单不存在或已支付",
+   600004:"订单异常,请联系客服",
+   600006:"拼团人数已达上限",
+   600007:"拼团关闭",
+   600008:"商品已下架",
+   600009:"账号无权限,请使用商户账号",
+   600010:"不能删除绑定商品的分类",
+   600011:"商品库存不足",
+   600012:"起拼团失败,请联系客服",
+   600013:"不可多次参与同一拼团",
+   600014:"签到失败",
+   600015:"今日已签到",
+   600016:"今日未签到",
+   200002:"操作失败"
+   
+   
+   
+ }

+ 87 - 0
util/request/index.js

@@ -0,0 +1,87 @@
+import Request from './request'
+import {
+	errordata
+} from './eror.js'
+
+
+export const requestMap = new Map() // 创建一个请求池
+const request = new Request();
+let adminconfig = {
+	// baseUrl: "https://www.jxydyw.cn/patrol-app/v1",
+	// baseUrl: "http://172.22.45.21:82/patrol-app/v1",
+	//baseUrl: "http://101.34.64.169:13000"
+	baseUrl: "https://xj.chuanghai-tech.com/patrol-app/v1",
+	auth: true
+}
+
+export default function api(typeconfig) {
+
+	let data = {
+		...typeconfig.data,
+
+	} //添加公共函数
+	let api = {
+		url: typeconfig.url,
+		method: typeconfig.method
+	}
+	request.config = { //合并基础配置
+		...request.config,
+		...adminconfig,
+		...typeconfig
+	}
+	// console.log('request.config',request.config)
+	const uniqueCode = api.url
+	request.interceptor.request((config, cancel) => {
+		/* 请求之前拦截器 */
+		if (requestMap.get(uniqueCode)) {
+			throw ('请求发其中请勿重新发起请求')
+			return false
+		} else {
+			requestMap.set(uniqueCode, uniqueCode)
+		}
+		//console.log("token的值",config.auth)
+		if (config.auth) {
+
+			let token = uni.getStorageSync('token')
+
+			if (token) {
+				config.header['Authorization'] = uni.getStorageSync('token') //添加token
+			} else {
+				uni.showToast({
+					title: '登录失效',
+					type: 'info',
+					duration: 2000
+				});
+				setTimeout(() => {
+					uni.reLaunch({
+						url: '/pages/login/login/index',
+						complete(data) {
+							console.log(data)
+						}
+					});
+				}, 3000)
+			}
+		}
+		return config
+	});
+
+	request.interceptor.response((response) => {
+
+		const url = response.config.url
+		/* 请求之后拦截器 */
+		if (requestMap.get(url)) {
+			requestMap.delete(url)
+		}
+
+		return response
+	}, (err) => { // 预留可以日志上报
+		console.log("报错", err)
+		return err
+	})
+
+	return request.request({
+		url: api.url,
+		data,
+		method: api.method
+	})
+}

+ 0 - 0
util/request/index.md


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.