From be290203369f9cbd618948901f79db5964bf01a6 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期五, 20 十二月 2024 10:48:40 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/funingyunwei

---
 admin/.env                                                                                                      |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java               |    5 
 h5/pages/polling/detail.vue                                                                                     |  188 ++++++--
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java                 |    1 
 h5/pages/operation/device.vue                                                                                   |   42 +
 h5/pages/index.vue                                                                                              |    7 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java                        |   13 
 h5/pages/login.vue                                                                                              |  497 ++++++++++++---------
 h5/api/staff.js                                                                                                 |   10 
 server/system_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java                   |    3 
 h5/manifest.json                                                                                                |    4 
 server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java                                |    6 
 h5/pages.json                                                                                                   |    2 
 server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java                                     |    4 
 h5/utils/config.js                                                                                              |    5 
 admin/src/components/business/OperaAreasWindow.vue                                                              |   31 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java             |   45 +
 server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java                                 |    2 
 server/system_gateway/src/main/resources/bootstrap.yml                                                          |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java           |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java         |   17 
 h5/pages/workOrder/list.vue                                                                                     |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java                      |    1 
 server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java                                   |   20 
 server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java                           |    2 
 h5/pages/operation/record.vue                                                                                   |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskRecordService.java          |    2 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java                   |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java     |    1 
 admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue                                               |   12 
 server/system_service/src/main/java/com/doumee/service/system/SystemUserService.java                            |    2 
 admin/src/views/workorder/components/OperaYwWorkorderWindow.vue                                                 |   56 +-
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskRecordController.java              |    7 
 h5/pages/workOrder/edit.vue                                                                                     |   15 
 server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                                     |    6 
 server/visits/dmvisit_service/src/main/resources/application-pro.yml                                            |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java |   75 ++
 server/visits/dmvisit_admin/src/main/resources/bootstrap.yml                                                    |    2 
 h5/pages/operation/detail.vue                                                                                   |    5 
 server/system_timer/src/main/resources/application-pro.yml                                                      |    6 
 h5/pages/polling/task.vue                                                                                       |  100 +++
 h5/api/yw.js                                                                                                    |    7 
 h5/pages/workOrder/detail.vue                                                                                   |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java       |    6 
 server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java                  |   43 +
 server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java                              |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java     |    8 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java             |    3 
 server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java                             |    4 
 server/system_timer/src/main/resources/bootstrap.yml                                                            |    2 
 server/system_gateway/src/main/resources/application-pro.yml                                                    |   13 
 server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java                               |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java     |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java |    2 
 54 files changed, 945 insertions(+), 399 deletions(-)

diff --git a/admin/.env b/admin/.env
index c471f0b..6aaad6a 100644
--- a/admin/.env
+++ b/admin/.env
@@ -3,8 +3,8 @@
 # 璺敱鏂瑰紡
 VUE_APP_ROUTER_MODE = 'hash'
 
-# 椤圭洰涓婁笅鏂囪矾寰� fn_admin/#/
-VUE_APP_CONTEXT_PATH = '/'
+# 椤圭洰涓婁笅鏂囪矾寰� 
+VUE_APP_CONTEXT_PATH = '/fn_admin'
 
 # 鎺ュ彛鍓嶇紑
 VUE_APP_API_PREFIX = '/gateway_interface'
diff --git a/admin/src/components/business/OperaAreasWindow.vue b/admin/src/components/business/OperaAreasWindow.vue
index fea3c84..2458dad 100644
--- a/admin/src/components/business/OperaAreasWindow.vue
+++ b/admin/src/components/business/OperaAreasWindow.vue
@@ -6,8 +6,8 @@
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" label-width="100px" label-suffix="锛�" :rules="rules">
-      <el-form-item :label="form.type==0?'甯傚悕绉�':'鍘垮尯鍚嶇О'" prop="name">
-        <el-input v-model="form.name" :placeholder="form.type==0?'杈撳叆甯傚悕绉�':'杈撳叆鍘垮尯鍚嶇О'" v-trim/>
+      <el-form-item :label="form.type==1?'甯傚悕绉�':'鍘垮尯鍚嶇О'" prop="name">
+        <el-input v-model="form.name" :placeholder="form.type==1?'杈撳叆甯傚悕绉�':'杈撳叆鍘垮尯鍚嶇О'" v-trim/>
       </el-form-item>
       <el-form-item label="鎺掑簭鐮�" prop="sortnum">
         <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
@@ -31,7 +31,7 @@
         parentId: null,
         name: null,
         sortnum: '0',
