From 1465eb9dc666715143d75a6ffcac4312f923e947 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期五, 17 一月 2025 18:05:11 +0800
Subject: [PATCH] 最新版本541200007

---
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/RetentionCloudController.java                           |   13 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/RetentionCarsVO.java                              |   58 +++++++
 h5_meeting/utils/config.js                                                                                               |    4 
 admin/src/api/business/retentionCars.js                                                                                  |   20 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/RetentionService.java                            |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java                   |   54 +++++
 admin/src/views/meeting/rooms.vue                                                                                        |   13 -
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java                    |    3 
 server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java                      |    2 
 h5_meeting/package-lock.json                                                                                             |    7 
 server/system_service/src/main/java/com/doumee/service/business/third/model/response/TmsOutQtyAndVehicleQtyResponse.java |    2 
 h5_meeting/pages/index/index.vue                                                                                         |   75 ++++++--
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java                 |    6 
 admin/src/views/business/retentionCars.vue                                                                               |  154 +++++++++++++++++++
 h5_meeting/.hbuilderx/launch.json                                                                                        |   17 +
 h5_meeting/package.json                                                                                                  |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java                      |   10 
 admin/src/views/meeting/components/OperaRoomsWindow.vue                                                                  |    6 
 h5_meeting/manifest.json                                                                                                 |    7 
 19 files changed, 394 insertions(+), 61 deletions(-)

