From c5c4f201eedfcf374008238dce7afc84f8200ea4 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期六, 07 二月 2026 16:33:42 +0800
Subject: [PATCH] 代码初始化

---
 server/services/src/main/java/com/doumee/service/business/RefundService.java          |   99 ++++
 server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java   |   19 
 server/services/src/main/java/com/doumee/service/business/impl/RefundServiceImpl.java |  246 ++++++++++
 server/admin/db/RefundPermissions.sql                                                 |    6 
 admin/src/views/business/refund.vue                                                   |  179 +++++++
 server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java              |    3 
 server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java            |    2 
 admin/src/components/business/OperaRefundWindow.vue                                   |  132 +++++
 admin/src/api/business/refund.js                                                      |   49 ++
 server/services/src/main/java/com/allinpay/syb/model/PayOrderRefundResponse.java      |   32 +
 web/pages/success/success.vue                                                         |    3 
 server/services/src/main/java/com/allinpay/syb/lib/DoumeeTLUtil.java                  |  120 +++++
 server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java         |    2 
 server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java               |    2 
 admin/src/views/business/orders.vue                                                   |   25 
 server/services/src/main/java/com/doumee/dao/business/model/Refund.java               |  111 ++++
 server/services/src/main/java/com/doumee/dao/business/RefundMapper.java               |   12 
 server/services/src/main/java/com/doumee/dao/business/model/Orders.java               |    3 
 server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java            |    3 
 server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java |  191 +++----
 server/admin/src/main/resources/application.yml                                       |    2 
 server/admin/src/main/java/com/doumee/api/business/RefundController.java              |   92 ++++
 22 files changed, 1,204 insertions(+), 129 deletions(-)

diff --git a/admin/src/api/business/refund.js b/admin/src/api/business/refund.js
new file mode 100644
index 0000000..02ddf4a
--- /dev/null
+++ b/admin/src/api/business/refund.js
@@ -0,0 +1,49 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/refund/page', data, {
+    trim: true
+  })
+}
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/refund/exportExcel', data, {
+    download: true,
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/refund/create', data)
+}
+export function updateByPayStatus (data) {
+  return request.post('/business/refund/updateByPayStatus', data)
+}
+export function cancel (id) {
+  return request.get(`/business/refund/cancel?id=${id}`)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/refund/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/refund/delete/${id}`)
+}
+// 鍒犻櫎
+export function getById (id) {
+  return request.get(`/business/refund/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/refund/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/components/business/OperaRefundWindow.vue b/admin/src/components/business/OperaRefundWindow.vue
new file mode 100644
index 0000000..1b65d01
--- /dev/null
+++ b/admin/src/components/business/OperaRefundWindow.vue
@@ -0,0 +1,132 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    width="60%"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <div class="header">
+      <div  class="header-b">璁㈠崟淇℃伅</div>
+      <div class="info-item"  >
+        <div class="info-item-a">璁㈠崟閲戦锛�<span class="orange"> 锟{((form.order.money||0)/100).toFixed(2)}}鍏�</span></div>
+        <div class="info-item-a">璁㈠崟缂栧彿锛�<span>{{form.order.id }}</span></div>
+        <div class="info-item-a">浠樻浜猴細<span>{{form.order.name +'-' + form.order.phone}}</span></div>
+      </div>
+    </div>
+    <el-form :model="form" ref="form" :rules="rules">
+      <p class="tip-warn" ><i class="el-icon-warning"></i>璇存槑锛氭搷浣滃綋鍓嶅彲閫�閲戦<span class="red">锟{((form.balance||0)/100).toFixed(2)}}鍏�</span>锛岃璋ㄦ厧鎿嶄綔锛�</p>
+      <el-form-item label="閫�娆鹃噾棰�" prop="money">
+        <el-input v-model="form.money" type="number" placeholder="閫�娆鹃噾棰�" v-trim><template s></template></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaOrdersWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        money: '',
+        remark: '',
+        orderId: '',
+        balance: 0,
+        order:{}
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        money: [{ required: true, message: '璇疯緭鍏ラ��娆鹃噾棰�' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/refund',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
+
+<style scoped  lang="scss">
+.table-pagination{
+  position: fixed !important;
+  bottom: 50px;
+}
+.header-b{
+  display: inline-block;
+  font-size: 16px;
+  font-weight: bold;
+}
+.header-red-btn{
+  display: inline-block;
+  font-size: 12px;
+  background-color:  red;
+  padding: 2px 10px 3px 10px;
+  margin-left: 20px;
+  color: white;
+  cursor: pointer;
+  border-radius: 5px ;
+}
+.header-blue-btn{
+  display: inline-block;
+  font-size: 12px;
+  background-color:  #216EEE;
+  padding: 2px 10px 3px 10px;
+  margin-left: 20px;
+  color: white;
+  cursor: pointer;
+  border-radius: 5px ;
+}
+.header-grey{
+  display: inline-block;
+  font-size: 12px;
+  border: 1px solid grey;
+  padding: 2px 10px;
+  margin-left: 20px;
+  color: grey;
+  border-radius: 5px ;
+}
+.header-orange{
+  display: inline-block;
+  font-size: 12px;
+  border: 1px solid orange;
+  padding: 2px 10px;
+  margin-left: 20px;
+  color: orange;
+  border-radius: 5px ;
+}
+.header-btn{
+  display: inline-block;
+  border: none;
+  padding: 2px 10px;
+  margin-left: 20px;
+}
+.info-item{
+  display: flex;
+  width: 100%;
+  margin: 15px;
+}
+.info-item-a{
+  flex: 1;
+  font-size: 14px;
+
+}
+.info-item-a span{
+}
+.info-item-a  .btn{
+  font-size: 12px !important;
+  cursor: pointer !important;
+}
+</style>
diff --git a/admin/src/views/business/orders.vue b/admin/src/views/business/orders.vue
index c5f770d..c7fc669 100644
--- a/admin/src/views/business/orders.vue
+++ b/admin/src/views/business/orders.vue
@@ -84,18 +84,25 @@
             <span v-if="row.type==1">寤舵湡娆�</span>
           </template>
         </el-table-column>
+        <el-table-column prop="money" label="宸查��娆鹃噾棰濓紙鍏冿級" min-width="150px">
+          <template slot-scope="{row}">
+            <span class="red">{{((row.refundMoney || 0)/100).toFixed(2)}}</span>
+          </template>
+        </el-table-column>
         <el-table-column prop="remark" label="璁㈠崟澶囨敞"  width="200px"  ></el-table-column>
         <el-table-column prop="userRealname" label="鏀舵浜哄鍚�"  width="100px"  ></el-table-column>
         <el-table-column prop="username" label="璐熻矗浜鸿处鍙�"  width="120px"  ></el-table-column>
         <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="150px"></el-table-column>
         <el-table-column prop="payDate" label="浠樻鏃堕棿" min-width="150px"></el-table-column>
         <el-table-column prop="cancelDate" label="鍙栨秷鏃堕棿" min-width="150px"></el-table-column>
-  <el-table-column
+       <el-table-column
           label="鎿嶄綔"
           align="center"
-          min-width="100"
+          min-width="180"
+          fixed="right"
         >
           <template slot-scope="{row}">
+            <el-button type="text" v-if="row.status==1&&(row.money-(row.refundMoney||0)) >1"  @click="sendRefund(row)" icon="el-icon-edit" v-permissions="['business:refund:create']">閫�娆�</el-button>
             <el-button type="text"   @click="payStatus(row)" icon="el-icon-refresh" v-permissions="['business:orders:update']">鍚屾鐘舵��</el-button>
           </template>
         </el-table-column>
@@ -109,6 +116,7 @@
     </template>
     <!-- 鏂板缓/淇敼 -->
     <OperaOrderDetailWindow ref="OperaOrderDetailWindow" @success="handlePageChange"/>
+    <OperaRefundWindow ref="OperaRefundWindow" @success="handlePageChange"/>
   </TableLayout>
 </template>
 
@@ -117,11 +125,12 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaOrderDetailWindow from '@/components/business/OperaOrderDetailWindow'
+import OperaRefundWindow from '@/components/business/OperaRefundWindow'
 import { cancel } from '@/api/business/orders'
 export default {
   name: 'Orders',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaOrderDetailWindow },
+  components: { TableLayout, Pagination, OperaOrderDetailWindow, OperaRefundWindow },
   data () {
     return {
       // 鎼滅储
@@ -168,11 +177,19 @@
             })
         })
     },