-        type: '',
+        type: null
       },
       // 楠岃瘉瑙勫垯
       rules: {
@@ -45,6 +45,31 @@
     })
   },
   methods: {
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs.form.resetFields()
+        this.form[this.configData['field.id']] = null
+      })
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          for (const key in this.form) {
+            this.form[key] = target[key]
+          }
+        })
+
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+      console.log(this.form)
+    },
     // 纭鏂板缓
     __confirmCreate () {
       this.$refs.form.validate((valid) => {
diff --git a/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue b/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
index 64040ec..432d082 100644
--- a/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
+++ b/admin/src/views/Inspection/components/OperaYwPatrolLineWindow.vue
@@ -32,7 +32,7 @@
 
     </el-form>
     <!--  -->
-    <el-dialog title="娣诲姞宸℃鐐�" :close-on-click-modal="false" append-to-body :visible.sync="isShowModal" width="780px">
+    <el-dialog title="娣诲姞宸℃鐐�" :close-on-click-modal="false" append-to-body :visible.sync="isShowModal" width="880px">
       <!-- <el-select class="w400" v-model="selPoint" clearable multiple filterable>
         <el-option v-for="item in pointList" :value="item.id" :label="item.name"></el-option>
       </el-select> -->
@@ -50,6 +50,8 @@
         </el-form-item>
         <el-button type="primary" @click="initData">鎼滅储</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
+        <el-button type="primary" @click="editClick()" icon="el-icon-plus"
+                   v-permissions="['business:ywpatrolpoint:create']">鏂板缓宸℃鐐�</el-button>
       </el-form>
 
       <el-table @selection-change="handleSelectionChange" v-loading="isWorking.search" :data="pointList" stripe>
@@ -67,12 +69,14 @@
         <el-button type="primary" @click="subModal">纭� 瀹�</el-button>
       </span>
     </el-dialog>
+    <OperaYwPatrolPointWindow ref="operaYwPatrolPointWindow" @success="handlePageChange" />
   </GlobalWindow>
 </template>
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import OperaYwPatrolPointWindow from '@/views/Inspection/components/OperaYwPatrolPointWindow'
 import Pagination from '@/components/common/Pagination'
 import { fetchList as getFetchList } from '@/api/Inspection/ywPatrolPoint'
 import { create, updateById, detailById } from '@/api/Inspection/ywPatrolLine'
@@ -81,7 +85,7 @@
 export default {
   name: 'OperaYwPatrolLineWindow',
   extends: BaseOpera,
-  components: { GlobalWindow, Pagination },
+  components: { GlobalWindow, Pagination,OperaYwPatrolPointWindow },
   data() {
     return {
       // 琛ㄥ崟鏁版嵁
@@ -120,6 +124,10 @@
     })
   },
   methods: {
+    editClick(row) {
+        this.$refs.operaYwPatrolPointWindow.open('鏂板缓宸℃鐐�')
+      // this.$refs.operaYwPatrolPointWindow.initData()
+    },
     confirm() {
       const { form, list } = this
       this.$refs['form'].validate((valid) => {
diff --git a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
index b524ba3..4f8ce99 100644
--- a/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
+++ b/admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -142,35 +142,35 @@
       this.getCate()
       // 鏂板缓
       if (target == null) {
+        this.form = {
+          id: null,
+          editDate: '',
+          floor: '',
+          title: '',
+          remark: '',
+          status: '',
+          sortnum: '',
+          content: '',
+          getDate: '',
+          projectId: '',
+          buildingId: '',
+          floorId: '',
+          roomId: '',
+          userId: '',
+          submitDate: '',
+          cateId: '',
+          areaType: '0',
+          code: '',
+          dealStatus: '',
+          dispatchUserId: '',
+          dispatchDate: '',
+          dispatchInfo: '',
+          dealUserId: '',
+          dealDate: '',
+          dealInfo: '',
+          dealType: ''
+        }
         this.$nextTick(() => {
-          this.$refs.form = {
-            id: null,
-            editDate: '',
-            floor: '',
-            title: '',
-            remark: '',
-            status: '',
-            sortnum: '',
-            content: '',
-            getDate: '',
-            projectId: '',
-            buildingId: '',
-            floorId: '',
-            roomId: '',
-            userId: '',
-            submitDate: '',
-            cateId: '',
-            areaType: '0',
-            code: '',
-            dealStatus: '',
-            dispatchUserId: '',
-            dispatchDate: '',
-            dispatchInfo: '',
-            dealUserId: '',
-            dealDate: '',
-            dealInfo: '',
-            dealType: ''
-          }
           this.buildList = []
           this.roomList = []
           this.levelList = []
diff --git a/h5/api/staff.js b/h5/api/staff.js
index b77655f..491ab58 100644
--- a/h5/api/staff.js
+++ b/h5/api/staff.js
@@ -15,6 +15,14 @@
     data
   })
 }
+// 鎺堟潈
+export const ywWxAuthorize = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/web/visitor/ywWxAuthorize',
+    method: 'get',
+    data
+  })
+}
 export const findInternalList = (data) => {
   return http({
     url: 'visitsAdmin/cloudService/system/user/findInternalList',
@@ -31,7 +39,7 @@
 // loginout
 export const logoutPost = (data) => {
   return http({
-    url: '/logout',
+    url: 'logout',
     method: 'post',
     data
   })
diff --git a/h5/api/yw.js b/h5/api/yw.js
index acce7d5..5e211b0 100644
--- a/h5/api/yw.js
+++ b/h5/api/yw.js
@@ -127,4 +127,11 @@
     url: 'visitsAdmin/cloudService/business/category/page',
     data
   })
+}
+//
+export const getPointRecordByCode = (data) => {
+  return http({
+    url: 'visitsAdmin/cloudService/business/ywPatrolTaskRecord/getPointRecordByCode',
+    data
+  })
 }
\ No newline at end of file
diff --git a/h5/manifest.json b/h5/manifest.json
index b905047..4f22dff 100644
--- a/h5/manifest.json
+++ b/h5/manifest.json
@@ -129,9 +129,9 @@
                 "/gateway_interface" : {
                     // 杩欎釜瀛楁鍚嶉渶涓庝綘閰嶇疆鐨刡asePrefixUrl涓�鑷达紝绯荤粺璇嗗埆鍒板甫鏈�/dev-api璇锋眰鐨勫湴鍧�鏃讹紝浼氬湪鍓嶉潰鎷兼帴涓婁唬鐞嗘湇鍔″櫒鍦板潃
                     // "target" : "http://172.20.10.7:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
-                    "target" : "http://192.168.0.163:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    // "target" : "http://192.168.0.163:10010", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     // "target" : "http://10.50.250.253:8088/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
-                    // "target" : "http://192.168.0.173/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    "target" : "https://zhcg.fnwtzx.com/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     "changeOrigin" : true, // 鍏佽璺ㄥ煙 
                     "pathRewrite" : {
                         "^/gateway_interface" : ""
diff --git a/h5/pages.json b/h5/pages.json
index e1958a5..d255e6d 100644
--- a/h5/pages.json
+++ b/h5/pages.json
@@ -87,7 +87,7 @@
 	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "",
+		"navigationStyle": "custom",
 		"navigationBarBackgroundColor": "#ffffff",
 		"backgroundColor": "#ffffff"
 	},
diff --git a/h5/pages/index.vue b/h5/pages/index.vue
index 8232d81..9d3409d 100644
--- a/h5/pages/index.vue
+++ b/h5/pages/index.vue
@@ -74,12 +74,13 @@
 					url: item.url
 				})
 			},
-			loginOut() {
-				this.$store.commit('empty')
+			loginOut() {
 				logoutPost()
+				this.$store.commit('empty')
 				uni.redirectTo({
 					url: '/pages/login'
-				})
+				})
+				// window.location.href= 'https://zhcg.fnwtzx.com/fn_h5'
 			},
 
 		}
diff --git a/h5/pages/login.vue b/h5/pages/login.vue
index 4c32dbc..81323ed 100644
--- a/h5/pages/login.vue
+++ b/h5/pages/login.vue
@@ -1,213 +1,284 @@
-<template>
-  <view class="login">
-    <view class="login_title">娆㈣繋鐧诲綍</view>
-    <view class="login_title login_title2">闃滃畞鏂囦綋涓績</view>
-    <view class="login_list">
-      <view class="login_list_item">
-        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
-        <input v-model="form.phone" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
-      </view>
-<!--     <view class="login_list_item">
-        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
-        <input v-model="form.password" type="password" placeholder="瀵嗙爜" />
-      </view> -->
-     <view class="login_list_item">
-        <image src="@/static/login_ic_password@2x.png" mode="widthFix"></image>
-        <input v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" type="text" />
-        <view v-if="downTime == 0" class="btn" @click="sendSms">鑾峰彇楠岃瘉鐮�</view>
-        <view v-else class="btn gray">{{ downTime }}</view>
-      </view>
-    </view>
-    <view class="login_btn">
-      <view class="login_btn_n" @click="onLogin">鐧诲綍</view>
-    </view>
-  </view>
-</template>
-
-<script>
-import { loginPost, getUserInfo, sendSMsPost } from '@/api'
-import { mapState, mapMutations } from 'vuex'
-export default {
-  name: 'login',
-
-  data() {
-    return {
-      form: {
-				phone: '18888888888',
-				code: '1'
-      },
-			downTime: 0
-    }
-  },
-
-  onLoad() {
-  },
-  onBackPress(options) {
-    uni.redirectTo({
-      url: '/pages/login/login'
-    })
-    return true
-  },
-  methods: {
-    ...mapMutations(["setToken", "setUserInfo"]),
-		sendSms() {
-			this.downTime = 60
-			let timer = setInterval(() => {
-				if(this.downTime == 0) return clearInterval(timer)
-				this.downTime = this.downTime - 1
-			}, 1000)
-			const { form } = this
-			sendSMsPost({
-				phone: form.phone,
-				type: 0
-			}).then(res => {
-				this.showToast('鐭俊鍙戦�佹垚鍔�')
-			})
-		},
-    onLogin() {
-      const { form, ProtocolFlag } = this
-      // if (!ProtocolFlag) return uni.showToast({
-      //   title: '璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁�',
-      //   icon: 'none'
-      // })
-      if (!form.phone) return uni.showToast({
-        title: '鎵嬫満鍙蜂笉鑳戒负绌�',
-        icon: 'none'
-      })
-      if (!form.code) return uni.showToast({
-        title: '楠岃瘉鐮佷笉鑳戒负绌�',
-        icon: 'none'
-      })
-      loginPost({
-        ...form,
-        openId: this.$store.state.openId
-      }).then(res => {
-        if (res.code === 200) {
-          this.setToken(res.data)
-					this.showToast('鐧诲綍鎴愬姛')
-          getUserInfo().then(ress => {
-            this.setUserInfo(ress.data)
-            uni.redirectTo({
-              url: "/pages/index"
-            })
-          })
-        }
-      })
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.login {
-  width: 100%;
-  height: 100vh;
-  display: flex;
-  padding-top: 130rpx;
-  box-sizing: border-box;
-  align-items: center;
-  flex-direction: column;
-  background: linear-gradient( 180deg, #C5DDFF 0%, #FFFFFF 100%);
-  .login_title {
-    font-weight: 500;
-    font-size: 52rpx;
-    color: #222222;
-    margin-top: 180rpx;
-		width: 100%;
-		padding-left: 60rpx;
-  }
-	.login_title2{
-		margin-top: 10rpx;
-		margin-bottom: 80rpx;
-	}
-  .login_list {
-    width: 100%;
-    padding: 0 60rpx;
-    box-sizing: border-box;
-    .login_list_item {
-      width: 100%;
-      border-radius: 50rpx;
-      height: 98rpx;
-      padding: 0 40rpx;
-      box-sizing: border-box;
-      background: #ffffff;
-      margin-bottom: 40rpx;
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      &:last-child {
-        margin-bottom: 0 !important;
-      }
-      image {
-        flex-shrink: 0;
-        width: 40rpx;
-        height: 40rpx;
-      }
-      .btn{
-      	width: 145rpx;
-      	color:  $primaryColor;
-				text-align: center;
-      }
-			.gray{
-				color: #999999;
-			}
-      input {
-        flex: 1;
-        height: 100%;
-        color: #666666;
-        margin-left: 24rpx;
-        border: none;
-      }
-    }
-  }
-  .login_btn {
-    width: 100%;
-    padding: 0 60rpx;
-    box-sizing: border-box;
-    margin-top: 60rpx;
-    .for_psd {
-      color: $uni-color-primary;
-      width: 140rpx;
-      text-align: center;
-      margin: 40rpx auto;
-    }
-    .login_btn_n {
-      width: 100%;
-      height: 98rpx;
-      background: $uni-color-primary;
-      box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      color: #ffffff;
-      border-radius: 50rpx;
-			font-weight: 500;
-			font-size: 32rpx;
-    }
-  }
-  .deal_wrap {
-    position: absolute;
-    width: 100%;
-    left: 0;
-    text-align: center;
-    bottom: 88rpx;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    .deal {
-      color: $uni-color-primary;
-    }
-    .checked {
-      width: 48rpx;
-      margin-right: 12rpx;
-    }
-  }
-}
-.modal {
-  width: 690rpx;
-  min-height: 920rpx;
-  max-height: 720px;
-  border-radius: 24rpx;
-  padding: 32rpx;
-}
-</style>
+<template>
+	<view class="login">
+		<view class="login_title">娆㈣繋鐧诲綍</view>
+		<view class="login_title login_title2">闃滃畞鏂囦綋涓績</view>
+		<view class="login_list">
+			<view class="login_list_item">
+				<image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
+				<input v-model="form.phone" maxlength="18" placeholder="璇疯緭鍏ユ墜鏈哄彿" />
+			</view>
+			<!--     <view class="login_list_item">
+        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
+        <input v-model="form.password" type="password" placeholder="瀵嗙爜" />
+      </view> -->
+			<view class="login_list_item">
+				<image src="@/static/login_ic_password@2x.png" mode="widthFix"></image>
+				<input v-model="form.code" placeholder="璇疯緭鍏ラ獙璇佺爜" type="text" />
+				<view v-if="downTime == 0" class="btn" @click="sendSms">鑾峰彇楠岃瘉鐮�</view>
+				<view v-else class="btn gray">{{ downTime }}</view>
+			</view>
+		</view>
+		<view class="login_btn">
+			<view class="login_btn_n" @click="onLogin">鐧诲綍</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		loginPost,
+		getUserInfo,
+		sendSMsPost,
+		ywWxAuthorize
+	} from '@/api'
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'login',
+
+		data() {
+			return {
+				form: {
+					phone: '',
+					code: ''
+				},
+				downTime: 0,
+				code: ''
+				// code: ''
+			}
+		},
+
+		onShow() {
+			// return
+			var that = this
+			let url = window.location.href
+			if (url.indexOf('code=') !== -1 || this.code) {
+				let code = ''
+				const query = url.split('?')
+				for (const q of query) {
+					if (q.indexOf('code=') !== -1) {
+						let statusIndex = q.indexOf('&state')
+						code = q.substring(q.indexOf('code=') + 5, statusIndex)
+					}
+				}
+				ywWxAuthorize({
+					code: code || this.code
+				}).then(res => {
+					if (res.code === 200) {
+						console.log('res', res);
+						that.$store.commit('setOpenId', res.data.openid)
+						if (res.data.token && res.data.token != '') {
+							that.$store.commit('setToken', res.data.token)
+							getUserInfo().then(ress => {
+								that.$store.commit('setUserInfo', ress.data)
+							})
+							setTimeout(() => {
+								uni.redirectTo({
+									url: "/pages/index"
+								})
+							}, 300)
+						}
+					}
+				})
+			} else {
+				let url = 'https://zhcg.fnwtzx.com/yunwei_h5'
+				const appID = 'wx95ac1efb67f0330d'
+				let uri = encodeURIComponent(url)
+				let authURL =
+					`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base#wechat_redirect`
+				window.location.href = authURL
+			}
+
+		},
+		// onBackPress(options) {
+		// 	uni.redirectTo({
+		// 		url: '/pages/login/login'
+		// 	})
+		// 	return true
+		// },
+		methods: {
+			...mapMutations(["setToken", "setUserInfo"]),
+			onLogin() {
+				const {
+					form,
+					ProtocolFlag
+				} = this
+				if (!form.phone) return uni.showToast({
+					title: '鎵嬫満鍙蜂笉鑳戒负绌�',
+					icon: 'none'
+				})
+				if (!form.code) return uni.showToast({
+					title: '楠岃瘉鐮佷笉鑳戒负绌�',
+					icon: 'none'
+				})
+
+				loginPost({
+					...form,
+					openid: this.$store.state.openId
+				}).then(res => {
+					if (res.code === 200) {
+						this.setToken(res.data)
+						this.showToast('鐧诲綍鎴愬姛')
+						getUserInfo().then(ress => {
+							this.setUserInfo(ress.data)
+							uni.redirectTo({
+								url: "/pages/index"
+							})
+						})
+					}
+				})
+
+
+
+			},
+			sendSms() {
+				this.downTime = 60
+				let timer = setInterval(() => {
+					if (this.downTime == 0) return clearInterval(timer)
+					this.downTime = this.downTime - 1
+				}, 1000)
+				const {
+					form
+				} = this
+				sendSMsPost({
+					phone: form.phone,
+					type: 0
+				}).then(res => {
+					this.showToast('鐭俊鍙戦�佹垚鍔�')
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.login {
+		width: 100%;
+		height: 100vh;
+		display: flex;
+		padding-top: 130rpx;
+		box-sizing: border-box;
+		align-items: center;
+		flex-direction: column;
+		background: linear-gradient(180deg, #C5DDFF 0%, #FFFFFF 100%);
+
+		.login_title {
+			font-weight: 500;
+			font-size: 52rpx;
+			color: #222222;
+			margin-top: 180rpx;
+			width: 100%;
+			padding-left: 60rpx;
+		}
+
+		.login_title2 {
+			margin-top: 10rpx;
+			margin-bottom: 80rpx;
+		}
+
+		.login_list {
+			width: 100%;
+			padding: 0 60rpx;
+			box-sizing: border-box;
+
+			.login_list_item {
+				width: 100%;
+				border-radius: 50rpx;
+				height: 98rpx;
+				padding: 0 40rpx;
+				box-sizing: border-box;
+				background: #ffffff;
+				margin-bottom: 40rpx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				&:last-child {
+					margin-bottom: 0 !important;
+				}
+
+				image {
+					flex-shrink: 0;
+					width: 40rpx;
+					height: 40rpx;
+				}
+
+				.btn {
+					width: 145rpx;
+					color: $primaryColor;
+					text-align: center;
+				}
+
+				.gray {
+					color: #999999;
+				}
+
+				input {
+					flex: 1;
+					height: 100%;
+					color: #666666;
+					margin-left: 24rpx;
+					border: none;
+				}
+			}
+		}
+
+		.login_btn {
+			width: 100%;
+			padding: 0 60rpx;
+			box-sizing: border-box;
+			margin-top: 60rpx;
+
+			.for_psd {
+				color: $uni-color-primary;
+				width: 140rpx;
+				text-align: center;
+				margin: 40rpx auto;
+			}
+
+			.login_btn_n {
+				width: 100%;
+				height: 98rpx;
+				background: $uni-color-primary;
+				box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				color: #ffffff;
+				border-radius: 50rpx;
+				font-weight: 500;
+				font-size: 32rpx;
+			}
+		}
+
+		.deal_wrap {
+			position: absolute;
+			width: 100%;
+			left: 0;
+			text-align: center;
+			bottom: 88rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			.deal {
+				color: $uni-color-primary;
+			}
+
+			.checked {
+				width: 48rpx;
+				margin-right: 12rpx;
+			}
+		}
+	}
+
+	.modal {
+		width: 690rpx;
+		min-height: 920rpx;
+		max-height: 720px;
+		border-radius: 24rpx;
+		padding: 32rpx;
+	}
+</style>
\ No newline at end of file
diff --git a/h5/pages/operation/detail.vue b/h5/pages/operation/detail.vue
index 0420d6b..51bafd8 100644
--- a/h5/pages/operation/detail.vue
+++ b/h5/pages/operation/detail.vue
@@ -2,7 +2,7 @@
 	<view>
 		<view class="content">
 			<view class="name_wrap">
-				<view class="name">{{info.deviceName}}</view>
+				<view class="name">{{info.deviceName}} {{info.deviceCode || ''}}</view>
 				<view class="status" v-if="info.status == 0">姝e父</view>
 				<view class="status red" v-if="info.status == 1">鎹熷潖</view>
 				<view class="status red" v-if="info.status == 2">鎶ュ簾</view>
@@ -15,7 +15,7 @@
 			<view class="title">杩愮淮澶囨敞</view>
 			<view class="file_list">
 				<view class="file" v-for="item in info.multifileList">
-					<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
+					<image v-if="item.type == 0" :src="item.fileurlFull" mode="aspectFill"></image>
 					<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
 				</view>
 			</view>
@@ -99,6 +99,7 @@
 			}
 			image,video{
 				width: 156rpx;
+				height: 156rpx;
 			}
 		}
 		.desc{
diff --git a/h5/pages/operation/device.vue b/h5/pages/operation/device.vue
index 80b70b1..9377ebb 100644
--- a/h5/pages/operation/device.vue
+++ b/h5/pages/operation/device.vue
@@ -5,8 +5,8 @@
 				<view class="la"><text class="red">*</text>閫夋嫨璁惧</view>
 				<view class="line">
 					<view class="sel_wrap" @click="showModal = true">
-						<view class="left" :class="param.deviceName ? '' : 'placeholder9'">
-							{{ param.deviceName ? param.deviceName : '璇烽�夋嫨璁惧' }}
+						<view class="left" :class="(param.deviceName || param.deviceCode) ? '' : 'placeholder9'">
+							{{ (param.deviceName || param.deviceCode) ? param.deviceName ? `[${param.deviceCode}] ` + param.deviceName : `[${param.deviceCode}]` : '璇烽�夋嫨璁惧' }}
 						</view>
 						<u-icon name="arrow-right" color="#999999" size="17"></u-icon>
 					</view>
@@ -118,14 +118,37 @@
 				} = this
 
 				if (!param.deviceId) return this.showToast('璇峰厛閫夋嫨瑕佺淮鎶ょ殑璁惧')
+				this.handleP()
+			},
+			handleP() {
+				const {
+					param,
+					fileList
+				} = this
 				ywDeviceCreate({
 					...param,
 					userId: uni.getStorageSync('userInfo').id,
 					dealDate: dayjs().format('YYYY-MM-DD HH:mm:ss'),
 					multifileList: fileList
 				}).then(res => {
-					this.showToast('鎻愪氦鎴愬姛')
-					uni.navigateBack()
+					if (param.status != 0) {
+						uni.showModal({
+							title: '娓╅Θ鎻愮ず',
+							content: '璁惧杩愮淮缁撴灉寮傚父锛屾槸鍚﹀墠寰�鎻愪氦宸ュ崟?',
+							success: function(res) {
+								if (res.confirm) {
+									uni.redirectTo({
+										url: '/pages/workOrder/edit'
+									})
+								} else if (res.cancel) {
+									uni.navigateBack()
+								}
+							}
+						});
+					}else{
+						this.showToast('鎻愪氦鎴愬姛')
+						uni.navigateBack()
+					}
 				})
 			},
 			getDevice() {
@@ -145,6 +168,7 @@
 				} = this
 				if (!activeDevice.id) return this.showToast('璇峰厛閫夋嫨璁惧')
 				this.$set(this.param, 'deviceId', activeDevice.id)
+				this.$set(this.param, 'deviceCode', activeDevice.code)
 				this.$set(this.param, 'deviceName', activeDevice.name)
 				this.showModal = false
 			},
@@ -261,7 +285,7 @@
 							},
 							(decodeText, decodeResult) => {
 								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
-									this.action(decodeText) //瀵逛簩缁寸爜閫昏緫澶勭悊
+									this.$set(this.param, 'deviceCode', decodeText)
 									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
 								}
 							},
@@ -408,11 +432,12 @@
 	}
 
 	.sub_btn {
-		position: fixed;
-		bottom: 68rpx;
-		left: 40rpx;
+		// position: fixed;
+		// bottom: 68rpx;
+		// left: 40rpx;
 		width: 670rpx;
 		height: 88rpx;
+		margin-top: 80rpx;
 		background: $primaryColor;
 		box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
 		border-radius: 44rpx;
@@ -457,6 +482,7 @@
 
 		.modal_list {
 			height: calc(100% - 360rpx);
+			margin-bottom: -20rpx;
 
 			.item {
 				display: flex;
diff --git a/h5/pages/operation/record.vue b/h5/pages/operation/record.vue
index 14fc07e..21af5f5 100644
--- a/h5/pages/operation/record.vue
+++ b/h5/pages/operation/record.vue
@@ -3,7 +3,7 @@
 		<view class="head_wrap">
 			<view class="search_wrap">
 				<image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
-				<input v-model="param.deviceName" @confirm="getList()" type="text" placeholder="鎼滅储璁惧鍚嶇О/缂栧彿"
+				<input v-model="param.deviceName" @confirm="queryList" type="text" placeholder="鎼滅储璁惧鍚嶇О/缂栧彿"
 					placeholder-class="placeholder9" />
 			</view>
 			<view class="name_wrap" @click="handleMem">
@@ -71,11 +71,18 @@
 			this.$eventBus.$on('memberSel', (option) => {
 				this.$set(this.param, 'userName', option.realname)
 				this.$set(this.param, 'userId', option.id)
+				this.list = []
+				this.page = 1
 				this.getList()
 			})
 			
 		},
-		methods: {
+		methods: {
+			queryList() {
+				this.page = 1
+				this.list = []
+				this.getList()
+			},
 			getList() {
 				const {
 					page,
@@ -118,7 +125,7 @@
 
 <style lang="scss" scoped>
 	.main_app {
-		padding: 0 30rpx;
+		padding: 30rpx;
 	}
 
 	.head_wrap {
diff --git a/h5/pages/polling/detail.vue b/h5/pages/polling/detail.vue
index 41553c2..383395d 100644
--- a/h5/pages/polling/detail.vue
+++ b/h5/pages/polling/detail.vue
@@ -1,14 +1,16 @@
 <template>
 	<view class="main_app">
-		<view v-if="info.status || info.status == 0" class="head_bg" :style="{
-			background: `linear-gradient(180deg, ${statusM[info.status].color} 0%, rgba(247, 247, 247, 0) 100%)`
+		<view v-if="info.status || info.status == 0" class="head_bg" :style="{
+			background: `linear-gradient(180deg, ${statusM[info.status].color} 0%, rgba(247, 247, 247, 0) 100%)`
 		}"></view>
 		<view class="info">
 			<image v-if="info.status == 2" class="icon" src="@/static/side/ic_dabiaoed.png" mode=""></image>
 			<image v-if="info.status == 3" class="icon" src="@/static/side/ic_dabiao.png" mode=""></image>
 			<view class="head">
 				<view class="name">{{ info.title || info.planTitle }}</view>
-				<view class="status" v-if="info.status || info.status == 0" :style="{color: statusM[info.status].color}">{{statusM[info.status].name}}</view>
+				<view class="status" v-if="info.status || info.status == 0" :style="{color: statusM[info.status].color}">
+					{{statusM[info.status].name}}
+				</view>
 			</view>
 			<view class="line">
 				<view class="la">浠诲姟鏃ユ湡锛�</view>
@@ -17,7 +19,8 @@
 			<view class="line">
 				<view class="la">鎵ц鏃堕棿锛�</view>
 				<view class="val" v-if="info.startDate && info.endDate">{{ info.startDate.slice(11,16) }} 鑷�
-					{{ info.endDate.slice(11, 16) }}</view>
+					{{ info.endDate.slice(11, 16) }}
+				</view>
 			</view>
 			<view class="line">
 				<view class="la">瀹屾垚鎯呭喌锛�</view>
@@ -47,8 +50,12 @@
 				</view>
 			</view>
 		</view>
-		<view class="footer" v-if="flag">
+		<view class="footer" @click="openSc" v-if="flag">
 			<view class="sub_btn">鎵爜宸℃</view>
+		</view>
+		<!--  -->
+		<view class="reader-box" @click="stopScan" v-if="isScaning">
+			<view class="reader" id="reader"></view>
 		</view>
 	</view>
 </template>
@@ -56,34 +63,95 @@
 <script>
 	import {
 		ywPatrolDetail,
-		ywPatrolTaskRecord
-	} from '@/api'
+		ywPatrolTaskRecord,
+		getPointRecordByCode
+	} from '@/api'
 	import dayjs from 'dayjs';
+	import {
+		Html5Qrcode
+	} from 'html5-qrcode';
 	export default {
 		data() {
 			return {
 				id: '',
 				info: {},
-				list: [],
-				flag: false,
-				statusM: [
-					{ color: '#4593f7', name: '寰呭紑濮�' },
-					{ color: '#73e09a', name: '杩涜涓�' },
-					{ color: '#f1a93f', name: '宸茶秴鏈�' },
-					{ color: '#b9b9b9', name: '宸插鐞�' },
-				]
+				list: [],
+				flag: false,
+				statusM: [{
+						color: '#4593f7',
+						name: '寰呭紑濮�'
+					},
+					{
+						color: '#73e09a',
+						name: '杩涜涓�'
+					},
+					{
+						color: '#f1a93f',
+						name: '宸茶秴鏈�'
+					},
+					{
+						color: '#b9b9b9',
+						name: '宸插鐞�'
+					},
+				],
+				html5Qrcode: null,
+				isScaning: false,
 			};
 		},
 		onLoad(option) {
 			this.id = option.id
 			this.getDetail()
-		},
-		onShow() {
-			this.getDetail()
 		},
+		// onShow() {
+		// 	this.getDetail()
+		// },
 		methods: {
-			itemClick(item) {
-				if(!this.flag) return
+			openSc() {
+				this.isScaning = true;
+				Html5Qrcode.getCameras().then((devices) => {
+					if (devices && devices.length) {
+						this.html5Qrcode = new Html5Qrcode('reader');
+						this.html5Qrcode.start({
+								facingMode: 'environment'
+							}, {
+								focusMode: 'continuous', //璁剧疆杩炵画鑱氱劍妯″紡
+								fps: 5, //璁剧疆鎵爜璇嗗埆閫熷害
+								qrbox: 280 //璁剧疆浜岀淮鐮佹壂鎻忔澶у皬
+							},
+							(decodeText, decodeResult) => {
+								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
+									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
+									getPointRecordByCode({
+										taskId: this.id,
+										pointCode: decodeText
+									}).then(ress => {
+										if (ress.data) {
+											uni.navigateTo({
+												url: '/pages/polling/point?id=' + ress.data.id
+											})
+										} else {
+											this.showToast('鏈尮閰嶅埌宸℃鐐�,璇烽噸鏂版壂鎻�')
+										}
+									})
+								}
+							},
+							(err) => {
+								// console.log(err);  //閿欒淇℃伅
+							}
+						);
+					}
+				});
+			},
+
+			stopScan() {
+				console.log('鍋滄鎵爜')
+				this.isScaning = false;
+				if (this.html5Qrcode) {
+					this.html5Qrcode.stop();
+				}
+			},
+			itemClick(item) {
+				if (!this.flag) return
 				uni.navigateTo({
 					url: '/pages/polling/point?id=' + item.id
 				})
@@ -93,8 +161,9 @@
 					id
 				} = this
 				ywPatrolDetail(id).then(res => {
-					this.info = res.data
-					let time = new Date(res.data.startDate.slice(0, 10) + ' 00:00:00').getTime()
+					this.info = res.data
+					let time = new Date(res.data.startDate).getTime()
+					console.log('res.data.startDate', new Date().getTime());
 					this.flag = new Date().getTime() > time
 				})
 				ywPatrolTaskRecord({
@@ -107,22 +176,26 @@
 					this.list = res.data.records
 				})
 			},
-			async startScan() {
-			      try {
-			        const video = document.getElementById('video');
-			        const stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } });
-			        video.srcObject = stream;
-			
-			        // 浣跨敤 QrScanner 瑙f瀽
-			        const qrScanner = new QrScanner(video, result => {
-			          alert(`鎵弿缁撴灉: ${result}`);
-			          qrScanner.stop(); // 鍋滄鎵爜
-			        });
-			        qrScanner.start();
-			      } catch (err) {
-			        console.error('鎵撳紑鎽勫儚澶村け璐�:', err);
-			      }
-			    }
+			async startScan() {
+				try {
+					const video = document.getElementById('video');
+					const stream = await navigator.mediaDevices.getUserMedia({
+						video: {
+							facingMode: "environment"
+						}
+					});
+					video.srcObject = stream;
+
+					// 浣跨敤 QrScanner 瑙f瀽
+					const qrScanner = new QrScanner(video, result => {
+						alert(`鎵弿缁撴灉: ${result}`);
+						qrScanner.stop(); // 鍋滄鎵爜
+					});
+					qrScanner.start();
+				} catch (err) {
+					console.error('鎵撳紑鎽勫儚澶村け璐�:', err);
+				}
+			}
 		}
 	}
 </script>
@@ -174,9 +247,10 @@
 
 				.status {
 					color: $primaryColor;
-				}
-				.gray{
-					color: gray;
+				}
+
+				.gray {
+					color: gray;
 				}
 			}
 
@@ -212,9 +286,11 @@
 				display: flex;
 				padding: 20rpx 30rpx 0 16rpx;
 				margin-bottom: 20rpx;
-				.line{
-					margin-bottom: 10rpx;
+
+				.line {
+					margin-bottom: 10rpx;
 				}
+
 				.icon {
 					width: 10rpx;
 					height: 148rpx;
@@ -238,9 +314,10 @@
 							offset-anchor: 28rpx;
 							color: $primaryColor;
 							font-weight: 400;
-						}
-						.gray{
-							color: #999999;
+						}
+
+						.gray {
+							color: #999999;
 						}
 					}
 
@@ -284,4 +361,23 @@
 		}
 
 	}
