From 69283b5a4559509187516355602e32e4bdac9d5d Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期五, 28 二月 2025 11:54:12 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.0.1' into 2.0.1

---
 admin/src/views/business/onlinePayStatistics.vue                                                  |    5 
 admin/src/views/combo/record.vue                                                                  |  404 ++++++----------
 server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java               |    2 
 admin/src/views/combo/components/SaleDetail.vue                                                   |  139 +++++
 admin/src/views/business/goodsorder.vue                                                           |    5 
 admin/src/views/combo/order.vue                                                                   |   64 +
 server/services/src/main/java/com/doumee/service/business/GoodsorderService.java                  |    4 
 admin/package-lock.json                                                                           |    5 
 server/services/src/main/java/com/doumee/service/business/impl/BikesServiceImpl.java              |    2 
 server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java        |   60 +
 server/platform/src/main/java/com/doumee/api/business/DiscountMemberController.java               |    2 
 admin/src/views/business/memberRides.vue                                                          |    4 
 admin/src/views/business/bikeRetakeRecord.vue                                                     |    6 
 server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java              |    2 
 admin/src/components/base/BasePageTemp.vue                                                        |    8 
 server/services/src/main/java/com/doumee/service/business/impl/DiscountMemberServiceImpl.java     |   42 +
 server/services/src/main/java/com/doumee/core/constants/Constants.java                            |    5 
 server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java                   |    8 
 admin/src/views/combo/index.vue                                                                   |   20 
 server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java                         |   70 +
 server/services/src/main/java/com/doumee/dao/business/model/Discount.java                         |   15 
 server/services/src/main/java/com/doumee/dao/business/model/DiscountMember.java                   |    4 
 server/services/src/main/java/com/doumee/dao/business/vo/DiscountGoodsorderExportVO.java          |    4 
 server/services/src/main/java/com/doumee/service/business/impl/DiscountServiceImpl.java           |   47 +
 server/services/src/main/java/com/doumee/service/business/impl/TransactionsServiceImpl.java       |    4 
 server/web/src/main/java/com/doumee/api/web/BusinessApi.java                                      |   13 
 admin/src/views/business/bikeRepair.vue                                                           |    5 
 admin/src/views/combo/components/OrderDetail.vue                                                  |  140 ++++-
 server/services/src/main/java/com/doumee/core/wx/SendWxMessage.java                               |    4 
 server/platform/src/main/java/com/doumee/api/business/DiscountController.java                     |   11 
 server/services/src/main/java/com/doumee/dao/business/model/DiscountLog.java                      |    4 
 server/services/src/main/resources/application-dev.yml                                            |   13 
 admin/src/components/common/Paginations.vue                                                       |   40 +
 admin/package.json                                                                                |    1 
 server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java |    1 
 admin/src/api/business/combo.js                                                                   |   43 +
 admin/src/views/combo/components/ComboDetail.vue                                                  |   24 
 admin/src/views/combo/components/Refund.vue                                                       |    3 
 server/services/src/main/java/com/doumee/core/utils/DateUtil.java                                 |   21 
 server/platform/src/main/java/com/doumee/task/ScheduleTool.java                                   |   12 
 server/services/src/main/java/com/doumee/service/business/impl/DiscountLogServiceImpl.java        |   74 --
 admin/src/views/combo/components/Edit.vue                                                         |    8 
 server/jtt808_parent/jtt808-protocol/src/test/java/org/yzh/protocol/TestHex.java                  |   32 
 server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java       |    3 
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java         |  103 ++-
 45 files changed, 956 insertions(+), 530 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index dcbeba0..92bcd97 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -5266,6 +5266,11 @@
       "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
       "dev": true
     },
+    "dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    },
     "de-indent": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
diff --git a/admin/package.json b/admin/package.json
index 228ca86..56f3575 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -21,6 +21,7 @@
     "@wangeditor/editor-for-vue": "^1.0.2",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
+    "dayjs": "^1.11.13",
     "echarts": "^5.4.2",
     "ele-calendar": "^2.0.0",
     "element-ui": "^2.15.13",
diff --git a/admin/src/api/business/combo.js b/admin/src/api/business/combo.js
index 6a6d329..d63366d 100644
--- a/admin/src/api/business/combo.js
+++ b/admin/src/api/business/combo.js
@@ -10,6 +10,15 @@
     trim: true
   })
 }
+export function comboUpdatePost(data) {
+  return request.post('/business/discount/updStatus', data, {
+    trim: true
+  })
+}
+
+export function comboDelPost(id) {
+  return request.get(`/business/discount/delete/${id}`)
+}
 export function comboListPost(data) {
   return request.post('/business/discount/page', data, {
     trim: true
@@ -34,7 +43,7 @@
 }
 
 export function comboReDetailPost(params) {
-  return request.get('/business/goodsorder/getGoodsorderCanBanlanceDTO', {params})
+  return request.get('/business/goodsorder/getGoodsorderCanBanlanceDTO', { params })
 }
 export function comboOrderRefundPost(data) {
   return request.post('/business/goodsorder/backGoodsorder', data, {
@@ -42,7 +51,7 @@
   })
 }
 export function comboOrderDetailPost(params) {
-  return request.get('/business/goodsorder/discountOrderDetail', {params})
+  return request.get('/business/goodsorder/discountOrderDetail', { params })
 }
 
 export function comboListOrderEx(data) {
@@ -50,4 +59,34 @@
     trim: true,
     download: true
   })
+}
+
+export function comboSalePage(data) {
+  return request.post('/business/discountMember/page', data, {
+    trim: true
+  })
+}
+export function comboSaleEx(data) {
+  return request.post('/business/discountMember/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+export function comboSaleAdjust(data) {
+  return request.post('/business/discountMember/adjust', data, {
+    trim: true
+  })
+}
+export function comboSaleCancel(data) {
+  return request.post('/business/discountMember/cancel', data, {
+    trim: true
+  })
+}
+export function comboSalerDetailPost(id) {
+  return request.get('/business/discountMember/' + id)
+}
+export function discountLogLog(data) {
+  return request.post('/business/discountLog/page', data, {
+    trim: true
+  })
 }
\ No newline at end of file
diff --git a/admin/src/components/base/BasePageTemp.vue b/admin/src/components/base/BasePageTemp.vue
index af01469..85784ce 100644
--- a/admin/src/components/base/BasePageTemp.vue
+++ b/admin/src/components/base/BasePageTemp.vue
@@ -1,5 +1,5 @@
 <script>
-import Pagination from '@/components/common/Pagination'
+import Pagination from '@/components/common/Paginations'
 import QueryForm from '@/components/common/QueryForm'
 export default {
   name: 'BasePageTemp',
@@ -7,7 +7,7 @@
     Pagination,
     QueryForm,
   },
-  data () {
+  data() {
     return {
       loading: false,
       pagination: {
@@ -21,11 +21,13 @@
     }
   },
   methods: {
-    getList(){},
+    getList() { },
     clear() {
       this.filters = {}
       this.pagination.pageSize = 10
       this.pagination.page = 1
+      console.log('-----');
+      
       this.getList()
     },
     handleSizeChange(capacity) {
diff --git a/admin/src/components/common/Paginations.vue b/admin/src/components/common/Paginations.vue
new file mode 100644
index 0000000..384d728
--- /dev/null
+++ b/admin/src/components/common/Paginations.vue
@@ -0,0 +1,40 @@
+<template>
+  <div class="table-pagination">
+    <el-pagination
+      :current-page="pagination.page"
+      :page-sizes="pagination.pageSizes||[10, 20, 30, 40]"
+      :page-size="pagination.pageSize"
+      layout="total, sizes, prev, pager, next, jumper"
+      :total="pagination.total"
+      @size-change="sizeChange"
+      @current-change="currentChange"
+      background>
+    </el-pagination>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Pagination',
+  props: {
+    pagination: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+    }
+  },
+  methods: {
+    sizeChange (value) {
+      this.$emit('size-change', value)
+    },
+    currentChange (value) {
+      this.$emit('current-change', value)
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/bikeRepair.vue b/admin/src/views/business/bikeRepair.vue
index 251ce4a..35fc3dd 100644
--- a/admin/src/views/business/bikeRepair.vue
+++ b/admin/src/views/business/bikeRepair.vue
@@ -107,7 +107,7 @@
 import Pagination from '@/components/common/Pagination'
 import OperaRepairDealWindow from '@/components/business/OperaRepairDealWindow'
 import RepairDetailWindow from '@/components/business/RepairDetailWindow'
-import { formatDateTime } from '@/utils/util'
+import dayjs from 'dayjs'
 import { getFileList } from '@/api/business/bikeRepair'
 export default {
   name: 'BikeRepair',
@@ -150,7 +150,8 @@
       'field.id': 'id',
       'field.main': 'id'
     })
-    // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
+    this.searchForm.startDate = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
+    this.searchForm.endDate = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
     this.search()
   },
   methods: {
diff --git a/admin/src/views/business/bikeRetakeRecord.vue b/admin/src/views/business/bikeRetakeRecord.vue
index babeb93..471f844 100644
--- a/admin/src/views/business/bikeRetakeRecord.vue
+++ b/admin/src/views/business/bikeRetakeRecord.vue
@@ -106,7 +106,7 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
-import { formatDateTime } from '@/utils/util'
+import dayjs from 'dayjs'
 export default {
   name: 'MemberRides',
   extends: BaseTable,
@@ -165,8 +165,8 @@
       'field.id': 'id',
       'field.main': 'id'
     })
-    // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
-    // this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59'
+    this.searchForm.startDate = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
+    this.searchForm.endDate = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
     this.search()
   },
   methods: {
diff --git a/admin/src/views/business/goodsorder.vue b/admin/src/views/business/goodsorder.vue
index 275e639..41d831a 100644
--- a/admin/src/views/business/goodsorder.vue
+++ b/admin/src/views/business/goodsorder.vue
@@ -116,7 +116,7 @@
 import GoodsOrderDetail from '@/components/business/goodsOrderDetail'
 import BackGoodsorderWindow from '@/components/business/backGoodsorderWindow'
 import { getDetail, getGoodsorderCanBanlanceDTO, closerGoodsorder } from '@/api/business/goodsorder'
-import { formatDateTime } from '@/utils/util'
+import dayjs from 'dayjs'
 export default {
   name: 'Goodsorder',
   extends: BaseTable,
@@ -159,7 +159,8 @@
       'field.id': 'id',
       'field.main': 'id'
     })
-    // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
+    this.searchForm.startDate = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
+    this.searchForm.endDate = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
     this.search()
   },
   methods: {
diff --git a/admin/src/views/business/memberRides.vue b/admin/src/views/business/memberRides.vue
index e9d0139..09a12c2 100644
--- a/admin/src/views/business/memberRides.vue
+++ b/admin/src/views/business/memberRides.vue
@@ -108,7 +108,7 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
-import { formatDateTime } from '@/utils/util'
+import dayjs from 'dayjs'
 export default {
   name: 'MemberRides',
   extends: BaseTable,
@@ -167,6 +167,8 @@
       'field.id': 'id',
       'field.main': 'id'
     })
+    this.searchForm.startDate = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
+    this.searchForm.endDate = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
     // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
     // this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59'
     this.search()
diff --git a/admin/src/views/business/onlinePayStatistics.vue b/admin/src/views/business/onlinePayStatistics.vue
index 55f7ca8..5178a32 100644
--- a/admin/src/views/business/onlinePayStatistics.vue
+++ b/admin/src/views/business/onlinePayStatistics.vue
@@ -55,7 +55,7 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout from '@/layouts/TableLayout'
 import { fetchList } from '@/api/business/onlinePayStatistics'
-import { formatDateTime } from '@/utils/util'
+import dayjs from 'dayjs'
 export default {
   name: 'PricingParam',
   extends: BaseTable,
@@ -71,7 +71,8 @@
     }
   },
   created () {
-    // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
+    this.searchForm.startDate = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
+    this.searchForm.endDate = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
     this.search()
   },
   methods: {
diff --git a/admin/src/views/combo/components/ComboDetail.vue b/admin/src/views/combo/components/ComboDetail.vue
index 6ab44db..ea24c96 100644
--- a/admin/src/views/combo/components/ComboDetail.vue
+++ b/admin/src/views/combo/components/ComboDetail.vue
@@ -10,13 +10,13 @@
               <span class="title">{{ detail.name }}</span>
               <span class="status">{{ detail.status == '0' ? '宸插惎鐢�' : '绂佺敤' }}</span>
             </div>
-            <div class="placeholder9 mt10">姣忔棩閿�鍞檺閲忥細{{ detail.saleDayLimit }}</div>
+            <div class="placeholder9 mt10">姣忔棩閿�鍞檺閲忥細{{ detail.saleDayLimit || '涓嶉檺棰�' }}</div>
           </div>
         </div>
         <div class="right">
           <div class="item">
             <div class="key">鎬诲彂鏀炬暟閲�</div>
-            <div class="value">{{ detail.saleLimit || '涓嶉檺棰�' }}</div>
+            <div class="value">{{ detail.saleLimit || '-' }}</div>
           </div>
           <div class="item">
             <div class="key">宸查攢鍞暟閲�</div>
@@ -25,15 +25,15 @@
           <div class="item">
             <div class="key">鍓╀綑鏁伴噺</div>
             <div v-if="detail.saleLimit" class="value">{{ detail.saleLimit - detail.saleNum }}</div>
-            <div v-else class="value">涓嶉檺棰�</div>
+            <div v-else class="value">-</div>
           </div>
         </div>
       </div>
       <div class="createTime_wrap">
         <span class="item">鍒涘缓鏃堕棿锛歿{ detail.createDate }}</span>
-        <span class="item">鍒涘缓浜猴細{{ detail.creator }}</span>
+        <span class="item">鍒涘缓浜猴細{{ detail.creatorName }}</span>
         <span class="item">鏈�鍚庢洿鏂版椂闂达細{{ detail.editDate }}</span>
-        <span class="item">鏇存柊浜猴細{{ detail.editor }}</span>
+        <span class="item">鏇存柊浜猴細{{ detail.editorName }}</span>
       </div>
     </div>
     <div class="separate" />
@@ -55,7 +55,7 @@
     <div class="line">
       <div class="key">濂楅绠�浠嬶細</div>
       <div class="value">
-        <div>{{ detail.desc }}</div>
+        <div>{{ detail.descs }}</div>
       </div>
     </div>
 
@@ -66,22 +66,22 @@
     </div>
     <div class="line">
       <div class="key">浣跨敤鏃堕棿锛�</div>
-      <div class="value" v-if="detail.useType == 0">{{ detail.useStartDate }} 鑷� {{ detail.useEndDate }}</div>
-      <div class="value" v-if="detail.useType == 1">璐拱鍚巤{ detail.useDays }}澶╁唴鏈夋晥</div>
-      <div class="value" v-if="detail.useType == 2">鑷獅{ detail.useStartDate }} 鍚� {{ detail.useDays }}澶╁唴鏈夋晥</div>
+      <div class="value" v-if="detail.useType == 0">{{ detail.useStartDate }} 鑷� {{ detail.useEndDate }}鍐呮湁鏁�</div>
+      <div class="value" v-if="detail.useType == 1">璐拱鍚庣珛鍗崇敓鏁堬紝鏈夋晥鏈焮{ detail.useDays }}澶�</div>
+      <div class="value" v-if="detail.useType == 2">鑷獅{ detail.useStartDate }}璧穥{ detail.useDays }}澶╁唴鏈夋晥</div>
     </div>
     <div class="line">
       <div class="key">閫傜敤鑼冨洿锛�</div>
-      <div class="value">{{ detail.useWorkday == 1 && '宸ヤ綔鏃�' }} {{ detail.useWorkday && detail.useHoliday && '|' }} {{ detail.useHoliday == 1 && '鑺傚亣鏃�' }}</div>
+      <div class="value">{{ detail.useWorkday == 1 ? '宸ヤ綔鏃�' : ''}} {{ detail.useWorkday && detail.useHoliday ? '|' : '' }} {{ detail.useHoliday == 1 ? '鑺傚亣鏃�' : '' }}</div>
     </div>
     <div class="line">
       <div class="key">閫傜敤椤圭洰锛�</div>
-      <div class="value">{{ detail.isbike == 1 && '鑷杞�' }} {{ detail.isbike && detail.iselecbike && '|' }} {{ detail.iselecbike == 1 && '鐢靛姩杞�' }}</div>
+      <div class="value">{{ detail.isbike == 1 ? '鑷杞�' : '' }} {{ detail.isbike && detail.iselecbike ? '|' : '' }} {{ detail.iselecbike == 1 ? '鐢靛姩杞�' :'' }}</div>
 
     </div>
     <div class="line">
       <div class="key">鎬婚檺棰濓細</div>
-      <div class="value">{{ detail.saleLimit || '涓嶉檺鍒�' }}</div>
+      <div class="value">{{ detail.saleLimit || '涓嶉檺棰�' }}</div>
     </div>
     <div class="line">
       <div class="key">姣忔棩闄愰锛�</div>
diff --git a/admin/src/views/combo/components/Edit.vue b/admin/src/views/combo/components/Edit.vue
index 51b16fd..ee6f0a0 100644
--- a/admin/src/views/combo/components/Edit.vue
+++ b/admin/src/views/combo/components/Edit.vue
@@ -100,13 +100,13 @@
         </div>
       </el-form-item>
       <el-form-item label="鎬婚檺棰�">
