From e23a1db0b60437f17d09d65c65f8fd0c8a5d88c7 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期一, 26 八月 2024 18:11:07 +0800
Subject: [PATCH] 最新版本

---
 admin/src/components/business/OperaPlatformWaterWindow.vue                                                          |   92 +++
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java                             |    7 
 admin/src/views/business/visits.vue                                                                                 |   22 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java                         |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java                          |    2 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/PlatformWaterGasController.java                   |   90 +++
 admin/src/components/business/OperaPlatformGasWindow.vue                                                            |   92 +++
 admin/src/views/platform/gas.vue                                                                                    |  116 ++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java                |  101 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java                          |  148 ++--
 admin/src/views/vehicle/cars.vue                                                                                    |   33 
 server/db/business.platform_water_gas.permissions.sql                                                               |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformWaterGasMapper.java                     |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java       |  210 +++++++
 admin/src/views/platform/water.vue                                                                                  |  117 ++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java |    2 
 admin/src/components/business/OperaPlatformOilWindow.vue                                                            |   98 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java                     |   85 +++
 admin/src/api/business/visits.js                                                                                    |    3 
 admin/src/views/platform/platform.vue                                                                               |    1 
 server/system_service/src/main/java/com/doumee/api/BaseController.java                                              |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java                               |    3 
 admin/src/api/platform/platformWaterGas.js                                                                          |   48 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformWaterGasCloudController.java               |   93 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java           |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java                 |   35 +
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java                              |   35 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java     |   24 
 admin/src/views/platform/oil.vue                                                                                    |  132 ++++
 29 files changed, 1,497 insertions(+), 124 deletions(-)

diff --git a/admin/src/api/business/visits.js b/admin/src/api/business/visits.js
index c0a99fa..b2df3b8 100644
--- a/admin/src/api/business/visits.js
+++ b/admin/src/api/business/visits.js
@@ -61,3 +61,6 @@
 export const createVisit = (data) => {
   return request.post('/visitsAdmin/cloudService/business/visits/createVisit', data)
 }