+
+	.reader-box {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+	}
+	
+	.reader {
+		width: 100%;
+		// width: 540rpx;
+		// height: 540rpx;
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
 </style>
\ No newline at end of file
diff --git a/h5/pages/polling/task.vue b/h5/pages/polling/task.vue
index e89f434..6ba466e 100644
--- a/h5/pages/polling/task.vue
+++ b/h5/pages/polling/task.vue
@@ -28,23 +28,23 @@
 		<!--  -->
 		<scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
 			<view class="list">
-				<view class="item" v-for="item in list" @click="itemClick(item)">
-					<image v-if="item.status == 0 || item.status == 1" src="@/static/side/xunjianed.png" class="icon"></image>
-					<image v-else src="@/static/side/xunjian.png" class="icon"></image>
+				<view class="item" v-for="item in list">
+					<image @click="itemClick(item)" v-if="item.status == 0 || item.status == 1" src="@/static/side/xunjianed.png" class="icon"></image>
+					<image @click="itemClick(item)" v-else src="@/static/side/xunjian.png" class="icon"></image>
 					<view class="content">
 						<view class="name_wrap line">
-							<view class="name">{{item.planTitle}}</view>
-							<view class="status" :class="{
+							<view class="name" @click="itemClick(item)">{{item.planTitle}}</view>
+							<view class="status" @click="itemClick(item)" :class="{
 								green: item.status == 1,
 								red: item.status == 2,
 								gray: item.status == 3 || item.status == 4
 							}">{{statusM[item.status]}}</view>
 						</view>