+    sendRefund (row) {
+      var balance = row.money - (row.refundMoney || 0)
+      if (balance < 1) {
+        this.$message.error('璇ヨ鍗曞凡鏃犲彲閫�娆句綑棰�')
+        return
+      }
+      this.$refs.OperaRefundWindow.open('鍙戣捣閫�娆�', { orderId: row.id, balance: balance ,order:row})
+    },
     payStatus (row) {
       this.$dialog.actionConfirm('鎮ㄧ‘璁ゃ�愬悓姝ャ�戣璁㈠崟鏈�鏂扮姸鎬佸悧锛�', '鎿嶄綔纭')
         .then(() => {
           this.dealing = true
-          this.api.updateByPayStatus({id:row.id})
+          this.api.updateByPayStatus({ id: row.id })
             .then(res => {
               this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
               this.search()
diff --git a/admin/src/views/business/refund.vue b/admin/src/views/business/refund.vue
new file mode 100644
index 0000000..a9284c8
--- /dev/null
+++ b/admin/src/views/business/refund.vue
@@ -0,0 +1,179 @@
+<template>
+  <TableLayout :permissions="['business:refund:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="" prop="id">
+        <el-input v-model="searchForm.id"    clearable placeholder="璁㈠崟鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="" prop="memberName">
+        <el-input v-model="searchForm.memberName"    clearable placeholder="浠樻浜哄鍚�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="" prop="memberPhone">
+        <el-input v-model="searchForm.memberPhone"    clearable placeholder="浠樻浜烘墜鏈哄彿" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+<!--      <el-form-item label="" prop="username">
+        <el-input v-model="searchForm.username"  clearable placeholder="璐熻矗浜鸿处鍙�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="" prop="userRealname">
+        <el-input v-model="searchForm.userRealname"   clearable placeholder="璐熻矗浜哄鍚�" @keypress.enter.native="search"></el-input>
+      </el-form-item>-->
+      <el-form-item label="" prop="orderType">
+        <el-select v-model="searchForm.orderType"    @change="search"  clearable placeholder="浠樻浜嬬敱">
+          <el-option label="杞︽" :value="0"></el-option>
+          <el-option label="寤舵湡娆�" :value="1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="status">
+        <el-select v-model="searchForm.status"  @change="search" clearable placeholder="鐘舵��">
+        <el-option label="澶勭悊涓�" :value="0"></el-option>
+        <el-option label="鎴愬姛" :value="1"></el-option>
+        <el-option label="澶辫触" :value="2"></el-option>
+        </el-select>
+      </el-form-item>
+        <el-form-item label=""   prop="starttime"  label-width="100px" >
+          <el-date-picker type="datetime"    v-model="searchForm.starttime" clearable value-format="yyyy-MM-dd HH:mm:ss"
+                          placeholder="寮�濮�(鍒涘缓)鏃堕棿" /> -
+        </el-form-item>
+        <el-form-item label="" prop="endtime"   label-width="0px" >
+          <el-date-picker type="datetime"   v-model="searchForm.endtime" clearable value-format="yyyy-MM-dd HH:mm:ss"
+                          placeholder="缁撴潫(鍒涘缓)鏃堕棿" />
+        </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+<!--
+        <el-button type="primary" :loading="isWorking.export" @click="exportExcel">瀵煎嚭</el-button>
+-->
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+<!--      <ul class="toolbar" v-permissions="['business:refund:create', 'business:refund:delete']">
+        <li><el-button type="primary" @click="$refs.operaOrdersWindow.open('鏂板缓璁㈠崟淇℃伅璁板綍')" icon="el-icon-plus" v-permissions="['business:refund:create']">鏂板缓</el-button></li>
+        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:refund:delete']">鍒犻櫎</el-button></li>
+      </ul>-->
+      <el-table
+         :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column prop="id" label="閫�娆惧崟鍙�" width="120px" fixed="left">
+          <template slot-scope="{row}">
+            <span class="blue"   @click="openDetail(row)">{{row.id}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="orderId" label="鏀粯璁㈠崟鍙�"  width="100px" :show-overflow-tooltip='true'></el-table-column>
+        <el-table-column prop="memberName" label="浠樻浜哄鍚�"  width="100px" :show-overflow-tooltip='true'></el-table-column>
+        <el-table-column prop="memberPhone" label="浠樻浜烘墜鏈哄彿"  width="120px" :show-overflow-tooltip='true'></el-table-column>
+        <el-table-column prop="money" label="鏀粯閲戦锛堝厓锛�" min-width="150px">
+          <template slot-scope="{row}">
+            <span class="yellowstate">{{((row.money || 0)/100).toFixed(2)}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="statusName" label="閫�娆剧姸鎬�" min-width="100px"  >
+          <template slot-scope="{row}">
+          <span v-if="row.status == 0" class="blue">澶勭悊涓�</span>
+          <span v-if="row.status == 1" class="green">鎴愬姛</span>
+          <span v-if="row.status == 2" class="grey">澶辫触</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="orderType" label="浠樻浜嬬敱" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.orderType==0">杞︽</span>
+            <span v-if="row.orderType==1">寤舵湡娆�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="money" label="閫�娆鹃噾棰濓紙鍏冿級" min-width="150px">
+          <template slot-scope="{row}">
+            <span class="red">{{((row.money || 0)/100).toFixed(2)}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="remark" label="閫�娆惧娉�"  width="200px"  ></el-table-column>
+        <el-table-column prop="memberName" label="鏀舵浜哄鍚�"  width="100px"  ></el-table-column>
+        <el-table-column prop="memberPhone" label="璐熻矗浜鸿处鍙�"  width="120px"  ></el-table-column>
+        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="payDate" label="瀹屾垚鏃堕棿" min-width="150px"></el-table-column>
+       <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          min-width="180"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text"   @click="payStatus(row)" icon="el-icon-refresh" v-permissions="['business:refund:update']">鍚屾鐘舵��</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaOrderDetailWindow ref="OperaOrderDetailWindow" @success="handlePageChange"/>
+    <OperaRefundWindow ref="OperaRefundWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaOrderDetailWindow from '@/components/business/OperaOrderDetailWindow'
+import OperaRefundWindow from '@/components/business/OperaRefundWindow'
+import { cancel } from '@/api/business/orders'
+export default {
+  name: 'Orders',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaOrderDetailWindow, OperaRefundWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        id: null,
+        status: null,
+        type: null,
+        starttime: null,
+        endtime: null,
+        memberName: null,
+        memberPhone: null,
+        orderId: null
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '閫�娆句俊鎭褰�',
+      api: '/business/refund',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    openDetail (row) {
+    },
+    payStatus (row) {
+      this.$dialog.actionConfirm('鎮ㄧ‘璁ゃ�愬悓姝ャ�戣閫�娆炬渶鏂扮姸鎬佸悧锛�', '鎿嶄綔纭')
+        .then(() => {
+          this.dealing = true
+          this.api.updateByPayStatus({ id: row.id })
+            .then(res => {
+              this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.dealing = false
+            })
+        })
+    }
+  }
+}
+</script>
diff --git a/server/admin/db/RefundPermissions.sql b/server/admin/db/RefundPermissions.sql
new file mode 100644
index 0000000..4c4141b
--- /dev/null
+++ b/server/admin/db/RefundPermissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`, `MODULE`) VALUES ('business:refund:create', '鏂板缓璁㈠崟閫�娆句俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0,'璁㈠崟閫�娆句俊鎭〃');
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`, `MODULE`) VALUES ('business:refund:delete', '鍒犻櫎璁㈠崟閫�娆句俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0,'璁㈠崟閫�娆句俊鎭〃');
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`, `MODULE`) VALUES ('business:refund:update', '淇敼璁㈠崟閫�娆句俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0,'璁㈠崟閫�娆句俊鎭〃');
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`, `MODULE`) VALUES ('business:refund:query', '鏌ヨ璁㈠崟閫�娆句俊鎭〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0,'璁㈠崟閫�娆句俊鎭〃');
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`, `MODULE`) VALUES ('business:refund:exportExcel', '瀵煎嚭璁㈠崟閫�娆句俊鎭〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0,'璁㈠崟閫�娆句俊鎭〃');
+
diff --git a/server/admin/src/main/java/com/doumee/api/business/RefundController.java b/server/admin/src/main/java/com/doumee/api/business/RefundController.java
new file mode 100644
index 0000000..dee6a25
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/RefundController.java
@@ -0,0 +1,92 @@
+package com.doumee.api.business;
+
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.Refund;
+import com.doumee.core.utils.Utils;
+import com.doumee.service.business.RefundService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import  com.doumee.api.BaseController;
+/**
+ * 璁㈠崟閫�娆句俊鎭〃Controller瀹氫箟
+ * @author doumee
+ * @date 2026-02-06 11:35:16
+ */
+@Api(tags = "refund鎺ュ彛")
+@RestController
+@RequestMapping("/business/refund")
+public class RefundController extends BaseController {
+
+    @Autowired
+    private RefundService refundService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:refund:create")
+    public ApiResponse create(@RequestBody Refund refund) {
+        return ApiResponse.success(refundService.create(refund));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:refund:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        refundService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:refund:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        refundService.deleteByIdInBatch(this.getIdList(ids));
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鏍规嵁ID鏌ヨ浜ゆ槗娴佹按淇℃伅鏇存柊鏈�鏂颁氦鏄撶姸鎬�")
+    @PostMapping("/updateByPayStatus")
+    @RequiresPermissions("business:refund:update")
+    public ApiResponse updateByPayStatus(@RequestBody Refund orders) {
+        refundService.updateByPayStatus(orders);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:refund:update")
+    public ApiResponse updateById(@RequestBody Refund refund) {
+        refundService.updateById(refund);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:refund:query")
+    public ApiResponse<PageData<Refund>> findPage (@RequestBody PageWrap<Refund> pageWrap) {
+        return ApiResponse.success(refundService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:refund:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Refund> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Refund.class).export(refundService.findPage(pageWrap).getRecords(), "璁㈠崟閫�娆句俊鎭〃", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:refund:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(refundService.findById(id));
+    }
+}
diff --git a/server/admin/src/main/resources/application.yml b/server/admin/src/main/resources/application.yml
index 80562ae..058e31c 100644
--- a/server/admin/src/main/resources/application.yml
+++ b/server/admin/src/main/resources/application.yml
@@ -8,7 +8,7 @@
 
 spring:
   profiles:
-    active: pro
+    active: dev
   # JSON杩斿洖閰嶇疆
   jackson:
     # 榛樿鏃跺尯
diff --git a/server/services/src/main/java/com/allinpay/syb/lib/DoumeeTLUtil.java b/server/services/src/main/java/com/allinpay/syb/lib/DoumeeTLUtil.java
new file mode 100644
index 0000000..adbc0d2
--- /dev/null
+++ b/server/services/src/main/java/com/allinpay/syb/lib/DoumeeTLUtil.java
@@ -0,0 +1,120 @@
+package com.allinpay.syb.lib;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.allinpay.syb.model.PayOrderNotifyParam;
+import com.allinpay.syb.model.PayOrderRefundResponse;
+import com.allinpay.syb.model.PayPublicModel;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.Refund;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.Map;
+import java.util.TreeMap;
+
+@Slf4j
+@Data
+public class DoumeeTLUtil {
+    public static final String SUCCESS_CODE = "SUCCESS";
+    public static final String FAIL_CODE = "FAIL";
+    private PayPublicModel publicModel;
+    private String appkey;
+    private String pubKey;
+    public DoumeeTLUtil(PayPublicModel model){
+        this.publicModel = model;
+    }
+    public  static  String REFUND_SN_PREFIX = "refund_";
+    public PayOrderRefundResponse sendRefundOrder(String reqsn, String oldReqsn, String money, String remark)    {
+            TreeMap<String, String> params = new TreeMap<String, String>();
+            params.put("cusid", publicModel.getCusid());
+            params.put("appid", publicModel.getAppid());
+            params.put("version", publicModel.getVersion());
+            params.put("trxid", "");
+            params.put("randomstr", SybUtil.getValidatecode(8));
+            params.put("signtype", publicModel.getSigntype());
+            params.put("notify_url",publicModel.getNotifyUrl());
+            params.remove("sign");
+            params.put("reqsn",REFUND_SN_PREFIX+reqsn);
+            params.put("oldreqsn",oldReqsn);
+            params.put("trxamt",money);
+            params.put("remark",remark);
+            return  sendRequest(params,publicModel.getUrl()+"/tranx/refund",publicModel.getAppkey(),publicModel.getAppPubkey(),new TypeReference<PayOrderRefundResponse>(){});
+    }
+    public  PayOrderNotifyParam   sendQueryOrder(String reqsn  )  {
+            TreeMap<String, String> params = new TreeMap<String, String>();
+            params.put("cusid", publicModel.getCusid());
+            params.put("appid", publicModel.getAppid());
+            params.put("version", publicModel.getVersion());
+            params.put("trxid", "");
+            params.put("randomstr", SybUtil.getValidatecode(8));
+            params.put("signtype", publicModel.getSigntype());
+            params.remove("sign");
+            params.put("reqsn",reqsn);
+           return  sendRequest(params,publicModel.getUrl()+"/tranx/query",publicModel.getAppkey(),publicModel.getAppPubkey(),new TypeReference<PayOrderNotifyParam>(){});
+    }
+    public static <T> T sendRequest(TreeMap<String,String> params, String url, String appkey, String pubKey, TypeReference<T> typeReference )  {
+        try {
+            params.put("sign", SybUtil.unionSign(params,appkey,params.get("signtype")));
+            String data =getHttpParamsStr(params);
+            log.error("璁㈠崟浜ゆ槗鏁版嵁璇锋眰================{}",data);
+            String result =  HttpsUtil.post(url,data,"application/x-www-form-urlencoded",true);
+            log.error("璁㈠崟鏌ヤ氦鎹繑鍥�================{}",result);
+            T map = handleResult(result,pubKey,params.get("signtype"),typeReference);
+            return map;
+        }catch (Exception e){
+            log.error("閫氳仈璁㈠崟鏌ヨ寮傚父================{}",e);
+        }
+        return  null;
+    }
+    public static String getHttpParamsStr(Map<String, String> params ) throws IOException {
+        StringBuilder outBuf = new StringBuilder();
+        boolean isNotFirst = false;
+        for (Map.Entry<String, String> entry: params.entrySet()){
+            if (isNotFirst)
+                outBuf.append('&');
+            isNotFirst = true;
+            outBuf
+                    .append(entry.getKey())
+                    .append('=')
+                    .append(URLEncoder.encode(StringUtils.defaultString(entry.getValue(),""), "UTF-8"));
+        }
+        System.out.println("鍙傛暟:"+outBuf.toString());
+        return outBuf.toString();
+    }
+
+    public static <T> T  handleResult(String result,String pubKey,String signType, TypeReference<T> typeReference ) throws Exception{
+        log.error("杩斿洖鏁版嵁杩斿洖================{}",result);
+        Map map = SybUtil.json2ObjMap(result);
+        if(map == null){
+            log.error("杩斿洖鏁版嵁杩斿洖閿欒================{}",result);
+            throw new Exception("杩斿洖鏁版嵁閿欒");
+        }
+        if("SUCCESS".equals(map.get("retcode"))){
+            TreeMap tmap = new TreeMap();
+            tmap.putAll(map);
+            if(SybUtil.validSign(tmap, pubKey, signType)){
+                T param = JSONObject.parseObject(result,typeReference.getType());
+                return param;
+            }
+        }
+        return null;
+    }
+    public static  TreeMap<String, String> getParams(HttpServletRequest request){
+        TreeMap<String, String> map = new TreeMap<String, String>();
+        Map reqMap = request.getParameterMap();
+        for(Object key:reqMap.keySet()){
+            String value = ((String[])reqMap.get(key))[0];
+            System.out.println(key+";"+value);
+            map.put(key.toString(),value);
+        }
+        return map;
+    }
+
+}
diff --git a/server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java b/server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java
index 5e9fa47..946071e 100644
--- a/server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java
+++ b/server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java
@@ -4,7 +4,7 @@
 import lombok.Data;
 
 /**
- * 鍛樺伐淇℃伅瀵煎叆琛�
+ * 璁㈠崟鏀粯鍙傛暟寮傛閫氱煡杩斿洖
  * @author 姹熻箘韫�
  * @date 2024/01/16 10:03
  */
diff --git a/server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java b/server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java
index 1f68543..3667f66 100644
--- a/server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java
+++ b/server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java
@@ -4,7 +4,7 @@
 import lombok.Data;
 
 /**
- * 鍛樺伐淇℃伅瀵煎叆琛�
+ * 璁㈠崟鏀粯鍙傛暟
  * @author 姹熻箘韫�
  * @date 2024/01/16 10:03
  */
diff --git a/server/services/src/main/java/com/allinpay/syb/model/PayOrderRefundResponse.java b/server/services/src/main/java/com/allinpay/syb/model/PayOrderRefundResponse.java
new file mode 100644
index 0000000..eba2e02
--- /dev/null
+++ b/server/services/src/main/java/com/allinpay/syb/model/PayOrderRefundResponse.java
@@ -0,0 +1,32 @@
+package com.allinpay.syb.model;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 璁㈠崟閫�娆捐繑鍥炲璞�
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Data
+@ApiModel("璁㈠崟閫�娆捐繑鍥炲璞�")
+public class PayOrderRefundResponse {
+
+    private String  cusid	;//鍟嗘埛鍙�	骞冲彴鍒嗛厤鐨勫晢鎴峰彿	鍚�	15
+    private String appid	;//搴旂敤ID	骞冲彴鍒嗛厤鐨凙PPID	鍚�	8
+    private String trxid	;//浜ゆ槗鍗曞彿	鏀堕摱瀹濆钩鍙扮殑閫�娆句氦鏄撴祦姘村彿	鍚�	20
+    private String reqsn	;//鍟嗘埛璁㈠崟鍙�	鍟嗘埛鐨勯��娆句氦鏄撹鍗曞彿	鍚�	32
+    private String  trxstatus	;//浜ゆ槗鐘舵��	浜ゆ槗鐨勭姸鎬�	鍚�	4	瑙侀檮褰曚氦鏄撹繑鍥炵爜璇存槑
+    private String  fintime	;//浜ゆ槗瀹屾垚鏃堕棿	yyyyMMddHHmmss	鏄�	14
+    private String  errmsg;//	閿欒鍘熷洜	澶辫触鐨勫師鍥犺鏄�	鏄�	100
+    private String fee	;//鎵嬬画璐�	 	鏄�	15
+    private String  trxcode	;//浜ゆ槗绫诲瀷	 	鏄�	8	瑙侀檮褰曚氦鏄撶被鍨嬭鏄�
+    private String  randomstr	;//闅忔満瀛楃涓�	闅忔満鐢熸垚鐨勫瓧绗︿覆	鍚�	32
+    private String    chnltrxid	;//娓犻亾娴佹按鍙�	濡傛敮浠樺疂锛屽井淇″钩鍙拌鍗曞彿	鏄�	64
+    private String   chnldata;//	娓犻亾淇℃伅	 	鏄�	-
+    private String bankcode;//	鎵�灞為摱琛�	 	鏄�
+    private String  sign	;//绛惧悕	 	鍚�	32	璇﹁瀹夊叏瑙勮寖
+
+   private String retcode;//	string	鍚�	鏀堕摱瀹滱PPID	8
+   private String retmsg;//	string	鍚�	鏀堕摱瀹滱PPID	8
+}
diff --git a/server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java b/server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java
index 8fac915..78a410d 100644
--- a/server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java
+++ b/server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java
@@ -4,7 +4,7 @@
 import lombok.Data;
 
 /**
- * 鍛樺伐淇℃伅瀵煎叆琛�
+ * 璁㈠崟鏀粯鍙傛暟杩斿洖
  * @author 姹熻箘韫�
  * @date 2024/01/16 10:03
  */
diff --git a/server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java b/server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java
index b80eb8a..58a0091 100644
--- a/server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java
+++ b/server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java
@@ -4,7 +4,7 @@
 import lombok.Data;
 
 /**
- * 鍛樺伐淇℃伅瀵煎叆琛�
+ * 閫氳仈鍏叡閰嶇疆鍙傛暟
  * @author 姹熻箘韫�
  * @date 2024/01/16 10:03
  */
@@ -19,6 +19,7 @@
     private String appkey;
     private String url;
     private String appPubkey;
+    private String notifyUrl;
 
 
 }
diff --git a/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java b/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
index 78ace21..38a2b65 100644
--- a/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
+++ b/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
@@ -1,5 +1,6 @@
 package com.doumee.biz.system;
 
+import com.allinpay.syb.model.PayPublicModel;
 import com.doumee.dao.common.dto.UpdateSortDTO;
 import com.doumee.dao.system.model.SystemDictData;
 
@@ -34,7 +35,7 @@
      */
     void sort(UpdateSortDTO dto);
 
-
+    PayPublicModel initPayPublicModel();
     void updateByIdNew(SystemDictData systemDictData);
     SystemDictData queryByCode(String dicCode, String label);
     String  queryCodeById(Integer id);
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 8c3ed57..d77c860 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
@@ -1,5 +1,6 @@
 package com.doumee.biz.system.impl;
 
+import com.allinpay.syb.model.PayPublicModel;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.exception.BusinessException;
@@ -50,6 +51,20 @@
     public void updateById(SystemDictData systemDictData) {
         systemDictDataService.updateById(systemDictData);
     }
+    @Override
+    public PayPublicModel initPayPublicModel() {
+        PayPublicModel model = new PayPublicModel();
+        model.setUrl( queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
+        model.setCusid( queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
+        model.setAppid(queryByCode(Constants.SYSTEM,Constants.PAY_SYB_APPID).getCode());
+        model.setVersion(queryByCode(Constants.SYSTEM,Constants.PAY_VERSION).getCode());
+        model.setSigntype( queryByCode(Constants.SYSTEM,Constants.PAY_SIGN_TYPE).getCode());
+        model.setAppkey(queryByCode(Constants.SYSTEM,Constants.PAY_APPKEY).getCode());
+        model.setUrl(queryByCode(Constants.SYSTEM,Constants.PAY_SYB_APIURL).getCode());
+        model.setNotifyUrl(queryByCode(Constants.SYSTEM,Constants.PAY_NOTIFY_URL).getCode());
+        model.setAppPubkey( queryByCode(Constants.SYSTEM,Constants.PAY_SYB_RSATLPUBKEY).getCode());
+        return model;
+    }
 
     @Override
     public void sort(UpdateSortDTO dto) {
@@ -75,9 +90,7 @@
             }
             SystemDictData preDictData = dictDataList.remove(index - 1);
             dictDataList.add(index, preDictData);
-        }
-        // 涓嬬Щ
-        else {
+        }else {
             if (index + 1 > dictDataList.size() - 1) {
                 return;
             }
diff --git a/server/services/src/main/java/com/doumee/dao/business/RefundMapper.java b/server/services/src/main/java/com/doumee/dao/business/RefundMapper.java
new file mode 100644
index 0000000..7b5708c
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/RefundMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Refund;
+import com.github.yulichang.base.MPJBaseMapper;
+/**
+ * 璁㈠崟閫�娆句俊鎭〃Mapper瀹氫箟
+ * @author doumee
+ * @date 2026-02-06 11:35:16
+ */
+public interface RefundMapper extends MPJBaseMapper<Refund> {
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Orders.java b/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
index 46058a1..c37f398 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -130,4 +130,7 @@
     @ApiModelProperty("缁熻閲�")
     @TableField(exist = false)
     private Long num;
+    @ApiModelProperty("宸查��娆鹃噾棰�")
+    @TableField(exist = false)
+    private BigDecimal refundMoney;
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Refund.java b/server/services/src/main/java/com/doumee/dao/business/model/Refund.java
new file mode 100644
index 0000000..2318b1b
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Refund.java
@@ -0,0 +1,111 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+/**
+ * 璁㈠崟閫�娆句俊鎭〃Model瀹氫箟
+ * @author doumee
+ * @date 2026-02-06 11:35:16
+ */
+@Data
+@TableName("refund")
+@ApiModel(value = "Refund 瀹炰綋绫�")
+public class Refund  {
+
+    @ApiModelProperty("鏀粯鐘舵��:0=鏈敮浠�;1=宸叉敮浠�")
+    @ExcelColumn(name="鏀粯鐘舵��:0=鏈敮浠�;1=宸叉敮浠�",index=1 ,width=10)
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    @ApiModelProperty("鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�")
+    @ExcelColumn(name="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�",index=2 ,width=10)
+    private Integer deleted;
+    @ApiModelProperty("鍒涘缓浜虹紪鐮�")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�",index=3 ,width=10)
+    private Integer createUser;
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿",index=4 ,width=10)
+    private Date createTime;
+    @ApiModelProperty("鏇存柊浜虹紪鐮�")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�",index=5 ,width=10)
+    private Integer updateUser;
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿",index=6 ,width=10)
+    private Date updateTime;
+    @ApiModelProperty("澶囨敞")
+    @ExcelColumn(name="澶囨敞",index=7 ,width=10)
+    private String remark;
+    @ApiModelProperty("鐘舵��:0=澶勭悊涓�;1=鎴愬姛;2=澶辫触")
+    @ExcelColumn(name="鐘舵��:0=澶勭悊涓�;1=鎴愬姛;2=澶辫触",index=8 ,width=10)
+    private Integer status;
+    @ApiModelProperty("璇存槑")
+    @ExcelColumn(name="璇存槑",index=9 ,width=10)
+    private String detail;
+    @ApiModelProperty("鍒楄〃鍥�")
+    @ExcelColumn(name="鍒楄〃鍥�",index=10 ,width=10)
+    private String imgurl;
+    @ApiModelProperty("鎺掑簭鐮侊紙鍗囧簭浣跨敤锛�")
+    @ExcelColumn(name="鎺掑簭鐮侊紙鍗囧簭浣跨敤锛�",index=11 ,width=10)
+    private Integer sortnum;
+    @ApiModelProperty("閲戦锛堝垎锛�")
+    @ExcelColumn(name="閲戦锛堝垎锛�",index=12 ,width=10)
+    private BigDecimal money;
+    @ApiModelProperty("褰撳墠浣欓(鍒嗭級")
+    @ExcelColumn(name="褰撳墠浣欓(鍒嗭級",index=13 ,width=10)
+    private BigDecimal banlance;
+    @ApiModelProperty("閫氳仈浜ゆ槗娴佹按鍙�")
+    @ExcelColumn(name="閫氳仈浜ゆ槗娴佹按鍙�",index=14 ,width=10)
+    private String payOrderId;
+    @ApiModelProperty("閫氳仈浜ゆ槗娴佹按(寰俊鏀粯瀹濈瓑骞冲彴浜ゆ槗娴佹按濂斤級")
+    @ExcelColumn(name="閫氳仈浜ゆ槗娴佹按(寰俊鏀粯瀹濈瓑骞冲彴浜ゆ槗娴佹按濂斤級",index=15 ,width=10)
+    private String payThirdOrderId;
+    @ApiModelProperty("鏀粯缁撴灉璇存槑")
+    @ExcelColumn(name="鏀粯缁撴灉璇存槑",index=16 ,width=10)
+    private String payInfo;
+    @ApiModelProperty("閫氳仈浜ゆ槗娓犻亾鏁版嵁")
+    @ExcelColumn(name="閫氳仈浜ゆ槗娓犻亾鏁版嵁",index=17 ,width=10)
+    private String payThirdOrderData;
+    @ApiModelProperty("閫氳仈浜ゆ槗鎵嬬画璐癸紙鍒嗭級")
+    @ExcelColumn(name="閫氳仈浜ゆ槗鎵嬬画璐癸紙鍒嗭級",index=18 ,width=10)
+    private String payFee;
+    @ApiModelProperty("閫氳仈浜ゆ槗骞冲彴缂栧彿")
+    @ExcelColumn(name="閫氳仈浜ゆ槗骞冲彴缂栧彿",index=19 ,width=10)
+    private String payCode;
+    @ApiModelProperty("璁㈠崟缂栫爜锛堝叧鑱攐rders)")
+    @ExcelColumn(name="璁㈠崟缂栫爜锛堝叧鑱攐rders)",index=20 ,width=10)
+    private Integer orderId;
+    @ApiModelProperty("瀹屾垚鏃堕棿")
+    @ExcelColumn(name="瀹屾垚鏃堕棿",index=20 ,width=10)
+    private Date payDate;
+
+    @ApiModelProperty("寮�濮嬫椂闂�")
+    @TableField(exist = false)
+    private Date starttime;
+    @ApiModelProperty("鎴鏃堕棿")
+    @TableField(exist = false)
+    private Date endtime;
+
+    @ApiModelProperty("浠樻浜哄鍚�")
+    @TableField(exist = false)
+    private String memberName;
+    @ApiModelProperty("浠樻浜哄鍚�")
+    @TableField(exist = false)
+    private String memberPhone;
+    @ApiModelProperty("璐熻矗浜虹櫥闄�")
+    @TableField(exist = false)
+    private String username;
+    @ApiModelProperty("璐熻矗浜哄鍚�")
+    @TableField(exist = false)
+    private String userRealname;
+    @ApiModelProperty("浠樻浜嬬敱")
+    @TableField(exist = false)
+    private Integer orderType;
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/RefundService.java b/server/services/src/main/java/com/doumee/service/business/RefundService.java
new file mode 100644
index 0000000..ccbf00c
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/RefundService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Refund;
+import java.util.List;
+
+/**
+ * 璁㈠崟閫�娆句俊鎭〃Service瀹氫箟
+ * @author doumee
+ * @date 2026-02-06 11:35:16
+ */
+public interface RefundService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param model 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Refund model);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param model 瀹炰綋瀵硅薄
+     */
+    void delete(Refund model);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param model 瀹炰綋瀵硅薄
+     */
+    void updateById(Refund model);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param model 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Refund> model);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return model
+     */
+    Refund findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param model 瀹炰綋瀵硅薄
+     * @return Refund
+     */
+    Refund findOne(Refund model);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param model 瀹炰綋瀵硅薄
+     * @return List<Refund>
+     */
+    List<Refund> findList(Refund model);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Refund>
+     */
+    PageData<Refund> findPage(PageWrap<Refund> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param model 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Refund model);
+
+    void updateByPayStatus(Refund orders);
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
index 9f9db40..bdacd23 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
+import com.allinpay.syb.lib.DoumeeTLUtil;
 import com.allinpay.syb.lib.SybConstants;
 import com.allinpay.syb.lib.SybUtil;
 import com.allinpay.syb.model.PayPublicModel;
@@ -18,9 +19,11 @@
 import com.allinpay.syb.model.PayOrderNotifyParam;
 import com.allinpay.syb.model.PayOrderParam;
 import com.allinpay.syb.model.PayOrderResponse;
+import com.doumee.dao.business.RefundMapper;
 import com.doumee.dao.business.model.Orders;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.model.Refund;
 import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.vo.IndexOrderCountVO;
@@ -56,6 +59,8 @@
 
     @Autowired
     private OrdersMapper ordersMapper;
+    @Autowired
+    private RefundMapper refundMapper;
     @Autowired
     private SystemUserMapper systemUserMapper;
     @Autowired
@@ -207,6 +212,7 @@
         IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(Orders.class)
+                .select("(select sum(r.money) from refund r where r.deleted=0 and r.status in(0,1) and r.order_id=t.id)",Orders::getRefundMoney)
                 .selectAs(SystemUser::getRealname,Orders::getUserRealname)
                 .selectAs(SystemUser::getUsername,Orders::getUsername)
                 .leftJoin(SystemUser.class,SystemUser::getId,Orders::getUserId);
@@ -357,7 +363,7 @@
                 .eq(Orders::getStatus,Constants.ZERO)
                 .apply("TIMESTAMPDIFF(MINUTE, create_time ,now()) > "+time));
         if(orderList !=null && orderList.size()>0){
-            PayPublicModel publicModel = initPayPublicModel();
+            PayPublicModel publicModel =systemDictDataBiz.initPayPublicModel();
             Date date = new Date();
             for(Orders model : orderList){
                 queryPayOrderDetailBiz(model,publicModel,date,time);
@@ -373,26 +379,15 @@
         }
         Orders  model =  ordersMapper.selectById(param.getId());
         if(model !=null ){
-            PayPublicModel publicModel = initPayPublicModel();
+            PayPublicModel publicModel =systemDictDataBiz.initPayPublicModel();
             Date date = new Date();
             queryPayOrderDetailBiz(model,publicModel,date,time);
         }
     }
 
     private void queryPayOrderDetailBiz(Orders model, PayPublicModel publicModel, Date date,int time) {
-        TreeMap<String,String> params = new TreeMap<String,String>();
-        params.put("cusid",publicModel.getCusid());
-        params.put("appid",publicModel.getAppid());
-        params.put("version",publicModel.getVersion());
-        params.put("trxid", "");
-        params.put("randomstr", SybUtil.getValidatecode(8));
-        params.put("signtype", publicModel.getSigntype());
-        String appkey = publicModel.getAppkey();
-        String url =  publicModel.getUrl();
-        String appPubkey = publicModel.getAppPubkey();
-        params.remove("sign");
-        params.put("reqsn", model.getId()+"");
-        PayOrderNotifyParam map = query(params,url,appkey,appPubkey);
+        DoumeeTLUtil doumeeTLUtil = new DoumeeTLUtil(publicModel);
+        PayOrderNotifyParam map = doumeeTLUtil.sendQueryOrder(model.getId()+"");
         int status = Constants.TWO;
         if(map!=null){
             String info = SybUtil.getPayInfoByStatus(map);
@@ -406,7 +401,7 @@
                     status = Constants.ONE;
                 } else if (StringUtils.equals(map.getTrxstatus(),"2000") || StringUtils.equals(map.getTrxstatus(),"2008")) {
                     //濡傛灉浜ゆ槗鏈敮浠橈紝骞朵笖鏈秴杩囧崐灏忔椂锛屼笉澶勭悊
-                    if(date.getTime() - model.getCreateTime().getTime() < 30*60*1000){
+                    if(date.getTime() - model.getCreateTime().getTime() < time*60*1000){
                         return;
                     }
                 }
@@ -429,66 +424,8 @@
         ordersMapper.updateById(model) ;
     }
 
-    private PayPublicModel initPayPublicModel() {
-        PayPublicModel model = new PayPublicModel();
-        model.setUrl(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
-        model.setCusid( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
-        model.setAppid(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_APPID).getCode());
-        model.setVersion(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VERSION).getCode());
-        model.setSigntype( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SIGN_TYPE).getCode());
-        model.setAppkey(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_APPKEY).getCode());
-        model.setUrl(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_APIURL).getCode());
-        model.setAppPubkey( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_RSATLPUBKEY).getCode());
-        return model;
-    }
 
-    public  PayOrderNotifyParam query( TreeMap<String,String> params,String url,String appkey,String pubKey )  {
-        try {
-            params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
-            String data =getHttpParamsStr(params);
-            log.error("璁㈠崟鏌ヨ鏁版嵁璇锋眰================{}",data);
-            String result =  HttpsUtil.post(url+"/tranx/query",data,"application/x-www-form-urlencoded",true);
-            log.error("璁㈠崟鏌ヨ鏁版嵁杩斿洖================{}",result);
-            PayOrderNotifyParam map = handleResult(result,pubKey,params.get("signtype"));
-            return map;
-        }catch (Exception e){
-            log.error("閫氳仈璁㈠崟鏌ヨ寮傚父================{}",e);
-        }
-        return  null;
-    }
-    public String getHttpParamsStr(Map<String, String> params ) throws IOException {
-        StringBuilder outBuf = new StringBuilder();
-        boolean isNotFirst = false;
-        for (Map.Entry<String, String> entry: params.entrySet()){
-            if (isNotFirst)
-                outBuf.append('&');
-            isNotFirst = true;
-            outBuf
-                    .append(entry.getKey())
-                    .append('=')
-                    .append(URLEncoder.encode(entry.getValue(), "UTF-8"));
-        }
-        System.out.println("鍙傛暟:"+outBuf.toString());
-        return outBuf.toString();
-    }
 
-    public static PayOrderNotifyParam handleResult(String result,String pubKey,String signType) throws Exception{
-        log.error("杩斿洖鏁版嵁杩斿洖================{}",result);
-        Map map = SybUtil.json2ObjMap(result);
-        if(map == null){
-            log.error("杩斿洖鏁版嵁杩斿洖閿欒================{}",result);
-            throw new Exception("杩斿洖鏁版嵁閿欒");
-        }
-        if("SUCCESS".equals(map.get("retcode"))){
-            TreeMap tmap = new TreeMap();
-            tmap.putAll(map);
-            if(SybUtil.validSign(tmap, pubKey, signType)){
-                PayOrderNotifyParam param = JSONObject.toJavaObject(JSONObject.parseObject(result),PayOrderNotifyParam.class);
-                return param;
-            }
-        }
-        return null;
-    }
     @Override
     public void returnPage(PayOrderParam param, HttpServletResponse response) throws IOException {
 //        String url =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_RETURN_WEB_URL).getCode();
@@ -512,46 +449,24 @@
                     r ="鏀粯缁撴灉寮傚父锛屽鏈夌枒闂鑱旂郴瀹㈡湇浜哄憳";
                     return;
                 }
-                Orders model = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
-                        .eq(Orders::getId,Integer.parseInt(map.getCusorderid()))
-                );
-                if(model ==null){
-                    log.error("鏀粯澶勭悊澶辫触======鏈壘鍒颁氦鏄撹鍗�"+map.getCusorderid());
-                    r ="鏀粯缁撴灉寮傚父锛岃鍗曟煡璇㈠け璐ワ紝濡傛湁鐤戦棶璇疯仈绯诲鏈嶄汉鍛�";
-                    return;
-                }
-                 if(Constants.equalsInteger(model.getPayStatus(),Constants.ONE)){
-                    log.error("鏀粯澶勭悊======璁㈠崟宸叉敮浠�"+map.getCusorderid());
-                    return;
-                }
                 String info = SybUtil.getPayInfoByStatus(map);
                 if(StringUtils.equals(map.getTrxcode(),"VSP501")
                     ||StringUtils.equals(map.getTrxcode(),"VSP511")
                     ||StringUtils.equals(map.getTrxcode(),"VSP551")){
                     //浜ゆ槗绫诲瀷鏄� 寰俊鏀粯 銆佹敮浠樺疂鏀粯鎴栬�呴摱鑱旀壂鐮佹敮浠橈紝璁板綍鏀粯鐘舵��
-                    if(StringUtils.equals(map.getTrxstatus(),"0000")){
-                        //浜ゆ槗鎴愬姛
-                        model.setPayStatus(Constants.ONE);
-                        model.setStatus(Constants.ONE);
-                    }else{
-                        //浜ゆ槗澶辫触
-                        model.setStatus(Constants.TWO);
-                    }
-                }else{
-                    model.setStatus(Constants.TWO);
+                    dealOrdersResultBiz(info,map,r);
+                }else  if(StringUtils.equals(map.getTrxcode(),"VSP503")
+                        ||StringUtils.equals(map.getTrxcode(),"VSP513")
+                        ||StringUtils.equals(map.getTrxcode(),"VSP553")){
+                    //浜ゆ槗绫诲瀷鏄� 寰俊t閫�娆� 銆佹敮浠樺疂鏀粯閫�娆炬垨鑰呴摱鑱旀壂鐮侀��璐э紝璁板綍鏀粯鐘舵��
+                    dealRefunResultBiz(info,map,r);//澶勭悊閫�娆�
+                }else {
+                  //鍏朵粬绫诲瀷涓嶉�氱煡
                 }
-                model.setPayFee(map.getFee());
-                model.setPayDate(DateUtil.fromStringToDate("yyyyMMddHHmmss",map.getPaytime()));
-                model.setPayOrderId(map.getSrctrxid());//閫氳仈璁㈠崟鍙�
-                model.setPayThirdOrderId(map.getChnltrxid());//鏀粯瀹濆井淇¤鍗曞彿
-                model.setPayThirdOrderData(map.getChnldata());//涓夋柟浜ゆ槗娓犻亾鏁版嵁
-                model.setPayInfo(info);
-                model.setPayCode(map.getTrxcode());
-                ordersMapper.updateById(model);
+
             }else{
                 log.error("鏀粯楠岀澶辫触======");
                 r ="鏀粯澶辫触锛屽鏈夌枒闂鑱旂郴瀹㈡湇浜哄憳";
-                return;
             }
             //楠岀瀹屾瘯杩涜涓氬姟澶勭悊
         } catch (Exception e) {//澶勭悊寮傚父
@@ -565,18 +480,66 @@
         }
     }
 
-
-    public   TreeMap<String, String> getParams(HttpServletRequest request){
-        TreeMap<String, String> map = new TreeMap<String, String>();
-        Map reqMap = request.getParameterMap();
-        for(Object key:reqMap.keySet()){
-            String value = ((String[])reqMap.get(key))[0];
-            System.out.println(key+";"+value);
-            map.put(key.toString(),value);
+    private String dealRefunResultBiz(String info, PayOrderNotifyParam map, String r) {
+        Refund model = refundMapper.selectOne(new QueryWrapper<Refund>().lambda()
+                .eq(Refund::getId,Integer.parseInt(map.getCusorderid().replace(DoumeeTLUtil.REFUND_SN_PREFIX,"")))
+        );
+        if(model ==null){
+            log.error("鏀粯澶勭悊澶辫触======鏈壘鍒颁氦鏄撹鍗�"+map.getCusorderid());
+            return "鏀粯缁撴灉寮傚父锛岃鍗曟煡璇㈠け璐ワ紝濡傛湁鐤戦棶璇疯仈绯诲鏈嶄汉鍛�";
         }
-        return map;
+        if(Constants.equalsInteger(model.getStatus(),Constants.ONE)){
+            log.error("鏀粯澶勭悊======璁㈠崟宸叉敮浠�"+map.getCusorderid());
+            return  "璁㈠崟宸叉敮浠�";
+        }
+        if(StringUtils.equals(map.getTrxstatus(),"0000")){
+            //浜ゆ槗鎴愬姛
+            model.setStatus(Constants.ONE);
+        }else{
+            //浜ゆ槗澶辫触
+            model.setStatus(Constants.TWO);
+        }
+        model.setPayFee(map.getFee());
+        model.setPayDate(DateUtil.fromStringToDate("yyyyMMddHHmmss",map.getPaytime()));
+        model.setPayOrderId(map.getTrxid());//閫氳仈璁㈠崟鍙�
+        model.setPayThirdOrderId(map.getChnltrxid());//鏀粯瀹濆井淇¤鍗曞彿
+        model.setPayThirdOrderData(map.getChnldata());//涓夋柟浜ゆ槗娓犻亾鏁版嵁
+        model.setPayInfo(info);
+        model.setPayCode(map.getTrxcode());
+        refundMapper.updateById(model);
+        return  r;
     }
 
+    private String dealOrdersResultBiz(String info, PayOrderNotifyParam map,String r) {
+        Orders model = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getId,Integer.parseInt(map.getCusorderid()))
+        );
+        if(model ==null){
+            log.error("鏀粯澶勭悊澶辫触======鏈壘鍒颁氦鏄撹鍗�"+map.getCusorderid());
+            return "鏀粯缁撴灉寮傚父锛岃鍗曟煡璇㈠け璐ワ紝濡傛湁鐤戦棶璇疯仈绯诲鏈嶄汉鍛�";
+        }
+        if(Constants.equalsInteger(model.getPayStatus(),Constants.ONE)){
+            log.error("鏀粯澶勭悊======璁㈠崟宸叉敮浠�"+map.getCusorderid());
+            return  "璁㈠崟宸叉敮浠�";
+        }
+        if(StringUtils.equals(map.getTrxstatus(),"0000")){
+            //浜ゆ槗鎴愬姛
+            model.setPayStatus(Constants.ONE);
+            model.setStatus(Constants.ONE);
+        }else{
+            //浜ゆ槗澶辫触
+            model.setStatus(Constants.TWO);
+        }
+        model.setPayFee(map.getFee());
+        model.setPayDate(DateUtil.fromStringToDate("yyyyMMddHHmmss",map.getPaytime()));
+        model.setPayOrderId(map.getTrxid());//閫氳仈璁㈠崟鍙�
+        model.setPayThirdOrderId(map.getChnltrxid());//鏀粯瀹濆井淇¤鍗曞彿
+        model.setPayThirdOrderData(map.getChnldata());//涓夋柟浜ゆ槗娓犻亾鏁版嵁
+        model.setPayInfo(info);
+        model.setPayCode(map.getTrxcode());
+        ordersMapper.updateById(model);
+        return  r;
+    }
 
 
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/RefundServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/RefundServiceImpl.java
new file mode 100644
index 0000000..8cb9ad7
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/RefundServiceImpl.java
@@ -0,0 +1,246 @@
+package com.doumee.service.business.impl;
+
+import com.allinpay.syb.lib.DoumeeTLUtil;
+import com.allinpay.syb.lib.SybUtil;
+import com.allinpay.syb.model.PayOrderNotifyParam;
+import com.allinpay.syb.model.PayOrderRefundResponse;
+import com.allinpay.syb.model.PayPublicModel;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.Refund;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.RefundMapper;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.RefundService;
+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.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.sql.Ref;
+import java.util.Date;
+import java.util.List;
+import java.util.TreeMap;
+
+/**
+ * 璁㈠崟閫�娆句俊鎭〃Service瀹炵幇
+ * @author doumee
+ * @date 2026-02-06 11:35:16
+ */
+@Service
+public class RefundServiceImpl implements RefundService {
+
+    @Autowired
+    private RefundMapper refundMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private OrdersMapper ordersMapper;
+
+    @Override
+    @Transactional
+    public Integer create(Refund model) {
+        if(model.getOrderId()==null
+                ||model.getMoney()==null
+                ||model.getMoney().compareTo(new BigDecimal("0.01")) < 0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"璇锋寜鐓ц姹傚~鍐欎俊鎭紒");
+        }
+
+        model.setMoney(model.getMoney().multiply(new BigDecimal(100)));//鍗曚綅鍒�
+        Orders order = ordersMapper.selectById(model.getOrderId());
+        if(order==null){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"璁㈠崟淇℃伅涓嶅瓨鍦紒");
+        }
+        if(!Constants.equalsInteger(order.getStatus(),Constants.ONE)){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"璁㈠崟鏈氦鏄撴垚鍔燂紝涓嶆敮鎸侀��娆炬搷浣滐紒");
+        }
+        if( Constants.formatBigDecimal(model.getMoney()).compareTo(Constants.formatBigDecimal(order.getMoney())) >=0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"閫�娆鹃噾棰濅笉鑳借秴杩囪鍗曢噾棰濓紒");
+        }
+        Refund sum = refundMapper.selectOne(new QueryWrapper<Refund>().select("sum(money) as money").lambda()
+                .eq(Refund::getDeleted,Constants.ZERO)
+                .eq(Refund::getOrderId,model.getOrderId())
+                .in(Refund::getStatus,Constants.ZERO,Constants.ONE)
+        );
+        if(sum!=null && Constants.formatBigDecimal(sum.getMoney()).compareTo(Constants.formatBigDecimal(order.getMoney())) >=0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"璇ヨ鍗曢��娆炬�婚宸茶揪涓婇檺锛�");
+        }
+        Date date = new Date();
+        model.setCreateTime(date);
+        model.setStatus(Constants.ZERO);
+        model.setDeleted(Constants.ZERO);
+        model.setBanlance(Constants.formatBigDecimal(order.getMoney()).subtract(Constants.formatBigDecimal( model.getMoney())));
+        if(sum!=null){
+            model.setBanlance(Constants.formatBigDecimal(model.getBanlance()).subtract(Constants.formatBigDecimal( sum.getMoney())));//褰撳墠杩樺彲鎻愮幇浣欓
+        }
+        refundMapper.insert(model);
+        DoumeeTLUtil doumeeTLUtil = new DoumeeTLUtil(systemDictDataBiz.initPayPublicModel());
+        PayOrderRefundResponse map = doumeeTLUtil.sendRefundOrder(model.getId()+"",model.getOrderId()+"", model.getMoney().intValue()+"",model.getRemark());
+        if(map ==null || !StringUtils.equals(map.getRetcode(),DoumeeTLUtil.SUCCESS_CODE) || !StringUtils.equals(map.getTrxstatus(),"0000")){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍙戣捣閫�娆惧け璐�,"+(map!=null?map.getErrmsg():""));
+        }
+        return model.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        refundMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Refund refund) {
+        UpdateWrapper<Refund> deleteWrapper = new UpdateWrapper<>(refund);
+        refundMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        refundMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Refund refund) {
+        refundMapper.updateById(refund);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Refund> refunds) {
+        if (CollectionUtils.isEmpty(refunds)) {
+            return;
+        }
+        for (Refund refund: refunds) {
+            this.updateById(refund);
+        }
+    }
+
+    @Override
+    public Refund findById(Integer id) {
+        return refundMapper.selectById(id);
+    }
+
+    @Override
+    public Refund findOne(Refund refund) {
+        QueryWrapper<Refund> wrapper = new QueryWrapper<>(refund).last("limit 1");
+        return refundMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Refund> findList(Refund refund) {
+        QueryWrapper<Refund> wrapper = new QueryWrapper<>(refund);
+        return refundMapper.selectList(wrapper);
+    }
+
+    @Override
+    public  void updateByPayStatus(Refund param) {
+        int time = 30;
+        try {
+            time = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode());
+        }catch (Exception e){
+        }
+        Refund  model =  refundMapper.selectById(param.getId());
+        if(model !=null ){
+            PayPublicModel publicModel =systemDictDataBiz.initPayPublicModel();
+            Date date = new Date();
+            queryPayOrderDetailBiz(model,publicModel,date,time);
+        }
+    }
+
+    private void queryPayOrderDetailBiz(Refund model, PayPublicModel publicModel, Date date,int time) {
+        DoumeeTLUtil doumeeTLUtil = new DoumeeTLUtil(publicModel);
+        PayOrderNotifyParam map = doumeeTLUtil.sendQueryOrder(DoumeeTLUtil.REFUND_SN_PREFIX+model.getId()+"");
+        int status = Constants.TWO;
+        if(map!=null){
+            String info = SybUtil.getPayInfoByStatus(map);
+            if(StringUtils.equals(map.getTrxcode(),"VSP503")
+                    ||StringUtils.equals(map.getTrxcode(),"VSP513")
+                    ||StringUtils.equals(map.getTrxcode(),"VSP553")){
+                // //浜ゆ槗绫诲瀷鏄� 寰俊t閫�娆� 銆佹敮浠樺疂鏀粯閫�娆炬垨鑰呴摱鑱旀壂鐮侀��璐э紝璁板綍鏀粯鐘舵��
+                if(StringUtils.equals(map.getTrxstatus(),"0000")){
+                    //浜ゆ槗鎴愬姛
+                    status = Constants.ONE;
+                } else if (StringUtils.equals(map.getTrxstatus(),"2000") || StringUtils.equals(map.getTrxstatus(),"2008")) {
+                    //濡傛灉浜ゆ槗鏈敮浠橈紝骞朵笖鏈秴杩囧崐灏忔椂锛屼笉澶勭悊
+                    if(date.getTime() - model.getCreateTime().getTime() < time*60*1000){
+                        return;
+                    }
+                }
+            }
+            model.setPayFee(map.getFee());
+            model.setStatus(status);
+            model.setPayDate(DateUtil.fromStringToDate("yyyyMMddHHmmss",map.getPaytime()));
+            model.setPayOrderId(map.getSrctrxid());//閫氳仈璁㈠崟鍙�
+            model.setPayThirdOrderId(map.getChnltrxid());//鏀粯瀹濆井淇¤鍗曞彿
+            model.setPayThirdOrderData(map.getChnldata());//涓夋柟浜ゆ槗娓犻亾鏁版嵁
+            model.setPayInfo(info);
+            model.setPayCode(map.getTrxcode());
+        }else{
+            model.setPayInfo("瓒呮椂鏃犵粨鏋滐紝鑷姩鍙栨秷");
+            model.setStatus(Constants.TWO);
+        }
+        model.setUpdateTime(date);
+        refundMapper.updateById(model) ;
+    }
+
+    @Override
+    public PageData<Refund> findPage(PageWrap<Refund> pageWrap) {
+        IPage<Refund> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Refund> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Refund.class)
+                .selectAs(SystemUser::getRealname,Refund::getUserRealname)
+                .selectAs(SystemUser::getUsername,Refund::getUsername)
+                .selectAs(Orders::getName,Refund::getMemberName)
+                .selectAs(Orders::getPhone,Refund::getMemberPhone)
+                .leftJoin(Orders.class,Orders::getId,Refund::getOrderId)
+                .leftJoin(SystemUser.class,SystemUser::getId,Refund::getCreateUser);
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setDeleted(Constants.ZERO);
+        queryWrapper.eq(pageWrap.getModel().getId() != null,Refund::getId, pageWrap.getModel().getId());
+        queryWrapper.eq(pageWrap.getModel().getDeleted() != null,Refund::getDeleted, pageWrap.getModel().getDeleted());
+        queryWrapper.eq(pageWrap.getModel().getCreateUser() != null,Refund::getCreateUser, pageWrap.getModel().getCreateUser());
+        queryWrapper.eq(pageWrap.getModel().getUpdateUser() != null,Refund::getUpdateUser, pageWrap.getModel().getUpdateUser());
+        queryWrapper.eq(pageWrap.getModel().getRemark() != null,Refund::getRemark, pageWrap.getModel().getRemark());
+        queryWrapper.eq(pageWrap.getModel().getStatus() != null,Refund::getStatus, pageWrap.getModel().getStatus());
+        queryWrapper.eq(pageWrap.getModel().getDetail() != null,Refund::getDetail, pageWrap.getModel().getDetail());
+        queryWrapper.eq(pageWrap.getModel().getImgurl() != null,Refund::getImgurl, pageWrap.getModel().getImgurl());
+        queryWrapper.eq(pageWrap.getModel().getSortnum() != null,Refund::getSortnum, pageWrap.getModel().getSortnum());
+        queryWrapper.eq(pageWrap.getModel().getMoney() != null,Refund::getMoney, pageWrap.getModel().getMoney());
+        queryWrapper.eq(pageWrap.getModel().getBanlance() != null,Refund::getBanlance, pageWrap.getModel().getBanlance());
+        queryWrapper.eq(pageWrap.getModel().getPayOrderId() != null,Refund::getPayOrderId, pageWrap.getModel().getPayOrderId());
+        queryWrapper.eq(pageWrap.getModel().getPayThirdOrderId() != null,Refund::getPayThirdOrderId, pageWrap.getModel().getPayThirdOrderId());
+        queryWrapper.eq(pageWrap.getModel().getPayInfo() != null,Refund::getPayInfo, pageWrap.getModel().getPayInfo());
+        queryWrapper.eq(pageWrap.getModel().getPayThirdOrderData() != null,Refund::getPayThirdOrderData, pageWrap.getModel().getPayThirdOrderData());
+        queryWrapper.eq(pageWrap.getModel().getPayFee() != null,Refund::getPayFee, pageWrap.getModel().getPayFee());
+        queryWrapper.eq(pageWrap.getModel().getPayCode() != null,Refund::getPayCode, pageWrap.getModel().getPayCode());
+        queryWrapper.eq(pageWrap.getModel().getOrderType() != null,Orders::getType, pageWrap.getModel().getOrderType());
+        queryWrapper.eq(pageWrap.getModel().getOrderId() != null,Refund::getOrderId, pageWrap.getModel().getOrderId());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getMemberPhone() ) ,Orders::getName, pageWrap.getModel().getMemberPhone());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getMemberName() ) ,Orders::getName, pageWrap.getModel().getMemberName());
+        queryWrapper.ge(pageWrap.getModel().getStarttime()!=null,Refund::getCreateTime , pageWrap.getModel().getStarttime());
+        queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Refund::getCreateTime , pageWrap.getModel().getEndtime());
+        queryWrapper.orderByDesc(Refund::getId);
+
+        return PageData.from(refundMapper.selectJoinPage(page,Refund.class, queryWrapper));
+    }
+    @Override
+    public long count(Refund refund) {
+        QueryWrapper<Refund> wrapper = new QueryWrapper<>(refund);
+        return refundMapper.selectCount(wrapper);
+    }
+}
diff --git a/web/pages/success/success.vue b/web/pages/success/success.vue
index 490a748..c88c586 100644
--- a/web/pages/success/success.vue
+++ b/web/pages/success/success.vue
@@ -3,8 +3,7 @@
 		<template>
 			<image v-if="info.status ==1" src="/static/ic_paysuccess@2x.png" mode="widthFix" class="icon"></image>
 			<image v-else-if="info.status ==2" src="/static/ic_payfail.png" mode="widthFix" class="icon"></image>
-			<image v-else src="/static/ic_paysuccess@2x.png" mode="widthFix" class="icon"></image>
-	
+			<image v-else src="/static/ic_paysuccess@2x.png" mode="widthFix" class="icon"></image> 
 		</template>
 		<view class="title" v-if="info.id">{{info.status==0?'绛夊緟鏀粯':(info.status==1?'鏀粯鎴愬姛':'鏀粯澶辫触')}}</view> 
 		<view class="title" v-if="!info.id">鏌ヨ涓�</view>

--
Gitblit v1.9.3