-        <el-input class="w400" v-model="param.saleLimit" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 12)"
+        <el-input class="w400" v-model="param.saleLimit" oninput="value=value.replace(/^(-1+)|[^\d]+/g, '').slice(0, 12)"
           placeholder="璇疯緭鍏ユ�诲彂鍞暟閲�" v-trim />
         <div class="placeholder9">璇疯緭鍏ユ�诲彂鍞暟閲忥紝閿�閲忓ぇ浜庤鏁伴噺鍚庯紝涓嶅啀鏀寔閿�鍞紱涓虹┖琛ㄧず涓嶉檺鍒�</div>
       </el-form-item>
       <el-form-item label="鏃ラ檺棰�">
         <el-input class="w400" v-model="param.saleDayLimit"
-          oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 12)" placeholder="璇疯緭鍏ュ崟鏃ュ彂鍞暟閲�" v-trim />
+          oninput="value=value.replace(/^(-1+)|[^\d]+/g, '').slice(0, 12)" placeholder="璇疯緭鍏ュ崟鏃ュ彂鍞暟閲�" v-trim />
         <div class="placeholder9">璇疯緭鍏ユ棩鍙戝敭鏁伴噺锛屽綋鏃ラ攢閲忓ぇ浜庤鏁伴噺鍚庯紝涓嶅啀鏀寔閿�鍞紱涓虹┖琛ㄧず涓嶉檺鍒�</div>
       </el-form-item>
 
@@ -227,10 +227,10 @@
       comboDetailPost(id).then(res => {
         this.param = res
         this.$set(this.param, 'saleDate', [res.startDate, res.endDate])
-        if (res.useStartDate && res.useEndDate) {
+        if (res.useStartDate && res.useEndDate && res.type != 0) {
           this.$set(this.param, 'useDate', [res.useStartDate, res.useEndDate])
         }
-        this.$set(this.param, id, type == 'copy' ? null : this.param.id)
+        this.$set(this.param, 'id', type == 'copy' ? null : this.param.id)
       })
     },
   }
diff --git a/admin/src/views/combo/components/OrderDetail.vue b/admin/src/views/combo/components/OrderDetail.vue
index 8768d44..7aac679 100644
--- a/admin/src/views/combo/components/OrderDetail.vue
+++ b/admin/src/views/combo/components/OrderDetail.vue
@@ -1,45 +1,95 @@
 <template>
-  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking">
-    <div class="title">鏀粯鏄庣粏</div>
-    <el-table :data="list" stripe border>
-      <el-table-column prop="id" label="璁㈠崟缂栧彿" show-overflow-tooltip align="center"></el-table-column>
-      <el-table-column prop="onlineorderId" label="浜ゆ槗鍗曞彿" show-overflow-tooltip align="center"></el-table-column>
-      <el-table-column prop="refundType" label="浜ゆ槗绫诲瀷" width="100px" align="center">
+  <GlobalWindow :title="title" width="1100px" :visible.sync="visible" :confirm-working="isWorking">
+    <div class="title">璁㈠崟淇℃伅</div>
+    <div class="info_warp">
+      <div class="item">
+        <div class="la">璁㈠崟缂栧彿锛�</div>
+        <div class="val">{{ info.id }}</div>
+      </div>
+      <div class="item">
+        <div class="la">璁㈠崟鐘舵�侊細</div>
+        <div class="val">{{ info.status == 1 ? '宸叉敮浠�' : '鏈敮浠�' }}</div>
+      </div>
+      <div class="item">
+        <div class="la">涓嬪崟鏃堕棿锛�</div>
+        <div class="val">{{ info.createDate }}</div>
+      </div>
+      <div class="item">
+        <div class="la">鏀粯鏃堕棿锛�</div>
+        <div class="val">{{ info.payDate }}</div>
+      </div>
+      <div class="item">
+        <div class="la">璁㈠崟閲戦锛�</div>
+        <div class="val">{{ info.money }}</div>
+      </div>
+      <div class="item">
+        <div class="la">鏀粯鏂瑰紡锛�</div>
+        <div class="val">{{ info.payWay == 0 ? '寰俊' : '鏀粯瀹�' }}</div>
+      </div>
+      <div class="item">
+        <div class="la">鏀粯鍗曞彿锛�</div>
+        <div class="val">{{ info.onlineOrderid }}</div>
+      </div>
+      <div class="item">
+        <div class="la">瀹屾垚鏃堕棿锛�</div>
+        <div class="val">{{ info.payDate }}</div>
+      </div>
+      <div class="item">
+        <div class="la">澶囨敞锛�</div>
+        <div class="val">{{ info.closeInfo }}</div>
+      </div>
+    </div>
+    <div class="title">涔板淇℃伅</div>
+    <div class="info_warp">
+      <div class="item">
+        <div class="la">鍛㈢О锛�</div>
+        <div class="val">{{ form.member.name }}</div>
+      </div>
+      <div class="item">
+        <div class="la">鎵嬫満鍙凤細</div>
+        <div class="val">{{ form.member.phone }}</div>
+      </div>
+      <div class="item">
+        <div class="la">openId锛�</div>
+        <div class="val">{{ form.member.openid }}</div>
+      </div>
+    </div>
+    <div class="title">鍟嗗搧淇℃伅</div>
+    <el-table :data="[goods]" stripe border>
+      <el-table-column prop="name" min-width="100px" label="濂楅鍗�" show-overflow-tooltip align="center"></el-table-column>
+      <el-table-column prop="refundType" label="鏈夋晥鏈�" min-width="160px" align="center">
         <template slot-scope="{row}">
-          {{ typeToStr(row.refundType) }}
+          {{ row.useStartDate }} 鑷� {{ row.useEndDate }}
         </template>
       </el-table-column>
-      <el-table-column prop="money" label="浜ゆ槗閲戦(鍏�)" width="100px" align="center"></el-table-column>
-      <el-table-column prop="payWay" label="娓犻亾" width="100px" align="center">
+      <el-table-column label="鏁伴噺" width="80px" align="center">
         <template slot-scope="{row}">
-          {{ row.payWay==0? '寰俊' : '鏀粯瀹�' }}
+          <span>1</span>
         </template>
       </el-table-column>
-      <el-table-column prop="payDate" label="浜ゆ槗鏃堕棿" width="150px" align="center"></el-table-column>
-
+      <el-table-column prop="price" label="浠锋牸" width="100px" align="center"></el-table-column>
+      <el-table-column prop="payWay" label="鐘舵��" width="100px" align="center">
+        <template slot-scope="{row}">
+          {{ info.status == 1 ? '宸叉敮浠�' : '鏈敮浠�' }}
+        </template>
+      </el-table-column>
     </el-table>
-    <div class="title">楠戣璁板綍</div>
-    <el-table
-      :data="memberRidesList"
-      stripe
-      border
-    >
-      <el-table-column prop="openid" label="鐢ㄦ埛" width="250px" show-overflow-tooltip align="center"></el-table-column>
-      <el-table-column prop="bikeCode" label="杞﹁締缂栧彿" width="100px" align="center"></el-table-column>
-      <el-table-column prop="bikeType" label="杞︾被鍨�" width="200px" align="center"></el-table-column>
-      <el-table-column prop="rideTime" label="鍊熷嚭鏃堕暱(鍒�)" width="200px" align="center"></el-table-column>
-      <el-table-column prop="duration" label="璁¤垂鏃堕暱(鍒�)" width="200px" align="center"></el-table-column>
-      <el-table-column prop="bikeType" label="杞︾被鍨�" width="150px" align="center"></el-table-column>
-      <el-table-column prop="rentDate" label="鍊熷嚭鏃堕棿" width="150px" align="center"></el-table-column>
-      <el-table-column prop="backDate" label="杩樿溅鏃堕棿" width="150px" align="center"></el-table-column>
-      <el-table-column prop="closeStatus" fixed="right" label="缁撶畻鐘舵��" width="100px" align="center">
-        <template slot-scope="{row}">
-          {{ row.closeStatus == 0 ? '鏈粨绠�' : '宸茬粨绠�' }}
+    <div v-if="form.refundList && form.refundList.length > 0" class="title">閫�娆句俊鎭�</div>
+    <el-table v-if="form.refundList && form.refundList.length > 0" :data="form.refundList" stripe border>
+      <el-table-column prop="createDate" label="閫�娆炬椂闂�" min-width="180px" show-overflow-tooltip align="center"></el-table-column>
+      <el-table-column prop="money" label="閫�娆鹃噾棰�" min-width="100px" align="center"></el-table-column>
+      <el-table-column label="鐘舵��" min-width="100px" align="center">
+        <template v-slot="{row}">
+          <span v-if="row.status == 0">棰勯��娆�</span>
+          <span v-if="row.status == 1">閫�娆惧け璐�</span>
+          <span v-if="row.status == 2">閫�娆惧畬鎴�</span>
         </template>
       </el-table-column>
+      <el-table-column prop="reason" label="閫�娆惧娉�" min-width="100px" align="center"></el-table-column>
+      <el-table-column prop="creatorName" label="鎿嶄綔浜�" min-width="100px" align="center"></el-table-column>
     </el-table>
     <div slot="footer">
-      <el-button @click="visible=false">杩斿洖</el-button>
+      <el-button @click="visible = false">杩斿洖</el-button>
     </div>
   </GlobalWindow>
 </template>
@@ -52,12 +102,14 @@
   name: 'OperaSitesWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
-  data () {
+  data() {
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
-        goodsorderId: ''
+        member: {}
       },
+      info: {},
+      goods: {},
       list: [],
       memberRidesList: [],
       // 0缁撶畻閫�娆� 1寮哄埗缁撶畻閫�娆� 2缁撶畻鍚庨��娆� [99: 铏氭嫙type 鏀粯鎶奸噾]
@@ -78,7 +130,11 @@
       this.title = title
       this.visible = true
       // 鏂板缓
+      console.log('target', target)
+
       this.form = target
+      this.info = target.goodsOrder
+      this.goods = target.discountMember
       this.$nextTick(() => {
         this.list = target.payOrderDTOList
         this.memberRidesList = target.memberRidesList
@@ -86,7 +142,7 @@
       })
     },
     typeToStr(type) {
-      let temp = this.type.find(item => item.id == type )
+      let temp = this.type.find(item => item.id == type)
       return temp ? temp.label : '-'
     }
   },
@@ -94,7 +150,23 @@
 }
 </script>
 