-						<view class="line" v-if="item.startDate">浠诲姟鏃ユ湡锛歿{ item.startDate.slice(0, 11) }}</view>
-						<view class="line">鎵ц鏃堕棿锛歿{ item.startDate.slice(11, 16) }} 鑷� {{ item.endDate.slice(11, 16) }}</view>
+						<view class="line" @click="itemClick(item)" v-if="item.startDate">浠诲姟鏃ユ湡锛歿{ item.startDate.slice(0, 11) }}</view>
+						<view class="line" @click="itemClick(item)">鎵ц鏃堕棿锛歿{ item.startDate.slice(11, 16) }} 鑷� {{ item.endDate.slice(11, 16) }}</view>
 						<view class="line">
-							<view>瀹屾垚鎯呭喌锛歿{item.finishNum || 0}}/{{item.patrolNum}}</view>
-							<view class="btn">
+							<view @click="itemClick(item)">瀹屾垚鎯呭喌锛歿{item.finishNum || 0}}/{{item.patrolNum}}</view>
+							<view v-if="param.queryStatus == '0,1'" class="btn" @click="openSc(item)">
 								<image src="@/static/side/ic_saoma@2x.png" class="saoma" mode=""></image>
 								<view>鎵爜宸℃</view>
 							</view>
@@ -54,14 +54,22 @@
 			</view>
 		</scroll-view>
 