+export function visitResend (visitId) {
+  return request.get(`/visitsAdmin/cloudService/business/visits/visitResend?visitId=${visitId}`)
+}
diff --git a/admin/src/api/platform/platformWaterGas.js b/admin/src/api/platform/platformWaterGas.js
new file mode 100644
index 0000000..d8026e1
--- /dev/null
+++ b/admin/src/api/platform/platformWaterGas.js
@@ -0,0 +1,48 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformWaterGas/page', data, {
+    trim: true
+  })
+}
+export function allList (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformWaterGas/list', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformWaterGas/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformWaterGas/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformWaterGas/updateById', data)
+}
+export function updateStatusById (data) {
+  return request.post('/visitsAdmin/cloudService/business/platformWaterGas/updateStatusById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/platformWaterGas/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/platformWaterGas/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/components/business/OperaPlatformGasWindow.vue b/admin/src/components/business/OperaPlatformGasWindow.vue
new file mode 100644
index 0000000..fda7296
--- /dev/null
+++ b/admin/src/components/business/OperaPlatformGasWindow.vue
@@ -0,0 +1,92 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    width="50%"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鏈堜唤" prop="timeInfo">
+        <el-date-picker
+            v-model="form.timeInfo"
+            format="yyyy-MM"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="month"
+        />
+      </el-form-item>
+      <el-form-item label="鐢ㄦ皵閲忥紙绔嬫柟绫筹級锛�" prop="num" >
+        <el-input type="number" v-model="form.num" placeholder="璇疯緭鍏ョ敤姘旈噺锛堢珛鏂圭背锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璇存槑锛�" prop="content">
+        <el-input type="textarea"  v-model="form.content" placeholder="璇疯緭鍏ヨ鏄�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { allList } from '@/api/platform/platformGroup'
+export default {
+  name: 'OperaPlatformReasonWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      groupList: [],
+      form: {
+        id: null,
+        content: null,
+        num: null,
+        timeInfo: '',
+        type: 1
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        timeInfo: [{ required: true, message: '璇疯緭閫夋嫨鏈堜唤 ', trigger: 'blur' }],
+        num: [{ required: true, message: '璇疯緭鍏ョ敤姘旈噺锛堝惃锛� ', trigger: 'blur' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/platform/platformWaterGas',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    /**
+     * 鎵撳紑绐楀彛
+     * @title 绐楀彛鏍囬
+     * @target 缂栬緫鐨勫璞�
+     */
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+.labelTip{
+  font-size: 12px;
+  color: #666666;
+}
+</style>
diff --git a/admin/src/components/business/OperaPlatformOilWindow.vue b/admin/src/components/business/OperaPlatformOilWindow.vue
new file mode 100644
index 0000000..154560e
--- /dev/null
+++ b/admin/src/components/business/OperaPlatformOilWindow.vue
@@ -0,0 +1,98 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    width="50%"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="杞︾墝鍙凤細" prop="carCode" >
+        <el-input type="text" v-model="form.carCode" placeholder="璇疯緭鍏ヨ溅鐗屽彿" v-trim/>
+      </el-form-item>
+      <el-form-item label="鏈堜唤" prop="timeInfo">
+        <el-date-picker
+            v-model="form.timeInfo"
+            format="yyyy-MM"
+            placeholder="璇烽�夋嫨骞存湀"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="month"
+        />
+      </el-form-item>
+      <el-form-item label="娌硅�楋紙鍗囷級锛�" prop="num" >
+        <el-input type="number" v-model="form.num" placeholder="璇疯緭鍏ユ补鑰楋紙鍗囷級" v-trim/>
+      </el-form-item>
+      <el-form-item label="璇存槑锛�" prop="content">
+        <el-input type="textarea"  v-model="form.content" placeholder="璇疯緭鍏ヨ鏄�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { allList } from '@/api/platform/platformGroup'
+export default {
+  name: 'OperaPlatformReasonWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      groupList: [],
+      form: {
+        id: null,
+        carCode:null,
+        content: null,
+        num: null,
+        timeInfo: '',
+        type: 2
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        carCode: [{ required: true, message: '璇疯緭鍏ヨ溅鐗屽彿 ', trigger: 'blur' }],
+        timeInfo: [{ required: true, message: '璇疯緭閫夋嫨鏈堜唤 ', trigger: 'blur' }],
+        num: [{ required: true, message: '璇疯緭鍏ユ补鑰楋紙鍗囷級 ', trigger: 'blur' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/platform/platformWaterGas',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    /**
+     * 鎵撳紑绐楀彛
+     * @title 绐楀彛鏍囬
+     * @target 缂栬緫鐨勫璞�
+     */
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+.labelTip{
+  font-size: 12px;
+  color: #666666;
+}
+</style>
diff --git a/admin/src/components/business/OperaPlatformWaterWindow.vue b/admin/src/components/business/OperaPlatformWaterWindow.vue
new file mode 100644
index 0000000..af58236
--- /dev/null
+++ b/admin/src/components/business/OperaPlatformWaterWindow.vue
@@ -0,0 +1,92 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    width="50%"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鏈堜唤" prop="timeInfo">
+        <el-date-picker
+            v-model="form.timeInfo"
+            format="yyyy-MM"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            type="month"
+        />
+      </el-form-item>
+      <el-form-item label="鐢ㄦ按閲忥紙鍚級锛�" prop="num" >
+        <el-input type="number" v-model="form.num" placeholder="璇疯緭鍏ョ敤姘撮噺锛堝惃锛�" v-trim/>
+      </el-form-item>
+      <el-form-item label="璇存槑锛�" prop="content">
+        <el-input type="textarea"  v-model="form.content" placeholder="璇疯緭鍏ヨ鏄�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { allList } from '@/api/platform/platformGroup'
+export default {
+  name: 'OperaPlatformReasonWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      groupList: [],
+      form: {
+        id: null,
+        content: null,
+        num: null,
+        timeInfo: '',
+        type:0
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        timeInfo: [{ required: true, message: '璇疯緭閫夋嫨鏈堜唤 ', trigger: 'blur' }],
+        num: [{ required: true, message: '璇疯緭鍏ョ敤鎴烽噺锛堝惃锛� ', trigger: 'blur' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/platform/platformWaterGas',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    /**
+     * 鎵撳紑绐楀彛
+     * @title 绐楀彛鏍囬
+     * @target 缂栬緫鐨勫璞�
+     */
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+.labelTip{
+  font-size: 12px;
+  color: #666666;
+}
+</style>
diff --git a/admin/src/views/business/visits.vue b/admin/src/views/business/visits.vue
index bbf8005..51ee101 100644
--- a/admin/src/views/business/visits.vue
+++ b/admin/src/views/business/visits.vue
@@ -92,12 +92,13 @@
                 <el-table-column
                     v-if="containPermissions(['business:visits:update', 'business:visits:delete'])"
                     label="鎿嶄綔"
-                    min-width="100"
+                    min-width="200"
                     fixed="right"
                 >
                     <template slot-scope="{row}">
                       <el-button type="text" @click="departure(row.id)" v-permissions="['business:visits:level']" icon="el-icon-delete" style="color: red" v-if="row.status == 7">绂诲巶</el-button>
                       <el-button type="text" @click="cancel(row.id)" v-permissions="['business:visits:cancel']" icon="el-icon-delete"   style="color: red" v-if="row.status == 5">鍙栨秷棰勭害</el-button>
+                      <el-button type="text" @click="resend(row.id)" v-permissions="['business:visits:update']" icon="el-icon-edit"   v-if="row.status == 6">閲嶆柊涓嬪彂</el-button>
                         <!-- <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('璇︽儏', row.id)" icon="el-icon-view">璇︽儏</el-button> -->
                         <el-button type="text" @click="handleDetail(row)" icon="el-icon-view">璇︽儏</el-button>
 <!--                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:visits:delete']">鏌ヨ瀹℃壒缁撴灉</el-button>-->
@@ -177,7 +178,7 @@
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
-        level(id)
+      level(id)
           .then(res => {
             this.page = 1
             this.getData()
@@ -192,7 +193,22 @@
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
-        visitCancel(id)
+      visitCancel(id)
+          .then(res => {
+            this.page = 1
+            this.getData()
+          })
+      }).catch(() => {
+
+      })
+    },
+    resend (id) {
+      this.$confirm('纭畾灏濊瘯閲嶆柊娲楀彂棰勭害鍚�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.api.visitResend(id)
           .then(res => {
             this.page = 1
             this.getData()
diff --git a/admin/src/views/platform/gas.vue b/admin/src/views/platform/gas.vue
new file mode 100644
index 0000000..7cb6c13
--- /dev/null
+++ b/admin/src/views/platform/gas.vue
@@ -0,0 +1,116 @@
+<template>
+  <TableLayout :permissions="['business:platformwatergas:query']">
+    <SearchFormCollapse slot="search-form" :need-more="false">
+      <el-form ref="searchForm" :model="searchForm"  label-width="100px" inline >
+          <el-form-item title="璇烽�夋嫨骞存湀鏃堕棿" label="" prop="timeInfo" >
+            <el-date-picker
+                @change="search"
+                v-model="searchForm.timeInfo"
+                format="yyyy-MM"
+                placeholder="璇烽�夋嫨骞存湀鏃堕棿"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                type="month"
+            />
+          </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:platformwatergas:create','business:platformwatergas:delete','business:notice:exportExcel']">
+        <li><el-button type="primary" @click="$refs.OperaPlatformGasWindow.open('鏂板缓鐢ㄦ皵')" icon="el-icon-plus" v-permissions="['business:platformwatergas:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">鍒犻櫎</el-button></li>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:notice:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="timeInfo" label="浣跨敤鏈堜唤" fixed min-width="100px">
+          <template slot-scope="{row}">
+              {{(row.timeInfo || row.timeInfo.length >7 )?row.timeInfo.substr(0,7):'-'}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="num" label="鐢ㄦ皵閲忥紙绔嬫柟绫筹級" fixed min-width="150px"></el-table-column>
+        <el-table-column prop="content" label="璇存槑" min-width="120px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�杩戞搷浣滄椂闂�" min-width="140px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:platformwatergas:update', 'business:platformwatergas:delete'])"
+          label="鎿嶄綔"
+          align="center"
+          min-width="150"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.OperaPlatformGasWindow.open('缂栬緫鐢ㄦ皵', row)" icon="el-icon-edit" v-permissions="['business:platformwatergas:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaPlatformGasWindow ref="OperaPlatformGasWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaPlatformGasWindow from '@/components/business/OperaPlatformGasWindow'
+import { allList } from '@/api/platform/platformGroup'
+export default {
+  name: 'Platform',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaPlatformGasWindow },
+  data () {
+    return {
+      groupList: [],
+      // 鎼滅储
+      working: false,
+      working1: false,
+      searchForm: {
+        timeInfo: '',
+        type: 1
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鐢ㄦ皵淇℃伅琛�',
+      api: '/platform/platformWaterGas',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+    this.loadGroupList()
+  },
+  methods: {
+    loadGroupList () {
+      allList({})
+        .then(res => {
+          this.groupList = res || []
+        })
+    },
+    changeStatus (e, row) {
+      this.api.updateStatusById({
+        id: row.id,
+        status: e
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/platform/oil.vue b/admin/src/views/platform/oil.vue
new file mode 100644
index 0000000..d69db71
--- /dev/null
+++ b/admin/src/views/platform/oil.vue
@@ -0,0 +1,132 @@
+<template>
+  <TableLayout :permissions="['business:platformwatergas:query']">
+    <SearchFormCollapse slot="search-form" :need-more="false">
+      <el-form ref="searchForm" :model="searchForm"  label-width="100px" inline >
+          <el-form-item title="璇疯緭鍏ヨ溅鐗屽彿"  >
+            <el-input v-model="searchForm.carCode" clearable placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
+          </el-form-item>
+          <el-form-item  label="浣跨敤鏃堕棿锛�"  >
+            <el-date-picker
+                @change="search"
+                v-model="searchForm.startTime"
+                format="yyyy-MM"
+                style="width: 140px"
+                placeholder="寮�濮嬫椂闂�"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                type="month"
+            />~
+              <el-date-picker
+                  @change="search"
+                  v-model="searchForm.endTime"
+                  format="yyyy-MM"
+                  style="width: 140px"
+                  placeholder="缁撴潫鏃堕棿"
+                  value-format="yyyy-MM-dd HH:mm:ss"
+                  type="month"
+              />
+          </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:platformwatergas:create','business:platformwatergas:delete','business:notice:exportExcel']">
+        <li><el-button type="primary" @click="$refs.OperaPlatformOilWindow.open('鏂板缓娌硅��')" icon="el-icon-plus" v-permissions="['business:platformwatergas:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">鍒犻櫎</el-button></li>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:notice:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="carCode" label="杞︾墝鍙�" fixed min-width="150px"></el-table-column>
+        <el-table-column prop="timeInfo" label="浣跨敤鏈堜唤" fixed min-width="100px">
+          <template slot-scope="{row}">
+              {{(row.timeInfo || row.timeInfo.length >7 )?row.timeInfo.substr(0,7):'-'}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="num" label="娌硅�楋紙鍗囷級" fixed min-width="150px"></el-table-column>
+        <el-table-column prop="content" label="璇存槑" min-width="120px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�杩戞搷浣滄椂闂�" min-width="140px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:platformwatergas:update', 'business:platformwatergas:delete'])"
+          label="鎿嶄綔"
+          align="center"
+          min-width="150"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.OperaPlatformOilWindow.open('缂栬緫娌硅��', row)" icon="el-icon-edit" v-permissions="['business:platformwatergas:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaPlatformOilWindow ref="OperaPlatformOilWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaPlatformOilWindow from '@/components/business/OperaPlatformOilWindow'
+import { allList } from '@/api/platform/platformGroup'
+export default {
+  name: 'Platform',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaPlatformOilWindow },
+  data () {
+    return {
+      groupList: [],
+      // 鎼滅储
+      working: false,
+      working1: false,
+      searchForm: {
+        carCode:'',
+        startTime: '',
+        endTime: '',
+        type: 2
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '娌硅�椾俊鎭〃',
+      api: '/platform/platformWaterGas',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+    this.loadGroupList()
+  },
+  methods: {
+    loadGroupList () {
+      allList({})
+        .then(res => {
+          this.groupList = res || []
+        })
+    },
+    changeStatus (e, row) {
+      this.api.updateStatusById({
+        id: row.id,
+        status: e
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/platform/platform.vue b/admin/src/views/platform/platform.vue
index 079b3fa..44eb641 100644
--- a/admin/src/views/platform/platform.vue
+++ b/admin/src/views/platform/platform.vue
@@ -66,7 +66,6 @@
             <span v-if="row.platformStatus == 3">閿欒鍋滈潬</span>
           </template>
         </el-table-column>
-
         <el-table-column prop="broadcastNames" label="鍏宠仈骞挎挱" min-width="100px"></el-table-column>
         <el-table-column prop="ledNames" label="鍏宠仈LED" min-width="100px"></el-table-column>
         <el-table-column prop="hkDate" label="鍚屾鏃堕棿" min-width="140px"></el-table-column>
diff --git a/admin/src/views/platform/water.vue b/admin/src/views/platform/water.vue
new file mode 100644
index 0000000..fd99d89
--- /dev/null
+++ b/admin/src/views/platform/water.vue
@@ -0,0 +1,117 @@
+<template>
+  <TableLayout :permissions="['business:platformwatergas:query']">
+    <SearchFormCollapse slot="search-form" :need-more="false">
+      <el-form ref="searchForm" :model="searchForm"  label-width="100px" inline>
+          <el-form-item title="璇烽�夋嫨骞存湀鏃堕棿" label=""   >
+            <el-date-picker
+                @change="search"
+                clearable
+                v-model="searchForm.timeInfo"
+                format="yyyy-MM"
+                placeholder="璇烽�夋嫨骞存湀鏃堕棿"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                type="month"
+            />
+          </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </SearchFormCollapse>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:platformwatergas:create','business:platformwatergas:delete','business:notice:exportExcel']">
+        <li><el-button type="primary" @click="$refs.OperaPlatformWaterWindow.open('鏂板缓鐢ㄦ按')" icon="el-icon-plus" v-permissions="['business:platformwatergas:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">鍒犻櫎</el-button></li>
+        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:notice:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="timeInfo" label="浣跨敤鏈堜唤" fixed min-width="100px">
+          <template slot-scope="{row}">
+              {{(row.timeInfo || row.timeInfo.length >7 )?row.timeInfo.substr(0,7):'-'}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="num" label="鐢ㄦ按閲忥紙鍚級" fixed min-width="150px"></el-table-column>
+        <el-table-column prop="content" label="璇存槑" min-width="120px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�杩戞搷浣滄椂闂�" min-width="140px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:platformwatergas:update', 'business:platformwatergas:delete'])"
+          label="鎿嶄綔"
+          align="center"
+          min-width="150"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.OperaPlatformWaterWindow.open('缂栬緫鐢ㄦ按', row)" icon="el-icon-edit" v-permissions="['business:platformwatergas:update']">缂栬緫</el-button>
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaPlatformWaterWindow ref="OperaPlatformWaterWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import SearchFormCollapse from '@/components/common/SearchFormCollapse'
+import Pagination from '@/components/common/Pagination'
+import OperaPlatformWaterWindow from '@/components/business/OperaPlatformWaterWindow'
+import { allList } from '@/api/platform/platformGroup'
+export default {
+  name: 'Platform',
+  extends: BaseTable,
+  components: { SearchFormCollapse, TableLayout, Pagination, OperaPlatformWaterWindow },
+  data () {
+    return {
+      groupList: [],
+      // 鎼滅储
+      working: false,
+      working1: false,
+      searchForm: {
+        timeInfo: '',
+        type: 0
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鐢ㄦ按淇℃伅琛�',
+      api: '/platform/platformWaterGas',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+    this.loadGroupList()
+  },
+  methods: {
+    loadGroupList () {
+      allList({})
+        .then(res => {
+          this.groupList = res || []
+        })
+    },
+    changeStatus (e, row) {
+      this.api.updateStatusById({
+        id: row.id,
+        status: e
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/vehicle/cars.vue b/admin/src/views/vehicle/cars.vue
index bdd6b22..55d2b4e 100644
--- a/admin/src/views/vehicle/cars.vue
+++ b/admin/src/views/vehicle/cars.vue
@@ -53,22 +53,22 @@
               <el-table-column prop="memberName" label="杞︿富濮撳悕"  min-width="100px"></el-table-column>
               <el-table-column prop="memberPhone" label="杞︿富鎵嬫満鍙�" min-width="100px"></el-table-column>
               <el-table-column prop="companyName" label="杞︿富缁勭粐" min-width="200px"></el-table-column>
-                <el-table-column label="鏄惁鎺堟潈" align="center" min-width="100px">
-                  <template slot-scope="{row}">
-                    <span v-if="row.authStatus == 1" style="color: green">鏄�</span>
-                    <span v-else style="color: red">鍚�</span>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="parksName" align="center" label="宸叉巿鏉冨仠杞﹀満" min-width="200px">
-                  <template slot-scope="{row}">
-                    <div  v-if="row.parkBookList && row.parkBookList.length" >
-                      <span v-for="item in row.parkBookList"  :key="item.id" style="display: block">
-                        <span  :style="(item.hkStatus== 0?'color:#2080f7':(item.hkStatus== 1?'color:green':(item.hkStatus== 2?'color:red':'')))">銆恵{item.hkStatus== 0?'绛夊緟涓嬪彂':(item.hkStatus== 1?'涓嬪彂鎴愬姛':(item.hkStatus== 2?'涓嬪彂澶辫触':''))}}銆� </span>{{item.parksName}}
-                      </span>
-                    </div>
-                    <span  v-if="row.parkBookList ==null ||row.parkBookList.length ==0">-</span>
-                  </template>
-                </el-table-column>
+              <el-table-column label="鏄惁鎺堟潈" align="center" min-width="100px">
+                <template slot-scope="{row}">
+                  <span v-if="row.authStatus == 1" style="color: green">鏄�</span>
+                  <span v-else style="color: red">鍚�</span>
+                </template>
+              </el-table-column>
+              <el-table-column prop="parksName" align="center" label="宸叉巿鏉冨仠杞﹀満" min-width="200px">
+                <template slot-scope="{row}">
+                  <div  v-if="row.parkBookList && row.parkBookList.length" >
+                    <span v-for="item in row.parkBookList"  :key="item.id" style="display: block">
+                      <span  :style="(item.hkStatus== 0?'color:#2080f7':(item.hkStatus== 1?'color:green':(item.hkStatus== 2?'color:red':'')))">銆恵{item.hkStatus== 0?'绛夊緟涓嬪彂':(item.hkStatus== 1?'涓嬪彂鎴愬姛':(item.hkStatus== 2?'涓嬪彂澶辫触':''))}}銆� </span>{{item.parksName}}
+                    </span>
+                  </div>
+                  <span  v-if="row.parkBookList ==null ||row.parkBookList.length ==0">-</span>
+                </template>
+              </el-table-column>
               <el-table-column label="涓嬪彂鏈夋晥鏈�" align="center" min-width="170px">
                 <template slot-scope="{row}">
                   <div v-if="row.authStatus !=null && row.authStatus == 1 && row.parkBookList!=null && row.parkBookList.length>0">
@@ -116,7 +116,6 @@
 import Pagination from '@/components/common/Pagination'
 import OperaCarsWindow from '@/components/business/OperaCarsWindow'
 import OperaCarAuthWindow from '@/components/business/OperaCarAuthWindow'
-import { sync } from '@/api/business/cars'
 export default {
   name: 'Cars',
   extends: BaseTable,
diff --git a/server/db/business.platform_water_gas.permissions.sql b/server/db/business.platform_water_gas.permissions.sql
new file mode 100644
index 0000000..72aa1ed
--- /dev/null
+++ b/server/db/business.platform_water_gas.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:platformwatergas:create', '鏂板缓鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:platformwatergas:delete', '鍒犻櫎鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:platformwatergas:update', '淇敼鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:platformwatergas:query', '鏌ヨ鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:platformwatergas:exportExcel', '瀵煎嚭鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/system_service/src/main/java/com/doumee/api/BaseController.java b/server/system_service/src/main/java/com/doumee/api/BaseController.java
index e431c04..7aae08b 100644
--- a/server/system_service/src/main/java/com/doumee/api/BaseController.java
+++ b/server/system_service/src/main/java/com/doumee/api/BaseController.java
@@ -32,7 +32,7 @@
      * @author Eva.Caesar Liu
      * @date 2023/03/21 14:49
      */
-    protected LoginUserInfo getLoginUser (String token) {
+    public LoginUserInfo getLoginUser (String token) {
         if (token == null || token.isEmpty()) {
                return (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
 //            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"鏈櫥褰�");
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/PlatformWaterGasController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/PlatformWaterGasController.java
new file mode 100644
index 0000000..ff6eb05
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/PlatformWaterGasController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.PlatformWaterGas;
+import com.doumee.service.business.PlatformWaterGasService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/08/26 16:22
+ */
+@Api(tags = "鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�")
+@RestController
+@RequestMapping("/business/platformWaterGas")
+public class PlatformWaterGasController extends BaseController {
+
+    @Autowired
+    private PlatformWaterGasService platformWaterGasService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:platformwatergas:create")
+    public ApiResponse create(@RequestBody PlatformWaterGas platformWaterGas) {
+        return ApiResponse.success(platformWaterGasService.create(platformWaterGas));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:platformwatergas:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        platformWaterGasService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:platformwatergas:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        platformWaterGasService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:platformwatergas:update")
+    public ApiResponse updateById(@RequestBody PlatformWaterGas platformWaterGas) {
+        platformWaterGasService.updateById(platformWaterGas);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:platformwatergas:query")
+    public ApiResponse<PageData<PlatformWaterGas>> findPage (@RequestBody PageWrap<PlatformWaterGas> pageWrap) {
+        return ApiResponse.success(platformWaterGasService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:platformwatergas:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<PlatformWaterGas> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(PlatformWaterGas.class).export(platformWaterGasService.findPage(pageWrap).getRecords(), "鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:platformwatergas:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(platformWaterGasService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
index 41eeaf0..532e499 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -77,6 +77,13 @@
         visitsService.visitCancel(visitId);
         return ApiResponse.success(null);
     }
+    @ApiOperation("閲嶆柊涓嬪彂澶辫触鐨勯绾�")
+    @GetMapping("/visitResend")
+    @RequiresPermissions("business:visits:update")
+    public ApiResponse   visitResend(@RequestParam Integer visitId) {
+        visitsService.visitResend(visitId);
+        return ApiResponse.success(null);
+    }
 
     @ApiOperation("鏍规嵁鏃ユ湡(starttime)鍚屾璁垮鏁版嵁")
     @PostMapping("/syncByDate")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformWaterGasCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformWaterGasCloudController.java
new file mode 100644
index 0000000..080fc0b
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformWaterGasCloudController.java
@@ -0,0 +1,93 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.PlatformWaterGas;
+import com.doumee.service.business.PlatformWaterGasService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/08/26 16:22
+ */
+@Api(tags = "鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/platformWaterGas")
+public class PlatformWaterGasCloudController extends BaseController {
+
+    @Autowired
+    private PlatformWaterGasService platformWaterGasService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:platformwatergas:create")
+    public ApiResponse create(@RequestBody PlatformWaterGas platformWaterGas,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        platformWaterGas.setLoginUserInfo(getLoginUser(token));
+        return ApiResponse.success(platformWaterGasService.create(platformWaterGas));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:platformwatergas:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        platformWaterGasService.deleteById(id,getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:platformwatergas:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        platformWaterGasService.deleteByIdInBatch(idList,getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:platformwatergas:update")
+    public ApiResponse updateById(@RequestBody PlatformWaterGas platformWaterGas,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        platformWaterGas.setLoginUserInfo(getLoginUser(token));
+        platformWaterGasService.updateById(platformWaterGas);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:platformwatergas:query")
+    public ApiResponse<PageData<PlatformWaterGas>> findPage (@RequestBody PageWrap<PlatformWaterGas> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(platformWaterGasService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:platformwatergas:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<PlatformWaterGas> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        ExcelExporter.build(PlatformWaterGas.class).export(platformWaterGasService.findPage(pageWrap).getRecords(), "鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:platformwatergas:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(platformWaterGasService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java
index 1b1279c..35c331f 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java
@@ -19,6 +19,7 @@
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -150,4 +151,13 @@
         visitsService.resetPassword(resetPasswordDTO);
         return ApiResponse.success("閲嶇疆鎴愬姛");
     }
+
+    @ApiOperation("閲嶆柊涓嬪彂澶辫触鐨勯绾�")
+    @GetMapping("/visitResend")
+    @CloudRequiredPermission("business:visits:update")
+    public ApiResponse   visitResend(@RequestParam Integer visitId) {
+        visitsService.visitResend(visitId);
+        return ApiResponse.success(null);
+    }
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
index 787c633..cf0970f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -30,81 +30,81 @@
      * 鎺ュ彛鍦板潃闆嗗悎
      */
     public interface InterfacePath{
-//        String doorEvents = "/api/acs/v2/door/events";//闂ㄧ浜嬩欢鏌ヨ
-//        String visitEvents = "/api/visitor/v1/event/turnover/search";//璁垮浜嬩欢鏌ヨ
-        String parkCrossRecords = "/api/pms/v1/crossRecords/page";//鍋滆溅鍦鸿繃绋嬭褰�
-        String rootOrg = "/api/resource/v1/org/rootOrg";//鑾峰彇璺熺粍缁�
-        String orgAllList = "/api/resource/v1/org/orgList";//鑾峰彇鍏ㄩ噺缁勭粐淇℃伅
-        String userAllList = "/api/resource/v2/person/personList";//鑾峰彇鍏ㄩ噺鐢ㄦ埛鍒楄〃
-        String personList = "/api/resource/v2/person/advance/personList";//鏌ヨ浜哄憳鍒楄〃v2
-        String orgTimeRangeList = "/api/resource/v1/org/timeRange";//澧為噺鑾峰彇缁勭粐淇℃伅
-        String userTimeRangeList = "/api/resource/v1/person/personList/timeRange";//澧為噺鑾峰彇鐢ㄦ埛鍒楄〃
-        String addBatchOrg = "/api/resource/v1/org/batch/add";//鎵归噺鏂板缁勭粐
-        String delBatchOrg = "/api/resource/v1/org/batch/delete";//鎵归噺鍒犻櫎缁勭粐
-        String editOrg = "/api/resource/v1/org/single/update";//淇敼缁勭粐
-        String addUser = "/api/resource/v2/person/single/add";//娣诲姞浜哄憳
-        String addBatchUser = "/api/resource/v1/person/batch/add";//鎵归噺娣诲姞浜哄憳
-        String editUser = "/api/resource/v1/person/single/update";//淇敼浜哄憳
-        String delBatchUser = "/api/resource/v1/person/batch/delete";//鎵归噺鍒犻櫎浜哄憳
-        String addFace = "/api/resource/v1/face/single/add";//娣诲姞浜鸿劯
-        String editFace = "/api/resource/v1/face/single/update";//淇敼浜鸿劯
-        String delFace = "/api/resource/v1/face/single/delete";//鍒犻櫎浜鸿劯
-        String acsDeviceList = "/api/resource/v2/acsDevice/search";//鏌ヨ闂ㄧ璁惧鍒楄〃v2
-        String acsDeviceTimeRangeList = "/api/resource/v1/acsDevice/timeRange";//澧為噺鑾峰彇闂ㄧ璁惧鏁版嵁
-        String parkAddition = "/api/pms/v2/parkingSpace/reservations/addition";//杞︿綅棰勭害v2
-        String parkDeletion= "/api/pms/v1/parkingSpace/reservations/deletion";//杞︿綅鍙栨秷棰勭害v2
-        String carChargeAddtion= "/api/pms/v1/car/charge";//鍥哄畾杞﹀厖鍊煎寘鏈�
-        String carChargeDeletion= "/api/pms/v1/car/charge/deletion";//鍥哄畾杞﹀彇娑堝寘鏈�
-        String getParkList= "/api/resource/v1/park/parkList";//鑾峰彇鍋滆溅搴撳垪琛�
-        String getEntranceList= "/api/resource/v1/entrance/entranceList";//鑾峰彇鍑哄叆鍙e垪琛�
-        String visitAppiontment= "/api/visitor/v2/appointment";//璁垮棰勭害v2
-        String visitAppiontmentMDJ= "/api/visitor/v1/appointment/registration";//璁垮棰勭害鍏嶇櫥璁皏2
-        String visitCancel= "/api/visitor/v1/appointment/cancel";//鍙栨秷璁垮棰勭害
-        String visitOut= "/api/visitor/v1/visitor/out";//绛剧璁垮棰勭害
-        String facePicture= "/api/resource/v1/person/picture";//鎻愬彇鐢ㄦ埛浜鸿劯鐓х墖
-        String privilegeGroup= "/api/visitor/v1/privilege/group";//鏌ヨ璁垮鏉冮檺缁�
-        String eventSub= "/api/eventService/v1/eventSubscriptionByEventTypes";//浜嬩欢璁㈤槄
-        String doorSearch= "/api/resource/v2/door/search";//鏌ヨ闂ㄧ鐐瑰垪琛╲2
-        String cancelEventSub= "/api/eventService/v1/eventUnSubscriptionByEventTypes";//鍙栨秷浜嬩欢璁㈤槄
-        String visitPicture= "/api/visitor/v1/record/pictures";//鑾峰彇璁垮璁板綍涓殑鍥剧墖
-        String devicePicture= "/api/acs/v1/event/pictures";//鑾峰彇闂ㄧ浜嬩欢鐨勫浘鐗�
-        String carPicture= "/api/pms/v1/image";//鏌ヨ杞﹁締鎶撴媿鍥剧墖
-        String taskAddition= "/api/acps/v1/authDownload/task/addition";//鍒涘缓涓嬭浇浠诲姟_鏍规嵁浜哄憳涓庤澶囬�氶亾鎸囧畾涓嬭浇
-        String taskDataAddition= "/api/acps/v1/authDownload/data/addition";//涓嬭浇浠诲姟涓坊鍔犳暟鎹甠鏍规嵁浜哄憳涓庤澶囬�氶亾鎸囧畾涓嬭浇
-        String taskStart= "/api/acps/v1/authDownload/task/start";//寮�濮嬩笅杞戒换鍔�
-        String taskProgressNum= "/api/acps/v1/authDownload/task/progress";//鏌ヨ涓嬭浇浠诲姟杩涘害
-        String taskProgress= "/api/acps/v2/download_record/person/detail/search";//鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟v2
-        String authItemList= "/api/acps/v1/auth_item/list/search";//鏌ヨ鏉冮檺鏉$洰鍒楄〃
-        String cardBingding= "/api/cis/v1/card/bindings";//鎵归噺寮�鍗�
-        String cardDeletion= "/api/cis/v1/card/deletion";//鍗$墖閫�鍗�
-        String cardLoss= "/api/cis/v1/card/batch/loss";//鎵归噺鎸傚け
-        String cardUnloss= "/api/cis/v1/card/batch/unLoss";//鎵归噺瑙f寕
-        String taskPersoDetail= "/api/acps/v1/download_record/person/detail/search";//鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯�
-        String appointmentRecords= "/api/visitor/v2/appointment/records";//鏌ヨ璁垮棰勭害璁板綍v2
-        String visitingRecords= "/api/visitor/v2/visiting/records";//鏌ヨ璁垮鏉ヨ璁板綍v2
-        String vehicleList= "/api/resource/v2/vehicle/advance/vehicleList";//鏌ヨ杞﹁締鍒楄〃v2
-        String vehicleTimeRangeList= "/api/resource/v1/vehicle/timeRange";//澧為噺鑾峰彇杞﹁締鏁版嵁
-        String facePictureCheck= "/api/frs/v1/face/picture/check";//浜鸿劯璇勫垎
-        String acsDeviceStatus= "/api/nms/v1/online/acs_device/get";//鑾峰彇闂ㄧ璁惧鍦ㄧ嚎鐘舵��
-        String tempCarInRecords= "/api/pms/v1/tempCarInRecords/page";//鏌ヨ鍦哄唴杞﹀仠杞︿俊鎭�
-        String applyCTGT= "/api/lsm/ssoService/v1/applyCTGT";//鏍规嵁鐢ㄦ埛鏍囪瘑鑾峰彇瀹㈡埛绔疶GC鎺ュ彛
-        String applyST= "/api/lsm/ssoService/v1/applyST";//鏍规嵁鐧诲綍鏍囪瘑TGC鐢宠鐧诲綍鍑瘉ST鎺ュ彛
-        String tokenLoginUrl= "/lsm/ssoService/v1/tokenLogin?token=${st}&service=${service}";//缁勪欢鎺堟潈鐧诲綍鎷兼帴鍦板潃
-        String fetchAudioChannel= "/api/ibas/resource/v1/fetchAudioChannel";//1.1.4.1鍒嗛〉鑾峰彇骞挎挱鐐�
-        String fetchAudioDevice= "/api/ibas/resource/v1/fetchAudioDevice";//1.1.4.2鍒嗛〉鑾峰彇骞挎挱璁惧鍒楄〃
-        String fetchAudioChannelByDevice= "/api/ibas/resource/v1/fetchAudioChannelByDevice";//1.1.4.3鏍规嵁璁惧淇℃伅鑾峰彇骞挎挱鐐�
-        String ledRecords= "/api/v1/model/tb_led_info/records";//鑾峰彇鏈堝彴缁勪欢閰嶇疆鐨凩ED璁惧娓呭崟
-        String transparentchannel= "/api/v1/transparentchannel";//鍙戦�佹秷鎭粰LED
-        String platformsList= "/api/platformService/v1/platforms";//鑾峰彇鍏ㄩ儴鏈堝彴淇℃伅
-        String platformStatus= "/api/platformService/v1/platform/status";//鑾峰彇鏈堝彴鐘舵��
-        String customBroadcast= "/api/ibas/v1/customBroadcast";//鐢ㄤ簬璁剧疆骞挎挱鐨勮嚜瀹氭挱鏀惧拰鍋滄
-        String iccmAppointment= "/api/iccm/v2/appointment";//iccm璁垮鐧昏娣诲姞
-        String iccmUpdateAppointment= "/api/iccm/v2/appointment/update";//iccm璁垮鐧昏淇敼
-        String iccmCancelAppointment= "/api/iccm/v1/appointment/cancel";//iccm璁垮鐧昏淇敼
-        String iccmAppointmentMDJ= "/api/iccm/v1/appointment/free/registration";//iccm璁垮棰勭害鍏嶇櫥璁�
+//        String doorEvents = new String[]{"/api/acs/v2/door/events",""};//闂ㄧ浜嬩欢鏌ヨ
+//        String visitEvents = new String[]{"/api/visitor/v1/event/turnover/search",""};//璁垮浜嬩欢鏌ヨ
+        String[] parkCrossRecords =new String[]{"/api/pms/v1/crossRecords/page","鍋滆溅鍦鸿繃绋嬭褰�"};//鍋滆溅鍦鸿繃绋嬭褰�
+        String[] rootOrg = new String[]{"/api/resource/v1/org/rootOrg","鑾峰彇璺熺粍缁�"};//鑾峰彇璺熺粍缁�
+        String[] orgAllList = new String[]{"/api/resource/v1/org/orgList","鑾峰彇鍏ㄩ噺缁勭粐淇℃伅"};//鑾峰彇鍏ㄩ噺缁勭粐淇℃伅
+        String[] userAllList = new String[]{"/api/resource/v2/person/personList","鑾峰彇鍏ㄩ噺鐢ㄦ埛鍒楄〃"};//鑾峰彇鍏ㄩ噺鐢ㄦ埛鍒楄〃
+        String[] personList = new String[]{"/api/resource/v2/person/advance/personList","鏌ヨ浜哄憳鍒楄〃v2"};//鏌ヨ浜哄憳鍒楄〃v2
+        String[] orgTimeRangeList = new String[]{"/api/resource/v1/org/timeRange","澧為噺鑾峰彇缁勭粐淇℃伅"};//澧為噺鑾峰彇缁勭粐淇℃伅
+        String[] userTimeRangeList = new String[]{"/api/resource/v1/person/personList/timeRange","澧為噺鑾峰彇鐢ㄦ埛鍒楄〃"};//澧為噺鑾峰彇鐢ㄦ埛鍒楄〃
+        String[] addBatchOrg = new String[]{"/api/resource/v1/org/batch/add","鎵归噺鏂板缁勭粐"};//鎵归噺鏂板缁勭粐
+        String[] delBatchOrg = new String[]{"/api/resource/v1/org/batch/delete","鎵归噺鍒犻櫎缁勭粐"};//鎵归噺鍒犻櫎缁勭粐
+        String[] editOrg = new String[]{"/api/resource/v1/org/single/update","淇敼缁勭粐"};//淇敼缁勭粐
+        String[] addUser = new String[]{"/api/resource/v2/person/single/add","娣诲姞浜哄憳"};//娣诲姞浜哄憳
+        String[] addBatchUser = new String[]{"/api/resource/v1/person/batch/add","鎵归噺娣诲姞浜哄憳"};//鎵归噺娣诲姞浜哄憳
+        String[] editUser = new String[]{"/api/resource/v1/person/single/update","淇敼浜哄憳"};//淇敼浜哄憳
+        String[] delBatchUser = new String[]{"/api/resource/v1/person/batch/delete","鎵归噺鍒犻櫎浜哄憳"};//鎵归噺鍒犻櫎浜哄憳
+        String[] addFace = new String[]{"/api/resource/v1/face/single/add","娣诲姞浜鸿劯"};//娣诲姞浜鸿劯
+        String[] editFace = new String[]{"/api/resource/v1/face/single/update","淇敼浜鸿劯"};//淇敼浜鸿劯
+        String[] delFace = new String[]{"/api/resource/v1/face/single/delete","鍒犻櫎浜鸿劯"};//鍒犻櫎浜鸿劯
+        String[] acsDeviceList = new String[]{"/api/resource/v2/acsDevice/search","鏌ヨ闂ㄧ璁惧鍒楄〃v2"};//鏌ヨ闂ㄧ璁惧鍒楄〃v2
+        String[] acsDeviceTimeRangeList = new String[]{"/api/resource/v1/acsDevice/timeRange","澧為噺鑾峰彇闂ㄧ璁惧鏁版嵁"};//澧為噺鑾峰彇闂ㄧ璁惧鏁版嵁
+        String[] parkAddition = new String[]{"/api/pms/v2/parkingSpace/reservations/addition","杞︿綅棰勭害v2"};//杞︿綅棰勭害v2
+        String[] parkDeletion= new String[]{"/api/pms/v1/parkingSpace/reservations/deletion","杞︿綅鍙栨秷棰勭害v2"};//杞︿綅鍙栨秷棰勭害v2
+        String[] carChargeAddtion= new String[]{"/api/pms/v1/car/charge","鍥哄畾杞﹀厖鍊煎寘鏈�"};//鍥哄畾杞﹀厖鍊煎寘鏈�
+        String[] carChargeDeletion= new String[]{"/api/pms/v1/car/charge/deletion","鍥哄畾杞﹀彇娑堝寘鏈�"};//鍥哄畾杞﹀彇娑堝寘鏈�
+        String[] getParkList= new String[]{"/api/resource/v1/park/parkList","鑾峰彇鍋滆溅搴撳垪琛�"};//鑾峰彇鍋滆溅搴撳垪琛�
+        String[] getEntranceList= new String[]{"/api/resource/v1/entrance/entranceList","鑾峰彇鍑哄叆鍙e垪琛�"};//鑾峰彇鍑哄叆鍙e垪琛�
+        String[] visitAppiontment= new String[]{"/api/visitor/v2/appointment","璁垮棰勭害v2"};//璁垮棰勭害v2
+        String[] visitAppiontmentMDJ= new String[]{"/api/visitor/v1/appointment/registration","璁垮棰勭害鍏嶇櫥璁皏2"};//璁垮棰勭害鍏嶇櫥璁皏2
+        String[] visitCancel= new String[]{"/api/visitor/v1/appointment/cancel","鍙栨秷璁垮棰勭害"};//鍙栨秷璁垮棰勭害
+        String[] visitOut= new String[]{"/api/visitor/v1/visitor/out","绛剧璁垮棰勭害"};//绛剧璁垮棰勭害
+        String[] facePicture= new String[]{"/api/resource/v1/person/picture","鎻愬彇鐢ㄦ埛浜鸿劯鐓х墖"};//鎻愬彇鐢ㄦ埛浜鸿劯鐓х墖
+        String[] privilegeGroup= new String[]{"/api/visitor/v1/privilege/group","鏌ヨ璁垮鏉冮檺缁�"};//鏌ヨ璁垮鏉冮檺缁�
+        String[] eventSub= new String[]{"/api/eventService/v1/eventSubscriptionByEventTypes","浜嬩欢璁㈤槄"};//浜嬩欢璁㈤槄
+        String[] doorSearch= new String[]{"/api/resource/v2/door/search","鏌ヨ闂ㄧ鐐瑰垪琛╲2"};//鏌ヨ闂ㄧ鐐瑰垪琛╲2
+        String[] cancelEventSub= new String[]{"/api/eventService/v1/eventUnSubscriptionByEventTypes","鍙栨秷浜嬩欢璁㈤槄"};//鍙栨秷浜嬩欢璁㈤槄
+        String[] visitPicture= new String[]{"/api/visitor/v1/record/pictures","鑾峰彇璁垮璁板綍涓殑鍥剧墖"};//鑾峰彇璁垮璁板綍涓殑鍥剧墖
+        String[] devicePicture= new String[]{"/api/acs/v1/event/pictures","鑾峰彇闂ㄧ浜嬩欢鐨勫浘鐗�"};//鑾峰彇闂ㄧ浜嬩欢鐨勫浘鐗�
+        String[] carPicture= new String[]{"/api/pms/v1/image","鏌ヨ杞﹁締鎶撴媿鍥剧墖"};//鏌ヨ杞﹁締鎶撴媿鍥剧墖
+        String[] taskAddition= new String[]{"/api/acps/v1/authDownload/task/addition","鍒涘缓涓嬭浇浠诲姟_鏍规嵁浜哄憳涓庤澶囬�氶亾鎸囧畾涓嬭浇"};//鍒涘缓涓嬭浇浠诲姟_鏍规嵁浜哄憳涓庤澶囬�氶亾鎸囧畾涓嬭浇
+        String[] taskDataAddition= new String[]{"/api/acps/v1/authDownload/data/addition","涓嬭浇浠诲姟涓坊鍔犳暟鎹甠鏍规嵁浜哄憳涓庤澶囬�氶亾鎸囧畾涓嬭浇"};//涓嬭浇浠诲姟涓坊鍔犳暟鎹甠鏍规嵁浜哄憳涓庤澶囬�氶亾鎸囧畾涓嬭浇
+        String[] taskStart= new String[]{"/api/acps/v1/authDownload/task/start","寮�濮嬩笅杞戒换鍔�"};//寮�濮嬩笅杞戒换鍔�
+        String[] taskProgressNum= new String[]{"/api/acps/v1/authDownload/task/progress","鏌ヨ涓嬭浇浠诲姟杩涘害"};//鏌ヨ涓嬭浇浠诲姟杩涘害
+        String[] taskProgress= new String[]{"/api/acps/v2/download_record/person/detail/search","鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟v2"};//鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟v2
+        String[] authItemList= new String[]{"/api/acps/v1/auth_item/list/search","鏌ヨ鏉冮檺鏉$洰鍒楄〃"};//鏌ヨ鏉冮檺鏉$洰鍒楄〃
+        String[] cardBingding= new String[]{"/api/cis/v1/card/bindings","鎵归噺寮�鍗�"};//鎵归噺寮�鍗�
+        String[] cardDeletion= new String[]{"/api/cis/v1/card/deletion","鍗$墖閫�鍗�"};//鍗$墖閫�鍗�
+        String[] cardLoss= new String[]{"/api/cis/v1/card/batch/loss","鎵归噺鎸傚け"};//鎵归噺鎸傚け
+        String[] cardUnloss= new String[]{"/api/cis/v1/card/batch/unLoss","鎵归噺瑙f寕"};//鎵归噺瑙f寕
+        String[] taskPersoDetail= new String[]{"/api/acps/v1/download_record/person/detail/search","鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯�"};//鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯�
+        String[] appointmentRecords= new String[]{"/api/visitor/v2/appointment/records","鏌ヨ璁垮棰勭害璁板綍v2"};//鏌ヨ璁垮棰勭害璁板綍v2
+        String[] visitingRecords= new String[]{"/api/visitor/v2/visiting/records","鏌ヨ璁垮鏉ヨ璁板綍v2"};//鏌ヨ璁垮鏉ヨ璁板綍v2
+        String[] vehicleList= new String[]{"/api/resource/v2/vehicle/advance/vehicleList","鏌ヨ杞﹁締鍒楄〃v2"};//鏌ヨ杞﹁締鍒楄〃v2
+        String[] vehicleTimeRangeList= new String[]{"/api/resource/v1/vehicle/timeRange","澧為噺鑾峰彇杞﹁締鏁版嵁"};//澧為噺鑾峰彇杞﹁締鏁版嵁
+        String[] facePictureCheck= new String[]{"/api/frs/v1/face/picture/check","浜鸿劯璇勫垎"};//浜鸿劯璇勫垎
+        String[] acsDeviceStatus= new String[]{"/api/nms/v1/online/acs_device/get","鑾峰彇闂ㄧ璁惧鍦ㄧ嚎鐘舵��"};//鑾峰彇闂ㄧ璁惧鍦ㄧ嚎鐘舵��
+        String[] tempCarInRecords= new String[]{"/api/pms/v1/tempCarInRecords/page","鏌ヨ鍦哄唴杞﹀仠杞︿俊鎭�"};//鏌ヨ鍦哄唴杞﹀仠杞︿俊鎭�
+        String[] applyCTGT= new String[]{"/api/lsm/ssoService/v1/applyCTGT","鏍规嵁鐢ㄦ埛鏍囪瘑鑾峰彇瀹㈡埛绔疶GC鎺ュ彛"};//鏍规嵁鐢ㄦ埛鏍囪瘑鑾峰彇瀹㈡埛绔疶GC鎺ュ彛
+        String[] applyST= new String[]{"/api/lsm/ssoService/v1/applyST","鏍规嵁鐧诲綍鏍囪瘑TGC鐢宠鐧诲綍鍑瘉ST鎺ュ彛"};//鏍规嵁鐧诲綍鏍囪瘑TGC鐢宠鐧诲綍鍑瘉ST鎺ュ彛
+        String[] tokenLoginUrl= new String[]{"/lsm/ssoService/v1/tokenLogin?token=${st}&service=${service}","缁勪欢鎺堟潈鐧诲綍鎷兼帴鍦板潃"};//缁勪欢鎺堟潈鐧诲綍鎷兼帴鍦板潃
+        String[] fetchAudioChannel= new String[]{"/api/ibas/resource/v1/fetchAudioChannel","鍒嗛〉鑾峰彇骞挎挱鐐�"};//1.1.4.1鍒嗛〉鑾峰彇骞挎挱鐐�
+        String[] fetchAudioDevice= new String[]{"/api/ibas/resource/v1/fetchAudioDevice","2鍒嗛〉鑾峰彇骞挎挱璁惧鍒楄〃"};//1.1.4.2鍒嗛〉鑾峰彇骞挎挱璁惧鍒楄〃
+        String[] fetchAudioChannelByDevice= new String[]{"/api/ibas/resource/v1/fetchAudioChannelByDevice","3鏍规嵁璁惧淇℃伅鑾峰彇骞挎挱鐐�"};//1.1.4.3鏍规嵁璁惧淇℃伅鑾峰彇骞挎挱鐐�
+        String[] ledRecords= new String[]{"/api/v1/model/tb_led_info/records","鑾峰彇鏈堝彴缁勪欢閰嶇疆鐨凩ED璁惧娓呭崟"};//鑾峰彇鏈堝彴缁勪欢閰嶇疆鐨凩ED璁惧娓呭崟
+        String[] transparentchannel= new String[]{"/api/v1/transparentchannel","鍙戦�佹秷鎭粰LED"};//鍙戦�佹秷鎭粰LED
+        String[] platformsList= new String[]{"/api/platformService/v1/platforms","鑾峰彇鍏ㄩ儴鏈堝彴淇℃伅"};//鑾峰彇鍏ㄩ儴鏈堝彴淇℃伅
+        String[] platformStatus= new String[]{"/api/platformService/v1/platform/status","鑾峰彇鏈堝彴鐘舵��"};//鑾峰彇鏈堝彴鐘舵��
+        String[] customBroadcast= new String[]{"/api/ibas/v1/customBroadcast","鐢ㄤ簬璁剧疆骞挎挱鐨勮嚜瀹氭挱鏀惧拰鍋滄"};//鐢ㄤ簬璁剧疆骞挎挱鐨勮嚜瀹氭挱鏀惧拰鍋滄
+        String[] iccmAppointment= new String[]{"/api/iccm/v2/appointment/","iccm璁垮鐧昏娣诲姞"};//iccm璁垮鐧昏娣诲姞
+        String[] iccmUpdateAppointment= new String[]{"/api/iccm/v2/appointment/update","iccm璁垮鐧昏淇敼"};//iccm璁垮鐧昏淇敼
+        String[] iccmCancelAppointment= new String[]{"/api/iccm/v1/appointment/cancel","iccm璁垮鐧昏淇敼"};//iccm璁垮鐧昏淇敼
+        String[] iccmAppointmentMDJ= new String[]{"/api/iccm/v1/appointment/free/registration","iccm璁垮棰勭害鍏嶇櫥璁�"};//iccm璁垮棰勭害鍏嶇櫥璁�
 
-        String privilegIccmeGroup= "/api/iccm/v1/privilege/groups";//鏌ヨ璁垮鏉冮檺缁�
-        String iccmAppointmentRecords= "/api/iccm/v2/appointment/records";//iccm鏌ヨ宸查绾︾櫥璁�
+        String[] privilegIccmeGroup= new String[]{"/api/iccm/v1/privilege/groups","鏌ヨ璁垮鏉冮檺缁�"};//鏌ヨ璁垮鏉冮檺缁�
+        String[] iccmAppointmentRecords= new String[]{"/api/iccm/v2/appointment/records","iccm鏌ヨ宸查绾︾櫥璁�"};//iccm鏌ヨ宸查绾︾櫥璁�
     }
 
     /**
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
index f13409d..4a50aaf 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -61,7 +61,7 @@
 
 	}
 	public static InterfaceLogService interfaceLogService = null;
-	private static void saveInterfaceLog(String s, String result,Map<String, String> path) {
+	private static void saveInterfaceLog(String s, String result,Map<String, String> path,String name) {
 //		InterfaceLogService bean = SpringContextUtil.getBean(InterfaceLogService.class);
 		if(interfaceLogService !=null){
 			InterfaceLog hkMonitoryLogDO=new InterfaceLog();
@@ -70,7 +70,7 @@
 			hkMonitoryLogDO.setIsdeleted(0);
 			hkMonitoryLogDO.setRequest(s);
 			hkMonitoryLogDO.setRepose(result);
-			hkMonitoryLogDO.setName(path.get(HKConstants.https));
+			hkMonitoryLogDO.setName("銆愬畨闃插钩鍙般��"+name);
 			hkMonitoryLogDO.setUrl(HKConstants.https + ArtemisConfig.host+path.get(HKConstants.https));
 			interfaceLogService.create(hkMonitoryLogDO);
 		}
@@ -238,7 +238,7 @@
 	 */
 	public static InputStream getFaceInputStream(String body)  throws  Exception{
 
-		Map<String, String> path = getPath(HKConstants.InterfacePath.facePicture);
+		Map<String, String> path = getPath(HKConstants.InterfacePath.facePicture[0]);
 		//鍙傛暟鏍规嵁鎺ュ彛瀹為檯鎯呭喌璁剧疆
 		HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
 		if (200==resp.getStatusLine().getStatusCode()) {
@@ -255,7 +255,7 @@
 	 * @return
 	 */
 	public static InputStream getVisitPicture(String body)  throws  Exception{
-		Map<String, String> path = getPath(HKConstants.InterfacePath.visitPicture);
+		Map<String, String> path = getPath(HKConstants.InterfacePath.visitPicture[0]);
 		//鍙傛暟鏍规嵁鎺ュ彛瀹為檯鎯呭喌璁剧疆
 		HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
 		if (200==resp.getStatusLine().getStatusCode()) {
@@ -273,7 +273,7 @@
 	 */
 	public static InputStream getDevicePicture(String body)  throws  Exception{
 
-		Map<String, String> path = getPath(HKConstants.InterfacePath.devicePicture);
+		Map<String, String> path = getPath(HKConstants.InterfacePath.devicePicture[0]);
 		//鍙傛暟鏍规嵁鎺ュ彛瀹為檯鎯呭喌璁剧疆
 		HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
 		if (200==resp.getStatusLine().getStatusCode()) {
@@ -292,7 +292,7 @@
 	 */
 	public static InputStream getCarPicture(String body)  throws  Exception{
 
-		Map<String, String> path = getPath(HKConstants.InterfacePath.carPicture);
+		Map<String, String> path = getPath(HKConstants.InterfacePath.carPicture[0]);
 		//鍙傛暟鏍规嵁鎺ュ彛瀹為檯鎯呭喌璁剧疆
 		HttpResponse resp = ArtemisHttpUtil.doPostStringImgArtemis( path, body, null, null,"application/json",null);
 		if (200==resp.getStatusLine().getStatusCode()) {
@@ -369,20 +369,29 @@
 		return  startDoPostStringArtemis(HKConstants.InterfacePath.visitCancel,body);
 	}
 
-	public static String startDoPostStringArtemis(String pathStr,String body){
-		Map<String, String> path = getPath(pathStr);
+	public static String startDoPostStringArtemis(String[] pathStr,String body ){
+		Map<String, String> path = getPath(pathStr[0]);
 		Map<String, String> header = new HashMap<>();
 		header.put("tagId", UUID.randomUUID().toString().replace("-", ""));
 		String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", header);// post璇锋眰application/json绫诲瀷鍙傛暟
-		saveInterfaceLog(body,result,path);
+		saveInterfaceLog(body,result,path,pathStr[1]);
 		return result;
 
 	}
-	public static String startDoPostStringArtemis(String pathStr,Map<String, String> querys,Map<String, String> header,String body){
-		Map<String, String> path = getPath(pathStr);
+	public static String startDoPostStringArtemis(String[] pathStr,String param,String body ){
+		Map<String, String> path = getPath(pathStr[0]+StringUtils.defaultString(param,""));
+		Map<String, String> header = new HashMap<>();
+		header.put("tagId", UUID.randomUUID().toString().replace("-", ""));
+		String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", header);// post璇锋眰application/json绫诲瀷鍙傛暟
+		saveInterfaceLog(body,result,path,pathStr[1]);
+		return result;
+
+	}
+	public static String startDoPostStringArtemis(String[] pathStr,Map<String, String> querys,Map<String, String> header,String body){
+		Map<String, String> path = getPath(pathStr[0]);
 		header.put("tagId", UUID.randomUUID().toString().replace("-", ""));
 		String result = ArtemisHttpUtil.doPostStringArtemis(path, body, querys, null, "application/json", header);// post璇锋眰application/json绫诲瀷鍙傛暟
-		saveInterfaceLog(body,result,path);
+		saveInterfaceLog(body,result,path,pathStr[1]);
 		return result;
 
 	}
@@ -655,7 +664,7 @@
 	 */
 	public static String platformStatus(String param) {
 		if(StringUtils.isNotBlank(param)){
-			return startDoPostStringArtemis(HKConstants.InterfacePath.platformStatus+"?platformIds="+param,null);
+			return startDoPostStringArtemis(HKConstants.InterfacePath.platformStatus,"?platformIds="+param,null);
 		}else{
 			return startDoPostStringArtemis(HKConstants.InterfacePath.platformStatus,null);
 		}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformWaterGasMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformWaterGasMapper.java
new file mode 100644
index 0000000..3817dc9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformWaterGasMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.PlatformWaterGas;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/08/26 16:22
+ */
+public interface PlatformWaterGasMapper extends BaseMapper<PlatformWaterGas> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java
index cd622be..25d4fe5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.Visits;
+import com.github.yulichang.base.MPJBaseMapper;
 
 import java.util.List;
 
@@ -9,6 +10,6 @@
  * @author 姹熻箘韫�
  * @date 2023/11/30 15:33
  */
-public interface VisitsMapper extends BaseMapper<Visits> {
+public interface VisitsMapper extends MPJBaseMapper<Visits> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java
new file mode 100644
index 0000000..a801e0d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformWaterGas.java
@@ -0,0 +1,85 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�
+ * @author 姹熻箘韫�
+ * @date 2024/08/26 16:22
+ */
+@Data
+@ApiModel("鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛�")
+@TableName("`platform_water_gas`")
+public class PlatformWaterGas  extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鏃堕棿锛堝勾鏈堬級")
+    @ExcelColumn(name="鏃堕棿锛堝勾鏈堬級")
+    private Date timeInfo;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "绫诲瀷 0鐢ㄧ數 1鐢ㄧ數 2娌硅��", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鐢ㄧ數 1鐢ㄧ數 2娌硅��")
+    private Integer type;
+
+    @ApiModelProperty(value = "鏁伴噺 (鐢ㄧ數椤匡紝鐢ㄧ數搴︼紱 娌硅�桳锛�", example = "1")
+    @ExcelColumn(name="鏁伴噺 (鐢ㄧ數椤匡紝鐢ㄧ數搴︼紱 娌硅�桳锛�")
+    private BigDecimal num;
+
+    @ApiModelProperty(value = "璇存槑")
+    @ExcelColumn(name="璇存槑")
+    private String content;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    @ExcelColumn(name="杞︾墝鍙�")
+    private String carCode;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @TableField(exist = false)
+    private Date startTime;
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @TableField(exist = false)
+    private Date endTime;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java
new file mode 100644
index 0000000..320008c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PlatformWaterGasService.java
@@ -0,0 +1,101 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.LoginUserModel;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.PlatformWaterGas;
+import java.util.List;
+
+/**
+ * 鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2024/08/26 16:22
+ */
+public interface PlatformWaterGasService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param platformWaterGas 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(PlatformWaterGas platformWaterGas);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param platformWaterGas 瀹炰綋瀵硅薄
+     */
+    void delete(PlatformWaterGas platformWaterGas);
+    void deleteById(Integer id, LoginUserInfo user);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param platformWaterGas 瀹炰綋瀵硅薄
+     */
+    void updateById(PlatformWaterGas platformWaterGas);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param platformWaterGass 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<PlatformWaterGas> platformWaterGass);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return PlatformWaterGas
+     */
+    PlatformWaterGas findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param platformWaterGas 瀹炰綋瀵硅薄
+     * @return PlatformWaterGas
+     */
+    PlatformWaterGas findOne(PlatformWaterGas platformWaterGas);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param platformWaterGas 瀹炰綋瀵硅薄
+     * @return List<PlatformWaterGas>
+     */
+    List<PlatformWaterGas> findList(PlatformWaterGas platformWaterGas);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<PlatformWaterGas>
+     */
+    PageData<PlatformWaterGas> findPage(PageWrap<PlatformWaterGas> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param platformWaterGas 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(PlatformWaterGas platformWaterGas);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
index 569c7ca..172d792 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
@@ -141,4 +141,6 @@
     void  visitCancel(Integer visitId);
 
     void resetPassword(ResetPasswordDTO resetPasswordDTO);
+
+    void visitResend(Integer visitId);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
index 0ac1181..6fe0fdf 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
@@ -166,6 +166,6 @@
              days = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.HK_LOG_DEL_DAYS_LIMIT).getCode());
          }catch (Exception e){}
           interfaceLogMapper.delete(new UpdateWrapper<InterfaceLog>().lambda()
-                  .apply("to_days(create_date)+"+days+" < to_days(now())") );
+                  .apply("to_days(create_dat e)+"+days+" < to_days(now())") );
     }
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java
new file mode 100644
index 0000000..202d2b0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformWaterGasServiceImpl.java
@@ -0,0 +1,210 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.LoginUserModel;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.PlatformWaterGasMapper;
+import com.doumee.dao.business.model.PlatformReason;
+import com.doumee.dao.business.model.PlatformWaterGas;
+import com.doumee.service.business.PlatformWaterGasService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.C;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鏈堝彴_鐢ㄦ按鐢ㄦ皵淇℃伅璁板綍琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/08/26 16:22
+ */
+@Service
+public class PlatformWaterGasServiceImpl implements PlatformWaterGasService {
+
+    @Autowired
+    private PlatformWaterGasMapper platformWaterGasMapper;
+
+    @Override
+    public Integer create(PlatformWaterGas platformWaterGas) {
+        if(platformWaterGas.getTimeInfo() ==null || platformWaterGas.getNum()==null
+        ||(Constants.equalsInteger(platformWaterGas.getType(),Constants.TWO) && StringUtils.isBlank(platformWaterGas.getCarCode()))){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ュ勾鏈堟暟鎹凡瀛樺湪锛岃鍕块噸鏂板綍鍏ワ紝鍙互灏濊瘯鎼滅储鍚庤繘琛屾暟鎹慨鏀癸紒");
+        }
+        if( platformWaterGasMapper.selectCount(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted, Constants.ZERO)
+                .apply("to_days(time_info) = to_days('"+ DateUtil.getPlusTime2(platformWaterGas.getTimeInfo()) +"')")
+                .eq(Constants.equalsInteger(platformWaterGas.getType(),Constants.TWO),PlatformWaterGas::getCarCode,platformWaterGas.getCarCode()))>0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ュ勾鏈堟暟鎹凡瀛樺湪锛岃鍕块噸鏂板綍鍏ワ紝鍙互灏濊瘯鎼滅储鍚庤繘琛屾暟鎹慨鏀癸紒");
+        }
+        platformWaterGas.setIsdeleted(Constants.ZERO);
+        platformWaterGas.setType(Constants.formatIntegerNum(platformWaterGas.getType()));
+        platformWaterGas.setCreator(platformWaterGas.getLoginUserInfo().getId());
+        platformWaterGas.setCreateDate(new Date());
+        platformWaterGas.setEditDate(platformWaterGas.getCreateDate());
+        platformWaterGas.setEditor(platformWaterGas.getCreator());
+        platformWaterGasMapper.insert(platformWaterGas);
+        return platformWaterGas.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+
+        platformWaterGasMapper.deleteById(id);
+    }
+    @Override
+    public void deleteById(Integer id, LoginUserInfo model) {
+        PlatformWaterGas param = new PlatformWaterGas();
+        param.setId(id);
+        param.setIsdeleted(Constants.ONE);
+        param.setEditor(model.getId());
+        param.setEditDate(new Date());
+        platformWaterGasMapper.updateById(param);
+    }
+
+    @Override
+    public void delete(PlatformWaterGas platformWaterGas) {
+        UpdateWrapper<PlatformWaterGas> deleteWrapper = new UpdateWrapper<>(platformWaterGas);
+        platformWaterGasMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        platformWaterGasMapper.deleteBatchIds(ids);
+    }
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo model) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for(Integer id : ids){
+            deleteById(id,model);
+        }
+    }
+
+    @Override
+    public void updateById(PlatformWaterGas platformWaterGas) {
+        if(platformWaterGas.getTimeInfo() ==null
+                || platformWaterGas.getId()==null
+                || platformWaterGas.getNum()==null
+                ||(Constants.equalsInteger(platformWaterGas.getType(),Constants.TWO) && StringUtils.isBlank(platformWaterGas.getCarCode()))){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ュ勾鏈堟暟鎹凡瀛樺湪锛岃鍕块噸鏂板綍鍏ワ紝鍙互灏濊瘯鎼滅储鍚庤繘琛屾暟鎹慨鏀癸紒");
+        }
+        if( platformWaterGasMapper.selectCount(new QueryWrapper<PlatformWaterGas>().lambda()
+                .eq(PlatformWaterGas::getIsdeleted, Constants.ZERO)
+                .ne(PlatformWaterGas::getId,platformWaterGas.getId())
+                .apply("to_days(time_info) = to_days('"+ DateUtil.getPlusTime2(platformWaterGas.getTimeInfo()) +"')")
+                .eq(Constants.equalsInteger(platformWaterGas.getType(),Constants.TWO),PlatformWaterGas::getCarCode,platformWaterGas.getCarCode()))>0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ュ勾鏈堟暟鎹凡瀛樺湪锛岃鍕块噸鏂板綍鍏ワ紝鍙互灏濊瘯鎼滅储鍚庤繘琛屾暟鎹慨鏀癸紒");
+        }
+
+        platformWaterGas.setEditDate(new Date());
+        platformWaterGas.setEditor(platformWaterGas.getLoginUserInfo().getId());
+        platformWaterGasMapper.updateById(platformWaterGas);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<PlatformWaterGas> platformWaterGass) {
+        if (CollectionUtils.isEmpty(platformWaterGass)) {
+            return;
+        }
+        for (PlatformWaterGas platformWaterGas: platformWaterGass) {
+            this.updateById(platformWaterGas);
+        }
+    }
+
+    @Override
+    public PlatformWaterGas findById(Integer id) {
+        return platformWaterGasMapper.selectById(id);
+    }
+
+    @Override
+    public PlatformWaterGas findOne(PlatformWaterGas platformWaterGas) {
+        QueryWrapper<PlatformWaterGas> wrapper = new QueryWrapper<>(platformWaterGas);
+        return platformWaterGasMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<PlatformWaterGas> findList(PlatformWaterGas platformWaterGas) {
+        QueryWrapper<PlatformWaterGas> wrapper = new QueryWrapper<>(platformWaterGas);
+        return platformWaterGasMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<PlatformWaterGas> findPage(PageWrap<PlatformWaterGas> pageWrap) {
+        IPage<PlatformWaterGas> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<PlatformWaterGas> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(PlatformWaterGas::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(PlatformWaterGas::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(PlatformWaterGas::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(PlatformWaterGas::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getTimeInfo() != null) {
+            queryWrapper.lambda().ge(PlatformWaterGas::getTimeInfo, Utils.Date.getStart(pageWrap.getModel().getTimeInfo()));
+            queryWrapper.lambda().le(PlatformWaterGas::getTimeInfo, Utils.Date.getEnd(pageWrap.getModel().getTimeInfo()));
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getNum() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getNum, pageWrap.getModel().getNum());
+        }
+        if (pageWrap.getModel().getContent() != null) {
+            queryWrapper.lambda().eq(PlatformWaterGas::getContent, pageWrap.getModel().getContent());
+        }
+        if (pageWrap.getModel().getCarCode() != null) {
+            queryWrapper.lambda().like(PlatformWaterGas::getCarCode, pageWrap.getModel().getCarCode());
+        }
+        if (pageWrap.getModel().getStartTime() != null) {
+            queryWrapper.lambda().ge(PlatformWaterGas::getTimeInfo, pageWrap.getModel().getStartTime());
+        }
+        if (pageWrap.getModel().getEndTime() != null) {
+            queryWrapper.lambda().le(PlatformWaterGas::getTimeInfo,  pageWrap.getModel().getEndTime());
+        }
+        queryWrapper.lambda().orderByDesc(PlatformWaterGas::getTimeInfo ,PlatformWaterGas::getCarCode);
+        return PageData.from(platformWaterGasMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(PlatformWaterGas platformWaterGas) {
+        QueryWrapper<PlatformWaterGas> wrapper = new QueryWrapper<>(platformWaterGas);
+        return platformWaterGasMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
index 6cb1dbd..dee709a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -47,6 +47,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
 import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
@@ -1386,6 +1387,40 @@
                 .eq(Retention::getType,Constants.memberType.visitor)
                 .eq(Retention::getMemberId,visits.getMemberId()));
     }
+    @Override
+    public  void visitResend(Integer visitId) {
+        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Visits.class);
+        queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName)
+                .selectAs(Member::getHkId,Visits::getReceptMemberHkId)
+                .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId)
+                .eq(Visits::getId,visitId)//鏈悓姝ュ埌娴峰悍
+                .last("limit 1");
+        Visits visits   = visitsMapper.selectJoinOne(Visits.class,queryWrapper);
+        if(Objects.isNull(visits)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!visits.getStatus().equals(Constants.VisitStatus.xfFail)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁垮璁板綍鐘舵�侀敊璇紝璇峰埛鏂伴噸璇�");
+        }
+        List<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
+                .eq(DeviceRole::getType, Constants.ONE));
+        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+
+      HkSyncVisitServiceImpl.getUpdateModelByResponseIccm(visits,new Date(),roleList,path);
+      if(Constants.equalsInteger(visits.getStatus(),Constants.VisitStatus.xfSuccess)){
+          //濡傛灉涓嬪彂鎴愬姛锛�
+          visitsMapper.updateById(visits);
+          if(Objects.isNull(visits.getParentId())){
+              wxPlatNotice.sendVisitAuditTemplateNotice(visits,
+                      systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
+                      systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
+          }
+      }else{
+          throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"閲嶆柊涓嬪彂浼氬け璐ワ紒");
+      }
+    }
 
 
     @Override
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java
index de74b82..db32dd4 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java
@@ -79,7 +79,7 @@
                 String st = result.getData().getST();
                 try {
                     String serviceUrl =   systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_NGINX_URL).getCode()
-                            +(HKConstants.InterfacePath.tokenLoginUrl.replace("${st}", st).replace("${service}", URLEncoder.encode(url, "UTF-8")));
+                            +(HKConstants.InterfacePath.tokenLoginUrl[0].replace("${st}", st).replace("${service}", URLEncoder.encode(url, "UTF-8")));
 //                    redisTemplate.opsForValue().set(Constants.REDIS_HK_TOKEN_KEY+param.getUsername()+param.getLabel(),serviceUrl,1, TimeUnit.HOURS);
                     return serviceUrl;
                 }catch (Exception e){
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 143183d..9c4fba9 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
@@ -421,7 +421,7 @@
         c.setHkStatus(Constants.ONE);
         c.setHkDate(date);
     }
-    private void getUpdateModelByResponseIccm(  Visits c,Date date, List<DeviceRole> roleList,String path ) {
+    public static void getUpdateModelByResponseIccm(  Visits c,Date date, List<DeviceRole> roleList,String path ) {
         String code = null;
         String id = null;
         String qrcode = null;
@@ -511,7 +511,7 @@
         request.setVisitorPermissionSet(getVisitPermissonRequest(roleList,c));
         return  request;
     }
-    private IccmAppointmentMDJRequest getHkMDJRequestParamIccm(Visits c,List<DeviceRole> roleList,String path) {
+    public static IccmAppointmentMDJRequest getHkMDJRequestParamIccm(Visits c,List<DeviceRole> roleList,String path) {
         IccmAppointmentMDJRequest request = new IccmAppointmentMDJRequest();
         IccmAppointmentVistorRequest info =getRequestInfoByVisitIccm(c,path);
         if(info == null ){
@@ -521,7 +521,7 @@
         request.setVisitStartTime(DateUtil.getISO8601Timestamp2(c.getStarttime()));
         request.setVisitEndTime(DateUtil.getISO8601Timestamp2(c.getEndtime()));
         request.setReceptionistId(c.getReceptMemberHkId());//琚浜烘捣搴风紪鐮�
-        if(StringUtils.isNotBlank(c.getReason())){
+       /* if(StringUtils.isNotBlank(c.getReason())){
             char[] charArray = c.getReason().toCharArray();
             int length = charArray.length;
             if(length>32){
@@ -529,7 +529,7 @@
             }else{
                 request.setVisitPurpose(c.getReason());
             }
-        }
+        }*/
         request.setVisitorInfo(info);
         request.setVisitorPermissionSet(getVisitPermissonRequestIccm(roleList,c));
         return  request;
@@ -555,7 +555,7 @@
         }
         return  p;
     }
-    private IccmPermissionSetRequest getVisitPermissonRequestIccm(List<DeviceRole> roleList, Visits c) {
+    public static IccmPermissionSetRequest getVisitPermissonRequestIccm(List<DeviceRole> roleList, Visits c) {
         IccmPermissionSetRequest p = new IccmPermissionSetRequest();
         //鑾峰彇鏉冮檺缁勯泦鍚�
         String[] roles = getHkRoles(c.getDoors(),roleList);
@@ -598,7 +598,7 @@
         request.setVisitorInfoList(infolist);
         return  request;
     }
-    private IccmAppointmentRequest getHkRequestParaIccm(Visits c,List<DeviceRole> roleList,String path ) {
+    public static  IccmAppointmentRequest getHkRequestParaIccm(Visits c,List<DeviceRole> roleList,String path ) {
         IccmAppointmentRequest request = new IccmAppointmentRequest();
         //鐢宠浜轰俊鎭�
         IccmAppointmentVistorRequest info =getRequestInfoByVisitIccm(c,path);
@@ -606,11 +606,11 @@
             //浜鸿劯涓虹┖锛屼笉鑳借繘琛屾帹閫�
             return  null;
         }
-        request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime()));
-        request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime()));
+        request.setVisitStartTime(DateUtil.getISO8601Timestamp2(c.getStarttime()));
+        request.setVisitEndTime(DateUtil.getISO8601Timestamp2(c.getEndtime()));
         request.setReceptionistId(c.getReceptMemberHkId());//琚浜烘捣搴风紪鐮�
 
-        if(StringUtils.isNotBlank(c.getReason())){
+      /*  if(StringUtils.isNotBlank(c.getReason())){
             char[] charArray = c.getReason().toCharArray();
             int length = charArray.length;
             if(length>32){
@@ -618,7 +618,7 @@
             }else{
                 request.setVisitPurpose(c.getReason());
             }
-        }
+        }*/
         //鑾峰彇鏉冮檺缁勯泦鍚�
         request.setVisitorPermissionSet(getVisitPermissonRequestIccm(roleList,c));
         List<IccmAppointmentVistorRequest> infolist = new ArrayList<>();
@@ -673,7 +673,7 @@
 
         return info;
     }
-    private IccmAppointmentVistorRequest getRequestInfoByVisitIccm(Visits c,String path) {
+    public static IccmAppointmentVistorRequest getRequestInfoByVisitIccm(Visits c,String path) {
         IccmAppointmentVistorRequest info = new IccmAppointmentVistorRequest();
         //浜鸿劯鏁版嵁
         if(StringUtils.isBlank(c.getName())
@@ -720,7 +720,7 @@
         return info;
     }
 
-    private String[] getHkRoles(String doors, List<DeviceRole> roleList) {
+    public static String[] getHkRoles(String doors, List<DeviceRole> roleList) {
         if(StringUtils.isBlank(doors) || roleList.size()==0|| roleList.size()==0){
             return null;
         }

--
Gitblit v1.9.3