-<style scoped>
+<style scoped lang="scss">
+.info_warp {
+  display: flex;
+  flex-wrap: wrap;
+  font-size: 14px;
+
+  .item {
+    display: flex;
+    width: 33.3%;
+    margin-bottom: 6px;
+
+    .val {
+      color: #666666;
+    }
+  }
+}
+
 .title {
   font-size: 18px;
   font-weight: 600;
diff --git a/admin/src/views/combo/components/Refund.vue b/admin/src/views/combo/components/Refund.vue
index 776030f..c619c90 100644
--- a/admin/src/views/combo/components/Refund.vue
+++ b/admin/src/views/combo/components/Refund.vue
@@ -72,7 +72,8 @@
         comboReDetailPost({ orderId: id }).then(res => {
           if (res) {
             this.form = res
-            this.form.backType = 0
+            // this.form.backType = 0
+            this.$set(this.form, 'backType', 0)
             this.form.orderId = id
           }
         })
diff --git a/admin/src/views/combo/components/SaleDetail.vue b/admin/src/views/combo/components/SaleDetail.vue
new file mode 100644
index 0000000..8fb3e0b
--- /dev/null
+++ b/admin/src/views/combo/components/SaleDetail.vue
@@ -0,0 +1,139 @@
+<template>
+  <GlobalWindow title="濂楅鍗¤鎯�" :visible.sync="isShowModal" width="1000px" @close="close" @confirm="close">
+    <div>
+      <div class="modal_title">濂楅鍚嶇О锛歿{ detail.name }}</div>
+      <div class="place">
+        <span>濂楅鍙凤細{{ detail.code }}</span>
+        <span v-if="detail.useType == 1">鏈夋晥鏈燂細{{ detail.useStartDate }}鑷硔{ detail.useEndDate }}</span>
+        <span v-if="detail.useType == 0">鏈夋晥鏈燂細{{ detail.useStartDate }}鑷硔{ detail.useEndDate }}</span>
+        <span v-if="detail.useType == 2">鏈夋晥鏈燂細{{ detail.useStartDate }}鑷硔{ detail.useEndDate }}</span>
+      </div>
+      <div class="df_ac">
+        <el-tabs style="flex: 1;" v-model="activeTab" @tab-click="handleClick">
+          <el-tab-pane label="濂楅浣跨敤鏄庣粏" name="0" />
+          <el-tab-pane label="濂楅鎿嶄綔璁板綍" name="2" />
+        </el-tabs>
+        <div style="border-bottom: 2px solid #e5e7ec; margin-top: 1px;">{{ activeTab == 0 ? '浣跨敤鎯呭喌' : '鎿嶄綔鎯呭喌' }}锛歿{ pagination.total }}娆�</div>
+      </div>
+      <el-table v-if="activeTab == 0" v-loading="loading" :data="list" stripe border>
+        <el-table-column prop="createDate" align="center" label="浣跨敤鏃堕棿" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="goodsorderId" align="center" label="鍏宠仈璁㈠崟" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="" align="center" label="楠戣溅鏃堕暱" min-width="80" show-overflow-tooltip>
+          <template v-slot="{ row }">
+            {{ row.rideTime }}鍒嗛挓
+          </template>
+        </el-table-column>
+        <el-table-column prop="ridePrice" align="center" label="鎶垫墸閲戦" min-width="100" show-overflow-tooltip />
+      </el-table>
+      <el-table v-if="activeTab == 2" v-loading="loading" :data="list" stripe border>
+        <el-table-column prop="createDate" align="center" label="鎿嶄綔鏃堕棿" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="info" align="center" label="鎿嶄綔绫诲瀷" min-width="100" show-overflow-tooltip>
+          <template v-slot="{ row }">
+           <span v-if="row.type == 0">鐢ㄦ埛楠戣浣跨敤</span>
+           <span v-if="row.type == 1">濂楅浣滃簾</span>
+           <span v-if="row.type == 2">濂楅璋冩暣</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="editInfo" align="center" label="鎿嶄綔澶囨敞" min-width="200" show-overflow-tooltip />
+        <el-table-column prop="creatorName" align="center" label="鎿嶄綔浜�" min-width="80" show-overflow-tooltip />
+      </el-table>
+      <div class="table_btns">
+        <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
+      </div>
+    </div>
+  </GlobalWindow>
+</template>
+<script>
+import { comboSalerDetailPost, discountLogLog } from '@/api/business/combo.js'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BasePageTemp from '@/components/base/BasePageTemp'
+export default {
+  name: 'ComboDetail',
+  extends: BasePageTemp,
+  components: {
+    GlobalWindow
+  },
+  data() {
+    return {
+      isShowModal: false,
+      activeTab: '0',
+      detail: {},
+      pagination: {
+        page: 1,
+        rows: 10
+      },
+      totalCount: 0,
+      list: [],
+      loading: false
+    }
+  },
+  created() {
+    // this.detail = this.$route.query
+    // this.comboDetail()
+  },
+  methods: {
+    getDetail(row) {
+      comboSalerDetailPost(row.id).then(res => {
+        this.detail = res
+        this.activeTab = '0'
+        this.getList()
+      }, () => {
+
+      })
+    },
+    handleClick(val) {
+      this.getList()
+    },
+    getList(page) {
+      const { pagination, activeTab, detail } = this
+      this.loading = true
+      if (page) { pagination.page = page }
+      discountLogLog({
+        model: {
+          type: activeTab,
+          discountMemberId: detail.id
+        },
+        capacity: pagination.pageSize,
+        page: pagination.page,
+      }).then(res => {
+        this.loading = false
+        this.list = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
+      })
+    },
+    close() {
+      this.isShowModal = false
+      this.$emit('close')
+    },
+    currentPageChange(val) {
+      this.pagination.page = val
+      this.comboDetail()
+    },
+    pageSizeChange(val) {
+      this.pagination.rows = val
+      this.comboDetail()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.modal_title {
+  font-size: 18px;
+  font-weight: 500;
+  margin-bottom: 6px;
+}
+
+.place {
+  color: #999999;
+  font-size: 13px;
+  display: flex;
+  margin-bottom: 8px;
+
+  span {
+    margin-right: 60px;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/admin/src/views/combo/index.vue b/admin/src/views/combo/index.vue
index d32263e..5951710 100644
--- a/admin/src/views/combo/index.vue
+++ b/admin/src/views/combo/index.vue
@@ -49,7 +49,7 @@
           <div>
             <span v-if="row.status == 0" @click="handleEdit(row, 'copy')" class="primaryColor pointer">澶嶅埗</span>
             <span v-if="row.status == 1" @click="handleEdit(row)" class="primaryColor pointer mr10">缂栬緫</span>
-            <span v-if="row.status == 1" @click="handleDetail(row)" class="red pointer">鍒犻櫎</span>
+            <span v-if="row.status == 1" @click="handleDel(row)" class="red pointer">鍒犻櫎</span>
           </div>
         </template>
       </el-table-column>
@@ -68,7 +68,7 @@
 import TableLayout from '@/layouts/TableLayout'
 import Edit from './components/Edit'
 import ComboDetail from './components/ComboDetail.vue'
-import { comboListPost, comboEditPost } from '@/api/business/combo.js'
+import { comboListPost, comboUpdatePost, comboDelPost } from '@/api/business/combo.js'
 import { Message } from 'element-ui'
 export default {
   extends: BasePageTemp,
@@ -130,12 +130,26 @@
       })
     },
     changeStatus(row) {
-      comboEditPost({ ...row }).then(res => {
+      comboUpdatePost({ ...row }).then(res => {
         if (res.code == 200) {
           return Message.success('鏇存柊鎴愬姛')
         }
       })
     },
+    handleDel(row) {
+      this.$confirm('鎮ㄧ‘璁よ鍒犻櫎褰撳墠濂楅鍚楋紵', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning',
+      }).then(() => {
+        comboDelPost(row.id).then(res => {
+          if (res) {
+            Message.success('鍒犻櫎鎴愬姛')
+            this.getList()
+          }
+        })
+      })
+    },
     handleEdit(row, type = 'edit') {
       this.isShowEdit = true
       this.$nextTick(() => {
diff --git a/admin/src/views/combo/order.vue b/admin/src/views/combo/order.vue
index 949d402..bee9272 100644
--- a/admin/src/views/combo/order.vue
+++ b/admin/src/views/combo/order.vue
@@ -6,7 +6,7 @@
       <el-button type="primary" @click="handleEx()">瀵煎嚭</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe border>
-      <el-table-column prop="code" align="center" label="璁㈠崟缂栧彿" min-width="180" show-overflow-tooltip>
+      <el-table-column prop="code" align="center" label="璁㈠崟缂栧彿" min-width="200" show-overflow-tooltip>
         <template scope="{row}">
           <span @click="handleDetail(row.id)" class="primaryColor pointer">{{ row.code }}</span>
         </template>
@@ -15,7 +15,7 @@
       <el-table-column prop="money" align="center" label="鍚堣(鍏�)" min-width="80" show-overflow-tooltip />
       <el-table-column prop="money" align="center" label="瀹炰粯(鍏�)" min-width="80" show-overflow-tooltip />
       <el-table-column prop="refundMoney" align="center" label="宸查��閲戦(鍏�)" min-width="100" show-overflow-tooltip />
-      <el-table-column prop="memberId" align="center" label="鐢ㄦ埛淇℃伅" min-width="140" show-overflow-tooltip />
+      <el-table-column prop="openid" align="center" label="鐢ㄦ埛淇℃伅" min-width="200" show-overflow-tooltip />
       <el-table-column prop="payWay" align="center" label="鏀粯鏂瑰紡" min-width="80" show-overflow-tooltip>
         <template v-slot="{ row }">
           <span v-if="row.payWay == 0">寰俊鏀粯</span>
@@ -27,12 +27,19 @@
           <span>灏忕▼搴忕</span>
         </template>
       </el-table-column>
+      <el-table-column prop="payWay" align="center" label="璁㈠崟鐘舵��" min-width="80" show-overflow-tooltip>
+        <template v-slot="{ row }">
+          <span v-if="row.status == 0">鏈敮浠�</span>
+          <span v-if="row.status == 1">宸叉敮浠�</span>
+        </template>
+      </el-table-column>
       <el-table-column prop="refundUserName" align="center" label="鎿嶄綔浜�" min-width="80" show-overflow-tooltip />
-      <el-table-column prop="createDate" align="center" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip />
-      <el-table-column label="鎿嶄綔" fixed="right" align="center" min-width="80" show-overflow-tooltip>
+      <el-table-column prop="createDate" align="center" label="鍒涘缓鏃堕棿" min-width="160" show-overflow-tooltip />
+      <el-table-column label="鎿嶄綔" fixed="right" align="center" min-width="120" show-overflow-tooltip>
         <template v-slot="{ row }">
           <span @click="handleDetail(row.id)" class="primaryColor pointer">鏌ョ湅璇︽儏</span>
-          <span v-if="row.status == 1 && (row.refundMoney < row.money)" @click="handRefund(row.id)" class="primaryColor pointer ml10">閫�娆�</span>
+          <span v-if="row.status == 1 && (row.refundMoney < row.money)" @click="handRefund(row.id)"
+            class="primaryColor pointer ml10">閫�娆�</span>
         </template>
       </el-table-column>
     </el-table>
@@ -55,6 +62,7 @@
   comboListOrderEx,
   comboOrderDetailPost
 } from '@/api/business/combo.js'
+import dayjs from 'dayjs'
 export default {
   extends: BasePageTemp,
   components: {
@@ -73,19 +81,22 @@
             label: '璁㈠崟缂栧彿',
           },
           {
-            filed: 'name',
+            filed: 'discountName',
             type: 'input',
             label: '濂楅鍗�',
             placeholder: '璇疯緭鍏ュ崱鍚嶇О',
           },
           {
-            filed: 'pay',
+            filed: 'payWay',
             type: 'select',
             label: '鏀粯鏂瑰紡',
-            options: []
+            options: [
+              { label: '寰俊', value: 0 },
+              { label: '鏀粯瀹�', value: 1 },
+            ]
           },
           {
-            filed: 'status',
+            filed: 'payStatus',
             type: 'select',
             label: '璁㈠崟鐘舵��',
             options: [
@@ -94,12 +105,12 @@
             ]
           },
           {
-            filed: 'time',
-            type: 'date',
+            filed: 'selDate',
+            type: 'daterange',
             label: '鏀粯鏃堕棿',
           },
           {
-            filed: 'username',
+            filed: 'openid',
             type: 'input',
             label: '鐢ㄦ埛淇℃伅',
           },
@@ -109,6 +120,8 @@
     }
   },
   created() {
+    let date = dayjs().format('YYYY-MM-DD')
+    this.$set(this.filters, 'selDate', [date, date])
     this.getList()
     // this.initData()
   },
@@ -117,22 +130,36 @@
       this.$refs.RefundRef.open(id)
     },
     handleDetail(id) {
-      comboOrderDetailPost({id})
+      comboOrderDetailPost({ id })
         .then(res => {
-          this.$refs.OrderDetailRef.open('璁㈠崟璇︽儏', res)
+          if (res) {
+            this.$refs.OrderDetailRef.open('璁㈠崟璇︽儏', res)
+          }
+
         })
         .catch(err => {
           this.$tip.apiFailed(err)
         })
     },
     handleEx() {
+      const { pagination, filters } = this
       this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵')
         .then(() => {
           this.loading = true
+          if (filters.selDate && filters.selDate.length > 0) {
+            filters.startDate = filters.selDate[0] + ' 00:00:00'
+            filters.endDate = filters.selDate[1] + ' 00:00:00'
+          } else {
+            filters.startDate = null
+            filters.endDate = null
+          }
           comboListOrderEx({
             page: 1,
             capacity: 1000000,
-            model: this.filters
+            model: {
+              ...filters,
+              type: 1
+            },
           })
             .then(response => {
               this.download(response)
@@ -154,6 +181,13 @@
     getList(page) {
       const { pagination, filters } = this
       this.loading = true
+      if (filters.selDate && filters.selDate.length > 0) {
+        filters.startDate = filters.selDate[0] + ' 00:00:00'
+        filters.endDate = filters.selDate[1] + ' 00:00:00'
+      } else {
+        filters.startDate = null
+        filters.endDate = null
+      }
       if (page) { pagination.page = page }
       comboOrderPost({
         model: {
diff --git a/admin/src/views/combo/record.vue b/admin/src/views/combo/record.vue
index a30b1b8..4333ac9 100644
--- a/admin/src/views/combo/record.vue
+++ b/admin/src/views/combo/record.vue
@@ -1,72 +1,49 @@
 <template>
   <div class="main_app">
     <Breadcrumb />
-    <QueryForm v-model="querys" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clearQueryForm">
-      <template #btns>
-        <el-button v-if="meta.indexOf('MealsUseDetailExport') > -1" type="primary"
-          @click="comboRecordExport">瀵煎嚭</el-button>
-      </template>
-      <template #indate>
-        <el-date-picker v-model="querys.indate" type="datetimerange" range-separator="鑷�" start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" class="w400"
-          :picker-options="pickerOptions" />
-      </template>
+    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clearQueryForm">
     </QueryForm>
     <div class="table_btns">
-      <el-button v-preventReClick plain type="primary" @click="handleEx">瀵煎嚭</el-button>
-      <el-button v-preventReClick plain type="danger" @click="openModal('zuofei')">浣滃簾</el-button>
-      <el-button v-preventReClick plain @click="openModal('tiaozheng')">濂楅璋冩暣</el-button>
+      <el-button plain type="primary" @click="handleEx">瀵煎嚭</el-button>
+      <el-button plain type="danger" @click="openModal('zuofei')">浣滃簾</el-button>
+      <el-button plain @click="openModal('tiaozheng')">濂楅璋冩暣</el-button>
     </div>
     <el-table v-loading="loading" :data="list" stripe border @selection-change="handleSelectionChange">
       <el-table-column fixed="left" align="center" type="selection" :selectable="handleDisable" width="55" />
-      <el-table-column align="center" label="濂楅绁ㄥ彿" width="300" show-overflow-tooltip>
+      <el-table-column align="center" label="濂楅绁ㄥ彿" min-width="160" show-overflow-tooltip>
         <template v-slot="scope">
           <span class="primaryColor pointer" @click="comboDetail(scope.row)">{{
-            scope.row.id
-            }}</span>
+            scope.row.code
+          }}</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" label="濂楅绫诲瀷" width="120">
+      <el-table-column align="center" label="濂楅绫诲瀷" min-width="80">
         <template v-slot="scope">
-          <span v-if="scope.row.mealsType === '0'">闂ㄧエ娆″崱</span>
-          <span v-if="scope.row.mealsType === '1'">闂ㄧエ鏈熼檺鍗�</span>
-          <span v-if="scope.row.mealsType === '2'">棰勫畾娆″崱</span>
-          <span v-if="scope.row.mealsType === '3'">璇剧▼棰勭害娆″崱</span>
-          <span v-if="scope.row.mealsType === '4'">璇剧▼鏈熼檺鍗�</span>
+          <span v-if="scope.row.type == '0'">鏈熼檺鍗�</span>
+          <span v-if="scope.row.type == '1'">娆″崱</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" label="濂楅鍚嶇О" show-overflow-tooltip width="160" prop="mealsName" />
-      <el-table-column align="center" label="鐢ㄦ埛淇℃伅" min-width="240" prop="memberInfo" show-overflow-tooltip />
-      <el-table-column align="center" label="浣跨敤娆℃暟" width="80" prop="useCount">
+      <el-table-column align="center" label="濂楅鍚嶇О" show-overflow-tooltip min-width="100" prop="name" />
+      <el-table-column align="center" label="鐢ㄦ埛淇℃伅" min-width="100" prop="openid" show-overflow-tooltip />
+      <el-table-column align="center" label="浣跨敤娆℃暟" min-width="80" prop="useTimes">
+      </el-table-column>
+      <el-table-column align="center" label="鏈夋晥鏃ユ湡" min-width="200" prop="remainCount">
         <template v-slot="scope">
-          <span v-if="scope.row.mealsType === '1'">-</span>
-          <span v-else>{{ scope.row.useCount }}</span>
+          <span>{{ scope.row.useStartDate }}鑷硔{ scope.row.useEndDate }}</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" label="鏈夋晥鏃ユ湡" width="80" prop="remainCount">
+      <el-table-column align="center" label="濂楅鐘舵��" min-width="80">
         <template v-slot="scope">
-          <span v-if="scope.row.mealsType === '1'">-</span>
-          <span v-else>{{ scope.row.remainCount }}</span>
+          <span v-if="scope.row.status == '0'" class="text_success">姝e父</span>
+          <span v-if="scope.row.status == '1'" class="text_warning">浣滃簾</span>
+          <span v-if="scope.row.status == '2'" class="text-danger">寰呮敮浠�</span>
         </template>
       </el-table-column>
-      <el-table-column fixed="right" align="center" label="濂楅鐘舵��" width="80">
-        <template v-slot="scope">
-          <span v-if="scope.row.status === '0'" class="text_success">姝e父</span>
-          <span v-if="scope.row.status === '1'" class="text_warning">鍐荤粨</span>
-          <span v-if="scope.row.status === '2'" class="text-danger">浣滃簾</span>
-          <span v-if="scope.row.status === '3'" class="text-danger">澶辨晥</span>
-        </template>
-      </el-table-column>
-      <el-table-column align="center" label="鏈夋晥鏃ユ湡" width="120" prop="validTime" />
-      <el-table-column align="center" label="鎿嶄綔" fixed="right" width="150">
+      <el-table-column align="center" label="鎿嶄綔" fixed="right" min-width="150">
         <template v-slot="scope">
           <template>
-            <el-button v-if="
-              meta.indexOf('MealsMemberPartRefund') > -1 &&
-              (scope.row.status == '0' || scope.row.status == '1')
-            " type="text" @click="rowClickRefund(scope.row)">閫�娆�</el-button>
-            <el-button v-if="scope.row.status == '0'" type="text"
-              @click="getServiceChargePriceBtn('2', scope.row.id)">鍐荤粨</el-button>
+            <el-button v-if="scope.row.status == '0'" type="text" @click="openCan(scope.row)">浣滃簾</el-button>
+            <span v-else>-</span>
           </template>
         </template>
       </el-table-column>
@@ -78,14 +55,14 @@
     <el-dialog title="濂楅璋冩暣" :visible.sync="isShowAdjust" width="500px">
       <div class="adjust_modal">
         <div style="margin-top: -30px; margin-bottom: 10px;">
-          <el-radio v-model="adjustData.aa" label="1">宸查�夊綋鍓�2鏉℃暟鎹�</el-radio>
+          <el-radio v-model="adjustData.flag" label="0">宸查�墈{ selList.length }}鏉℃暟鎹�</el-radio>
         </div>
         <div style="margin-bottom: 16px;">
-          <el-radio v-model="adjustData.aa" label="1">宸查�夌幇鏈夌瓫閫夋潯浠朵笅鍏ㄩ儴鐨�11鏉℃暟鎹�</el-radio>
+          <el-radio v-model="adjustData.flag" label="1">閫夌幇鏈夌瓫閫夋潯浠朵笅鍏ㄩ儴鐨剓{ pagination.total }}鏉℃暟鎹�</el-radio>
         </div>
         <div class="df_ac mb5">
           <span class="key">鏈夋晥鏈熷鍔狅細</span>
-          <el-input v-model="adjustData.addTime" oninput="value=value.replace(/[^\d]/g,'')" class="flex1 mr10" />
+          <el-input v-model="adjustData.addNum" oninput="value=value.replace(/[^\d]/g,'')" class="flex1 mr10" />
           <span>澶�</span>
         </div>
         <div class="df_ac mb20">
@@ -99,26 +76,43 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="isShowAdjust = false">鍙栨秷</el-button>
-        <el-button v-preventReClick type="primary" :loading="subLoading" @click="handleModelEnter">纭畾</el-button>
+        <el-button type="primary" :loading="subLoading" @click="handleModelEnter">纭畾</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog title="濂楅浣滃簾" :visible.sync="isShowCan" width="500px">
+      <div class="adjust_modal" style="margin-top: -30px;">
+        <div class="red" style="font-size: 16px;">纭畾浣滃簾閫変腑濂楅鍚楋紵浣滃簾鍚庯紝濂楅涓嶅彲浣跨敤</div>
+        <div class="df_ac mt10">
+          <el-input type="textarea" v-model="remarkCan" placeholder="璇锋寜瑕佹眰杈撳叆澶囨敞璇存槑锛岄潪蹇呭~" />
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowCan = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="subLoading" @click="handleCan">纭畾</el-button>
       </span>
     </el-dialog>
 
     <Refund v-if="isShowRefund" ref="RefundRef" @close="isShowRefund = false" @success="refundSuccess" />
     <Detail v-if="isShowDetail" ref="detailRef" />
-    <orderDialog ref="child" @orderSuccess="getList()" />
+    <Detail ref="DetailRef" />
   </div>
 </template>
 
 <script>
-import { pickerOptions } from './components/config'
 import BasePageTemp from '@/components/base/BasePageTemp'
 import Breadcrumb from '@/layouts/Breadcrumb'
-// import Detail from '../comboDetail'
-// import Refund from './refund.vue'
+import Detail from './components/SaleDetail.vue'
+import { Message } from 'element-ui'
+import {
+  comboSalePage,
+  comboSaleEx,
+  comboSaleCancel,
+  comboSaleAdjust,
+} from '@/api/business/combo.js'
 export default {
   name: 'SalesRecord',
   extends: BasePageTemp,
-  components: { Breadcrumb },
+  components: { Breadcrumb, Detail },
   data() {
     return {
       exportLoading: false,
@@ -126,19 +120,19 @@
       isShowRefund: false,
       queryFormConfig: {
         formItems: [{
-          filed: 'id',
+          filed: 'code',
           type: 'input',
           label: '濂楅绁ㄥ彿',
           placeholder: '璇疯緭鍏ュ椁愬彿',
           clearable: true
         }, {
-          filed: 'mealsName',
+          filed: 'name',
           type: 'input',
           label: '濂楅鍚嶇О',
           placeholder: '璇疯緭鍏ュ椁愬悕绉�',
           clearable: true
         }, {
-          filed: 'memberSearchValue',
+          filed: 'openid',
           type: 'input',
           label: '鐢ㄦ埛淇℃伅',
           clearable: true
@@ -150,13 +144,12 @@
           clearable: true,
           options: [
             { value: '0', label: '姝e父' },
-            { value: '1', label: '鍐荤粨' },
-            { value: '2', label: '浣滃簾' },
-            { value: '3', label: '澶辨晥' }]
+            { value: '1', label: '浣滃簾' },
+            // { value: '2', label: '寰呮敮浠�' }
+          ]
         }],
         online: true
       },
-      pickerOptions,
       querys: {
         id: '',
         mealsName: '',
@@ -167,17 +160,21 @@
 
       saleRecordList: [],
       saleRecordTotal: 0,
-      selectSalesList: [],
+      selList: [],
       saleRecordLoading: false,
       subLoading: false,
 
-      isShowModal: false,
+      isShowCan: false,
       ModalTitle: '',
       ModalText: '',
       ModelRemark: '',
+      remarkCan: '',
       // 猬囷笍adjust璋冩暣鐩稿叧
       isShowAdjust: false,
+      isShowCan: false,
+      canList: [],
       adjustData: {
+        flag: 0,
         addNum: '',
         addTime: ''
       },
@@ -187,7 +184,7 @@
   },
   created() {
     // this.meta = this.$route.meta.buttons || []
-    // this.getList(1)
+    this.getList(1)
   },
   methods: {
     rowClickRefund(row) {
@@ -201,106 +198,67 @@
       this.isShowRefund = false
       this.getList()
     },
-    getServiceChargePriceBtn(type, mealsMemberId) {
-      this.serviceChargeId = mealsMemberId
-      getServiceChargePrice({
-        param: {
-          type,
-          mealsMemberId
-        }
-      }).then((res) => {
-        if (res.errorCode === '000000') {
-          this.serviceChargePrice = res.record.price
-          this.openModal('dongjie')
-        }
-      })
+    handleEx() {
+      const { pagination, filters } = this
+      this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵')
+        .then(() => {
+          this.loading = true
+          comboSaleEx({
+            page: 1,
+            capacity: 1000000,
+            model: filters
+          })
+            .then(response => {
+              this.download(response)
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
+        })
         .catch(() => { })
     },
-    handleEx() {
-      const { querys } = this
-      this.exportLoading = true
-      recordExport({
-        param: {
-          ...querys
-        }
-      }).then((res) => {
-        this.exportLoading = false
-        if (res.errorCode === '000000') {
-          const a = document.createElement('a') // 鍒涘缓涓�涓猘鏍囩鍏冪礌
-          a.style.display = 'none' // 璁剧疆鍏冪礌涓嶅彲瑙�
-          a.href = res.record.showUrl // 璁剧疆涓嬭浇鍦板潃
-          document.body.appendChild(a) // 鍔犲叆
-          a.click() // 瑙﹀彂鐐瑰嚮,涓嬭浇
-          document.body.removeChild(a) //
-          this.$message.success('瀵煎嚭鎴愬姛')
-        }
-      })
-        .catch(() => {
-          this.exportLoading = false
-        })
+    openCan(row) {
+      this.isShowCan = true
+      this.canList = [row]
     },
-    handleDisable(row, index) {
-      if (row.status === '2') {
-        return false
-      } else {
-        return true
-      }
+    handleDisable(row) {
+      // return row.status == 0
+      return true
     },
     // 鏌ヨ琛ㄦ牸鏁版嵁
     getList(page) {
-      const { querys, pagination } = this
-      if (page) {
-        pagination.page = page
-        this.pagination.page = Number(page)
-      }
-      if (querys.indate && querys.indate.length > 0) {
-        querys.startTime = querys.indate[0]
-        querys.endTime = querys.indate[1]
-      } else {
-        querys.startTime = null
-        querys.endTime = null
-      }
-      pagination.firstQueryTime = parseTime(new Date())
-      this.saleRecordLoading = true
-      comboSalesRecordPost({
-        pagination, param: {
-          ...querys,
-          venueId: sessionStorage.getItem('venueId')
-        }
+      const { pagination, filters } = this
+      this.loading = true
+      if (page) { pagination.page = page }
+      comboSalePage({
+        model: {
+          ...filters
+        },
+        capacity: pagination.pageSize,
+        page: pagination.page,
       }).then(res => {
-        this.saleRecordLoading = false
-        if (res.errorCode === '000000') {
-          this.saleRecordLoading = false
-          this.saleRecordTotal = res.totalCount
-          this.saleRecordList = res.recordList
-          if (res.totalCount && res.recordList.length === 0 && pagination.page > 1) {
-            this.getList(Math.ceil(res.totalCount / pagination.rows))
-          }
-        }
-      }).catch(() => {
-        this.saleRecordLoading = false
+        this.loading = false
+        this.list = res.records || []
+        this.pagination.total = res.total || 0
+      }, () => {
+        this.loading = false
       })
     },
     clearQueryForm() {
       // eslint-disable-next-line no-unused-vars
-      this.querys = {}
+      this.filters = {}
       this.getList(1)
     },
     // 鎵撳紑modal 鍐荤粨 瑙e喕 浣滃簾
     openModal(type) {
-      const { selectSalesList } = this
+      const { selList } = this
       this.ModelRemark = ''
       this.adjustData.addNum = ''
       this.adjustData.addTime = ''
       switch (type) {
-        case 'dongjie':
-          this.ModalTitle = '濂楅鍐荤粨'
-          this.ModalText = '纭畾鍐荤粨閫変腑濂楅鍚楋紵鍐荤粨鍚庯紝濂楅灏嗘棤娉曚娇鐢�'
-          break
-        case 'jiedong':
-          this.ModalTitle = '濂楅瑙e喕'
-          this.ModalText = '纭畾瑙e喕閫変腑濂楅鍚楋紵瑙e喕鍚庯紝濂楅鍙珛鍗崇敓鏁堜娇鐢�'
-          break
         case 'zuofei':
           this.ModalTitle = '濂楅浣滃簾'
           this.ModalText = '纭畾浣滃簾閫変腑濂楅鍚楋紵浣滃簾鍚庯紝濂楅涓嶅彲浣跨敤'
@@ -311,28 +269,21 @@
         default:
           break
       }
-      if (selectSalesList.length === 0 && type !== 'dongjie') {
-        return this.$message.warning(`璇峰厛閫夋嫨瑕�${this.ModalTitle.slice(2)}鐨勫椁恅)
+      if (selList.length === 0 && type == 'zuofei') {
+        return Message.warning(`璇峰厛閫夋嫨瑕�${this.ModalTitle.slice(2)}鐨勫椁恅)
       }
       if (this.ModalTitle === '濂楅璋冩暣') {
         this.isShowAdjust = true
+        this.adjustData = {
+          flag: '0'
+        }
       } else {
-        this.isShowModal = true
+        this.isShowCan = true
       }
     },
     // 纭畾 鍐荤粨 瑙e喕 浣滃簾
     handleModelEnter() {
-      // if (!this.ModelRemark) {
-      //   this.$message.warning('鎿嶄綔澶囨敞蹇呭~')
-      //   return
-      // }
       switch (this.ModalTitle) {
-        case '濂楅鍐荤粨':
-          this.Freeze()
-          break
-        case '濂楅瑙e喕':
-          this.Unfreeze()
-          break
         case '濂楅浣滃簾':
           this.cancellation()
           break
@@ -343,92 +294,27 @@
           break
       }
     },
-    // 鍐荤粨
-    Freeze() {
-      const that = this
-      const data = {
-        type: '1',
-        handleRemake: this.ModelRemark,
-        isCreateOrder: '1',
-        id: this.serviceChargeId
-      }
-      this.subLoading = true
-      handleComboSalesPost({ param: { ...data } }).then(res => {
-        this.subLoading = false
-        this.isShowModal = false
-        if (res.errorCode === '000000') {
-          const obj = res.record
-          if (obj && obj.price) {
-            obj.goodsInfos = obj.serviceChargeOrderInfo
-            obj.allPrice = obj.price
-            this.$refs.child.continuePay(obj, 'handlingFees')
-          } else {
-            this.$message.success('鍐荤粨鎴愬姛')
-            this.getList()
-          }
-          //
-        } else if (res.errorCode === '200001') {
-          this.$confirm('瀛樺湪鏈鐞嗚鍗�, 鏄惁璺宠浆?', '鎻愮ず', {
-            confirmButtonText: '纭畾',
-            cancelButtonText: '鍙栨秷',
-            type: 'warning',
-            callback: () => { },
-            beforeClose: (action, ctx, close) => {
-              if (action !== 'confirm') {
-                close()
-                return
-              }
-              ctx.confirmButtonLoading = true
-              that.$router.push({ name: 'HandlingFees' })
-            }
-          }).finally(() => {
-            this.subLoading = false
-            this.isShowModal = false
-          })
-        }
-      })
-    },
-    // 瑙e喕
-    async Unfreeze() {
-      const data = {
-        type: '2',
-        handleRemake: this.ModelRemark,
-        id: this.selectSalesList.map(i => i.id).join(',')
-      }
-      this.subLoading = true
-      const res = await handleComboSalesPost({ param: { ...data } }).catch(() => {
-        this.subLoading = false
-        this.isShowModal = false
-      })
-      this.subLoading = false
-      this.isShowModal = false
-      if (res && res.errorCode === '000000') {
-        this.$message.success('瑙e喕鎴愬姛')
-        this.getList()
-      }
-    },
     // 璋冩暣
     async handleAdjust() {
       if (!this.adjustData.addNum && !this.adjustData.addTime) {
-        return this.$message.warning('璇疯緭鍏ヨ璋冩暣鐨勬湁鏁堟湡澶╂暟鎴栬�呬綑閲忔鏁�')
+        return Message.warning('璇疯緭鍏ヨ璋冩暣鐨勬湁鏁堟湡澶╂暟鎴栬�呬綑閲忔鏁�')
       }
       const data = {
-        type: '3',
-        handleRemake: this.ModelRemark,
-        addNum: this.adjustData.addNum || 0,
-        addTime: this.adjustData.addTime || 0,
-        id: this.selectSalesList.map(i => i.id).join(',')
+        info: this.ModelRemark,
+        addDays: this.adjustData.addNum || 0,
+        choseIdList: this.adjustData.flag == 0 ? this.selList.map(i => i.id) : [],
+        ...this.filters
       }
 
       this.subLoading = true
-      const res = await handleComboSalesPost({ param: { ...data } }).catch(() => {
+      const res = await comboSaleAdjust({ ...data }).catch(() => {
         this.subLoading = false
-        this.isShowModal = false
+        this.isShowCan = false
       })
       this.subLoading = false
-      this.isShowModal = false
-      if (res && res.errorCode === '000000') {
-        this.$message.success('濂楅璋冩暣鎴愬姛')
+      this.isShowCan = false
+      if (res) {
+        Message.success('濂楅璋冩暣鎴愬姛')
         this.getList()
         this.isShowAdjust = false
       }
@@ -436,36 +322,46 @@
     // 浣滃簾
     async cancellation() {
       const data = {
-        type: '4',
-        handleRemake: this.ModelRemark,
-        id: this.selectSalesList.map(i => i.id).join(',')
+        handleRemake: this.remarkCan,
+        choseIdList: this.selList.map(i => i.id)
       }
       this.subLoading = true
-      const res = await handleComboSalesPost({ param: { ...data } }).catch(() => {
+      const res = await comboSaleCancel({ ...data }).catch(() => {
         this.subLoading = false
-        this.isShowModal = false
+        this.isShowCan = false
       })
       this.subLoading = false
-      this.isShowModal = false
-      if (res && res.errorCode === '000000') {
-        this.$message.success('浣滃簾鎴愬姛')
+      this.isShowCan = false
+      if (res) {
+        Message.success('浣滃簾鎴愬姛')
+        this.getList()
+      }
+    },
+    async handleCan() {
+      const data = {
+        handleRemake: this.remarkCan,
+        choseIdList: this.canList.map(i => i.id)
+      }
+      this.subLoading = true
+      const res = await comboSaleCancel({ ...data }).catch(() => {
+        this.subLoading = false
+        this.isShowCan = false
+      })
+      this.subLoading = false
+      this.isShowCan = false
+      if (res) {
+        Message.success('浣滃簾鎴愬姛')
         this.getList()
       }
     },
     handleSelectionChange(val) {
-      this.selectSalesList = val
+      this.selList = val
     },
     comboDetail(item) {
-      this.isShowDetail = true
       this.$nextTick(() => {
-        this.$refs.detailRef.isShowModal = true
-        this.$refs.detailRef.comboDetail(item)
+        this.$refs.DetailRef.isShowModal = true
+        this.$refs.DetailRef.getDetail(item)
       })
-
-      // this.$router.push({
-      //   name: 'comboDetail',
-      //   query: item
-      // })
     },
     pageSizeChange(val) {
       this.pagination.rows = val
@@ -484,9 +380,9 @@
       text-align: right;
     }
   }
-  .el-dialog__body{
-    
-  }
+
+  .el-dialog__body {}
+
   .text_warning {
     color: #e89e42;
   }
diff --git a/server/jtt808_parent/jtt808-protocol/src/test/java/org/yzh/protocol/TestHex.java b/server/jtt808_parent/jtt808-protocol/src/test/java/org/yzh/protocol/TestHex.java
index 167a3fb..0fb87d4 100644
--- a/server/jtt808_parent/jtt808-protocol/src/test/java/org/yzh/protocol/TestHex.java
+++ b/server/jtt808_parent/jtt808-protocol/src/test/java/org/yzh/protocol/TestHex.java
@@ -18,23 +18,23 @@
  */
 public class TestHex {
 
-    @Test
-    public void testHex() throws Exception {
-        try (BufferedReader reader = reader("target/test-classes/JT808.txt")) {
-            reader.lines().filter(hex -> !hex.isEmpty()).forEach(hex -> BeanTest.selfCheck(hex));
-        }
-    }
+//    @Test
+//    public void testHex() throws Exception {
+//        try (BufferedReader reader = reader("target/test-classes/JT808.txt")) {
+//            reader.lines().filter(hex -> !hex.isEmpty()).forEach(hex -> BeanTest.selfCheck(hex));
+//        }
+//    }
 
-    @Test
-    public void testSubpackage() throws Exception {
-        try (BufferedReader reader = reader("target/test-classes/JT1078.txt")) {
-            reader.lines().filter(hex -> !hex.isEmpty()).forEach(hex -> {
-                JTMessage message = BeanTest.coder.decode(Unpooled.wrappedBuffer(ByteBufUtil.decodeHexDump(hex)));
-                if (message != null)
-                    System.out.println(BeanTest.gson.toJson(message));
-            });
-        }
-    }
+//    @Test
+//    public void testSubpackage() throws Exception {
+//        try (BufferedReader reader = reader("target/test-classes/JT1078.txt")) {
+//            reader.lines().filter(hex -> !hex.isEmpty()).forEach(hex -> {
+//                JTMessage message = BeanTest.coder.decode(Unpooled.wrappedBuffer(ByteBufUtil.decodeHexDump(hex)));
+//                if (message != null)
+//                    System.out.println(BeanTest.gson.toJson(message));
+//            });
+//        }
+//    }
 
     public static BufferedReader reader(String path) throws FileNotFoundException {
         return new BufferedReader(new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8));
diff --git a/server/platform/src/main/java/com/doumee/api/business/DiscountController.java b/server/platform/src/main/java/com/doumee/api/business/DiscountController.java
index 5da9753..613739f 100644
--- a/server/platform/src/main/java/com/doumee/api/business/DiscountController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/DiscountController.java
@@ -67,6 +67,17 @@
         return ApiResponse.success(null);
     }
 
+    @ApiOperation("淇敼鐘舵��")
+    @PostMapping("/updStatus")
+    @RequiresPermissions("business:discount:update")
+    public ApiResponse updStatus(@RequestBody Discount discount) {
+        discountService.updStatus(discount);
+        return ApiResponse.success(null);
+    }
+
+
+
+
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @RequiresPermissions("business:discount:query")
diff --git a/server/platform/src/main/java/com/doumee/api/business/DiscountMemberController.java b/server/platform/src/main/java/com/doumee/api/business/DiscountMemberController.java
index 26f53d2..581578e 100644
--- a/server/platform/src/main/java/com/doumee/api/business/DiscountMemberController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/DiscountMemberController.java
@@ -85,7 +85,7 @@
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @RequiresPermissions("business:discountmember:query")
-    public ApiResponse findById(@PathVariable String id) {
+    public ApiResponse<DiscountMember> findById(@PathVariable String id) {
         return ApiResponse.success(discountMemberService.getDetail(id));
     }
 
diff --git a/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java b/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java
index 7f564cc..f27e18d 100644
--- a/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java
@@ -32,6 +32,7 @@
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author 姹熻箘韫�
@@ -92,6 +93,7 @@
     public ApiResponse<PageData<Goodsorder>> findPage (@RequestBody PageWrap<Goodsorder> pageWrap) {
         return ApiResponse.success(goodsorderService.findPage(pageWrap));
     }
+
     @ApiOperation("绾夸笂浜ゆ槗姹囨�绘暟鎹帴鍙�")
     @PostMapping("/getTotalData")
     @RequiresPermissions("business:goodsorder:query")
@@ -118,7 +120,8 @@
         for (Goodsorder goodsorder:goodsorders) {
             DiscountGoodsorderExportVO discountGoodsorderExportVO = new DiscountGoodsorderExportVO();
             BeanUtils.copyProperties(goodsorder,discountGoodsorderExportVO);
-            discountGoodsorderExportVO.setPayMoney(discountGoodsorderExportVO.getPayMoney());
+            discountGoodsorderExportVO.setPayMoney(discountGoodsorderExportVO.getMoney());
+            discountGoodsorderExportVO.setOrigin(Constants.ZERO);
             discountGoodsorderExportVOList.add(discountGoodsorderExportVO);
         }
         ExcelExporter.build(DiscountGoodsorderExportVO.class).exportWithFirstAndEnd(discountGoodsorderExportVOList, "璁㈠崟鍒楄〃_"+System.currentTimeMillis(),"璁㈠崟鍒楄〃_"+ DateUtil.getPlusTime2(DateUtil.getCurrentDate()),null, response);
@@ -170,6 +173,9 @@
     @PostMapping("/backGoodsorder")
     @RequiresPermissions("business:goodsorder:query")
     public ApiResponse backGoodsorder(@RequestBody GoodsorderBackDTO goodsorderBackDTO){
+        if(Objects.nonNull(goodsorderBackDTO) && Objects.isNull(goodsorderBackDTO.getBackType())){
+            goodsorderBackDTO.setBackType(Constants.ONE);
+        }
         goodsorderService.backGoodsorder(goodsorderBackDTO);
         return ApiResponse.success(null);
     }
diff --git a/server/platform/src/main/java/com/doumee/task/ScheduleTool.java b/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
index 4682063..e755ee9 100644
--- a/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
+++ b/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -98,6 +98,18 @@
 
 
     /**
+     * 瀹氭椂鍏抽棴 瓒呮椂鏈敮浠樼殑璁㈠崟
+     * 30 绉掑埛鏂颁竴娆�
+     * @throws Exception
+     */
+    @Scheduled(cron = "0/15 * * * * ? ")
+    public void autCancel() throws Exception {
+        log.info("=====================寮�濮嬪畾鏃跺埛鏂板叧闂秴鏃舵湭鏀粯鐨勮鍗�=======================");
+        goodsorderService.autCancel();
+        log.info("=====================缁撴潫瀹氭椂鍒锋柊鍏抽棴瓒呮椂鏈敮浠樼殑璁㈠崟=======================");
+    }
+
+    /**
      * 绔欑偣杞﹁締婊℃灦鐜囬璀�
      * @throws Exception
      */
diff --git a/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java b/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
index 6d9c460..c11eb84 100644
--- a/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -38,7 +38,7 @@
     public void updateById(SystemDictData systemDictData) {
         SystemDictData queryDto = new SystemDictData();
         queryDto.setDictId(systemDictData.getDictId());
-        queryDto.setCode(systemDictData.getCode());
+        queryDto.setLabel(systemDictData.getLabel());
         queryDto.setDeleted(Constants.ZERO);
         SystemDictData dictData = systemDictDataService.findOne(queryDto);
         if (dictData != null && !dictData.getId().equals(systemDictData.getId())) {
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index fdca607..be8dae9 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -126,7 +126,7 @@
 
         PLATFORM_REFUND(3,"骞冲彴閫�娆�", "骞冲彴閫�娆�"),
 
-        DISCOUNT(4,"骞冲彴濂楅", "骞冲彴濂楅")
+        DISCOUNT(4,"濂楅璐拱", "濂楅璐拱")
 
         ;
         String name;
@@ -207,6 +207,9 @@
         public static final String LEASE_NOTICE_URL = "LEASE_NOTICE_URL";
         //鎶奸噾
         public static final String RENT_DEPOSIT = "RENT_DEPOSIT";
+        //鐢佃溅涓村仠鑷姩鍏抽攣鏃堕暱锛堝垎閽燂級
+        public static final String PAUSE_AUTO_CLOSE_TIME = "PAUSE_AUTO_CLOSE_TIME";
+
         //娓╅Θ鎻愮ず
         public static final String TIPS = "TIPS";
         //娓╅Θ鎻愮ず
diff --git a/server/services/src/main/java/com/doumee/core/utils/DateUtil.java b/server/services/src/main/java/com/doumee/core/utils/DateUtil.java
index 575ab4e..ca3082d 100644
--- a/server/services/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/server/services/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -68,11 +68,28 @@
         return dt1;
     }
 
+
+
+    public static Date StringToDateFormat(String DATE,String format) {
+        if(StringUtils.isBlank(DATE)){
+            return null;
+        }
+        DateFormat df = new SimpleDateFormat(format);
+        Date dt1 = null;
+        try {
+            dt1 = df.parse(DATE);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return dt1;
+    }
+
+
     public static String getXDaysAfter(Date date, Integer days){
         Timestamp currentTimestamp = new Timestamp(date.getTime());
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(currentTimestamp);
-        calendar.add(Calendar.DAY_OF_YEAR, days-1); // 鍦ㄥ綋鍓嶆椂闂村熀纭�涓婃坊鍔犳寚瀹氱殑澶╂暟
+        calendar.add(Calendar.DAY_OF_YEAR, days); // 鍦ㄥ綋鍓嶆椂闂村熀纭�涓婃坊鍔犳寚瀹氱殑澶╂暟
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
         return formatter.format(calendar.getTime());
     }
@@ -2771,7 +2788,7 @@
 
     public static void main(String[] args) {
         try {
-            System.out.println(DateUtil.getBetweenDays("2025-02-13","2025-02-15"));
+            System.out.println(DateUtil.getCurrDate());
         } catch (Exception ex) {
             ex.printStackTrace();
         }
diff --git a/server/services/src/main/java/com/doumee/core/wx/SendWxMessage.java b/server/services/src/main/java/com/doumee/core/wx/SendWxMessage.java
index fecd6b6..2a42d95 100644
--- a/server/services/src/main/java/com/doumee/core/wx/SendWxMessage.java
+++ b/server/services/src/main/java/com/doumee/core/wx/SendWxMessage.java
@@ -44,9 +44,9 @@
         Map<String, TemplateData> m = new HashMap<>(4);
         m.put("character_string1", new TemplateData(bikeCode));
         //瑙i攣鏃堕棿
-        m.put("date3", new TemplateData(DateUtil.getDate(startTime,"yyyy-MM-dd HH:mm")));
+        m.put("date3", new TemplateData(DateUtil.getFomartDate(startTime,"yyyy/MM/dd HH:mm")));
         //涓婇攣鏃堕棿
-        m.put("date4", new TemplateData(DateUtil.getDate(endTime,"yyyy-MM-dd HH:mm")));
+        m.put("date4", new TemplateData(DateUtil.getFomartDate(endTime,"yyyy/MM/dd HH:mm")));
         //娓╅Θ鎻愰啋
         m.put("thing5", new TemplateData("涓存椂閿佽溅宸茶秴杩囨渶澶ф椂闀匡紝宸茶嚜鍔ㄨ繕杞�"));
         wxMsgVo.setPage(goodsOrderUrl + goodsOrderId);
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Discount.java b/server/services/src/main/java/com/doumee/dao/business/model/Discount.java
index 722c77f..45eb9a3 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Discount.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Discount.java
@@ -28,7 +28,7 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鍒涘缓浜�")
@@ -37,7 +37,7 @@
 
     @ApiModelProperty(value = "缂栬緫鏃堕棿")
     @ExcelColumn(name="缂栬緫鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date editDate;
 
     @ApiModelProperty(value = "缂栬緫浜�")
@@ -160,7 +160,18 @@
     @ApiModelProperty(value = "姣忔棩鍗曚环", example = "1")
     private BigDecimal dayPrice;
 
+    @ApiModelProperty(value = "灏忕▼搴忔煡璇娇鐢�", hidden = true)
+    @TableField(exist = false)
+    private Integer minShow;
 
+    @ApiModelProperty(value = "鍒涘缓浜哄悕绉�")
+    @TableField(exist = false)
+    private String creatorName;
+
+
+    @ApiModelProperty(value = "鏈�鍚庣紪杈戜汉")
+    @TableField(exist = false)
+    private String editorName;
 
     @TableField(exist = false)
     @ApiModelProperty(value = "鍥剧墖鍏ㄨ矾寰�", example = "1")
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/DiscountLog.java b/server/services/src/main/java/com/doumee/dao/business/model/DiscountLog.java
index 5de1fdd..c47be07 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/DiscountLog.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/DiscountLog.java
@@ -28,7 +28,7 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鍒涘缓浜�")
@@ -37,7 +37,7 @@
 
     @ApiModelProperty(value = "缂栬緫鏃堕棿")
     @ExcelColumn(name="缂栬緫鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date editDate;
 
     @ApiModelProperty(value = "缂栬緫浜�")
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/DiscountMember.java b/server/services/src/main/java/com/doumee/dao/business/model/DiscountMember.java
index f81fa77..ac0e439 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/DiscountMember.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/DiscountMember.java
@@ -27,14 +27,14 @@
     private String id;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鍒涘缓浜�")
     private String creator;
 
     @ApiModelProperty(value = "缂栬緫鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date editDate;
 
     @ApiModelProperty(value = "缂栬緫浜�")
diff --git a/server/services/src/main/java/com/doumee/dao/business/vo/DiscountGoodsorderExportVO.java b/server/services/src/main/java/com/doumee/dao/business/vo/DiscountGoodsorderExportVO.java
index 72855ff..a78efb6 100644
--- a/server/services/src/main/java/com/doumee/dao/business/vo/DiscountGoodsorderExportVO.java
+++ b/server/services/src/main/java/com/doumee/dao/business/vo/DiscountGoodsorderExportVO.java
@@ -45,11 +45,11 @@
     private String openid;
 
     @ApiModelProperty(value = "鏀粯鏂瑰紡 0寰俊 1鏀粯瀹�")
-    @ExcelColumn(name="鏀粯鏂瑰紡",index = 7 ,width = 10,valueMapping = "0=寰俊锛�1=鏀粯瀹濓紱",align = HorizontalAlignment.CENTER)
+    @ExcelColumn(name="鏀粯鏂瑰紡",index = 7 ,width = 10,valueMapping = "0=寰俊;1=鏀粯瀹�;",align = HorizontalAlignment.CENTER)
     private Integer payWay;
 
     @ApiModelProperty(value = "璁㈠崟鏉ユ簮")
-    @ExcelColumn(name="璁㈠崟鏉ユ簮",index = 8 ,width = 10,valueMapping = "0=灏忕▼搴忕锛�",align = HorizontalAlignment.CENTER)
+    @ExcelColumn(name="璁㈠崟鏉ユ簮",index = 8 ,width = 10,valueMapping = "0=灏忕▼搴忕;",align = HorizontalAlignment.CENTER)
     private Integer origin;
 
 
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java b/server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java
index d1a0e73..6c1fa5d 100644
--- a/server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java
+++ b/server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java
@@ -44,7 +44,7 @@
     @ApiModelProperty(value = "璁㈠崟涓婚敭")
     private String goodsOrderId;
 
-    @ApiModelProperty(value = "楠戣鐘舵�侊細-1=鏈獞琛岋紱0=璇锋眰寮�閿佷腑 ;1=楠戣涓�; 2=宸茶繕杞�;  3=寮�閿佸け璐ワ紱")
+    @ApiModelProperty(value = "楠戣鐘舵�侊細-1=鏈獞琛岋紱0=璇锋眰寮�閿佷腑 ;1=楠戣涓�; 2=宸茶繕杞�;  3=寮�閿佸け璐ワ紱4=涓存椂闅忚溅锛�")
     private Integer rideStatus;
 
     @ApiModelProperty(value = "灏忕▼搴忔槸鍚﹀仠姝㈡湇鍔� 0鍚� 1鏄�")
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java b/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java
index 78b7566..13f4795 100644
--- a/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java
+++ b/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java
@@ -14,7 +14,6 @@
 @ApiModel("楠戣璁板綍鐘舵�佷俊鎭繑鍥炵被")
 public class MemberRidesDetailResponse {
 
-
     @ApiModelProperty(value = "楠戣璁板綍涓婚敭")
     private String id;
 
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java b/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java
index 83f5279..a9fb0b5 100644
--- a/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java
+++ b/server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java
@@ -72,9 +72,6 @@
     @ApiModelProperty(value = "楠戣璁板綍涓婚敭")
     private String rideId;
 
-    @ApiModelProperty(value = "杞﹁締绫诲瀷")
-    private String bikeTypeName;
-
     @ApiModelProperty(value = "濂楅鍗′俊鎭�")
     private DiscountMember discountMember;
 
diff --git a/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java b/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
index 91f0931..9a570bf 100644
--- a/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
+++ b/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -209,5 +209,7 @@
 
     void autoCancelRefunOrder();
 
-    DiscountMember getUseDiscount(String memberId, Integer driveTime);
+    DiscountMember getUseDiscount(String memberId, Integer driveTime,Integer type);
+
+    void autCancel();
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/BikesServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/BikesServiceImpl.java
index e0a6288..d32fd5d 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/BikesServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/BikesServiceImpl.java
@@ -235,7 +235,7 @@
                 low = Double.parseDouble(collect.get(Constants.LOW_BIKE_VOLTAGE).getCode());
             }catch (Exception e){
             }
-            if(pageWrap.getModel().getType() == Constants.ONE){
+            if(pageWrap.getModel().getLowVoltage() == Constants.ONE){
                 //浣庣數閲�
                 queryWrapper.lt(Bikes::getVoltage,low);
             }else{
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DiscountLogServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DiscountLogServiceImpl.java
index bebd94a..fddabd9 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DiscountLogServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DiscountLogServiceImpl.java
@@ -1,20 +1,26 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.constants.Constants;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.DiscountLogMapper;
 import com.doumee.dao.business.model.DiscountLog;
+import com.doumee.dao.business.model.DiscountMember;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.DiscountLogService;
 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 com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 鐢ㄦ埛濂楅鍗′娇鐢ㄨ皟鏁存棩蹇楄〃Service瀹炵幇
@@ -87,60 +93,26 @@
     @Override
     public PageData<DiscountLog> findPage(PageWrap<DiscountLog> pageWrap) {
         IPage<DiscountLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<DiscountLog> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<DiscountLog> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getId, pageWrap.getModel().getId());
-        }
-        if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(DiscountLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(DiscountLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
-        }
-        if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getCreator, pageWrap.getModel().getCreator());
-        }
-        if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(DiscountLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(DiscountLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
-        }
-        if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getEditor, pageWrap.getModel().getEditor());
-        }
-        if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
-        }
-        if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getInfo, pageWrap.getModel().getInfo());
-        }
-        if (pageWrap.getModel().getDiscountMemberId() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getDiscountMemberId, pageWrap.getModel().getDiscountMemberId());
-        }
-        if (pageWrap.getModel().getType() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getType, pageWrap.getModel().getType());
-        }
-        if (pageWrap.getModel().getRideTime() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getRideTime, pageWrap.getModel().getRideTime());
-        }
-        if (pageWrap.getModel().getRidePrice() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getRidePrice, pageWrap.getModel().getRidePrice());
-        }
-        if (pageWrap.getModel().getEditInfo() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getEditInfo, pageWrap.getModel().getEditInfo());
-        }
-        if (pageWrap.getModel().getEditDays() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getEditDays, pageWrap.getModel().getEditDays());
-        }
-        if (pageWrap.getModel().getGoodsorderId() != null) {
-            queryWrapper.lambda().eq(DiscountLog::getGoodsorderId, pageWrap.getModel().getGoodsorderId());
-        }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+        DiscountLog model = pageWrap.getModel();
+        queryWrapper.selectAll(DiscountLog.class)
+                .selectAs(SystemUser::getRealname,DiscountLog::getCreatorName)
+                .leftJoin(SystemUser.class,SystemUser::getId,DiscountLog::getCreator)
+                .eq(DiscountLog::getIsdeleted, Constants.ZERO)
+                .eq(Objects.nonNull(model.getType()),DiscountLog::getType,model.getType())
+                .eq(StringUtils.isNotBlank(model.getDiscountMemberId()),DiscountLog::getDiscountMemberId,model.getDiscountMemberId());
+        PageData<DiscountLog> pageData = PageData.from(discountLogMapper.selectJoinPage(page, DiscountLog.class,queryWrapper));
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(pageData.getRecords())){
+            for (DiscountLog discountLog:pageData.getRecords()) {
+                if(Constants.equalsInteger(discountLog.getType(),Constants.ZERO)&&Objects.nonNull(discountLog.getRidePrice())){
+                    discountLog.setRidePrice(
+                            Constants.translateMoney(discountLog.getRidePrice())
+                    );
+                }
             }
         }
-        return PageData.from(discountLogMapper.selectPage(page, queryWrapper));
+        return pageData;
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DiscountMemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DiscountMemberServiceImpl.java
index 07658ac..aab545c 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DiscountMemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DiscountMemberServiceImpl.java
@@ -104,18 +104,20 @@
         if(Objects.isNull(discountMember)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        List<DiscountLog> discountLogList = discountLogMapper.selectJoinList(DiscountLog.class,new MPJLambdaWrapper<DiscountLog>()
-                .selectAll(DiscountLog.class)
-                .selectAs(SystemUser::getRealname,DiscountLog::getCreatorName)
-                .eq(DiscountLog::getDiscountMemberId,discountMember.getId())
-                .eq(DiscountLog::getIsdeleted,Constants.ZERO)
-                .orderByDesc(DiscountLog::getId)
-        );
-        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(discountLogList)){
-            discountMember.setDiscountLogList(discountLogList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()));
-            discountMember.setOptLogList(discountLogList.stream().filter(i->!Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()));
-            discountMember.setUseTimes(discountMember.getDiscountLogList().size());
-        }
+//        List<DiscountLog> discountLogList = discountLogMapper.selectJoinList(DiscountLog.class,new MPJLambdaWrapper<DiscountLog>()
+//                .selectAll(DiscountLog.class)
+//                .selectAs(SystemUser::getRealname,DiscountLog::getCreatorName)
+//                .leftJoin(SystemUser.class,SystemUser::getId,DiscountLog::getCreator)
+//                .eq(DiscountLog::getDiscountMemberId,discountMember.getId())
+//                .eq(DiscountLog::getIsdeleted,Constants.ZERO)
+//                .orderByDesc(DiscountLog::getId)
+//        );
+//        discountMember.setUseTimes(discountMember.getDiscountLogList().size());
+//        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(discountLogList)){
+//            discountMember.setDiscountLogList(discountLogList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()));
+//            discountMember.setOptLogList(discountLogList.stream().filter(i->!Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()));
+//
+//        }
         return discountMember;
     }
 
@@ -138,12 +140,15 @@
         Utils.MP.blankToNull(pageWrap.getModel());
         DiscountMember model = pageWrap.getModel();
         queryWrapper.selectAll(DiscountMember.class)
+                .selectAs(Member::getOpenid,DiscountMember::getOpenid)
+                .select(" ( select count(1) from discount_log d where d.discount_member_id = t.id and d.type = 0 ) ",DiscountMember::getUseTimes)
                 .leftJoin(Member.class,Member::getId,DiscountMember::getMemberId)
                 .like(StringUtils.isNotBlank(model.getCode()),DiscountMember::getCode,model.getCode())
                 .like(StringUtils.isNotBlank(model.getName()),DiscountMember::getName,model.getName())
                 .like(StringUtils.isNotBlank(model.getOpenid()),Member::getOpenid,model.getOpenid())
                 .eq(Objects.nonNull(model.getStatus()),DiscountMember::getStatus,model.getStatus())
-                .orderByDesc(DiscountMember::getId);
+                .ne(DiscountMember::getStatus,Constants.TWO)
+                .orderByDesc(DiscountMember::getCode);
         return PageData.from(discountMemberJoinMapper.selectJoinPage(page, DiscountMember.class,queryWrapper));
     }
 
@@ -164,9 +169,12 @@
                 .orderByDesc(DiscountMember::getId);
         List<DiscountMember> list = discountMemberJoinMapper.selectJoinList(DiscountMember.class,queryWrapper);
         if(CollectionUtils.isEmpty(list)){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈煡璇㈠埌鍙姤搴熺殑濂楅鍗′俊鎭�");
+            return;
         }
         for (DiscountMember discountMember:list) {
+            if(!Constants.equalsInteger(discountMember.getStatus(),Constants.ZERO)){
+                continue;
+            }
             discountMemberMapper.update(null,new UpdateWrapper<DiscountMember>().lambda()
                     .set(DiscountMember::getStatus,Constants.ONE)
                     .eq(DiscountMember::getId,discountMember.getId())
@@ -183,7 +191,6 @@
             discountLog.setGoodsorderId(discountMember.getGoodsorderId());
             discountLogMapper.insert(discountLog);
         }
-        //閫�娆炬搷浣�
     }
 
 
@@ -191,7 +198,7 @@
     @Override
     public void adjust(DiscountMemberDTO model){
         if(Objects.isNull(model)
-        || Objects.isNull(model.getAddDays())){
+            || Objects.isNull(model.getAddDays())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
@@ -228,8 +235,9 @@
             discountLog.setDiscountMemberId(discountMember.getId());
             discountLog.setType(Constants.TWO);
             discountLog.setGoodsorderId(discountMember.getGoodsorderId());
-            discountLog.setEditInfo(model.getInfo());
+            discountLog.setInfo(model.getInfo());
             discountLog.setEditDays(model.getAddDays());
+            discountLog.setEditInfo("灏嗘湁鏁堟湡澧炲姞"+model.getAddDays()+"澶�, 璋冩暣鍚庢湁鏁堟湡鑷�"+useEndDate);
             discountLogMapper.insert(discountLog);
 
         }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DiscountServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DiscountServiceImpl.java
index 6e6895b..a8c5a63 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DiscountServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DiscountServiceImpl.java
@@ -31,6 +31,7 @@
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -60,6 +61,8 @@
         discount.setIsdeleted(Constants.ZERO);
         discount.setCreateDate(new Date());
         discount.setCreator(userInfo.getId());
+        discount.setEditDate(new Date());
+        discount.setEditor(userInfo.getId());
         if(Constants.equalsInteger(discount.getUseType(),Constants.ZERO)){
             discount.setUseDays((int) (DateUtil.getBetweenDays(DateUtil.dateToString(discount.getUseStartDate(),"yyyy-MM-dd"),DateUtil.dateToString(discount.getUseEndDate(),"yyyy-MM-dd"))));
         }
@@ -68,7 +71,7 @@
     }
 
 
-    public void vaildReq(Discount discount) {
+    public void vaildReq(Discount discount){
         if(Objects.isNull(discount)
                 || StringUtils.isBlank(discount.getName())
                 || Objects.isNull(discount.getType())
@@ -95,13 +98,21 @@
                 ( discount.getUseStartDate().getTime()>discount.getUseEndDate().getTime()) ){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浣跨敤鏃舵淇℃伅閿欒");
         }
-
         //鎸囧畾鏃ユ湡鐢熸晥
         if(Constants.equalsInteger(discount.getUseType(),Constants.TWO) &&
                 ( discount.getUseStartDate().getTime()<discount.getStartDate().getTime() ||
                         discount.getUseStartDate().getTime() > discount.getEndDate().getTime()
                 ) ){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浣跨敤鏃舵淇℃伅閿欒");
+        }
+        if(Objects.isNull(discount.getSaleDayLimit())){
+            discount.setSaleDayLimit(Constants.ZERO);
+        }
+        if(Objects.isNull(discount.getSaleLimit())){
+            discount.setSaleLimit(Constants.ZERO);
+        }
+        if(Constants.equalsInteger(discount.getUseType(),Constants.TWO)){
+            discount.setUseEndDate( DateUtil.StringToDateFormat(DateUtil.getXDaysAfter(discount.getUseStartDate(),discount.getUseDays()),"yyyy-MM-dd"));
         }
     }
 
@@ -146,6 +157,24 @@
 
     @Override
     public void updateById(Discount discount) {
+        LoginUserInfo userInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        if(Objects.isNull(discount)
+        || StringUtils.isBlank(discount.getId())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Discount model = discountMapper.selectById(discount.getId());
+        if(Objects.isNull(model)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!Constants.equalsInteger(model.getStatus(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈鐢ㄦ棤娉曡繘琛屼慨鏀�");
+        }
+        this.vaildReq(discount);
+        discount.setEditDate(new Date());
+        discount.setEditor(userInfo.getId());
+        if(Constants.equalsInteger(discount.getUseType(),Constants.ZERO)){
+            discount.setUseDays((int) (DateUtil.getBetweenDays(DateUtil.dateToString(discount.getUseStartDate(),"yyyy-MM-dd"),DateUtil.dateToString(discount.getUseEndDate(),"yyyy-MM-dd"))));
+        }
         discountMapper.updateById(discount);
     }
 
@@ -162,9 +191,12 @@
     @Override
     public Discount findById(String id) {
         Discount discount = discountJoinMapper.selectOne(new MPJLambdaWrapper<Discount>()
-                        .selectAll(Discount.class)
+                .selectAll(Discount.class)
+                .select(" s1.realname ",Discount::getCreatorName)
+                .select(" s2.realname ",Discount::getEditorName)
                 .select(" (select count(1) from goodsorder g where g.obj_type = 0 and g.obj_id = t.id and g.pay_status = 1 ) ",Discount::getSaleNum)
-                .leftJoin(SystemUser.class,SystemUser::getId,Discount::getCreator)
+                .leftJoin(" system_user s1 on s1.id = t.creator")
+                .leftJoin(" system_user s2 on s2.id = t.editor")
                 .eq(Discount::getId,id)
         );
         if(Objects.isNull(discount)){
@@ -205,7 +237,9 @@
                 .eq(Objects.nonNull(modele.getBikeOrElec()) && Constants.equalsInteger(modele.getBikeOrElec(),Constants.ONE),Discount::getIsbike, Constants.ONE)
                 .eq(Objects.nonNull(modele.getBikeOrElec()) && Constants.equalsInteger(modele.getBikeOrElec(),Constants.TWO),Discount::getIselecbike, Constants.ONE)
                 .eq(Discount::getIsdeleted, Constants.ZERO)
-                .eq( pageWrap.getModel().getStatus() !=null,BikeRepair::getStatus,pageWrap.getModel().getStatus());
+                .eq( pageWrap.getModel().getStatus() !=null,BikeRepair::getStatus,pageWrap.getModel().getStatus())
+                .apply( Objects.nonNull(modele.getMinShow())," now() BETWEEN t.start_date and  ( t.end_date   + INTERVAL '1 day' ) ")
+        ;
                 queryWrapper.orderByDesc(Discount::getCreateDate);
         PageData<Discount> pageData = PageData.from(discountJoinMapper.selectJoinPage(page, Discount.class,queryWrapper));
         for (Discount discount:pageData.getRecords()) {
@@ -219,8 +253,7 @@
     @Override
     public void dealPrice(Discount discount){
         if(Objects.isNull(discount)
-            || Objects.isNull(discount.getUseEndDate())
-            || Objects.isNull(discount.getUseStartDate())
+            || Objects.isNull(discount.getUseDays())
             || Objects.isNull(discount.getPrice())
             || discount.getPrice().compareTo(BigDecimal.ZERO)==0
         ){
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index f46ffd0..fed4866 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -295,8 +295,10 @@
         MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(Goodsorder.class);
         queryWrapper.selectAs(Member::getOpenid, Goodsorder::getOpenid);
+        queryWrapper.selectAs(DiscountMember::getName, Goodsorder::getDiscountName);
         queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
-        queryWrapper.select("(select r.name from discount_member r where r.isdeleted=0  and r.goodsorder_id=t.id limit 1) as discountName");
+        queryWrapper.leftJoin(DiscountMember.class, DiscountMember::getGoodsorderId  ,Goodsorder::getId);
+//        queryWrapper.select("(select r.name from discount_member r where r.isdeleted=0  and r.goodsorder_id=t.id limit 1) as discountName");
         queryWrapper.select("(select max(r.done_date) from refund r where r.obj_id=t.id  and  r.status in(0,2)) as refund_date");
         queryWrapper.select("(select sum(r.money) from refund r where r.obj_id=t.id and r.status in(0,2)) as refund_money");
         //鏃堕棿娈电瓫閫�
@@ -310,11 +312,13 @@
         queryWrapper.like(model.getCode() !=null,Goodsorder::getCode,model.getCode());
         queryWrapper.like(model.getId() !=null,Goodsorder::getId,model.getId());
         queryWrapper.eq(model.getStatus() !=null,Goodsorder::getStatus,model.getStatus());
+        queryWrapper.eq(model.getPayWay() !=null,Goodsorder::getPayWay,model.getPayWay());
         queryWrapper.like(model.getOnlineOrderid() !=null,Goodsorder::getOnlineOrderid,model.getOnlineOrderid());
         queryWrapper.like(model.getOpenid() !=null,Member::getOpenid,model.getOpenid());
         queryWrapper.eq(Goodsorder::getIsdeleted,Constants.ZERO);
         //濡傛灉鏄獞琛岃鍗曞彧鏄剧ず鏀粯鎴愬姛鐨�
         queryWrapper.eq(Constants.equalsInteger(model.getType(),Constants.ZERO),Goodsorder::getPayStatus,Constants.ONE);
+        queryWrapper.in(Constants.equalsInteger(model.getType(),Constants.ONE),Goodsorder::getStatus,Constants.ONE,Constants.ZERO);
 
         return  queryWrapper;
     }
@@ -336,7 +340,7 @@
         if(Objects.nonNull(pageWrap.getModel().getCloseStatus()) && pageWrap.getModel().getCloseStatus().equals(Constants.ONE)){
             queryWrapper.eq(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.CLOSE.getKey());
         }
-        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDiscountName()),Goodsorder::getDiscountName,pageWrap.getModel().getDiscountName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDiscountName()),DiscountMember::getName,pageWrap.getModel().getDiscountName());
         IPage<Goodsorder> goodsorderIPage = goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class, queryWrapper);
         if (!CollectionUtils.isEmpty(goodsorderIPage.getRecords())){
             goodsorderIPage.getRecords().forEach(s->{
@@ -382,6 +386,7 @@
                 discountMapper.selectList(new QueryWrapper<Discount>().lambda()
                         .eq(Discount::getIsdeleted,Constants.ZERO)
                         .eq(Discount::getStatus,Constants.ZERO)
+                        .apply(" now() BETWEEN start_date and  ( end_date   + INTERVAL '1 day' )  ")
                         .orderByDesc(Discount::getId)
                         .last(" limit 3 ")
                 )
@@ -452,7 +457,7 @@
                         memberRidesResponse.setVoltageStatus(this.getVoltageStatus(bikes));
                     }
                     //鏌ヨ褰撳墠鐨勯獞琛屽椁�
-                    memberRidesResponse.setDiscountMember(this.getUseDiscount(memberId,Constants.ZERO));
+                    memberRidesResponse.setDiscountMember(this.getUseDiscount(memberId,Constants.ZERO,memberRides.getType()));
                     homeResponse.setMemberRidesResponse(memberRidesResponse);
                 }
             }
@@ -534,6 +539,7 @@
         if(Constants.equalsInteger(goodsorder.getType(),Constants.ZERO)){
             throw  new BusinessException(ResponseStatus.NOT_ALLOWED);
         }
+        goodsorder.setMoney(Constants.translateMoney(goodsorder.getMoney()));
         goodsorderDetailVO.setGoodsOrder(goodsorder);
         Member member = memberMapper.selectById(goodsorder.getMemberId());
         if(Objects.nonNull(member)){
@@ -555,6 +561,13 @@
                         .eq(Refund::getObjId,goodsorder.getId())
                         .orderByDesc(Refund::getId)
         );
+        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(refunds)){
+            for (Refund refund:refunds) {
+                if(Objects.nonNull(refund.getMoney())){
+                    refund.setMoney(Constants.translateMoney(refund.getMoney()));
+                }
+            }
+        }
         goodsorderDetailVO.setRefundList(refunds);
 
         return goodsorderDetailVO;
@@ -614,7 +627,7 @@
                 freeTime = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
             }catch (Exception e){
             }
-            closeMoney = getCloseMoneyByRides(memberRides,freeTime,true,goodsorder.getMoney(),goodsorder.getMemberId()).getAmount();
+            closeMoney = getCloseMoneyByRides(memberRides,freeTime,true,goodsorder.getMoney(),goodsorder.getMemberId(),true).getAmount();
             //瀹為檯缁撶畻浠锋牸锛岃褰曞湪鏈�楂樿溅鍨嬭褰曚笂
 //            memberRides.get(0).setActualPrice(closeMoney);
         }
@@ -779,7 +792,7 @@
         transactionsMapper.insert(transactions);
     }
 
-    private RidesDetailResponse  getCloseMoneyByRides(List<MemberRides> memberRides,int freeTime,boolean isClose,BigDecimal yjMoney,String memberId) {
+    private RidesDetailResponse  getCloseMoneyByRides(List<MemberRides> memberRides,int freeTime,boolean isClose,BigDecimal yjMoney,String memberId,Boolean unOver) {
         RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
         ridesDetailResponse.setHaveDisCount(Constants.ZERO);
         BigDecimal closeMoney = new BigDecimal(0.00);
@@ -816,9 +829,10 @@
             topRides.setActualPrice(closeMoney);
         } 
         //鏌ヨ鏄惁瀛樺湪濂楅淇℃伅
-        DiscountMember discountMember = this.getUseDiscount(memberId,durationSum);
+        DiscountMember discountMember = this.getUseDiscount(memberId,durationSum,Objects.nonNull(topRides)?topRides.getType():null);
         //璁$畻鎶垫墸閲戦
-        if(Objects.nonNull(discountMember) && discountMember.getSurplusTime() > Constants.ZERO && Objects.nonNull(topRides)){
+        //unOver 鏄惁鏈粨绠� 鏈粨绠楃殑璁㈠崟鏍规嵁褰撳墠濂楅鏌ヨ  宸茬粨绠楃殑璁㈠崟鏍规嵁宸茬敓鎴愮殑鏁版嵁杩涜鏌ヨ
+        if(Objects.nonNull(discountMember) && Objects.nonNull(topRides) && unOver){
             //瀛樺偍鎶垫墸璁板綍
             DiscountLog discountLog = new DiscountLog();
             discountLog.setIsdeleted(Constants.ZERO);
@@ -830,7 +844,7 @@
             discountLog.setEditInfo("楠戣鎶垫墸");
             discountLog.setGoodsorderId(topRides.getOrdreId());
             //濡傛灉楠戣鏃堕棿灏忎簬绛変簬鍓╀綑鏃堕棿 鍒欑洿鎺ユ坊鍔� 楠戣鍗′娇鐢ㄦ暟鎹�  淇瀹為檯鏀粯閲戦
-            if(discountMember.getSurplusTime() >= durationSum){
+            if(Constants.equalsInteger(discountMember.getLimitType(),Constants.ZERO) || discountMember.getSurplusTime() >= durationSum){
                 discountLog.setRideTime(durationSum);
                 discountLog.setRidePrice(closeMoney);
                 topRides.setActualPrice(BigDecimal.ZERO);
@@ -838,9 +852,10 @@
             }else{
                 int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
                 BigDecimal closeDisCountMoney = Constants.formatDecimalNum(topRides.getBasePrice());
-                //濡傛灉鏄竴鍙d环鏂瑰紡锛屼环鏍肩洿鎺ヤ负涓�鍙d环baseMoney,濡傛灉涓嶆槸璁$畻姝e父浠锋牸
+                //鍑忓幓浼樻儬鏃堕暱鍓╀綑鏃堕暱
                 Integer durationDisCountSum = durationSum - discountMember.getSurplusTime();
-                discountLog.setRideTime(discountMember.getSurplusTime());
+                discountLog.setRideTime(durationDisCountSum<=Constants.ZERO?discountMember.getSurplusTime():Constants.ZERO);
+                //濡傛灉鏄竴鍙d环鏂瑰紡锛屼环鏍肩洿鎺ヤ负涓�鍙d环baseMoney,濡傛灉涓嶆槸璁$畻姝e父浠锋牸
                 if(baseTime != -1){//涓嶆槸涓�鍙d环
                     if(durationDisCountSum > baseTime && Constants.formatIntegerNum(topRides.getUnitTime())>0){
                         //濡傛灉瓒呭嚭浜嗚捣姝ヤ环鏍硷紝璁$畻瓒呭嚭浠锋牸
@@ -848,14 +863,25 @@
                         //璁$畻閲戦绱瓒呭嚭閮ㄩ棬浠锋牸锛堣秴鍑烘椂闂村崟浣�*瓒呭嚭鍗曚綅鏃堕棿浠锋牸锛�
                         closeDisCountMoney = closeDisCountMoney.add(unit.multiply(Constants.formatDecimalNum(topRides.getUnitPrice())));
                     }
-                    discountLog.setRidePrice(closeMoney.subtract(closeDisCountMoney));
+                    discountLog.setRidePrice(durationDisCountSum<=Constants.ZERO?closeMoney.subtract(closeDisCountMoney):BigDecimal.ZERO);
                 }else{
                     discountLog.setRidePrice(BigDecimal.ZERO);
                 }
             }
-            discountLogMapper.insert(discountLog);
-            ridesDetailResponse.setHaveDisCount(Constants.ONE);
+            if(isClose&&discountLog.getRideTime()>Constants.ZERO){
+                discountLogMapper.insert(discountLog);
+            }
+            ridesDetailResponse.setHaveDisCount(discountLog.getRideTime()>Constants.ZERO?Constants.ONE:Constants.ZERO);
             ridesDetailResponse.setDisCountMoney(discountLog.getRidePrice());
+        }else if(Objects.nonNull(discountMember) && Objects.nonNull(topRides)
+                && !unOver ){
+            //宸茶繕杞﹀垯鏌ヨ鏄惁鏈� 濂楅鍗′娇鐢ㄨ褰�
+            List<DiscountLog> discountLogList = discountLogMapper.selectList(new QueryWrapper<DiscountLog>().lambda().eq(DiscountLog::getGoodsorderId,topRides.getOrdreId()).eq(DiscountLog::getType,Constants.ZERO)
+                    .eq(DiscountLog::getIsdeleted,Constants.ZERO));
+            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(discountLogList)){
+                ridesDetailResponse.setHaveDisCount(Constants.ONE);
+                ridesDetailResponse.setDisCountMoney(discountLogList.stream().map(i->i.getRidePrice()).reduce(BigDecimal.ZERO,BigDecimal::add));
+            }
         }
         //濡傛灉璁㈠崟浠锋牸灏侀《浜嗭紝鍙栬鍗� 浠锋牸
         if(Constants.compareBigdecimal(closeMoney, yjMoney) ==1){
@@ -888,7 +914,6 @@
         LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
         if(Objects.isNull(goodsorderBackDTO)
         || StringUtils.isBlank(goodsorderBackDTO.getOrderId())
-                || StringUtils.isBlank(goodsorderBackDTO.getReason())
                 || Objects.isNull(goodsorderBackDTO.getBackType())
                 || Objects.isNull(goodsorderBackDTO.getMoney())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -1060,7 +1085,8 @@
                 .selectAs(BaseParam::getSortnum,MemberRides::getSortnum)
                 .leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId)
                 .eq(MemberRides::getOrdreId,id)
-                .in(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey(),Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey())
+                .in(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()
+                        ,Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey(),Constants.MEMBER_RIDES_STATUS.RIDES_PAUSING.getKey())
                 .orderByDesc(MemberRides::getCreateDate));
         if (!CollectionUtils.isEmpty(memberRides)){
             //棰勮缁撶畻浠锋牸鍜岃绠楁椂闀�
@@ -1096,7 +1122,8 @@
                 return memberRidesResponse;
             }).collect(Collectors.toList());
             //绱鍜岄绠楃粨绠楅噾棰�
-            RidesDetailResponse ridesDetailResponse = getCloseMoneyByRides(memberRides,freeTime,false,goodsorder.getMoney(),goodsorder.getMemberId());
+            RidesDetailResponse ridesDetailResponse = getCloseMoneyByRides(memberRides,freeTime,false,goodsorder.getMoney(),goodsorder.getMemberId(),
+                    Constants.equalsInteger(goodsorder.getStatus(),Constants.GOODSORDER_STATUS.CLOSE.getKey())?false:true);
             if(Constants.formatIntegerNum(goodsorder.getStatus())!= Constants.goodsorderStatus.pay){
                 //濡傛灉闈炲凡鏀粯浣嗘湭缁撶畻锛屼娇鐢ㄨ鍗曢噾棰�
                 ridesDetailResponse.setAmount(goodsorder.getCloseMoney());
@@ -1174,8 +1201,13 @@
         discountMember.setMemberId(memberId);
         discountMember.setStatus(Constants.TWO);
         discountMember.setGoodsorderId(goodsorderId);
+        if(!Constants.equalsInteger(discountMember.getUseType(),Constants.ZERO)){
+            if(Constants.equalsInteger(discountMember.getUseType(),Constants.ONE)){
+                discountMember.setUseStartDate(DateUtil.StringToDateFormat(DateUtil.getCurrDate(),"yyyy-MM-dd"));
+            }
+            discountMember.setUseEndDate( DateUtil.StringToDateFormat(DateUtil.getXDaysAfter(discountMember.getUseStartDate(),discountMember.getUseDays()-1),"yyyy-MM-dd"));
+        }
         discountMemberMapper.insert(discountMember);
-
         Goodsorder goodsorder = new Goodsorder();
         goodsorder.setId(goodsorderId);
         goodsorder.setCreateDate(new Date());
@@ -1207,7 +1239,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌濂楅淇℃伅");
         }
         if(!(Constants.equalsInteger(discount.getIsdeleted(),Constants.ZERO)
-            ||Constants.equalsInteger(discount.getStatus(),Constants.ZERO))){
+             && Constants.equalsInteger(discount.getStatus(),Constants.ZERO))){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"濂楅宸蹭笅鏋讹紝鏃犳硶杩涜璐拱锛岃鍒锋柊鏌ョ湅");
         }
         if(!(discount.getStartDate().getTime() < System.currentTimeMillis()
@@ -1215,7 +1247,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"濂楅寮�鏀炬椂闂存湭鍒�,鏃犳硶杩涜璐拱");
         }
         //楠岃瘉鏄惁瓒呰繃浠婃棩鍙敭鍗栨暟閲�
-        if(Objects.nonNull(discount.getSaleDayLimit())){
+        if(Objects.nonNull(discount.getSaleDayLimit())&&discount.getSaleDayLimit()>Constants.ZERO){
             if(goodsorderMapper.selectCount(new QueryWrapper<Goodsorder>().lambda()
                     .eq(Goodsorder::getType,Constants.ONE)
                     .eq(Goodsorder::getObjId,discount.getId())
@@ -1225,13 +1257,12 @@
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"濂楅浠婃棩鍙戣閲忓凡鍞絼锛岃鏄庢棩鏌ョ湅锛�");
             }
         }
-        if(Objects.nonNull(discount.getSaleLimit())){
+        if(Objects.nonNull(discount.getSaleLimit())&&discount.getSaleLimit()>Constants.ZERO){
             if(goodsorderMapper.selectCount(new QueryWrapper<Goodsorder>().lambda()
                     .eq(Goodsorder::getType,Constants.ONE)
                     .eq(Goodsorder::getObjId,discount.getId())
                     .in(Goodsorder::getStatus,Constants.ZERO,Constants.ONE)
-                    .apply(" EXTRACT(YEAR FROM create_date) = EXTRACT(YEAR FROM CURRENT_DATE) ")
-            )>=discount.getSaleDayLimit()){
+            )>=discount.getSaleLimit()){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"濂楅鍙戣閲忓凡鍞絼锛�");
             }
         }
@@ -1240,8 +1271,8 @@
 
 
     private Object getWxPayResponse(Goodsorder goodsorder,String openid){
+        Object response = null; 
         //璋冭捣鏀粯
-        Object response = null;
         PrepayRequest request = new PrepayRequest();
         request.setAttach("createGoodsOrder");
         request.setDescription(Constants.equalsInteger(goodsorder.getType(),Constants.ZERO)?"妫灄鍏洯鑷杞﹂獞琛屾娂閲戞敮浠�":"妫灄鍏洯鑷杞﹁喘涔伴獞琛屽椁愭敮浠�");
@@ -1368,6 +1399,7 @@
         Goodsorder goodsorder = this.goodsorderMapper.selectOne(new QueryWrapper<Goodsorder>()
                 .eq("member_id",memberId)
                 .eq("status",Constants.goodsorderStatus.pay)
+                .eq("type",Constants.ZERO)
                 .last(" limit 1 "));
         if(Objects.isNull(goodsorder)){
             throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"鏃犻獞琛岃鍗曡褰�");
@@ -1514,7 +1546,10 @@
      * @param memberId
      */
     @Override
-    public DiscountMember getUseDiscount(String memberId,Integer driveTime){
+    public DiscountMember getUseDiscount(String memberId,Integer driveTime,Integer type){
+        if(Objects.isNull(type)){
+            return null;
+        }
         String today = DateUtil.getToday();
         //鍒ゆ柇浠婂ぉ鏄惁涓鸿妭鍋囨棩
         Holidays holidays = new Holidays();
@@ -1528,9 +1563,13 @@
                         "and  d.isdeleted = 0 and  d.type = 0 and   EXTRACT(DAY FROM d.create_date) = EXTRACT(DAY FROM CURRENT_DATE) ) " , DiscountMember::getUseTime)//鏌ヨ浠婃棩宸蹭娇鐢ㄦ椂闂�
                 .eq(DiscountMember::getStatus,Constants.ZERO)
                 .eq(DiscountMember::getMemberId,memberId)
-                .le(DiscountMember::getUseStartDate, Utils.Date.getStart(DateUtil.stringToDate(today,"yyyy-MM-dd")))
-                .ge(DiscountMember::getUseEndDate, Utils.Date.getEnd(DateUtil.stringToDate(today,"yyyy-MM-dd")))
+                .apply("  t.use_start_date <= '"+today+"' and t.use_end_date >= '"+today+"' ")
+
+                .eq(Constants.equalsInteger(holiday,Constants.ZERO),DiscountMember::getUseWorkday,Constants.ONE)
                 .eq(Constants.equalsInteger(holiday,Constants.ONE),DiscountMember::getUseHoliday,Constants.ONE)
+
+                .eq(Constants.equalsInteger(type,Constants.ZERO),DiscountMember::getIsbike,Constants.ONE)
+                .eq(Constants.equalsInteger(type,Constants.ONE),DiscountMember::getIselecbike,Constants.ONE)
                 .orderByDesc(DiscountMember::getLimitType)
                 .orderByDesc(DiscountMember::getLimitTime)
         );
@@ -1556,22 +1595,23 @@
                 if(list.size()>Constants.ZERO){
                     //d1鍦ㄥ墠鍒欏崌搴� 鍙嶄箣闄嶅簭
                     list.sort((d1,d2)-> Integer.compare(d2.getSurplusTime(),d1.getSurplusTime()));
+                    return list.get(Constants.ZERO);
                 }
-                return list.get(Constants.ZERO);
             }else{
                 //鏃犳棤鏈熼檺鐨勫椁� 浼樺厛鏌ヨ鍓╀綑鏃堕暱澶т簬楠戣鏃堕暱鐨勪俊鎭�(鍙栨椂闂存渶灏忕殑濂楅) 鍐嶆煡璇㈠皬浜庨獞琛屾椂闀跨殑濂楅
                 List<DiscountMember>  list =  discountMemberList.stream().filter(i->i.getSurplusTime()>=driveTime).collect(Collectors.toList());
                 if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
                     if(list.size()>Constants.ZERO){
                         //d1鍦ㄥ墠鍒欏崌搴� 鍙嶄箣闄嶅簭
-                        list.sort((d1,d2)-> Integer.compare(d2.getSurplusTime(),d1.getSurplusTime()));
+                        list.sort((d1,d2)-> Integer.compare(d1.getSurplusTime(),d2.getSurplusTime()));
+                        return list.get(Constants.ZERO);
                     }
-                    return list.get(Constants.ZERO);
+                  
                 }
                 list =  discountMemberList.stream().filter(i->i.getSurplusTime()<driveTime).collect(Collectors.toList());
                 if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
                     if(list.size()>Constants.ZERO){
-                        list.sort((d1,d2)-> Integer.compare(d1.getSurplusTime(),d2.getSurplusTime()));
+                        list.sort((d1,d2)-> Integer.compare(d2.getSurplusTime(),d1.getSurplusTime()));
                     }
                     return list.get(Constants.ZERO);
                 }
@@ -1582,10 +1622,11 @@
 
 
 
+    @Override
     public void autCancel(){
         goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
                 .set(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.CANCEL.getKey())
-                    .set(Goodsorder::getEditDate,DateUtil.getCurrDateTime())
+                .set(Goodsorder::getEditDate,DateUtil.getCurrDateTime())
                 .eq(Goodsorder::getStatus,Constants.GOODSORDER_STATUS.UN_PAY.getKey())
                 .apply(" NOW() >= create_date  + INTERVAL '30 min'  ")
         );
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
index 9608680..4437b8a 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -398,7 +398,7 @@
             }
         }else{
             //濡傛灉鏄數杞︼紝璇锋眰web绔帴鍙e叧闂溅杈嗕俊鎭�
-            bike =   sendCloseElecBikeRequest(memberRides.getBikeCode(),Constants.ONE);
+            bike  = sendCloseElecBikeRequest(model.getOrdreId(),memberRides.getBikeCode());
         }
         logInfo = bike!=null?bike.getForceBackInfo():null;
         Integer freeRentTime = Integer.valueOf(collect.get(Constants.FREE_RENT_TIME).getCode());
@@ -438,7 +438,7 @@
     /**
      *  濡傛灉鏄數杞︼紝璇锋眰web绔帴鍙e叧闂溅杈嗕俊鎭�
      */
-    private Bikes sendCloseElecBikeRequest(String bikeCode,int type) {
+    private Bikes sendCloseElecBikeRequest(String goodOrderId,String bikeCode) {
         Bikes  bike = bikesMapper.selectOne(new QueryWrapper<Bikes>().lambda()
                 .eq(Bikes::getType,Constants.ONE)
                 .eq(Bikes::getIsdeleted,Constants.ZERO)
@@ -448,30 +448,62 @@
             return null;
         }
         bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触锛�");
-        if(StringUtils.isNotBlank(bike.getDeviceSn())){
+        if(StringUtils.isNotBlank(bike.getDeviceSn())) {
             try {
                 //璇锋眰鍦板潃
-                String url = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ELEC_BIKE_CONTRIL_API_URL).getCode();
+                String url = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ELEC_BIKE_CONTRIL_API_URL).getCode();
                 JSONObject param = new JSONObject();
-                param.put("clientId",StringTools.leftTrip(bike.getDeviceSn(),'0'));
-                param.put("type",type);//0寮�閿� 1鍏抽攣
-                String res = HttpsUtil.postJsonString(url,param.toJSONString());
+                param.put("id", goodOrderId);
+                String res = HttpsUtil.postJsonString(url, param.toJSONString());
                 JSONObject json = JSONObject.parseObject(res);
-                if(json.get("code").equals("200")){
+                if (json.get("code").equals("200")) {
                     //鍙戣捣鎸囦护鎴愬姛
                     bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣鎴愬姛锛�");
-                }else{
-                    bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触锛�"+json.get("msg"));
+                } else {
+                    bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触锛�" + json.get("msg"));
                 }
-            }catch (Exception e){
+            } catch (Exception e) {
                 e.printStackTrace();
             }
         }else{
             bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触,鏈粦瀹氭帶鍒跺櫒sn锛�");
         }
-        bikesMapper.updateById(bike);
         return bike;
     }
+//    private Bikes sendCloseElecBikeRequest(String bikeCode,int type) {
+//        Bikes  bike = bikesMapper.selectOne(new QueryWrapper<Bikes>().lambda()
+//                .eq(Bikes::getType,Constants.ONE)
+//                .eq(Bikes::getIsdeleted,Constants.ZERO)
+//                .eq(Bikes::getCode,bikeCode)
+//        );
+//        if(bike == null){
+//            return null;
+//        }
+//        bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触锛�");
+//        if(StringUtils.isNotBlank(bike.getDeviceSn())){
+//            try {
+//                //璇锋眰鍦板潃
+//                String url = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ELEC_BIKE_CONTRIL_API_URL).getCode();
+//                JSONObject param = new JSONObject();
+//                param.put("clientId",StringTools.leftTrip(bike.getDeviceSn(),'0'));
+//                param.put("type",type);//0寮�閿� 1鍏抽攣
+//                String res = HttpsUtil.postJsonString(url,param.toJSONString());
+//                JSONObject json = JSONObject.parseObject(res);
+//                if(json.get("code").equals("200")){
+//                    //鍙戣捣鎸囦护鎴愬姛
+//                    bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣鎴愬姛锛�");
+//                }else{
+//                    bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触锛�"+json.get("msg"));
+//                }
+//            }catch (Exception e){
+//                e.printStackTrace();
+//            }
+//        }else{
+//            bike.setForceBackInfo("寮哄埗杩樿溅鍏抽棴杞﹂攣澶辫触,鏈粦瀹氭帶鍒跺櫒sn锛�");
+//        }
+//        bikesMapper.updateById(bike);
+//        return bike;
+//    }
 
     public static void main(String[] args) {
         String url = "http://localhost:10025/jtt808/device/8500";
@@ -771,7 +803,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"褰撳墠杞﹁締绫诲瀷鏃犳硶绉熻祦锛岃鑱旂郴绠$悊鍛橈紒");
         }
         memberRidesResponse.setBikeCode(bike.getCode());
-        memberRidesResponse.setBikeTypeName(baseParam.getName());
+        memberRidesResponse.setBikeType(baseParam.getName());
         MemberRides memberRides = new MemberRides();
         this.dealMemberRidesData(baseParam.getId(),memberRides);
         memberRidesResponse.setBasePrice(memberRides.getBasePrice());
@@ -783,7 +815,7 @@
                 memberRidesResponse.getUnitPrice()
                 ,memberRidesResponse.getUnitTime()));
         //鏌ヨ褰撳墠鐨勯獞琛屽椁�
-        memberRidesResponse.setDiscountMember(goodsorderService.getUseDiscount(memberId,Constants.ZERO));
+        memberRidesResponse.setDiscountMember(goodsorderService.getUseDiscount(memberId,Constants.ZERO,bikeType));
         return memberRidesResponse;
     }
 
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/TransactionsServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/TransactionsServiceImpl.java
index f09b5a2..a235b29 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/TransactionsServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/TransactionsServiceImpl.java
@@ -192,13 +192,13 @@
                 //璐拱濂楅 澶勭悊鍐呭
                  DiscountMember discountMember = discountMemberMapper.selectById(transactions.getObjId());
                  if(Objects.nonNull(discountMember)){
-                     transactions.setContent(discountMember.getName() +" 鏈夋晥鏈�" + DateUtil.dateToString(discountMember.getUseStartDate(),"yyyy-MM-dd") +"-"+DateUtil.dateToString(discountMember.getUseEndDate(),"yyyy-MM-dd"));
+                     transactions.setContent(discountMember.getName() +" | 鏈夋晥鏈�" + DateUtil.dateToString(discountMember.getUseStartDate(),"yyyy-MM-dd") +" 鑷� "+DateUtil.dateToString(discountMember.getUseEndDate(),"yyyy-MM-dd"));
                  }
             }else if(Constants.equalsInteger(transactions.getType(),Constants.TRANSACTIONS_TYPE.PLATFORM_REFUND.getKey())){
                 DiscountMember discountMember = discountMemberMapper.selectOne(
                         new QueryWrapper<DiscountMember>().lambda().eq(DiscountMember::getGoodsorderId, transactions.getOrderId()).last("limit 1"));
                 if(Objects.nonNull(discountMember)){
-                    transactions.setContent(discountMember.getName() +" 鏈夋晥鏈�" + DateUtil.dateToString(discountMember.getUseStartDate(),"yyyy-MM-dd") +"-"+DateUtil.dateToString(discountMember.getUseEndDate(),"yyyy-MM-dd"));
+                    transactions.setContent(discountMember.getName() +" | 鏈夋晥鏈�" + DateUtil.dateToString(discountMember.getUseStartDate(),"yyyy-MM-dd") +" 鑷� "+DateUtil.dateToString(discountMember.getUseEndDate(),"yyyy-MM-dd"));
                 }
             }
         }
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index c481f6a..b9061a1 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -50,12 +50,13 @@
     apiV3Key: iF3kC8pL8dZ9iU3hN5fX9zI6eF4xQ6fT
     serialNumer: 368B835A194384FD583B83B77977B84127D2F655
     mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
-    notifyUrl: http://xiaopiqiu3.natapp1.cc/api/wxPayNotify
-    refundNotifyUrl: http://xiaopiqiu3.natapp1.cc/api/wxRefundNotify
-#    notifyUrl: https://dmtest.ahapp.net/bike_h5_api/api/wxPayNotify
-    keyPath: D://apiclient_cert.p12
-    privateCertPath: D://apiclient_cert.pem
-    privateKeyPath: D://apiclient_key.pem
+#    notifyUrl: http://xiaopiqiu3.natapp1.cc/api/wxPayNotify
+#    refundNotifyUrl: http://xiaopiqiu3.natapp1.cc/api/wxRefundNotify
+    notifyUrl: https://dmtest.ahapp.net/bike_h5_api/api/wxPayNotify
+    refundNotifyUrl: https://dmtest.ahapp.net/bike_h5_api/api/wxRefundNotify
+    keyPath: /usr/local/aliConfig/bike/apiclient_cert.p12
+    privateCertPath: /usr/local/aliConfig/bike/apiclient_cert.pem
+    privateKeyPath: /usr/local/aliConfig/bike/apiclient_key.pem
     #鏈嶅姟鍟�-------------end---
     existsSub: 1
     appSecret: 1ceb7c9dff3c4330d653adc3ca55ea24
diff --git a/server/web/src/main/java/com/doumee/api/web/BusinessApi.java b/server/web/src/main/java/com/doumee/api/web/BusinessApi.java
index 1c5ee93..8414b7f 100644
--- a/server/web/src/main/java/com/doumee/api/web/BusinessApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/BusinessApi.java
@@ -181,6 +181,7 @@
     public ApiResponse<PageData<Discount>> discountPage (@RequestBody PageWrap<Discount> pageWrap) {
         Discount discount = new Discount();
         discount.setStatus(Constants.ZERO);
+        discount.setMinShow(Constants.ZERO);
         pageWrap.setModel(discount);
         return ApiResponse.success(discountService.findPage(pageWrap));
     }
@@ -326,10 +327,9 @@
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
     })
-    public ApiResponse openElecBike(@RequestBody OpenElecBikeRequest param) {
+    public ApiResponse<MemberRidesDetailResponse> openElecBike(@RequestBody OpenElecBikeRequest param) {
         param.setMemberId(getMemberId());
-        jtt808Service.openLock(param);
-        return  ApiResponse.success( null);
+        return  ApiResponse.success(jtt808Service.openLock(param));
     }
 
     @LoginRequired
@@ -344,5 +344,10 @@
         return  ApiResponse.success( null);
     }
 
-
+    @ApiOperation(value = "寮哄埗杩樿溅", notes = "寮哄埗杩樿溅")
+    @PostMapping("/forceBack")
+    public ApiResponse forceBack(@RequestBody Goodsorder goodsorder) {
+        jtt808Service.forceBack(goodsorder.getId());
+        return  ApiResponse.success( null);
+    }
 }
diff --git a/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java b/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
index ecf63d4..c77a7a0 100644
--- a/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
+++ b/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
@@ -80,7 +80,6 @@
     @Autowired
     private MemberRidesJoinMapper memberRidesJoinMapper;
 
-
     @Autowired
     private PricingParamMapper pricingParamMapper;
 
@@ -102,6 +101,10 @@
         return  data;
     }
 
+    /**
+     * 鎵嬪姩杩樿溅
+     * @param param
+     */
     @Transactional(rollbackFor = {BusinessException.class})
     public   void backElecBike(BackElecBikeRequest param) {
         Member member = memberMapper.selectById(param.getMemberId());
@@ -113,6 +116,22 @@
         gparam.setStatus(Constants.goodsorderStatus.pay);
         gparam.setType(Constants.ZERO);
         Goodsorder goodsorder =  goodsorderService.findOne(gparam);
+        this.backBike(goodsorder);
+    }
+
+    /**
+     * 鑷姩杩樿溅
+     * @param id
+     */
+    @Transactional
+    public void forceBack(String id){
+        Goodsorder goodsorder =  goodsorderService.findById(id);
+        this.backBike(goodsorder);
+    }
+
+
+    @Transactional(rollbackFor = {BusinessException.class})
+    public void backBike(Goodsorder goodsorder){
         if(Objects.isNull(goodsorder)){
             throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"鏃犻獞琛岃鍗曡褰�");
         }
@@ -127,15 +146,15 @@
                 if(Constants.equalsInteger(rides.getStatus(),Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey())
                         &&Constants.equalsInteger(rides.getType(),Constants.ONE)){
                     //濡傛灉鏄數杞﹀苟涓旀槸楠戣涓� 杩涜鍏抽攣澶勭悊
-//                    Bikes  bike = getElecBikeByCode(rides.getBikeCode());
-//                    //鏌ヨ鍋滆溅绔欑偣淇℃伅
-//                    if(bike.getSiteId() ==null){
-//                        throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍓嶅線鍋滆溅鐐瑰仠杞︼紒");
-//                    }
-//                    lockBikes(bike.getDeviceSn(),Constants.ZERO);//鍙戣捣鍏抽攣鎸囦护璇锋眰
+                    Bikes  bike = getElecBikeByCode(rides.getBikeCode());
+                    //鏌ヨ鍋滆溅绔欑偣淇℃伅
+                    if(bike.getSiteId() ==null){
+                        throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍓嶅線鍋滆溅鐐瑰仠杞︼紒");
+                    }
+                    lockBikes(bike.getDeviceSn(),Constants.ZERO);//鍙戣捣鍏抽攣鎸囦护璇锋眰
                     backIds.add(rides.getId());
                     rides.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey());//宸茶繕杞�
-//                    rides.setBackSiteId(bike.getSiteId());//杩樿溅绔欑偣
+                    rides.setBackSiteId(bike.getSiteId());//杩樿溅绔欑偣
 
                     rides.setBackDate(new Date());
                     Integer freeRentTime = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
@@ -194,7 +213,7 @@
         APIResult<T0201_0500> data = result.block();
         if(!data.isSuccess()){
             //濡傛灉寮�閿佸け璐ワ紝鍒欒繑鍥炲紓甯�
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝"+(type ==0?"杞﹁締寮�閿�":"杞﹁締鍏抽攣")+"澶辫触锛岃绋嶅悗閲嶈瘯锛屾垨鑰呰仈绯诲洯鍖虹鐞嗕汉鍛橈紒");
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝"+(type ==0?"杞﹁締鍏抽攣":"杞﹁締寮�閿�")+"澶辫触锛岃绋嶅悗閲嶈瘯锛屾垨鑰呰仈绯诲洯鍖虹鐞嗕汉鍛橈紒");
         }
     }
 
@@ -243,6 +262,7 @@
         Goodsorder gparam = new Goodsorder();
         gparam.setMemberId(param.getMemberId());
         gparam.setStatus(Constants.goodsorderStatus.pay);
+        gparam.setType(Constants.ZERO);
         Goodsorder goodsorder =  goodsorderService.findOne(gparam);
         if(Objects.isNull(goodsorder)){
             throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鎮ㄥ綋鍓嶆湁楠戣涓鍗曡褰�");
@@ -256,9 +276,9 @@
         if(memberRides ==null || memberRides.getBikeCode() == null){
             throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鎮ㄥ綋鍓嶆湁楠戣涓褰�");
         }
-//        Bikes bike = getElecBikeByCode(memberRides.getBikeCode());
-//        //鏌ヨ鍋滆溅浣嶇疆鏄惁绗﹀悎鍋滆溅浣嶇疆瑙勮寖
-//        checkPausePostionBiz(bike);
+        Bikes bike = getElecBikeByCode(memberRides.getBikeCode());
+        //鏌ヨ鍋滆溅浣嶇疆鏄惁绗﹀悎鍋滆溅浣嶇疆瑙勮寖
+        checkPausePostionBiz(bike);
         memberRides.setPauseDate(new Date());
         memberRides.setEditDate(memberRides.getBackDate());
         memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.RIDES_PAUSING.getKey());
@@ -373,7 +393,7 @@
             //濡傛灉杞﹁締绫诲瀷鏄┖
             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), " 璇ヨ溅鍨嬫殏鏃朵笉鑳藉�熻溅鎿嶄綔鍝︼紝璇锋洿鎹㈠叾浠栬溅鍨嬮噸璇曪紒");
         }