-		<!--  -->
+		<!--  -->
+		<!--  -->
+		<view class="reader-box" @click="stopScan" v-if="isScaning">
+			<view class="reader" id="reader"></view>
+		</view>
 	</view>
 </template>
 
 <script>
 	import {
-		ywPatrolTaskPost
-	} from '@/api'
+		ywPatrolTaskPost,
+		getPointRecordByCode
+	} from '@/api'
+	import {
+		Html5Qrcode
+	} from 'html5-qrcode';
 	export default {
 		data() {
 			return {
@@ -79,13 +87,60 @@
 					2: '宸茶秴鏈�',
 					3: '宸插畬鎴�',
 					4: '宸插彇娑�',
-				}
+				},
+				html5Qrcode: null,
+				isScaning: false,
+				// activeItem: {}
 			};
 		},
 		onLoad() {
 			this.getList()
 		},
 		methods: {
+			openSc(item) {
+				this.isScaning = true;
+				Html5Qrcode.getCameras().then((devices) => {
+					if (devices && devices.length) {
+						this.html5Qrcode = new Html5Qrcode('reader');
+						this.html5Qrcode.start({
+								facingMode: 'environment'
+							}, {
+								focusMode: 'continuous', //璁剧疆杩炵画鑱氱劍妯″紡
+								fps: 5, //璁剧疆鎵爜璇嗗埆閫熷害
+								qrbox: 280 //璁剧疆浜岀淮鐮佹壂鎻忔澶у皬
+							},
+							(decodeText, decodeResult) => {
+								if (decodeText) { //杩欓噷decodeText灏辨槸閫氳繃鎵弿浜岀淮鐮佸緱鍒扮殑鍐呭
+									this.stopScan(); //鍏抽棴鎵爜鍔熻兘
+									getPointRecordByCode({
+										taskId: item.id,
+										pointCode: decodeText
+									}).then(ress=> {
+										if(ress.data){
+											uni.navigateTo({
+												url: '/pages/polling/point?id=' + ress.data.id
+											})
+										}else{
+											this.showToast('鏈尮閰嶅埌宸℃鐐�,璇烽噸鏂版壂鎻�')
+										}
+									})
+								}
+							},
+							(err) => {
+								// console.log(err);  //閿欒淇℃伅
+							}
+						);
+					}
+				});
+			},
+			
+			stopScan() {
+				console.log('鍋滄鎵爜')
+				this.isScaning = false;
+				if (this.html5Qrcode) {
+					this.html5Qrcode.stop();
+				}
+			},
 			scrolltolower() {
 				const {
 					total,
@@ -300,4 +355,23 @@
 			}
 		}
 	}
+
+	.reader-box {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+	}
+	
+	.reader {
+		width: 100%;
+		// width: 540rpx;
+		// height: 540rpx;
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
 </style>
\ No newline at end of file
diff --git a/h5/pages/workOrder/detail.vue b/h5/pages/workOrder/detail.vue
index f1726d3..f26e85c 100644
--- a/h5/pages/workOrder/detail.vue
+++ b/h5/pages/workOrder/detail.vue
@@ -4,7 +4,7 @@
 			<view class="title">
 				<text>{{ info.projectName }}/{{ info.buildingName }}/{{info.roomNum || info.floorName}}</text>
 				<text class="status" v-if="info.dealStatus == 0">寰呭鐞�</text>
-				<text class="status" v-if="info.dealStatus == 1">宸叉寚娲�</text>
+				<text class="status" v-if="info.dealStatus == 1">寰呭鐞�</text>
 				<text class="status gray" v-if="info.dealStatus == 2">宸插鐞�</text>
 			</view>
 			<view class="desc">{{ info.content }}</view>
@@ -58,8 +58,8 @@
 			</view>
 		</view>
 		<!--  -->
-		<view class="btns" v-if="info.dealStatus == 0">
-			<view class="btn">
+		<view class="btns" v-if="info.dealStatus == 0 || (info.dealUserId === userInfo.id && info.dealStatus == 1)">
+			<view class="btn" @click="handleCall">
 				<image src="@/static/side/phoneed.png" class="icon"></image>
 				<text>涓婃姤浜�</text>
 			</view>
@@ -135,7 +135,8 @@
 				info: {},
 				showUpload: false,
 				isShowHandle: false,
-				isShowHandleDate: false,
+				isShowHandleDate: false,
+				userInfo: uni.getStorageSync('userInfo') || {},
 				handleParam: {},
 				dealFileList: []
 			};
@@ -159,6 +160,12 @@
 						uni.navigateBack()
 					}
 				})