diff --git a/admin/src/api/business/retentionCars.js b/admin/src/api/business/retentionCars.js
new file mode 100644
index 0000000..10c85a2
--- /dev/null
+++ b/admin/src/api/business/retentionCars.js
@@ -0,0 +1,20 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/retention/pageCars', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/retention/exportExcelCars', data, {
+    trim: true,
+    download: true
+  })
+}
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/retention/delete/${id}`)
+}
diff --git a/admin/src/views/business/retentionCars.vue b/admin/src/views/business/retentionCars.vue
new file mode 100644
index 0000000..227f7f0
--- /dev/null
+++ b/admin/src/views/business/retentionCars.vue
@@ -0,0 +1,154 @@
+<template>
+  <TableLayout :permissions="['business:retention:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="杞︾墝鍙�" prop="carNo">
+        <el-input v-model="searchForm.carNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="濮撳悕/鎵嬫満鍙�" prop="keyWords">
+        <el-input v-model="searchForm.keyWords" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="缁勭粐" prop="companyName">
+        <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏ョ粍缁囧悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="杞﹁締绫诲瀷" prop="carType">
+        <el-select v-model="searchForm.carType" placeholder="璇烽�夋嫨">
+          <el-option label="鍐呴儴杞﹁締" value="0"></el-option>
+          <el-option label="鐩稿叧鏂硅溅杈�" value="1"></el-option>
+          <el-option label="璁垮杞﹁締" value="2"></el-option>
+          <el-option label="鍐呰繍鐗╂祦杞�" value="3"></el-option>
+          <el-option label="澶栧崗杞﹁締" value="4"></el-option>
+          <el-option label="甯傚叕鍙稿嵏璐ц溅" value="5"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="璧锋鏃堕棿" prop="startTime">
+        <el-date-picker @change="seleTime" v-model="time" type="datetimerange" format="yyyy-MM-dd HH:mm:ss"
+          value-format="yyyy-MM-dd HH:mm:ss" range-separator="鑷�" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿">
+        </el-date-picker>
+      </el-form-item>
+      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
+        <el-radio-button label="0">褰撳ぉ</el-radio-button>
+        <el-radio-button label="1">杩�7澶�</el-radio-button>
+        <el-radio-button label="2">杩�30澶�</el-radio-button>
+      </el-radio-group>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:retention:exportExcel']">
+        <li>
+          <el-button type="primary" :loading="isWorking.export" v-permissions="['business:retention:exportExcel']"
+            @click="exportExcel">瀵煎嚭</el-button>
+        </li>
+      </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="createDate" label="杩涘満鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="carNo" label="杞︾墝鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="companyName" label="缁勭粐" min-width="250px">
+          <template slot-scope="{ row }">
+            <span>{{row.companyName || row.visitCompanyName || '' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="carType" label="杞﹁締绫诲瀷" min-width="100px">
+          <template slot-scope="{ row }">
+            <span v-if="row.carType == 0">鍐呴儴杞﹁締</span>
+            <span v-else-if="row.carType == 1">鐩稿叧鏂硅溅杈�</span>
+            <span v-else-if="row.carType == 2">璁垮杞﹁締</span>
+            <span v-else-if="row.carType == 3">鍐呰繍鐗╂祦杞�</span>
+            <span v-else-if="row.carType == 4">澶栧崗杞﹁締</span>
+            <span v-else-if="row.carType == 5">甯傚叕鍙稿嵏璐ц溅</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+        <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+<!--        <el-table-column label="杩涘満闂ㄧ" min-width="100px">
+          <template slot-scope="{ row }">
+            &lt;!&ndash; <span v-if="row.type === 1">-</span> &ndash;&gt;
+            <span>{{ row.deviceName || '-' }}</span>
+          </template>
+        </el-table-column>-->
+        <el-table-column label="鎿嶄綔" min-width="120" fixed="right">
+          <template slot-scope="{ row }">
+            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
+              v-permissions="['business:retention:delete']">鏍囪绂诲満</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+    </template>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import { timeForMat } from '@/utils/util'
+export default {
+  name: 'Retention',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data() {
+    return {
+      // 鎼滅储
+      searchForm: {
+        carNo: '',
+        carType: '',
+        keyWords: '',
+        startTime: '',
+        endTime: '',
+        radio: 0
+      },
+      time: []
+    }
+  },
+  created() {
+    this.config({
+      module: '鍦ㄥ洯浜哄憳淇℃伅 琛紙婊炵暀锛�',
+      api: '/business/retentionCars',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.changeRadio('0')
+  },
+  methods: {
+    changeRadio(e) {
+      if (e === '0') {
+        this.searchForm.startTime = timeForMat(0)[0]
+        this.searchForm.endTime = timeForMat(0)[1]
+        this.time = timeForMat(0)
+      } else if (e === '1') {
+        this.searchForm.startTime = timeForMat(6)[0]
+        this.searchForm.endTime = timeForMat(6)[1]
+        this.time = timeForMat(6)
+      } else if (e === '2') {
+        this.searchForm.startTime = timeForMat(29)[0]
+        this.searchForm.endTime = timeForMat(29)[1]
+        this.time = timeForMat(29)
+      }
+      this.search()
+    },
+    reset() {
+      this.$refs.searchForm.resetFields()
+      this.searchForm.startTime = ''
+      this.searchForm.radio = '0'
+      this.searchForm.endTime = ''
+      this.time = []
+      this.search()
+    },
+    seleTime(e) {
+      if(e && e.length >2){
+        this.searchForm.startTime = e[0]
+        this.searchForm.endTime = e[1]
+        this.searchForm.radio = null
+      }
+
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/meeting/components/OperaRoomsWindow.vue b/admin/src/views/meeting/components/OperaRoomsWindow.vue
index ebe13ac..a9a6d58 100644
--- a/admin/src/views/meeting/components/OperaRoomsWindow.vue
+++ b/admin/src/views/meeting/components/OperaRoomsWindow.vue
@@ -16,10 +16,10 @@
         <el-input v-model="form.limitNum" type="number" placeholder="璇疯緭鍏ュ绾充汉鏁�" v-trim />
       </el-form-item>
       <el-form-item label="绠$悊鍛�" prop="sysList">
-        <el-select v-model="form.sysList" filterable multiple clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+        <el-select style="width: 100%" v-model="form.sysList" filterable multiple clearable placeholder="璇烽�夋嫨閮ㄩ棬">
           <!-- :label="`${item.department.name}-${item.realname}`" -->
           <el-option v-for="item in userList()" :key="item.id" :value="item.id"
-            :label="item.companyId ? `${item.companyName}-${item.companyName}` : item.realname" />
+            :label="item.companyId ? `${item.realname}-${item.companyName}` : item.realname" />
         </el-select>
       </el-form-item>
       <el-form-item label="鎻愪緵鏈嶅姟椤圭洰" prop="projectList">
@@ -373,4 +373,4 @@
   max-height: 90px;
   display: block;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/admin/src/views/meeting/rooms.vue b/admin/src/views/meeting/rooms.vue
index 5380f67..9742cab 100644
--- a/admin/src/views/meeting/rooms.vue
+++ b/admin/src/views/meeting/rooms.vue
@@ -18,7 +18,7 @@
             v-for="item in userList"
             :key="item.id"
             :value="item.id"
-            :label="item.companyId?`${item.companyName}-${item.companyName}`:item.realname"
+            :label="item.companyId?`${item.realname}-${item.companyName}`:item.realname"
             ></el-option>
             <!-- :label="`${item.department.name}-${item.realname}`" -->
           <!-- <el-option :key="1" :value="1" label="绂佺敤" /> -->
@@ -125,7 +125,7 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaRoomsWindow from '@/views/meeting/components/OperaRoomsWindow'
-import { fetchList as userList } from '@/api/system/user'
+import { findAllList as userList } from '@/api/system/user'
 // import selectMember from '@/components/meeting/selectMember'
 import { updateStatusById } from '@/api/meeting/rooms'
 export default {
@@ -168,14 +168,9 @@
       'field.id': 'id',
       'field.main': 'id'
     })
-    userList({
-      page: 1,
-      capacity: 9999,
-      memberType: 2,
-      model: { realname: this.filterText }
-    })
+    userList({ queryParam: this.filterText ,workStatus:0,type:2} )
       .then(res => {
-        this.userList = res.records
+        this.userList = res
       })
     this.search()
   },
diff --git a/h5_meeting/.hbuilderx/launch.json b/h5_meeting/.hbuilderx/launch.json
index 8e2b38a..e5fe1ea 100644
--- a/h5_meeting/.hbuilderx/launch.json
+++ b/h5_meeting/.hbuilderx/launch.json
@@ -5,12 +5,15 @@
             "openVueDevtools" : false,
             "type" : "uni-app:h5"
         },
-	{
-		"app-plus" : 
-		{
-			"launchtype" : "local"
-		},
-		"type" : "uniCloud"
-	}
+        {
+            "app-plus" : {
+                "launchtype" : "local"
+            },
+            "type" : "uniCloud"
+        },
+        {
+            "playground" : "standard",
+            "type" : "uni-app:app-android"
+        }
     ]
 }
diff --git a/h5_meeting/manifest.json b/h5_meeting/manifest.json
index 89ba255..6167242 100644
--- a/h5_meeting/manifest.json
+++ b/h5_meeting/manifest.json
@@ -1,6 +1,6 @@
 {
     "name" : "瀹夋嘲浼氳瀹�",
-    "appid" : "__UNI__EF8BAA7",
+    "appid" : "__UNI__C77DAC4",
     "description" : "",
     "versionName" : "1.0.0",
     "versionCode" : "100",
@@ -96,9 +96,10 @@
             "disableHostCheck" : true,
             "proxy" : {
                 "/gateway_interface" : {
-                    // "target" : "http://10.50.250.253:8088/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    "target" : "http://10.50.250.253:8088/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+
                     // "target" : "http://192.168.0.173/gateway_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
-                    "target" : "https://atwl.ahzyssl.com/zhyq_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
+                    // "target" : "https://atwl.ahzyssl.com/zhyq_interface", // 浠g悊鏈嶅姟鍣ㄥ煙鍚嶆垨IP鍦板潃
                     "changeOrigin" : true, // 鍏佽璺ㄥ煙 
                     "pathRewrite" : {
                         "^/gateway_interface" : ""
diff --git a/h5_meeting/package-lock.json b/h5_meeting/package-lock.json
index 8b1c85c..4dc2f47 100644
--- a/h5_meeting/package-lock.json
+++ b/h5_meeting/package-lock.json
@@ -4,9 +4,14 @@
   "dependencies": {
     "dayjs": {
       "version": "1.11.13",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
       "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
     },
+    "qrcodejs": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/qrcodejs/-/qrcodejs-1.0.0.tgz",
+      "integrity": "sha512-67rj3mMBhSBepaD57qENnltO+r8rSYlqM7HGThks/BiyDAkc86sLvkKqjkqPS5v13f7tvnt6dbEf3qt7zq+BCg=="
+    },
     "uqrcodejs": {
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/uqrcodejs/-/uqrcodejs-4.0.7.tgz",
diff --git a/h5_meeting/package.json b/h5_meeting/package.json
index 2728378..21d28d7 100644
--- a/h5_meeting/package.json
+++ b/h5_meeting/package.json
@@ -1,6 +1,7 @@
 {
   "dependencies": {
     "dayjs": "^1.11.13",
+    "qrcodejs": "^1.0.0",
     "uqrcodejs": "^4.0.7"
   }
 }
diff --git a/h5_meeting/pages/index/index.vue b/h5_meeting/pages/index/index.vue
index 70b9d44..2b0a0a5 100644
--- a/h5_meeting/pages/index/index.vue
+++ b/h5_meeting/pages/index/index.vue
@@ -21,7 +21,7 @@
 			<text
 				v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 5">宸叉挙閿�</text>
 		</view>
-		<view v-if="meetingInfo.meetingName" class="meeting_name">{{meetingInfo.meetingName}}</view>
+		<view v-if="meetingInfo.meetingName" class="meeting_name_box"><view  class="meeting_name">{{meetingInfo.meetingName}}</view></view>
 		<view class="">
 			<view v-if="meetingInfo.meetingTime && meetingInfo.bookingUser" class="meeting_con">
 				<view class="content">
@@ -57,7 +57,9 @@
 			</view>
 			<view class="list">
 				<view class="item" v-for="item in info.meetingListResponseList">
-					<view class="name">{{item.meetingName}}</view>
+					<view class="nameBox">
+						<view  class="name">{{item.meetingName}}</view>
+					</view>
 					<view class="line">棰勭害浜猴細{{item.bookingUser}}</view>
 					<view class="line">{{item.meetingTime}}锛坽{statusMap[item.meetingStatus]}}锛�</view>
 					<image src="@/static/ic_meeting@2x.png" class="item_bg"></image>
@@ -148,6 +150,9 @@
 					roomId: this.param.code
 				}).then(res => {
 					this.info = res.data
+				/* 	if(this.info.title && this.info.title.length>0){
+						this.info.title = this.info.title.slice(0,20)+"..."
+					} */
 					if (this.info.meetingListResponseList && this.info.meetingListResponseList.length > 0) {
 						this.meetingInfo = this.info.meetingListResponseList[0]
 						this.$nextTick(() => {
@@ -171,7 +176,7 @@
 					qr.data =
 						"https://atwl.ahzyssl.com/zhyq_h5/#/pages/login/login/?type=2&yw=1&ywid=" + this.meetingInfo.id
 					// 璁剧疆浜岀淮鐮佸ぇ灏忥紝蹇呴』涓巆anvas璁剧疆鐨勫楂樹竴鑷�
-					qr.size = 104;
+					qr.size = this.rpxToPx(208);
 					// 璋冪敤鍒朵綔浜岀淮鐮佹柟娉�
 					qr.make();
 					// 鑾峰彇canvas涓婁笅鏂�
@@ -195,6 +200,17 @@
 					}
 					this.touchNum = 0
 				}, 250)
+			},
+			
+			//rpx杞琾x
+			rpxToPx(rpx) {
+			    const screenWidth = uni.getSystemInfoSync().screenWidth
+			        return (screenWidth * Number.parseInt(rpx)) / 750
+			},
+			//px杞瑀px
+			pxToRpx(px) {
+			    const screenWidth = uni.getSystemInfoSync().screenWidth
+			    return (750 * Number.parseInt(px)) / screenWidth 
 			},
 			initDatetime() {
 				let weeks = ['鍛ㄦ棩', '鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚']
@@ -263,8 +279,10 @@
 
 		.meeting_wrap {
 			margin-left: 42rpx;
-			// margin-top: 60rpx;
-
+			// margin-top: 60rpx; 
+			.titleBox{
+				height: 124rpx;
+			}
 			.title {
 				font-weight: 500;
 				font-size: 42rpx;
@@ -309,17 +327,23 @@
 						bottom: 0;
 						// z-index: -1;
 					}
-
-					.name {
-						flex: 1;
-						font-weight: bold;
-						font-size: 39rpx;
+					.nameBox{
+						flex: 1; 
 						width: 100%;
+					}
+					.name {
+						
+						font-weight: bold; 
+						line-height: 40rpx;
+						max-height: 120rpx;
+						font-size: 39rpx;
 						word-break: break-all;
 						text-overflow: ellipsis;
 						display: -webkit-box;
 						-webkit-box-orient: vertical;
-						-webkit-line-clamp: 3;
+						-webkit-line-clamp: 3; 
+						overflow: hidden; 
+						 white-space: normal; /* 淇濊瘉鏂囨湰姝e父鎹㈣ */
 						/* 瓒呭嚭鍑犺鐪佺暐 */
 					}
 
@@ -360,16 +384,16 @@
 
 
 			.qrcode_wrap {
-				width: 110px;
-				height: 110px;
+				width: 208rpx;
+				height: 208rpx;
 				display: flex;
 				align-items: center;
 				justify-content: center;
 				background-color: #fff;
 
 				.qrcode {
-					width: 104px;
-					height: 104px;
+					width: 200rpx;
+					height: 200rpx;
 				}
 			}
 
@@ -380,22 +404,33 @@
 			display: flex;
 			justify-content: flex-end;
 			color: rgba(255, 255, 255, 0.6);
-			padding-right: 64rpx;
+			padding-right: 65rpx;
 			margin-top: 18rpx;
 			.text {
-				width: 110px;
-				text-align: center;
-				font-size: 22rpx;
+				width: 200rpx;
+				text-align: right;
+				padding-right: 8rpx;
+				font-size: 21rpx;
 				// transform: scale(.84);
 			}
 		}
-
+		.meeting_name_box {
+			// max-height: 150rpx;
+		}
 		.meeting_name {
 			margin-bottom: 12rpx;
 			font-weight: bold;
 			font-size: 49rpx;
+			// height: 150rpx;
 			padding-left: 42rpx;
 			padding-right: 64rpx;
+			word-break: break-all;
+			text-overflow: ellipsis;
+			display: -webkit-box;
+			-webkit-box-orient: vertical;
+			-webkit-line-clamp: 2; 
+			overflow: hidden; 
+			 white-space: normal; /* 淇濊瘉鏂囨湰姝e父鎹㈣ */
 		}
 
 		.home_status {
diff --git a/h5_meeting/utils/config.js b/h5_meeting/utils/config.js
index 3d94dee..b060ee4 100644
--- a/h5_meeting/utils/config.js
+++ b/h5_meeting/utils/config.js
@@ -1,7 +1,7 @@
 
 // export const baseUrl = 'gateway_interface/'
-// export const baseUrl = 'http://192.168.5.13/gateway_interface/'
-export const baseUrl = 'http://192.168.0.173/gateway_interface/'
+export const baseUrl = 'http://192.168.5.13/gateway_interface/'
+// export const baseUrl = 'http://10.50.250.253:8088/gateway_interface/'
 // export const baseUrl = 'https://atwl.ahzyssl.com/zhyq_interface/'
 
 export const statusMap = {
diff --git a/server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java b/server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java
index 015b024..82efd00 100644
--- a/server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java
+++ b/server/meeting/meeting_service/src/main/java/com/doumee/service/business/impl/RoomsServiceImpl.java
@@ -383,6 +383,8 @@
 
         roomsMapper.update(rooms, Wrappers.<Rooms>lambdaUpdate()
                 .set(Rooms::getFileType, rooms.getFileType())
+//                .set(Rooms::getEndTime, rooms.getEndTime())
+//                .set(Rooms::getStartTime, rooms.getStartTime())
                 .set(Rooms::getLimitNum, rooms.getLimitNum())
                 .set(Rooms::getTips, rooms.getTips())
                 .set(Rooms::getImgurl, rooms.getImgurl())
diff --git a/server/system_service/src/main/java/com/doumee/service/business/third/model/response/TmsOutQtyAndVehicleQtyResponse.java b/server/system_service/src/main/java/com/doumee/service/business/third/model/response/TmsOutQtyAndVehicleQtyResponse.java
index 64e29f3..0ddeedc 100644
--- a/server/system_service/src/main/java/com/doumee/service/business/third/model/response/TmsOutQtyAndVehicleQtyResponse.java
+++ b/server/system_service/src/main/java/com/doumee/service/business/third/model/response/TmsOutQtyAndVehicleQtyResponse.java
@@ -16,7 +16,7 @@
 public class TmsOutQtyAndVehicleQtyResponse {
 
     @ApiModelProperty(value = "绱鍑哄簱閲� 绱鍊�")
-    private BigDecimal totalOutQty;//鏁板瓧	绱鍑哄簱閲�(totalOutT01Qty+totalOutT03Qty)
+    private BigDecimal totalOutQty;//鏁板瓧
     @ApiModelProperty(value = "鐪佸绱鍑哄簱閲�  绱鍊�")
     private BigDecimal outSideProvinceOutQty;//	鏁板瓧	鐪佸绱鍑哄簱閲�
     @ApiModelProperty(value = "鐪佸唴绱鍑哄簱閲�  绱鍊�")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/RetentionCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/RetentionCloudController.java
index 82c7397..ee6d5ed 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/RetentionCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/RetentionCloudController.java
@@ -4,6 +4,7 @@
 import com.doumee.config.annotation.CloudRequiredPermission;
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.dao.business.vo.RetentionCarsVO;
 import com.doumee.service.business.third.model.ApiResponse;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
@@ -73,7 +74,19 @@
     public ApiResponse<PageData<Retention>> findPage (@RequestBody PageWrap<Retention> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         return ApiResponse.success(retentionService.findTrainTimePage(pageWrap));
     }
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/pageCars")
+    @CloudRequiredPermission("business:retention:query")
+    public ApiResponse<PageData<RetentionCarsVO>> findPageForCars (@RequestBody PageWrap<RetentionCarsVO> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(retentionService.findPageForCars(pageWrap));
+    }
 
+    @ApiOperation("瀵煎嚭杞﹁締Excel")
+    @PostMapping("/exportExcelCars")
+    @CloudRequiredPermission("business:retention:exportExcel")
+    public void exportExcelCars (@RequestBody PageWrap<RetentionCarsVO> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        ExcelExporter.build(RetentionCarsVO.class).export(retentionService.findPageForCars(pageWrap).getRecords(), "瀹炴椂鍦ㄥ満杞﹁締", response);
+    }
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:retention:exportExcel")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/RetentionCarsVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/RetentionCarsVO.java
new file mode 100644
index 0000000..ca80d7d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/RetentionCarsVO.java
@@ -0,0 +1,58 @@
+package com.doumee.dao.business.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.service.business.third.model.LoginUserModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("鍦ㄥ巶浜哄憳淇℃伅 琛紙杞﹁締锛�")
+public class RetentionCarsVO extends LoginUserModel {
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+    @ApiModelProperty(value = "杩涘満鏃堕棿")
+    @ExcelColumn(name="杩涘満鏃堕棿" ,index = 1,width = 12,dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+    @ApiModelProperty(value = "杞︾墝鍙� ")
+    @ExcelColumn(name="杞︾墝鍙�" ,index = 2,width = 8)
+    private String carNo;
+    @ApiModelProperty(value = "璁垮ID(鍏宠仈member)")
+    private Integer memberId;
+    @ApiModelProperty(value = "杞﹁締绫诲瀷 0鍐呴儴杞﹁締 1鐩稿叧鏂硅溅杈� 2璁垮杞﹁締 3鍐呰繍鐗╂祦杞� 4澶栧崗杞﹁締 5甯傚叕鍙稿嵏璐ц溅 ")
+    @ExcelColumn(name="杞﹁締绫诲瀷" ,index = 3, valueMapping="0=鍐呴儴杞﹁締;1=鐩稿叧鏂硅溅杈�;2=璁垮杞﹁締;3=鍐呰繍鐗╂祦杞�;4=澶栧崗杞﹁締;5=甯傚叕鍙稿嵏璐ц溅;",width = 8)
+    private Integer carType  ;
+    @ApiModelProperty(value = "鍏徃缁勭粐")
+    @ExcelColumn(name="鍏徃缁勭粐" ,index = 4,width = 12)
+    public String companyName;
+    @ApiModelProperty(value = "浜哄憳濮撳悕")
+    @ExcelColumn(name="浜哄憳濮撳悕" ,index = 5,width = 8)
+    public String name;
+    @ApiModelProperty(value = "浜哄憳鎵嬫満鍙�")
+    @ExcelColumn(name="浜哄憳鎵嬫満鍙�" ,index = 6,width = 12)
+    public String phone;
+    @ApiModelProperty(value = "娴峰悍闂ㄧ鍚嶇О")
+//    @ExcelColumn(name="杩涘巶闂ㄧ" ,index = 7,width = 12)
+    private String deviceName;
+    @ApiModelProperty(value = "濮撳悕/鎵嬫満鍙�")
+    private String keyWords;
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private Date startTime;
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private Date endTime;
+    @ApiModelProperty(value = "璁垮鍏徃鍚嶇О")
+    private String visitCompanyName;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/RetentionService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/RetentionService.java
index 85db39b..90c5fc6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/RetentionService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/RetentionService.java
@@ -1,5 +1,6 @@
 package com.doumee.service.business;
 
+import com.doumee.dao.business.vo.RetentionCarsVO;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.Retention;
@@ -111,4 +112,6 @@
      * @return PageData<RetentionVo>
      */
     List<RetentionVo> findPageExcel(PageWrap<Retention> pageWrap);
+
+    PageData<RetentionCarsVO> findPageForCars(PageWrap<RetentionCarsVO> pageWrap);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java
index b095a33..cfdece5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java
@@ -3,6 +3,7 @@
 import cn.hutool.core.lang.PatternPool;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ReUtil;
+import com.doumee.dao.business.vo.RetentionCarsVO;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Constants;
@@ -216,6 +217,44 @@
         }
         return PageData.from(retentionIPage);
     }
+    @Override
+    public PageData<RetentionCarsVO> findPageForCars(PageWrap<RetentionCarsVO> pageWrap) {
+        IPage<RetentionCarsVO> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Retention> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        queryWrapper.select(Retention::getId,Retention::getCarNo,Retention::getCreateDate,Retention::getCarType,Retention::getType)
+                .leftJoin(Member.class,Member::getId,Retention::getMemberId)
+                .leftJoin(Member.class,Member::getId,Retention::getMemberId)
+                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
+                .selectAs(Company::getCompanyNamePath,Retention::getCompanyName)
+                .selectAs(Member::getName,Retention::getName)
+                .selectAs(Member::getPhone,Retention::getPhone)
+                .selectAs(Member::getVisitCompanyName,Retention::getVisitCompanyName)
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),w->{
+                    w.like( Retention::getPhone,pageWrap.getModel().getKeyWords())
+                            .or().like( Retention::getName,pageWrap.getModel().getKeyWords()); })
+                .eq(Retention::getType,3)
+                .eq(Retention::getIsdeleted,Constants.ZERO)
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),
+                        p-> p.like(Company::getName, pageWrap.getModel().getCompanyName())
+                                .or().like(Member::getVisitCompanyName, pageWrap.getModel().getCompanyName()))
+                .eq(Objects.nonNull(pageWrap.getModel().getCarType()),
+                        Retention::getCarType,pageWrap.getModel().getCarType())
+                .like(Objects.nonNull(pageWrap.getModel().getCarNo()),
+                        Retention::getCarNo,pageWrap.getModel().getCarNo())
+                .ge(Objects.nonNull(pageWrap.getModel().getStartTime()),
+                        Retention::getCreateDate,pageWrap.getModel().getStartTime())
+                .le(Objects.nonNull(pageWrap.getModel().getEndTime()),
+                        Retention::getCreateDate,pageWrap.getModel().getEndTime());
+        queryWrapper.orderByDesc(Retention::getCreateDate);
+        IPage<RetentionCarsVO> retentionIPage = retentionJoinMapper.selectJoinPage(page, RetentionCarsVO.class, queryWrapper);
+        if(retentionIPage!=null && retentionIPage.getRecords()!=null){
+            for(RetentionCarsVO model : retentionIPage.getRecords()){
+                model.setCompanyName(StringUtils.defaultString(model.getCompanyName(),model.getVisitCompanyName()));
+            }
+        }
+        return PageData.from(retentionIPage);
+    }
 
 
     @Override
@@ -250,11 +289,11 @@
 
     private  IPage<Retention> getDataInfo(PageWrap<Retention> pageWrap) {
         //鏄惁鏄暟瀛�
-        boolean number = Validator.isNumber(pageWrap.getModel().getKeyWords());
-        //鏄惁鍖呭惈涓枃
-        boolean b = Validator.hasChinese(pageWrap.getModel().getKeyWords());
-        //鏄惁鍖呭惈鑻辨枃
-        boolean hasWord = ReUtil.contains(PatternPool.WORD, pageWrap.getModel().getKeyWords());
+//        boolean number = Validator.isNumber(pageWrap.getModel().getKeyWords());
+//        //鏄惁鍖呭惈涓枃
+//        boolean b = Validator.hasChinese(pageWrap.getModel().getKeyWords());
+//        //鏄惁鍖呭惈鑻辨枃
+//        boolean hasWord = ReUtil.contains(PatternPool.WORD, pageWrap.getModel().getKeyWords());
 
         IPage<Retention> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         MPJLambdaWrapper<Retention> queryWrapper = new MPJLambdaWrapper<>();
@@ -265,8 +304,9 @@
                 .selectAs(Company::getType,Retention::getCompanyType)
                 .select(" ( SELECT v.company_name FROM visits v WHERE v.member_id = t.member_id and v.status = "+Constants.VisitStatus.signin+" ORDER BY create_date DESC limit 1 ) as visitCompanyName ");
         queryWrapper.eq(Retention::getIsdeleted,Constants.ZERO)
-                .like(number,Retention::getPhone,pageWrap.getModel().getKeyWords())
-                .like((b||hasWord),Retention::getName,pageWrap.getModel().getKeyWords())
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),w->{
+                    w.like( Retention::getPhone,pageWrap.getModel().getKeyWords())
+                            .or().like( Retention::getName,pageWrap.getModel().getKeyWords()); })
                 .eq(Objects.nonNull(pageWrap.getModel().getType()),
                         Retention::getType,
                         pageWrap.getModel().getType())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
index b5bb4a2..b86035c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -316,7 +316,7 @@
         List<SmsEmail> smsEmails = smsEmailMapper.selectList(wrapper);
         if(smsEmails!=null && smsEmails.size()>0){
             for(SmsEmail model : smsEmails){
-                if(Constants.equalsInteger(model.getType(),Constants.ONE)){
+                if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
                     if(model.getPhone() == null){
                         model.setStatus(Constants.THREE);//鍙戦�佸け璐�
                         model.setRemark("鎵嬫満鍙蜂负绌猴紝鍙栨秷浠诲姟鍙戦�侊紒");
@@ -348,7 +348,6 @@
             }
         }
     }
-
     /**
      * 璁垮鐢宠涓氬姟鐭俊閫氱煡
      * @param systemDictDataBiz
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 6e2f02b..65579fe 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
@@ -1722,10 +1722,12 @@
                 );
                 for (Company company:companyList) {
                     Integer count = retentionList.stream().filter(i->Constants.equalsInteger(i.getCompanyId(),company.getId())).collect(Collectors.toList()).size();
-                    InterestedListVO lw = new InterestedListVO();
-                    lw.setNum(count);
-                    lw.setName(company.getName());
-                    lwList.add(lw);
+                    if(count>0){
+                        InterestedListVO lw = new InterestedListVO();
+                        lw.setNum(count);
+                        lw.setName(company.getName());
+                        lwList.add(lw);
+                    }
                 }
             }
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
index 5a06a00..168daf3 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/thrid/BoardServiceImpl.java
@@ -2448,8 +2448,10 @@
                 data.setCurrentOutNum(data.getCurrentOutNum().add(Constants.formatBigdecimal(model.getOutSideProvinceOutQty())));
                 data.setCurrentInNum(data.getCurrentInNum().add(Constants.formatBigdecimal(model.getInSideProvinceOutQty())));
                 data.setTotalCarNum(data.getTotalCarNum()+Constants.formatIntegerNum(model.getVehicleQty()));//绱杞︽
-                data.setCurrentProvinceNum(data.getCurrentProvinceNum().add(model.getOutSideProvinceOutQty()).add(model.getInSideProvinceOutT01Qty()));//鐪佸唴鐪佸閿�鍞噺
-                data.setCurrentOtherNum(data.getCurrentOtherNum().add(model.getOutSideProvinceOutT03Qty()).add(model.getInSideProvinceOutT03Qty()));//鐪佸唴鐪佸鍏朵粬鍑哄簱閲�
+                data.setCurrentProvinceNum(data.getCurrentProvinceNum().add(Constants.formatBigdecimal(model.getOutSideProvinceOutQty()))
+                        .add(Constants.formatBigdecimal(model.getInSideProvinceOutT01Qty())));//鐪佸唴鐪佸閿�鍞噺
+                data.setCurrentOtherNum(data.getCurrentOtherNum().add(Constants.formatBigdecimal(model.getOutSideProvinceOutT03Qty()))
+                        .add(Constants.formatBigdecimal(model.getInSideProvinceOutT03Qty())));//鐪佸唴鐪佸鍏朵粬鍑哄簱閲�
             }
         }
         param.setDateEnd(DateUtil.getShortTime(lastEnd));

--
Gitblit v1.9.3