-        cacheOpenLock.put(bike.getCode(), 1);
+        cacheOpenLock.put(openElecBikeRequest.getCode(), 1);
         try {
             //鍒ゆ柇褰撳墠鏄惁宸叉敮浠樻娂閲�
             Goodsorder goodsorder = goodsorderService.findOneByWrapper(new QueryWrapper<Goodsorder>()
@@ -404,7 +424,7 @@
             //鏍规嵁杞﹀瀷鏌ヨ璁′环鏂规
             isValidePricingType(bike,memberRides) ;
             MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse();
-//            this.lockBikes(bike.getDeviceSn(),1);
+            this.lockBikes(bike.getDeviceSn(),1);
             //瀛樺偍楠戣璁板綍
             memberRides.setId(Constants.getUUID());
             memberRides.setIsdeleted(Constants.ZERO);
@@ -420,10 +440,12 @@
             memberRidesJoinMapper.insert(memberRides);
             BeanUtils.copyProperties(memberRides, memberRidesDetailResponse);
             return memberRidesDetailResponse;
-        }catch (Exception e){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "寮�閿佸け璐ワ紝璇疯仈绯荤鐞嗗憳");
+        }catch (BusinessException biz){
+            throw  biz;
+        }catch (Exception biz){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR);
         }finally {
-            cacheOpenLock.remove(bike.getCode());
+            cacheOpenLock.remove(openElecBikeRequest.getCode());
         }
     }
 