+			},
+			handleCall() {
+				const { info } = this
+				uni.makePhoneCall({
+					phoneNumber: info.creatorMobile
+				});
 			},
 			getDetail() {
 				ywWorkorderD(this.id).then(res => {
diff --git a/h5/pages/workOrder/edit.vue b/h5/pages/workOrder/edit.vue
index 4225aa1..3e0c34d 100644
--- a/h5/pages/workOrder/edit.vue
+++ b/h5/pages/workOrder/edit.vue
@@ -142,7 +142,11 @@
 				const {
 					param,
 					fileList
-				} = this
+				} = this
+				if (!param.projectId) return this.showToast('璇烽�夋嫨瀹屾暣鐨勫尯鍩�')
+				if (!param.buildingId) return this.showToast('璇烽�夋嫨瀹屾暣鐨勫尯鍩�')
+				if (!param.floorName && !param.roomNum) return this.showToast('璇烽�夋嫨瀹屾暣鐨勫尯鍩�')
+				if (!param.cateName) return this.showToast('璇烽�夋嫨宸ュ崟鍒嗙被')
 				ywWorkorderCreate({
 					...param,
 					// roomId: '',
@@ -445,11 +449,12 @@
 	}
 
 	.sub_btn {
-		position: fixed;
-		bottom: 68rpx;
-		left: 40rpx;
+		// position: fixed;
+		// bottom: 68rpx;
+		// left: 40rpx;
 		width: 670rpx;
-		height: 88rpx;
+		height: 88rpx;
+		margin-top: 80rpx;
 		background: $primaryColor;
 		box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
 		border-radius: 44rpx;
diff --git a/h5/pages/workOrder/list.vue b/h5/pages/workOrder/list.vue
index d2114af..2da419f 100644
--- a/h5/pages/workOrder/list.vue
+++ b/h5/pages/workOrder/list.vue
@@ -73,7 +73,7 @@
 				page: 1,
 			};
 		},
-		onShow() {
+		onLoad() {
 			this.getList()
 		},
 		methods: {
@@ -139,7 +139,7 @@
 
 <style lang="scss" scoped>
 	.main_app {
-		padding: 0 30rpx;
+		padding: 30rpx;
 	}
 
 	.tabs {
diff --git a/h5/utils/config.js b/h5/utils/config.js
index d6d6ee5..450773b 100644
--- a/h5/utils/config.js
+++ b/h5/utils/config.js
@@ -1,7 +1,6 @@
-
-export const baseUrl = 'gateway_interface/'
+ // export const baseUrl = 'gateway_interface/'
 // export const baseUrl = 'http://192.168.0.173/gateway_interface/'
-// export const baseUrl = 'http://10.50.250.253:8088/gateway_interface/'
+export const baseUrl = 'https://zhcg.fnwtzx.com/gateway_interface/'
 
 export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`
 export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch`
diff --git a/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java b/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
index 83fcdca..e21f023 100644
--- a/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
+++ b/server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
@@ -16,6 +16,7 @@
 import com.doumee.service.system.SystemUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.validation.annotation.Validated;
@@ -157,12 +158,10 @@
     public ApiResponse<String> logout(@RequestHeader(Constants.HEADER_USER_TOKEN) String oldToken){
         try {
              jwtTokenUtil.logout(oldToken);
-
-
-
         }catch (BusinessException e){
             return ApiResponse.failed(e.getCode(),e.getMessage());
         }catch (Exception e){
+            e.printStackTrace();
             return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
         }
         return ApiResponse.success(null);
diff --git a/server/system_gateway/src/main/resources/application-pro.yml b/server/system_gateway/src/main/resources/application-pro.yml
index b0ea2fd..d27b82f 100644
--- a/server/system_gateway/src/main/resources/application-pro.yml
+++ b/server/system_gateway/src/main/resources/application-pro.yml
@@ -1,12 +1,17 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://localhost:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: root
-    password: funing@2024
+    url: jdbc:mysql://rm-bp136n33jr035pbfl3o.mysql.rds.aliyuncs.com:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: zhcg
+    password: Fnwtzx@1127$dmtt
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
-
+  redis:
+    #    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password:
+    timeout: 5000      # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
   jackson:
     time-zone: GMT+8
     date-format: yyyy-MM-dd HH:mm:ss
diff --git a/server/system_gateway/src/main/resources/bootstrap.yml b/server/system_gateway/src/main/resources/bootstrap.yml
index bb432df..099da4a 100644
--- a/server/system_gateway/src/main/resources/bootstrap.yml
+++ b/server/system_gateway/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: test
+    active: pro
   application:
     name: system_gateway
   # 瀹夊叏閰嶇疆
diff --git a/server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java b/server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java
index 8167d7d..856b1f9 100644
--- a/server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java
+++ b/server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java
@@ -122,8 +122,8 @@
     @ApiOperation("鏌ヨ鎵�鏈夊唴閮ㄤ汉鍛樼敤鎴�")
     @PostMapping("/findInternalList")
     @CloudRequiredPermission("system:user:query")
-    public ApiResponse<List<SystemUser>> findInternalList () {
-        return ApiResponse.success(systemUserService.findInternalList());
+    public ApiResponse<List<SystemUser>> findInternalList (@RequestBody SystemUser systemUser) {
+        return ApiResponse.success(systemUserService.findInternalList(systemUser));
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
diff --git a/server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
index 8e539a4..b5a1acc 100644
--- a/server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
+++ b/server/system_service/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -5,6 +5,7 @@
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.HttpsUtil;
+import com.doumee.service.system.SystemLoginService;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import lombok.extern.slf4j.Slf4j;
@@ -36,6 +37,9 @@
     private JwtProperties jwtProperties;
     @Autowired
     private SystemDictDataBiz systemDictDataBiz ;
+    @Autowired
+    private SystemLoginService systemLoginService;
+
 
     /**
      * 鐢熸垚token浠ょ墝
@@ -137,7 +141,7 @@
                 HttpsUtil.get(url+"?token="+loginUserInfo.getHkMenuToken(),true);
             }
             redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);//鍒犻櫎鑰佺殑token
-
+            systemLoginService.cleanOpenid(loginUserInfo.getId());
         } catch (Exception e) {
             e.printStackTrace();
         }
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java b/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
index a617b61..a95788d 100644
--- a/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
+++ b/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -19,6 +19,10 @@
     @ApiModelProperty(value = "鐢ㄦ埛鍚�")
     private String username;
 
+    @ApiModelProperty(value = "寰俊openId")
+    private String openid;
+
+
     @NotBlank(message = "瀵嗙爜涓嶈兘涓虹┖")
     @ApiModelProperty(value = "瀵嗙爜")
     private String password;
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java b/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java
index 4646b5f..839b481 100644
--- a/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java
+++ b/server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java
@@ -18,6 +18,12 @@
     @NotBlank(message = "鎵嬫満鍙蜂笉鑳戒负绌�")
     @ApiModelProperty(value = "鎵嬫満鍙�")
     private String phone;
+
+
+    @ApiModelProperty(value = "寰俊openId")
+    private String openid;
+
+
     @NotBlank(message = "楠岃瘉鐮佷笉鑳戒负绌�")
     @ApiModelProperty(value = "楠岃瘉鐮�")
     private String code;
diff --git a/server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java b/server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java
index d4874b3..1921468 100644
--- a/server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java
+++ b/server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -102,6 +102,8 @@
     @ApiModelProperty(value = "鏄惁宸插垹闄�", hidden = true)
     private Boolean deleted;
 
+
+
     @ApiModelProperty(value = "0 鍚敤 1 绂佺敤")
     private Integer status;
     @ApiModelProperty(value = "浼佷笟缂栫爜锛堝叧鑱攃ompany锛�")
diff --git a/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java b/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
index dc28a94..c660c8e 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/SystemLoginService.java
@@ -35,4 +35,6 @@
      * @return
      */
     String loginByUserId(Integer userId);
+    void cleanOpenid(Integer userId);
+
 }
diff --git a/server/system_service/src/main/java/com/doumee/service/system/SystemUserService.java b/server/system_service/src/main/java/com/doumee/service/system/SystemUserService.java
index 2fe3b3c..eeeb248 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/SystemUserService.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/SystemUserService.java
@@ -86,7 +86,7 @@
      * 鏌ヨ鎵�鏈夊唴閮ㄤ汉鍛樺垪琛�
      * @return
      */
-    List<SystemUser> findInternalList();
+    List<SystemUser> findInternalList(SystemUser systemUser);
 
     /**
      * 鏉′欢缁熻
diff --git a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
index b9b8bf2..05e1749 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -1,6 +1,7 @@
 package com.doumee.service.system.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.doumee.config.jwt.JwtTokenUtil;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.LoginUserInfo;
@@ -11,6 +12,7 @@
 import com.doumee.dao.business.dao.SmsEmailMapper;
 import com.doumee.dao.business.model.Company;
 import com.doumee.dao.business.model.SmsEmail;
+import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.dto.LoginByOpenidDTO;
 import com.doumee.dao.system.dto.LoginDTO;
 import com.doumee.dao.system.dto.LoginPhoneDTO;
@@ -50,6 +52,9 @@
 
     @Autowired
     private SmsEmailMapper smsEmailMapper;
+    @Autowired
+    private SystemUserMapper systemUserMapper;
+
 
     @Lazy
     @Autowired
@@ -83,7 +88,7 @@
         loginLog.setLoginTime(new Date());
         loginLog.setSystemVersion(systemVersion);
         loginLog.setIp(Utils.User_Client.getIP(request));
-        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
         loginLog.setPlatform(Utils.User_Client.getPlatform(request));
         loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
         loginLog.setOsInfo(Utils.User_Client.getOS(request));
@@ -124,7 +129,7 @@
         loginLog.setLoginUsername(dto.getUsername());
         loginLog.setLoginTime(new Date());
         loginLog.setSystemVersion(systemVersion);
-        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
         if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
             loginLog.setIp(Utils.User_Client.getIP(request));
             loginLog.setPlatform(Utils.User_Client.getPlatform(request));
@@ -164,6 +169,7 @@
         if(Objects.nonNull(user.getCompanyId())){
             company = companyMapper.selectById(user.getCompanyId());
         }
+        dealOpenIdBiz(user,dto.getOpenid());
         // 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
         List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
         List<SystemPermission> permissions = systemPermissionService.findByUserId(user.getId());
@@ -178,6 +184,21 @@
     }
 
 
+    private void dealOpenIdBiz(SystemUser user, String openid) {
+        if(StringUtils.isNotBlank(openid)){
+            //濡傛灉openId涓嶄负绌�,缁戝畾璇ョ敤鎴穙penid
+            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
+                    .set(SystemUser::getOpenid,null)
+                    .eq(SystemUser::getType,user.getType())
+                    .eq(SystemUser::getOpenid,openid)
+            );
+            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
+                    .set(SystemUser::getOpenid,openid)
+                    .eq(SystemUser::getId,user.getId()));
+        }
+    }
+
+
 
 
 
@@ -187,7 +208,7 @@
         loginLog.setLoginUsername(dto.getPhone());
         loginLog.setLoginTime(new Date());
         loginLog.setSystemVersion(systemVersion);
-        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
         if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
             loginLog.setIp(Utils.User_Client.getIP(request));
             loginLog.setPlatform(Utils.User_Client.getPlatform(request));
@@ -239,6 +260,9 @@
         if(Objects.nonNull(user.getCompanyId())){
             company = companyMapper.selectById(user.getCompanyId());
         }
+
+        dealOpenIdBiz(user,dto.getOpenid());
+
         // 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
         List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
         List<SystemPermission> permissions = systemPermissionService.findByUserId(user.getId());
@@ -259,7 +283,7 @@
         loginLog.setLoginUsername(dto.getUsername());
         loginLog.setLoginTime(new Date());
         loginLog.setSystemVersion(systemVersion);
-        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
         if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){
             loginLog.setIp(Utils.User_Client.getIP(request));
             loginLog.setPlatform(Utils.User_Client.getPlatform(request));
@@ -289,6 +313,15 @@
     }
 
 
+    @Override
+    public void cleanOpenid(Integer userId){
+        systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
+                .set(SystemUser::getOpenid,null)
+                .eq(SystemUser::getId,userId)
+        );
+
+    }
+
     /**
      * 鍐呴儴浜哄憳 涓� 鍙告満 鏍规嵁code鏌ヨopenId鍚庤繘琛岀櫥褰曟帴鍙�
      * @return
@@ -298,7 +331,7 @@
         SystemLoginLog loginLog = new SystemLoginLog();
         loginLog.setLoginTime(new Date());
         loginLog.setSystemVersion(systemVersion);
-        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
+//        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
         loginLog.setServerIp(Utils.Server.getIP());
 
         // 鏍规嵁鐢ㄦ埛鍚嶆煡璇㈢敤鎴峰璞�
diff --git a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
index bf8ef74..e21a1e7 100644
--- a/server/system_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
+++ b/server/system_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
@@ -235,12 +235,13 @@
 
 
     @Override
-    public List<SystemUser> findInternalList() {
+    public List<SystemUser> findInternalList(SystemUser systemUser) {
         MPJLambdaWrapper<SystemUser> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(SystemUser.class);
         queryWrapper.eq(SystemUser::getDeleted, Constants.ZERO);
         queryWrapper.leftJoin(Company.class,Company::getId,SystemUser::getCompanyId);
         queryWrapper.eq(Company::getType,Constants.ONE);
+        queryWrapper.like(Objects.nonNull(systemUser)&&StringUtils.isNotBlank(systemUser.getRealname()),SystemUser::getRealname,systemUser.getRealname());
         queryWrapper.orderByDesc(SystemUser::getCreateTime);
         List<SystemUser> result = systemUserJoinMapper.selectJoinList( SystemUser.class, queryWrapper);
         return result;
diff --git a/server/system_timer/src/main/resources/application-pro.yml b/server/system_timer/src/main/resources/application-pro.yml
index b0ea2fd..c763d64 100644
--- a/server/system_timer/src/main/resources/application-pro.yml
+++ b/server/system_timer/src/main/resources/application-pro.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://localhost:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: root
-    password: funing@2024
+    url: jdbc:mysql://rm-bp136n33jr035pbfl3o.mysql.rds.aliyuncs.com:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: zhcg
+    password: Fnwtzx@1127$dmtt
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
 
diff --git a/server/system_timer/src/main/resources/bootstrap.yml b/server/system_timer/src/main/resources/bootstrap.yml
index 107b53b..05a83ce 100644
--- a/server/system_timer/src/main/resources/bootstrap.yml
+++ b/server/system_timer/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: pro
   application:
     name: systemTimer
     # 瀹夊叏閰嶇疆
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java
index 19131de..d7600a1 100644
--- a/server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/WxTokenTimerController.java
@@ -42,6 +42,7 @@
      */
     @Value("${debug_model}")
     private Boolean timing;
+
     @ApiOperation("寮�鍚畾鏃舵洿鏂板井淇″叕浼楀彿accesstoken")
     @GetMapping("/updateWxAccessToken")
     public ApiResponse updateWxAccessToken() {
@@ -54,7 +55,6 @@
         String url = WXConstant.GET_ACCESS_TOKEN_URL.replace("APPID",appId).replace("APPSECRET",appSecret);
         String response = HttpsUtil.get(url,false);
         JSONObject json = JSONObject.parseObject(response);
-        System.out.println(json);
         SystemDictData systemDictData =  systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN);
         if(!Objects.isNull(systemDictData)){
             systemDictData.setCode(json.getString("access_token"));
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
index bfa5c41..8a7c380 100644
--- a/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/YwTimerController.java
@@ -1,7 +1,10 @@
 package com.doumee.api;
 
+import com.alibaba.fastjson.JSONObject;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.core.wx.WXConstant;
 import com.doumee.dao.business.model.YwContract;
 import com.doumee.service.business.PlatformJobService;
 import com.doumee.service.business.YwContractBillService;
@@ -52,18 +55,15 @@
         return ApiResponse.success("瀹氭椂澶勭悊鍚堝悓杩囨湡涓庢墽琛屼腑");
     }
 
+    public static void main(String[] args) {
+        String url = WXConstant.GET_ACCESS_TOKEN_URL.replace("APPID","wx95ac1efb67f0330d")
+                .replace("APPSECRET","f228b9e3b49a37b881b51431a483c939");
+        String response = HttpsUtil.get(url,false);
+        JSONObject json = JSONObject.parseObject(response);
+        System.out.println(json);
 
 
-
-
-
-
-
-
-
-
-
-
+    }
 
 
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java
index 4ce8ec6..23eccac 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/SmsEmailColudController.java
@@ -56,5 +56,4 @@
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
-
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
index b1d01e4..18caac1 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
@@ -103,6 +103,7 @@
     public ApiResponse<List<YwContract>> list (@RequestBody YwContract model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(ywContractService.findList(model));
     }
+
     @ApiOperation("鏍规嵁閫�绉熸棩鏈熸煡璇㈣处鍗曟暟鎹�")
     @PostMapping("/findForBills")
     @CloudRequiredPermission("business:ywcontract:query")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java
index eda122e..35fc0a9 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolSchemeCloudController.java
@@ -101,4 +101,7 @@
     public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(ywPatrolSchemeService.findById(id));
     }
+
+
+
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskRecordController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskRecordController.java
index 6fcfbd6..052f8bd 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskRecordController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwPatrolTaskRecordController.java
@@ -100,6 +100,13 @@
         return ApiResponse.success(null);
     }
 
+    @ApiOperation("鎵爜鑾峰彇宸℃鐐逛换鍔′俊鎭�")
+    @PostMapping("/getPointRecordByCode")
+    @CloudRequiredPermission("business:ywpatroltaskrecord:update")
+    public ApiResponse<YwPatrolTaskRecord> getPointRecordByCode(@RequestBody YwPatrolTaskRecord ywPatrolTaskRecord,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success("鏌ヨ鎴愬姛",ywPatrolTaskRecordService.getPointRecordByCode(ywPatrolTaskRecord));
+    }
+
 
 
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
index 2ac7672..dbf0657 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
@@ -71,6 +71,19 @@
     }
 
 
+    @ApiOperation(value = "璁垮寰俊鎺堟潈 - 闃滃畞杩愮淮", notes = "璁垮寰俊鎺堟潈鑾峰彇openId")
+    @GetMapping("/ywWxAuthorize")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "鎺堟潈鐮�", required = true),
+            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "source", value = "鏉ユ簮:0=鍙告満锛�1=璁垮锛�2=鍐呴儴鍛樺伐", required = true)
+    })
+    public ApiResponse<WxAuthorizeVO> ywWxAuthorize(@RequestParam String code) {
+        WxAuthorizeVO wxAuthorizeVO =  memberService.ywWxAuthorize(code);
+        return ApiResponse.success("鏌ヨ鎴愬姛",wxAuthorizeVO);
+    }
+
+
+
     @ApiOperation(value = "鏌ヨ琚闂汉淇℃伅", notes = "鏌ヨ琚闂汉淇℃伅")
     @PostMapping("/getVisitedMember")
     public ApiResponse<List<MemberVO>> getVisitedMember(@Valid @RequestBody CheckVisitedDTO checkVisitedDTO) {
diff --git a/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml b/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
index 86e11a3..2df12af 100644
--- a/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
+++ b/server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: test
+    active: pro
   application:
     name: visitsAdmin
     # 瀹夊叏閰嶇疆
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
index 71f6b4e..1cf5188 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolTaskRecord.java
@@ -109,6 +109,11 @@
     @TableField(exist = false)
     private String content;
 
+    @ApiModelProperty(value = "宸℃鐐圭紪鐮�")
+    @TableField(exist = false)
+    private String pointCode;
+
+
     @ApiModelProperty(value = "闄勪欢鍒楄〃")
     @TableField(exist = false)
     private List<Multifile> multifileList;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
index 41cb5a8..fc83e99 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -176,6 +176,7 @@
      */
     WxAuthorizeVO wxAuthorize(String code,Integer source);
 
+    WxAuthorizeVO ywWxAuthorize(String code);
 
 
     List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO);
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskRecordService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskRecordService.java
index 38e4bee..deae531 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskRecordService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwPatrolTaskRecordService.java
@@ -99,4 +99,6 @@
     void patrolData(YwPatrolTaskRecord ywPatrolTaskRecord);
 
     YwPatrolTaskRecord getDetail(Integer id);
