From 437027600391a245588e6f719717b2f27a4222dc Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 22 一月 2026 10:48:30 +0800
Subject: [PATCH] 经销商管理

---
 admin/src/views/business/withdrawRecord.vue                                                         |  158 +++++++++++++
 admin/src/components/business/OperaWithdrawRecordWindow.vue                                         |  353 +++++++++++++++++++++++++++++
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java               |   20 +
 server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java               |    3 
 admin/src/api/business/withdrawRecord.js                                                            |   23 +
 server/dmmall_service/src/main/java/com/doumee/core/utils/CodeGenerator.java                        |    6 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java |  147 +++++++++--
 admin/src/views/business/integral.vue                                                               |    6 
 8 files changed, 673 insertions(+), 43 deletions(-)

diff --git a/admin/src/api/business/withdrawRecord.js b/admin/src/api/business/withdrawRecord.js
new file mode 100644
index 0000000..e092e37
--- /dev/null
+++ b/admin/src/api/business/withdrawRecord.js
@@ -0,0 +1,23 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/withdrawRecord/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/withdrawRecord/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+export function updateById (data) {
+  return request.post('/business/withdrawRecord/updateById', data)
+}
+export function detail (id) {
+  return request.get('/business/withdrawRecord/'+id)
+}
diff --git a/admin/src/components/business/OperaWithdrawRecordWindow.vue b/admin/src/components/business/OperaWithdrawRecordWindow.vue
new file mode 100644
index 0000000..cbf76e4
--- /dev/null
+++ b/admin/src/components/business/OperaWithdrawRecordWindow.vue
@@ -0,0 +1,353 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="100%"
+      :visible.sync="visible"
+  >
+      <div style="display: block;">
+        <div class="header">
+          <div  class="header-b">鍩烘湰淇℃伅</div>
+          <div v-if="form.status ==0" class="header-orange">寰呭鎵�</div>
+          <div v-if="form.status ==1" class="header-green">宸查�氳繃</div>
+          <div v-if="form.status ==2" class="header-red">宸查┏鍥�</div>
+        </div>
+        <div class="info-item">
+          <div class="info-item-a">缁忛攢鍟嗗悕绉帮細<span>{{form.shopName || ''}}</span> </div>
+          <div class="info-item-a">闂ㄥ簵ID锛�<span>{{form.shopCode || ''}}</span></div>
+          <div class="info-item-a">鐢宠鏃堕棿锛�<span>{{form.createDate || ''}}</span></div>
+        </div>
+        <div class="info-item"></div>
+      </div>
+      <div style="display: block;">
+        <div class="header">
+          <div  class="header-b">鎻愮幇淇℃伅</div>
+        </div>
+        <div class="info-item">
+          <div class="info-item-a">鎻愮幇閲戦锛�<span class="orange">锟{(form.amount || 0).toFixed(2)}}</span> </div>
+          <div class="info-item-a"> </div>
+          <div class="info-item-a"> </div>
+        </div>
+        <div class="info-item">
+          <div class="info-item-a">鎴峰悕锛�<span class="orange">{{ form.name||'' }}</span> </div>
+          <div class="info-item-a">璐﹀彿锛�<span class="orange">{{ form.bankAccount||'' }}</span> </div>
+          <div class="info-item-a">閾惰锛�<span class="orange">{{ form.bankName||'' }}</span> </div>
+        </div>
+        <div class="info-item"></div>
+      </div>
+      <div style="display: block">
+        <div class="header">
+          <div  class="header-b">瀹℃牳娴佺▼</div>
+        </div>
+        <div class="info-item">
+          <div class="time-line">
+            <el-timeline :reverse="true">
+              <el-timeline-item
+                  v-for="(item, index) in logList"
+                  :key="index"
+                  color="#2991FF"
+                  size="large"
+                  type="primary"
+              >
+                <div class="ml10">
+                  <div class="list-title">{{ item.title }}
+                    <i  v-if="item.status ==1"  class="el-icon-success green"></i>
+                    <i  v-if="item.status ==2"  class="el-icon-error red"></i>
+                  </div>
+                  <div class="list-company"><span>{{item.info }}</span><span style="margin-left: 10px">{{item.createTime }}</span></div>
+                  <div class="list-company1" v-if="item.status ===1"><span>鎵撴鍑瘉锛�</span>
+                     <div v-if="item.files && item.files.length"; style="display: block;margin-left: 100px;">
+                       <el-image
+                          v-for="file in item.files "
+                          :key="'file_'+file.fileurl"
+                          style="margin-right: 20px; width: 100px; height: 100px; border-radius: 2px;"
+                          :src="file.fileFullUrl"
+                          :preview-src-list="[file.fileFullUrl]"
+                      ></el-image>
+                     </div>
+                    <span v-else>鏃�</span>
+                  </div>
+                  <div class="list-company1"  v-if="item.status ===1"><span>鎵撴閾惰锛�</span><span>{{item.payBank||'-' }}</span></div>
+                  <div class="list-company1"  v-if="item.status ===1||item.status ==2"><span>瀹℃牳澶囨敞锛�</span><span>{{item.auditRemark||'' }}</span></div>
+                </div>
+              </el-timeline-item>
+            </el-timeline>
+          </div>
+        </div>
+      </div>
+    <div  v-if="form && form.status == 0">
+      <p class="tip-header" >鐢宠瀹℃壒</p>
+      <el-form :model="checkForm" ref="checkForm" :rules="rules" label-width="110px" label-suffix="锛�"  style="margin-left: 20px;width: 500px;" inline >
+        <el-form-item label="瀹℃牳缁撴灉" prop="status">
+          <el-radio-group v-model="checkForm.status">
+            <el-radio :label="1">閫氳繃</el-radio>
+            <el-radio  :label="2">椹冲洖</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="鎵撴鍑瘉" prop="payFileList" v-if="checkForm.status ==1">
+          <div style="margin-left: 150px">
+          <UploadImage
+              :fileList="checkForm.payFileList"
+              :uploadData="{folder:'transfer'}"
+              @beginUpload="isUploading=true"
+              @endUpload="isUploading=false"/>
+          <p class="tip-warn">
+            寤鸿灏哄锛�750px X 750px锛屼笂闄�6寮�
+            鏀寔png銆乯pg銆乯peg鏍煎紡锛屽ぇ灏忎笉瓒呰繃2M锛屼笂浼犲浘鐗囦笉鍏佽娑夊強鏀挎不鏁忔劅涓庤壊鎯�
+          </p>
+          </div>
+        </el-form-item>
+        <el-form-item label="鎵撴閾惰" prop="payBank" v-if="checkForm.status ==1">
+          <el-input v-model="checkForm.payBank" placeholder="璇疯緭鍏ユ墦娆鹃摱琛�"  style="width: 350px"  v-trim/>
+        </el-form-item>
+        <el-form-item label="瀹℃牳澶囨敞" prop="auditRemark">
+          <el-input v-model="checkForm.auditRemark" placeholder="璇疯緭鍏ュ鏍稿娉�" type="textarea"  style="width: 350px; " rows="6" v-trim/>
+        </el-form-item>
+      </el-form>
+      <div class="info-item-a"></div>
+    </div>
+    <template  v-slot:footer>
+      <el-button :loading="isWorking" @click="confirmDo" v-if="form && form.status ==0" :type="checkForm.status==2?'danger':'primary'"  >{{checkForm.status==2?'瀹℃牳椹冲洖':'瀹℃牳閫氳繃'}}</el-button>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseOpera from '@/components/base/BaseOpera'
+import UploadImage from '@/components/common/UploadImage'
+export default {
+  name: 'OperaShopInfoWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow, UploadImage },
+  data () {
+    return {
+      title: '',
+      visible: false,
+      tabelHeight: null,
+      isUploading: false,
+      form: {},
+      logList: [],
+      checkForm: {
+        id: '',
+        status: '',
+        auditRemark: '',
+        payBank: '',
+        payFileList: null
+      },
+      rules: {
+        status: [
+          { required: true, message: '璇烽�夋嫨瀹℃牳缁撴灉' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鎻愮幇鐢宠琛�',
+      api: '/business/withdrawRecord',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+  },
+  methods: {
+    confirmDo () {
+      this.$refs.checkForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.$dialog.confirm('鎮ㄧ‘瀹氭彁浜よ瀹℃壒缁撴灉鍚楋紵', '鎿嶄綔鎻愮ず', {
+          confirmButtonText: this.checkForm.status === 1 ? '纭閫氳繃' : '纭畾椹冲洖',
+          type: 'warning'
+        })
+          .then(() => {
+            this.isWorking = true
+            this.api.updateById(this.checkForm)
+              .then(() => {
+                this.$tip.apiSuccess('瀹℃壒鎴愬姛')
+                this.loadInfo()
+                this.$emit('success')
+              }).catch(e => {
+                this.$tip.apiFailed(e)
+              })
+              .finally(() => {
+                this.isWorking = false
+              })
+          })
+          .catch(e => {
+
+          })
+        // 璋冪敤鏂板缓鎺ュ彛
+      })
+    },
+    loadInfo () {
+      this.api.detail(this.form.id).then(res => {
+        this.form = res || this.form
+        this.logList = []
+        if (this.form.status == 1) {
+          this.logList.push({ title: '骞冲彴瀹℃牳閫氳繃', info: this.form.auditUserName, createTime: this.form.auditTime || '', status: 1, files: this.form.payFileList || [], bank: this.form.payBank || '', auditRemark: this.form.auditRemark || '' })
+        } else if (this.form.status == 2) {
+          this.logList.push({ title: '骞冲彴瀹℃牳椹冲洖', info: this.form.auditUserName, createTime: this.form.auditTime || '', status: 2, auditRemark: this.form.auditRemark || '' })
+        }
+        this.logList.push({ title: '缁忛攢鍟嗗彂璧锋彁鐜扮敵璇�', info: '鎭掕揪鏈烘閿�鍞湁闄愬叕鍙� ', createTime: this.form.createDate || '', status: 0 })
+      })
+    },
+    open (title, info) {
+      this.title = title
+      this.visible = true
+      this.form = info || {}
+      this.loadInfo()
+      this.logList = []
+      this.checkForm = {
+        id: info.id,
+        status: 1,
+        auditRemark: '',
+        payBank: '',
+        payFileList: []
+      }
+    }
+  }
+}
+</script>
+<style lang="scss"  scoped>
+.platgroup_tabs {
+  flex: 1;
+  display: flex;
+  border-bottom: 1px solid #dfe2e8;
+  margin-bottom: 30px;
+  .tab {
+    color: #666666;
+    margin-right: 40px;
+    cursor: pointer;
+    padding-bottom: 10px;
+    border-bottom: 2px solid #fff;
+  }
+
+  .active {
+    font-weight: 500;
+    font-size: 15px;
+    color: #216EEE;
+    border-bottom: 2px solid #216EEE;
+  }
+}
+.table-pagination{
+  position: fixed !important;
+  bottom: 50px;
+}
+.header-b{
+  display: inline-block;
+  font-size: 16px;
+  font-weight: bold;
+}
+.confirmbtn1{
+  color: #FFFFFF;
+  background-color: #0e83d1!important;
+  border-color: #0e83d1!important;
+}
+.confirmbtn2{
+  color: #FFFFFF;
+  background-color: red!important;
+  border-color: red!important;
+}
+.header-green{
+  display: inline-block;
+  font-size: 12px;
+  border: 1px solid green;
+  padding: 2px 10px;
+  margin-left: 20px;
+  color: green;
+  border-radius: 5px ;
+}
+.header-red{
+  display: inline-block;
+  font-size: 12px;
+  border: 1px solid red;
+  padding: 2px 10px;
+  margin-left: 20px;
+  color: red;
+  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{
+  font-weight: 600;
+}
+.info-item-a  .btn{
+  font-size: 12px !important;
+  cursor: pointer !important;
+}
+
+.time-line {
+  margin-top: 20px;
+  margin-left: 20px;
+}
+.list-title {
+  font-size: 12px;
+  font-family: PingFangSC-Medium, PingFang SC;
+  font-weight: 500;
+  //color: #181b1e;
+  margin-bottom: 5px;
+}
+.list-company {
+  font-size: 12px;
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  color: #596878;
+  margin-bottom: 15px;
+}
+.list-company1 {
+  font-size: 12px;
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  margin-bottom: 15px;
+}
+.list-desc {
+  font-size: 12px;
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  color: #596878;
+}
+//宸︿晶鏃堕棿
+.time {
+  color: #409eff;
+  position: absolute;
+  left: -94px;
+  top: 1px;
+  .year {
+    font-size: 14px;
+    font-family: PingFangSC-Regular, PingFang SC;
+    font-weight: 400;
+    color: #20354a;
+  }
+  .day {
+    font-size: 12px;
+    font-family: PingFangSC-Regular, PingFang SC;
+    font-weight: 400;
+    color: black;
+    text-align: right;
+    margin-top: 0px;
+  }
+}
+</style>
diff --git a/admin/src/views/business/integral.vue b/admin/src/views/business/integral.vue
index 090e6cd..97c4c1c 100644
--- a/admin/src/views/business/integral.vue
+++ b/admin/src/views/business/integral.vue
@@ -27,9 +27,10 @@
         </el-select>
       </el-form-item>
       <div class="date-style" style="display: inline">
-        <el-form-item label="鍙樺姩鏃堕棿" prop="queryStartDate" >
+        <el-form-item label="鍙樺姩鏃堕棿" prop="starttime" >
           <el-date-picker
               style="width: 160px"
+              clearable
               v-model="searchForm.starttime"
               type="datetime"
               value-format="yyyy-MM-dd HH:mm:ss"
@@ -38,9 +39,10 @@
               placeholder="寮�濮嬫椂闂�"
           ></el-date-picker>
         </el-form-item>
-        <el-form-item label="-" label-width="10px" prop="queryEndDate" >
+        <el-form-item label="-" label-width="10px" prop="endtime" >
           <el-date-picker
               style="width: 160px"
+              clearable
               v-model="searchForm.endtime"
               type="datetime"
               value-format="yyyy-MM-dd HH:mm:ss"
diff --git a/admin/src/views/business/withdrawRecord.vue b/admin/src/views/business/withdrawRecord.vue
new file mode 100644
index 0000000..3e37802
--- /dev/null
+++ b/admin/src/views/business/withdrawRecord.vue
@@ -0,0 +1,158 @@
+<template>
+  <TableLayout :permissions="['business:withdrawrecord:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="缁忛攢鍟�" prop="shopName">
+        <el-input v-model="searchForm.shopName" placeholder="璇疯緭鍏ョ粡閿�鍟嗗悕绉�" clearable @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="瀹℃牳鐘舵��" prop="status"   >
+        <!-- 0姝e父 1绂佺敤 -->
+        <el-select     v-model="searchForm.status"  placeholder="瀹℃牳鐘舵��" style="width: 140px"   @change="search" clearable  >
+          <el-option  :key="0" :value="0"  label="寰呭鎵�"  ></el-option>
+          <el-option   :key="1" :value="1" label="宸查�氳繃"  ></el-option>
+          <el-option   :key="2" :value="2" label="宸查┏鍥�"  ></el-option>
+        </el-select>
+      </el-form-item>
+      <div class="date-style" style="display: inline">
+        <el-form-item label="鐢宠鏃堕棿" prop="starttime" >
+          <el-date-picker
+              style="width: 180px"
+              v-model="searchForm.starttime"
+              type="datetime"
+              clearable
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              range-separator="鑷�"
+              placeholder="寮�濮嬫椂闂�"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="-" label-width="10px" prop="endtime" >
+          <el-date-picker
+              style="width: 180px"
+              v-model="searchForm.endtime"
+              type="datetime"
+              clearable
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              range-separator="鑷�"
+              placeholder="鎴鏃堕棿"
+          ></el-date-picker>
+        </el-form-item>
+      </div>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" >
+        <li>绱鎻愮幇锛�<span class="red">锟� {{(totalData.amount||0).toFixed(2)}}</span></li>
+      </ul>
+      <el-table
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        border
+        @selection-change="handleSelectionChange"
+      >
+        <!-- <el-table-column type="selection" width="55"></el-table-column> -->
+        <el-table-column prop="shopName" label="缁忛攢鍟嗗悕绉�" fixed align="center" min-width="100px">  </el-table-column>
+        <el-table-column prop="shopCode" label="闂ㄥ簵ID" align="center" min-width="100px"></el-table-column>
+        <el-table-column prop="integral" label="鎻愮幇閲戦锛堝厓锛�" align="center" min-width="100px">
+          <template slot-scope="{row}">
+            <span class="orange">锟{(row.amount || 0).toFixed(2)}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="鏀舵浜�" align="center" min-width="100px"></el-table-column>
+        <el-table-column prop="bankAccount" label="鏀舵璐﹀彿" align="center" min-width="150px" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="bankName" label="鎻愮幇閾惰" align="center" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鐢宠鏃堕棿" align="center" min-width="140px"></el-table-column>
+        <el-table-column prop="status" label="瀹℃牳鐘舵��" align="center" min-width="100px" fixed="right">
+          <template slot-scope="{row}">
+              <span v-if="row.status==0" class="orange">寰呭鎵�</span>
+              <span v-if="row.status==1" class="green">宸查�氳繃</span>
+              <span v-if="row.status==2" class="red">宸查┏鍥�</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:withdrawrecord:update', 'business:withdrawrecord:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+          align="center"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWithdrawRecordWindow.open('鎻愮幇鐢宠璇︽儏', row)" v-permissions="['business:withdrawrecord:update']">鏌ョ湅璇︽儏</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWithdrawRecordWindow ref="operaWithdrawRecordWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWithdrawRecordWindow from '@/components/business/OperaWithdrawRecordWindow'
+export default {
+  name: 'Shop',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaWithdrawRecordWindow },
+  data () {
+    return {
+      // 鎼滅储
+      totalData: {},
+      searchForm: {
+        shopName: '',
+        starttime: '',
+        endtime: '',
+        status: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鎻愮幇鐢宠淇℃伅琛�',
+      api: '/business/withdrawRecord',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    handlePageChange (pageIndex) {
+      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
+      this.isWorking.search = true
+      this.api.fetchList({
+        page: this.tableData.pagination.pageIndex,
+        capacity: this.tableData.pagination.pageSize,
+        model: this.searchForm, // 閿�鍞ā寮忓彉鏇�
+        sorts: this.tableData.sorts
+      })
+        .then(data => {
+          this.tableData.list = data.records || []
+          this.tableData.pagination.total = data.total || 0
+          if (this.tableData.pagination.pageIndex === 1) {
+            this.totalData = data.countData || {}
+          }
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.isWorking.search = false
+        })
+    }
+  }
+}
+</script>
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/CodeGenerator.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/CodeGenerator.java
index b729a3a..2796a18 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/CodeGenerator.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/CodeGenerator.java
@@ -32,11 +32,7 @@
         String password = "Doumee@168";
         String database = "dmmall_full";
         List<String> tables = new ArrayList<>();
-        tables.add("member");
-        tables.add("labels");
-        tables.add("goods");
-        tables.add("goodsorder");
-        tables.add("integral");
+        tables.add("withdraw_record");
 
         for(String tableName : tables){
             // 鑾峰彇琛ㄤ俊鎭苟鐢熸垚浠g爜
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java
index 9e7c199..723ba63 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/WithdrawRecordMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.WithdrawRecord;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2026/01/16 11:50
  */
-public interface WithdrawRecordMapper extends BaseMapper<WithdrawRecord> {
+public interface WithdrawRecordMapper extends MPJBaseMapper<WithdrawRecord> {
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java
index d42a88a..973b368 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/WithdrawRecord.java
@@ -35,7 +35,6 @@
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
@@ -44,7 +43,6 @@
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
     @ExcelColumn(name="鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
@@ -79,7 +77,6 @@
     @ExcelColumn(name="寮�鎴蜂汉濮撳悕")
     private String name;
 
-
     @ApiModelProperty(value = "閾惰涓婚敭锛堝叧鑱� member_bank 琛級", example = "1")
     @ExcelColumn(name="閾惰涓婚敭锛堝叧鑱� member_bank 琛級")
     private Integer bankId;
@@ -94,9 +91,7 @@
 
     @ApiModelProperty(value = "瀹℃壒鏃堕棿")
     @ExcelColumn(name="瀹℃壒鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date auditTime;
-
     @ApiModelProperty(value = "瀹℃壒澶囨敞")
     @ExcelColumn(name="瀹℃壒澶囨敞")
     private String auditRemark;
@@ -104,9 +99,24 @@
     @ApiModelProperty(value = "鎵撴閾惰")
     @ExcelColumn(name="鎵撴閾惰")
     private String payBank;
+    @ApiModelProperty(value = "缁忛攢鍟嗗悕绉�")
+    @TableField(exist = false)
+    private String shopName;
+    @ApiModelProperty(value = "缁忛攢鍟嗛棬搴桰D")
+    @TableField(exist = false)
+    private String shopCode;
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    @TableField(exist = false)
+    private String auditUserName;
 
     @ApiModelProperty(value = "鎵撴鍑瘉", example = "1")
     @TableField(exist = false)
     private List<Multifile> payFileList;
+    @ApiModelProperty(value = "寮�濮嬫椂闂� ")
+    @TableField(exist = false)
+    private Date starttime;
 
+    @ApiModelProperty(value = "缁撴潫鏃堕棿 ")
+    @TableField(exist = false)
+    private Date endtime;
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java
index d279e73..cfc54b2 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java
@@ -3,6 +3,7 @@
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
@@ -11,6 +12,7 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.*;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.web.dto.MultiFileDTO;
 import com.doumee.dao.web.request.DealIntegralRequest;
 import com.doumee.dao.web.request.WithdrawApplyRequest;
@@ -20,15 +22,20 @@
 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 lombok.With;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
 import org.bouncycastle.cert.dane.DANEEntry;
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -88,11 +95,58 @@
         withdrawRecordMapper.deleteBatchIds(ids);
     }
 
+    /**
+     * 鎵撴瀹℃牳
+     * @param withdrawRecord 瀹炰綋瀵硅薄
+     */
     @Override
+    @Transactional
     public void updateById(WithdrawRecord withdrawRecord) {
-        withdrawRecordMapper.updateById(withdrawRecord);
-    }
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        if(!Constants.equalsObject(withdrawRecord.getStatus(),Constants.ONE)
+                && !Constants.equalsObject(withdrawRecord.getStatus(),Constants.TWO)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        WithdrawRecord model = withdrawRecordMapper.selectById(withdrawRecord.getId());
+        if(model == null || Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!Constants.equalsObject(model.getStatus(),Constants.ZERO)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ョ敵璇峰凡瀹℃壒锛岃灏濊瘯鍒锋柊椤甸潰鏌ョ湅");
+        }
 
+        Date date = new Date();
+        model.setPayBank(withdrawRecord.getPayBank());
+        model.setEditor(user.getId());
+        model.setEditDate(date);
+        model.setAuditRemark(withdrawRecord.getAuditRemark());
+        model.setAuditTime(date);
+        model.setAuditUser(user.getId());
+        model.setStatus(withdrawRecord.getStatus());
+        model.setPayBank(withdrawRecord.getPayBank());
+        withdrawRecordMapper.updateById(model);
+        dealBatchMultiFiles(model,withdrawRecord.getPayFileList());
+    }
+    public void dealBatchMultiFiles(WithdrawRecord model, List<Multifile> fileList  ) {
+        //娓呯┖鍘熸湁鐨�
+        if(fileList!=null && fileList.size()>0){
+            List<Multifile> multifileList = new ArrayList<>();
+            fileList.stream().forEach(s -> {
+                if(StringUtils.isNotBlank(s.getFileurl())){
+                    s.setIsdeleted(Constants.ZERO);
+                    s.setCreator(model.getAuditUser());
+                    s.setCreateDate(model.getAuditTime());
+                    s.setObjId(model.getId());
+                    s.setType(Constants.ZERO);
+                    s.setObjType(Constants.MultiFile.TRANSFER_FILE.getKey());
+                    multifileList.add(s);
+                }
+            });
+            if(multifileList.size()>0){
+                multifileMapper.insert(multifileList);
+            }
+        }
+    }
     @Override
     public void updateByIdInBatch(List<WithdrawRecord> withdrawRecords) {
         if (CollectionUtils.isEmpty(withdrawRecords)) {
@@ -105,8 +159,17 @@
 
     @Override
     public WithdrawRecord findById(Integer id) {
-        WithdrawRecord withdrawRecord = withdrawRecordMapper.selectById(id);
-        if (Objects.isNull(withdrawRecord)) {
+        MPJLambdaWrapper<WithdrawRecord> queryWrapper = new MPJLambdaWrapper<WithdrawRecord>()
+                .selectAll(WithdrawRecord.class)
+                .selectAs(SystemUser::getRealname,WithdrawRecord::getAuditUserName)
+                .selectAs(Shop::getName,WithdrawRecord::getShopName)
+                .selectAs(Shop::getCode,WithdrawRecord::getShopCode)
+                .leftJoin(Shop.class,Shop::getId,WithdrawRecord::getMemberId)
+                .leftJoin(SystemUser.class,SystemUser::getId,WithdrawRecord::getAuditUser)
+                .eq(WithdrawRecord::getId,id)
+                .eq(WithdrawRecord::getIsdeleted,Constants.ZERO);
+        WithdrawRecord withdrawRecord = withdrawRecordMapper.selectJoinOne(WithdrawRecord.class,queryWrapper);
+        if (Objects.isNull(withdrawRecord) ) {
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
         if(!Constants.equalsInteger(withdrawRecord.getStatus(), Constants.ZERO)){
@@ -119,7 +182,9 @@
             List<Multifile> filelist = multifileMapper.selectList(new QueryWrapper<>(queryfile));
             if(filelist !=null && filelist.size()>0){
                 for (Multifile multifile:filelist) {
-                    multifile.setFileFullUrl(path + multifile.getFileurl());
+                    if(StringUtils.isNotBlank(multifile.getFileurl())){
+                        multifile.setFileFullUrl(path + multifile.getFileurl());
+                    }
                 }
                 withdrawRecord.setPayFileList(filelist);
             }
@@ -142,64 +207,86 @@
     @Override
     public PageData<WithdrawRecord> findPage(PageWrap<WithdrawRecord> pageWrap) {
         IPage<WithdrawRecord> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<WithdrawRecord> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<WithdrawRecord> queryWrapper = new MPJLambdaWrapper<WithdrawRecord>()
+                .selectAll(WithdrawRecord.class)
+                .selectAs(Shop::getName,WithdrawRecord::getShopName)
+                .selectAs(Shop::getCode,WithdrawRecord::getShopCode)
+                .leftJoin(Shop.class,Shop::getId,WithdrawRecord::getMemberId);
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
         if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getId, pageWrap.getModel().getId());
+           queryWrapper.eq(WithdrawRecord::getId, pageWrap.getModel().getId());
         }
         if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getCreator, pageWrap.getModel().getCreator());
+           queryWrapper.eq(WithdrawRecord::getCreator, pageWrap.getModel().getCreator());
         }
         if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(WithdrawRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(WithdrawRecord::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+           queryWrapper.ge(WithdrawRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+           queryWrapper.le(WithdrawRecord::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
         }
         if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getEditor, pageWrap.getModel().getEditor());
+           queryWrapper.eq(WithdrawRecord::getEditor, pageWrap.getModel().getEditor());
         }
         if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(WithdrawRecord::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(WithdrawRecord::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+           queryWrapper.ge(WithdrawRecord::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+           queryWrapper.le(WithdrawRecord::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
         }
         if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getIsdeleted, pageWrap.getModel().getIsdeleted());
+           queryWrapper.eq(WithdrawRecord::getIsdeleted, pageWrap.getModel().getIsdeleted());
         }
         if (pageWrap.getModel().getRemark() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getRemark, pageWrap.getModel().getRemark());
+           queryWrapper.eq(WithdrawRecord::getRemark, pageWrap.getModel().getRemark());
         }
         if (pageWrap.getModel().getMemberId() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getMemberId, pageWrap.getModel().getMemberId());
+           queryWrapper.eq(WithdrawRecord::getMemberId, pageWrap.getModel().getMemberId());
         }
         if (pageWrap.getModel().getCode() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getCode, pageWrap.getModel().getCode());
+           queryWrapper.eq(WithdrawRecord::getCode, pageWrap.getModel().getCode());
         }
         if (pageWrap.getModel().getBankId() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getBankId, pageWrap.getModel().getBankId());
+           queryWrapper.eq(WithdrawRecord::getBankId, pageWrap.getModel().getBankId());
         }
         if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getStatus, pageWrap.getModel().getStatus());
+           queryWrapper.eq(WithdrawRecord::getStatus, pageWrap.getModel().getStatus());
         }
         if (pageWrap.getModel().getAuditUser() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getAuditUser, pageWrap.getModel().getAuditUser());
+           queryWrapper.eq(WithdrawRecord::getAuditUser, pageWrap.getModel().getAuditUser());
         }
         if (pageWrap.getModel().getAuditTime() != null) {
-            queryWrapper.lambda().ge(WithdrawRecord::getAuditTime, Utils.Date.getStart(pageWrap.getModel().getAuditTime()));
-            queryWrapper.lambda().le(WithdrawRecord::getAuditTime, Utils.Date.getEnd(pageWrap.getModel().getAuditTime()));
+           queryWrapper.ge(WithdrawRecord::getAuditTime, Utils.Date.getStart(pageWrap.getModel().getAuditTime()));
+           queryWrapper.le(WithdrawRecord::getAuditTime, Utils.Date.getEnd(pageWrap.getModel().getAuditTime()));
         }
         if (pageWrap.getModel().getAuditRemark() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getAuditRemark, pageWrap.getModel().getAuditRemark());
+           queryWrapper.eq(WithdrawRecord::getAuditRemark, pageWrap.getModel().getAuditRemark());
         }
         if (pageWrap.getModel().getPayBank() != null) {
-            queryWrapper.lambda().eq(WithdrawRecord::getPayBank, pageWrap.getModel().getPayBank());
+           queryWrapper.eq(WithdrawRecord::getPayBank, pageWrap.getModel().getPayBank());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+        queryWrapper.ge(pageWrap.getModel().getStarttime() != null,WithdrawRecord::getCreateDate, pageWrap.getModel().getStarttime());
+        queryWrapper.le(pageWrap.getModel().getEndtime() != null,WithdrawRecord::getCreateDate, pageWrap.getModel().getEndtime());
+        queryWrapper.like(pageWrap.getModel().getShopName() != null,Shop::getName, pageWrap.getModel().getShopName());
+        queryWrapper.orderByDesc(WithdrawRecord::getCreateDate);
+
+        PageData<WithdrawRecord> rr = PageData.from(withdrawRecordMapper.selectJoinPage(page,WithdrawRecord.class, queryWrapper));
+        if(pageWrap.getPage() == 1){
+            //濡傛灉鏌ヨ绗竴椤碉紝鍋氱粡閿�鍟嗛攢鍞俊鎭粺璁′笟鍔℃煡璇�
+            WithdrawRecord count   =  withdrawRecordMapper.selectJoinOne(WithdrawRecord.class,new MPJLambdaWrapper<WithdrawRecord>()
+                     .selectSum(WithdrawRecord::getAmount)
+                     .leftJoin(Shop.class,Shop::getId,WithdrawRecord::getMemberId)
+                     .ge(pageWrap.getModel().getStarttime() != null,WithdrawRecord::getCreateDate, pageWrap.getModel().getStarttime())
+                     .le(pageWrap.getModel().getEndtime() != null,WithdrawRecord::getCreateDate, pageWrap.getModel().getEndtime())
+                     .like(pageWrap.getModel().getShopName() != null,Shop::getName, pageWrap.getModel().getShopName())
+                     .eq(WithdrawRecord::getIsdeleted,Constants.ZERO)
+                     .eq(pageWrap.getModel().getStatus()!=null,WithdrawRecord::getStatus,pageWrap.getModel().getStatus())
+            );
+            if(count == null){
+                count = new WithdrawRecord();
             }
+            count.setAmount(Constants.formatBigdecimal4Float(count.getAmount()));
+            rr.setCountData(count);
         }
-        return PageData.from(withdrawRecordMapper.selectPage(page, queryWrapper));
+
+        return rr;
     }
 
 

--
Gitblit v1.9.3