@@ -437,6 +459,7 @@
         Goodsorder gparam = new Goodsorder();
         gparam.setMemberId(param.getMemberId());
         gparam.setStatus(Constants.goodsorderStatus.pay);
+        gparam.setType(Constants.ZERO);
         Goodsorder goodsorder =  goodsorderService.findOne(gparam);
         if(Objects.isNull(goodsorder)){
             throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鎮ㄥ綋鍓嶆湁楠戣涓鍗曡褰�");
@@ -536,9 +559,10 @@
                 .eq(MemberRides::getIsdeleted,Constants.ZERO)
                 .eq(MemberRides::getType,Constants.ONE)
                 .eq(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.RIDES_PAUSING.getKey())
-                .apply(" NOW() >= t.create_date  + INTERVAL '2 hours' ")
+                .apply(" NOW() >= (t.create_date  + INTERVAL '"+systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PAUSE_AUTO_CLOSE_TIME).getCode()+" min') ")
         );
 
+        ;
         for (MemberRides timeOutRides:memberRidesList) {
             Goodsorder goodsorder = goodsorderService.findById(timeOutRides.getOrdreId());
             //鏌ヨ楠戣璁板綍
@@ -557,6 +581,10 @@
                         rides.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey());//宸茶繕杞�
                         rides.setBackSiteId(bike.getSiteId());//杩樿溅绔欑偣
                         rides.setBackDate(new Date());