+
+    YwPatrolTaskRecord getPointRecordByCode(YwPatrolTaskRecord bean);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 534d629..fb15ce1 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -49,6 +49,7 @@
 import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
 import com.doumee.service.system.SystemLoginService;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -73,6 +74,7 @@
  * @date 2023/11/30 15:33
  */
 @Service
+@Slf4j
 public class MemberServiceImpl implements MemberService {
 
     @Autowired
@@ -1762,6 +1764,49 @@
 
 
 
+    /**
+     * 寰俊鎺堟潈鎺ュ彛
+     * @param code
+     * @return
+     */
+    @Override
+    public WxAuthorizeVO ywWxAuthorize(String code){
+        if(StringUtils.isBlank(code)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        String appId = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_APPID).getCode();
+        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_SECRET).getCode();
+        String getTokenUrl = WXConstant.GET_USER_INFO_URL.replace("CODE", code)
+                .replace("APPID", appId).replace("SECRET", appSecret);
+        log.error("=========================getTokenUrl=====================" + getTokenUrl);
+        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
+        log.error("=========================tokenJson=====================" + tokenJson);
+        String openId = "";
+        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
+        if(Objects.nonNull(tokenJson)&&!Objects.isNull(tokenJson.get("access_token"))){
+            openId = tokenJson.getString("openid");
+        }else{
+            if(StringUtils.isBlank(openId)){
+                return wxAuthorizeVO;
+            }
+        }
+        wxAuthorizeVO.setOpenid(openId);
+        //鏍规嵁openId 鏌ヨ鐢ㄦ埛淇℃伅
+        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
+                .eq(SystemUser::getOpenid,openId)
+                .eq(SystemUser::getDeleted,Boolean.FALSE)
+                .last(" limit 1 "));
+        if(!Objects.isNull(user)){
+            String token = systemLoginService.loginByUserId(user.getId());
+            wxAuthorizeVO.setToken(token);
+        }
+        return wxAuthorizeVO;
+    }
+
+
+
+
+
     @Override
     public List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO){
         List<Member> memberList = memberJoinMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>()
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
index 8f126e6..2edabc8 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -15,6 +15,8 @@
 import com.doumee.dao.business.dao.SmsConfigMapper;
 import com.doumee.dao.business.dao.SmsEmailMapper;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.SystemUserMapper;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.SmsEmailService;
 import com.doumee.service.business.third.EmayService;
 import org.apache.commons.lang3.StringUtils;
@@ -44,6 +46,8 @@
     private EmayService emayService;
     @Autowired
     private SmsConfigMapper smsConfigMapper;
+    @Autowired
+    private SystemUserMapper systemUserMapper;
 
     @Value("${debug_model}")
     private boolean debugModel;
@@ -86,6 +90,10 @@
         if(StringUtils.isBlank(smsEmail.getPhone())){
             throw  new BusinessException(ResponseStatus.BAD_REQUEST);
         }
+        //鏍规嵁鎵嬫満鍙锋煡璇㈢敤鎴�
+        if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda().eq(SystemUser::getMobile,smsEmail.getPhone()))==Constants.ZERO){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鎵嬫満鍙锋棤鏁堣妫�鏌ュ悗閲嶈瘯!");
+        };
         String nowDate = DateUtil.getFomartDate(new Date(),"yyyy-MM-dd HH:mm:ss");
         if(smsEmailMapper.selectCount(new QueryWrapper<SmsEmail>().lambda()
                 .eq(SmsEmail::getPhone,smsEmail.getPhone())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
index 00daa7a..4580e1d 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -434,7 +434,7 @@
                 for (String codeDate:codeDateSet) {
                     //鑾峰彇褰撳墠鏃ユ湡鐨勬暟鎹�
                     List<YwContractBill> codeDateBillList =
-                            ywContractBillList.stream().filter(i->i.getCodeDate().equals(codeDate)).collect(Collectors.toList());
+                            ywContractBillList.stream().filter(i->StringUtils.isNotBlank(i.getCodeDate()) && i.getCodeDate().equals(codeDate)).collect(Collectors.toList());
                     if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(codeDateBillList)){
                         continue;
                     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
index 729156a..4b51994 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -89,7 +89,6 @@
         }else{
             model.setStatus(Constants.TWO);
         }
-        model.setStatus(Constants.ZERO);//寰呮墽琛�
         model.setRemark(getRemarlByParam(model));
         ywContractMapper.insert(model);
         dealDetailListBiz(model);//澶勭悊鏉℃淇℃伅
@@ -468,8 +467,8 @@
                     }else if(fee.compareTo(new BigDecimal(0)) < 0){
                         //濡傛灉璐﹀崟杩樻湁娆惧緟鏀讹紝鍒欎繚鎸佺姸鎬佷笉鍙�
                     }
+                    b.setReceivableFee(editBill.getReceivableFee());
                 }
-                b.setReceivableFee(editBill.getReceivableFee());
                 b.setEditDate(param.getEditDate());
                 b.setEditor(param.getEditor());
                 b.setBtActDate(param.getBtActDate());
