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