+                        Integer freeRentTime = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
+                        Integer rideTime = DateUtil.betweenMin(rides.getRentDate(), rides.getBackDate());
+                        //璁$畻楠戣璁¤垂鏃堕暱
+                        rides.setDuration( rideTime > freeRentTime  ? rideTime : 0 );
                         rides.setEditDate(rides.getBackDate());
                         memberRidesJoinMapper.updateById(rides);//鏇存柊楠戣鐘舵�佷负宸茶繕杞�
                     }
@@ -570,10 +598,10 @@
             //鍙戦�佸皬绋嬪簭閫氱煡
             Member member = memberMapper.selectById(goodsorder.getMemberId());
             if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getOpenid())){
-                sendWxMessage.bookingsCancel(member.getOpenid(),goodsorder.getId(), WxMiniConfig.wxMaService.getAccessToken(),timeOutRides.getBikeCode(),goodsorder.getPayDate(),goodsorder.getEndDate());
+                sendWxMessage.bookingsCancel(member.getOpenid(),goodsorder.getId(),
+                        WxMiniConfig.wxMaService.getAccessToken(),
+                        timeOutRides.getBikeCode(),goodsorder.getPayDate(),goodsorder.getEditDate());
             }
-
-
         }
     }
 

--
Gitblit v1.9.3