@@ -701,13 +700,19 @@
         }
         int num =1;
         for(int i=0;i<billList1.size();i++){
+            if(Constants.formatBigdecimal(billList1.get(i).getReceivableFee()).compareTo(new BigDecimal(0)) == 0){
+                billList1.get(i).setPayStatus(Constants.ONE);
+            }
             if(Constants.equalsInteger(billList1.get(i).getCostType(),Constants.ZERO)){
                 billList1.get(i).setSortnum(num);
                 num++;
             }
         }
         for(int i=0;i<billList2.size();i++){
-            if(Constants.equalsInteger(billList1.get(i).getCostType(),Constants.ONE)) {
+            if(Constants.formatBigdecimal(billList2.get(i).getReceivableFee()).compareTo(new BigDecimal(0)) == 0){
+                billList2.get(i).setPayStatus(Constants.ONE);
+            }
+            if(Constants.equalsInteger(billList2.get(i).getCostType(),Constants.ONE)) {
                 billList2.get(i).setSortnum(num);
                 num++;
             }
@@ -1329,9 +1334,13 @@
         if(model.getBillList()!=null && model.getBillList().size()>0){
             for(YwContractBill bill: model.getBillList()){
                 //浠樻鐘舵�侊細0=寰呮敹娆撅紱1=宸茬粨娓咃紱2=閮ㄥ垎缁撴竻锛�3=寰呬粯娆撅紱4=寰呴��娆撅紱5=宸插叧闂�
+                if( Constants.formatBigdecimal(bill.getReceivableFee()).compareTo(new BigDecimal(0)) ==0){
+                    //濡傛灉杩樻病寮�濮嬶紝璐﹀崟鐩存帴鍏抽棴
+                    continue;
+                }
                 if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                         ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
-                    if(bill.getStartDate().getTime()>nowEnd){
+                    if(bill.getStartDate().getTime()>nowEnd ){
                         //濡傛灉杩樻病寮�濮嬶紝璐﹀崟鐩存帴鍏抽棴
                         continue;
                     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
index 9118073..a1a9b36 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
@@ -52,7 +52,6 @@
         if(Objects.isNull(ywDeviceRecord)
         || Objects.isNull(ywDeviceRecord.getDeviceId())
         || Objects.isNull(ywDeviceRecord.getStatus())
-        || StringUtils.isBlank(ywDeviceRecord.getContent())
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
index 171745d..0afc0a7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
@@ -61,12 +61,16 @@
                 ||Objects.isNull(ywPatrolScheme.getStartDate())
                 ||Objects.isNull(ywPatrolScheme.getEndDate())
                 ||Objects.isNull(ywPatrolScheme.getCircleType())
-                ||StringUtils.isBlank(ywPatrolScheme.getStartTime())
-                ||StringUtils.isBlank(ywPatrolScheme.getEndTime())
                 || (!Constants.equalsInteger(ywPatrolScheme.getCircleType(),Constants.ZERO) &&StringUtils.isBlank(ywPatrolScheme.getCircleDays()))
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
+        if(StringUtils.isBlank(ywPatrolScheme.getStartTime())){
+            ywPatrolScheme.setStartTime("00:00:00");
+        }
+        if(StringUtils.isBlank(ywPatrolScheme.getEndTime())){
+            ywPatrolScheme.setEndTime("23:59:59");
+        }
         LoginUserInfo loginUserInfo = ywPatrolScheme.getLoginUserInfo();
         ywPatrolScheme.setCreateDate(new Date());
         ywPatrolScheme.setCreator(loginUserInfo.getId());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
index 6fb3725..f463fe7 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskRecordServiceImpl.java
@@ -188,17 +188,24 @@
 
         if(ywPatrolTaskRecordMapper.selectCount(new QueryWrapper<YwPatrolTaskRecord>().lambda()
                 .eq(YwPatrolTaskRecord::getTaskId,ywPatrolTask.getId())
+                .eq(YwPatrolTaskRecord::getStatus,Constants.ZERO)
                 .ne(YwPatrolTaskRecord::getId,ywPatrolTaskRecord.getId()))==Constants.ZERO){
-            ywPatrolTask.setStatus(Constants.THREE);
+            ywPatrolTaskMapper.update(null,new UpdateWrapper<YwPatrolTask>().lambda()
+                    .eq(YwPatrolTask::getId,ywPatrolTask.getId())
+                    .set(YwPatrolTask::getStatus,Constants.THREE)
+                    .set(YwPatrolTask::getEditDate,DateUtil.getCurrDateTime())
+                    .set(YwPatrolTask::getDealDate,DateUtil.getCurrDateTime())
+                    .set(YwPatrolTask::getDealUserId,loginUserInfo.getId())
+                    .set(YwPatrolTask::getEditor,loginUserInfo.getId())
+            );
         }else{
-            ywPatrolTask.setStatus(Constants.ONE);
+            ywPatrolTaskMapper.update(null,new UpdateWrapper<YwPatrolTask>().lambda()
+                    .eq(YwPatrolTask::getId,ywPatrolTask.getId())
+                    .set(YwPatrolTask::getStatus,Constants.ONE)
+                    .set(YwPatrolTask::getEditDate,DateUtil.getCurrDateTime())
+                    .set(YwPatrolTask::getEditor,loginUserInfo.getId())
+            );
         }
-        //鏌ヨ鏄惁瀛樺湪鍏朵粬鏈�
-       ywPatrolTaskMapper.update(null,new UpdateWrapper<YwPatrolTask>().lambda().eq(YwPatrolTask::getId,ywPatrolTask.getId())
-               .set(YwPatrolTask::getStatus,ywPatrolTask.getStatus())
-               .set(YwPatrolTask::getEditDate,DateUtil.getCurrDateTime())
-               .set(YwPatrolTask::getEditor,loginUserInfo.getId())
-       );
         //闄勪欢鏁版嵁
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywPatrolTaskRecord.getMultifileList())){
             for (Multifile multifile:ywPatrolTaskRecord.getMultifileList()) {
@@ -221,6 +228,58 @@
 
 
     @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public YwPatrolTaskRecord getPointRecordByCode(YwPatrolTaskRecord bean) {
+        if(Objects.isNull(bean)
+        || Objects.isNull(bean.getTaskId())
+        || StringUtils.isBlank(bean.getPointCode())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        YwPatrolTaskRecord ywPatrolTaskRecord = ywPatrolTaskRecordMapper.selectJoinOne(YwPatrolTaskRecord.class,new MPJLambdaWrapper<YwPatrolTaskRecord>()
+                .selectAll(YwPatrolTaskRecord.class)
+                .selectAs(YwPatrolPoint::getName,YwPatrolTaskRecord::getPointName)
+                .selectAs(YwPatrolPoint::getContent,YwPatrolTaskRecord::getContent)
+                .selectAs(SystemUser::getRealname,YwPatrolTaskRecord::getRealname)
+                .selectAs(Company::getName,YwPatrolTaskRecord::getCompanyName)
+                .leftJoin(YwPatrolPoint.class,YwPatrolPoint::getId,YwPatrolTaskRecord::getPointId)
+                .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolTaskRecord::getDealUserId)
+                .leftJoin(Company.class,Company::getId,SystemUser::getCompanyId)
+                .eq(YwPatrolScheme::getIsdeleted, Constants.ZERO)
+                .eq(YwPatrolPoint::getCode,bean.getPointCode())
+                .eq(YwPatrolTaskRecord::getTaskId,bean.getTaskId())
+                .orderByDesc(YwPatrolScheme::getCreateDate)
+                .last(" limit 1 ")
+        );
+        if(Objects.isNull(ywPatrolTaskRecord)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈尮閰嶅埌宸℃鐐�!");
+        }
+        //闄勪欢鏁版嵁
+        List<Multifile> multifileList = multifileMapper.selectJoinList(Multifile.class,new MPJLambdaWrapper<Multifile>()
+                .selectAll(Multifile.class)
+                .selectAs(SystemUser::getRealname,Multifile::getUserName)
+                .leftJoin(SystemUser.class,SystemUser::getId,Multifile::getCreator)
+                .eq(Multifile::getObjId,ywPatrolTaskRecord.getId())
+                .eq(Multifile::getIsdeleted,Constants.ZERO)
+                .eq(Multifile::getObjType,Constants.MultiFile.FN_PATROL_TASK_RECORD_FILE.getKey()));
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
+            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_PATROL).getCode();
+            for (Multifile multifile:multifileList) {
+                if(StringUtils.isNotBlank(multifile.getFileurl())){
+                    multifile.setFileurlFull(path + multifile.getFileurl());
+                }
+            }
+            ywPatrolTaskRecord.setMultifileList(multifileList);
+        }
+
+        return ywPatrolTaskRecord;
+
+    }
+
+
+
+
+    @Override
     public YwPatrolTaskRecord getDetail(Integer id) {
 
         YwPatrolTaskRecord ywPatrolTaskRecord = ywPatrolTaskRecordMapper.selectJoinOne(YwPatrolTaskRecord.class,new MPJLambdaWrapper<YwPatrolTaskRecord>()
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
index 8267901..57dc76a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
@@ -87,7 +87,7 @@
                 .selectAs(YwPatrolScheme::getTitle,YwPatrolTask::getPlanTitle)
                 .selectAs(SystemUser::getRealname,YwPatrolTask::getUserName)
                 .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and t.ISDELETED = 0  ) ",YwPatrolTask::getPatrolNum)
-                .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and t.STATUS = 1 and t.ISDELETED = 0) ",YwPatrolTask::getPatrolNum)
+                .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and t.STATUS = 1 and t.ISDELETED = 0) ",YwPatrolTask::getFinishNum)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolTask::getDealUserId)
                 .leftJoin(YwPatrolScheme.class,YwPatrolScheme::getId,YwPatrolTask::getSchemeId)
                 .eq(YwPatrolTask::getIsdeleted, Constants.ZERO)
@@ -141,12 +141,12 @@
                 .selectAs(YwPatrolScheme::getTitle,YwPatrolTask::getPlanTitle)
                 .selectAs(SystemUser::getRealname,YwPatrolTask::getUserName)
                 .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and t.ISDELETED = 0  ) ",YwPatrolTask::getPatrolNum)
-                .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and t.STATUS = 1 and t.ISDELETED = 0) ",YwPatrolTask::getPatrolNum)
+                .select(" ( select count(1) from yw_patrol_task_record ytr where ytr.TASK_ID = t.id  and t.STATUS = 1 and t.ISDELETED = 0) ",YwPatrolTask::getFinishNum)
                 .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolTask::getDealUserId)
                 .leftJoin(YwPatrolScheme.class,YwPatrolScheme::getId,YwPatrolTask::getSchemeId)
                 .eq(YwPatrolTask::getIsdeleted, Constants.ZERO)
                 .eq(Objects.nonNull(model.getStatus()) && !Constants.equalsInteger(model.getStatus(),Constants.TWO),YwPatrolTask::getStatus, model.getStatus())
-                .eq(Objects.nonNull(model.getDealUserId()),YwPatrolTask::getDealUserId, model.getDealUserId())
+                .eq(Objects.nonNull(model.getDealUserId()),YwPatrolScheme::getUserIds, model.getDealUserId())
                 .apply(Objects.nonNull(model.getStatus()) && Constants.equalsInteger(model.getStatus(),Constants.TWO)," t.status = 1 and t.END_DATE > now() ")
                 .apply(StringUtils.isNotBlank(model.getQueryStatus())," find_in_set(t.status ,'"+model.getQueryStatus()+"') ")
                 .like(StringUtils.isNotBlank(model.getPlanTitle()),YwPatrolScheme::getTitle,model.getPlanTitle())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
index 0665993..b11c923 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -294,7 +294,7 @@
             return   ;
         }
         Constants.DEALING_HK_VISIT =true;
-        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                 +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
         List<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                 .eq(DeviceRole::getType, Constants.ONE));
diff --git a/server/visits/dmvisit_service/src/main/resources/application-pro.yml b/server/visits/dmvisit_service/src/main/resources/application-pro.yml
index ac528f3..71161ce 100644
--- a/server/visits/dmvisit_service/src/main/resources/application-pro.yml
+++ b/server/visits/dmvisit_service/src/main/resources/application-pro.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://localhost:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: root
-    password: funing@2024
+    url: jdbc:mysql://rm-bp136n33jr035pbfl3o.mysql.rds.aliyuncs.com:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: zhcg
+    password: Fnwtzx@1127$dmtt
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
   redis:

--
Gitblit v1.9.3