From 511ce651667f5b2284247cc60599078b86f7963f Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期五, 23 一月 2026 13:48:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/dmmall_admin/src/main/java/com/doumee/api/business/GoodsorderController.java             |    7 +
 admin/src/components/business/OperaOrderRefundWindow.vue                                        |  249 +++++++++++++++++++++++++++++++++++
 admin/src/components/business/OperaGoodsOrderDetail.vue                                         |   52 +++++-
 admin/src/views/business/goodsorder.vue                                                         |   12 +
 admin/src/api/business/goodsorder.js                                                            |    3 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java               |    3 
 admin/src/components/business/OperaOrderCancelWindow.vue                                        |    2 
 admin/src/components/business/OperaShipmentsWindow.vue                                          |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java          |    2 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java |   38 ++++
 10 files changed, 345 insertions(+), 25 deletions(-)

diff --git a/admin/src/api/business/goodsorder.js b/admin/src/api/business/goodsorder.js
index fc48acd..b829e37 100644
--- a/admin/src/api/business/goodsorder.js
+++ b/admin/src/api/business/goodsorder.js
@@ -37,6 +37,9 @@
 export function orderPlanCancelOrder (data) {
   return request.post('/business/goodsorder/orderPlanCancelOrder', data)
 }
+export function orderRefund (data) {
+  return request.post('/business/goodsorder/orderRefund', data)
+}
 export function orderSendOutGoods (data) {
   return request.post('/business/goodsorder/orderSendOutGoods', data)
 }
diff --git a/admin/src/components/business/OperaGoodsOrderDetail.vue b/admin/src/components/business/OperaGoodsOrderDetail.vue
index 76c4f46..dc6a2ac 100644
--- a/admin/src/components/business/OperaGoodsOrderDetail.vue
+++ b/admin/src/components/business/OperaGoodsOrderDetail.vue
@@ -14,8 +14,8 @@
           <div  v-if="info.status ==4"   class="header-grey">宸插叧闂�</div>
           <div  v-if="info.status ==6"   class="header-grey">宸查��娆�</div>
           <div style="text-align: right;">
-            <div class="header-red-btn" v-if="info.status == 0" @click="$refs.OperaOrderCancelWindow.open('鍙栨秷璁㈠崟', info)">鍙栨秷璁㈠崟</div>
-            <div class="header-red-btn" v-if="info.status == 3" @click="$refs.OperaOrderCancelWindow.open('璁㈠崟閫�娆�', info)">璁㈠崟閫�娆�</div>
+            <div class="header-red-btn" v-if="info.status == 0 || info.status == 1" @click="$refs.OperaOrderCancelWindow.open('鍙栨秷璁㈠崟', info)">鍙栨秷璁㈠崟</div>
+            <div class="header-red-btn" v-if="info.status == 3" @click="$refs.OperaOrderRefundWindow.open('璁㈠崟閫�娆�', info)">璁㈠崟閫�娆�</div>
             <div class="header-blue-btn" @click="showChangeRecord">鍙樻洿璁板綍</div>
           </div>
       </div>
@@ -94,7 +94,7 @@
         </div>
         <div class="info-item"  >
           <div class="info-item-a">鍙栨秷鏃堕棿锛�<span >{{info.cancelDate}}</span></div>
-          <div class="info-item-a">鍙栨秷浜哄憳锛�<span>{{info.cancelUserName }}</span></div>
+          <div class="info-item-a">鍙栨秷浜哄憳锛�<span>{{info.cancelUser !=null?info.cancelUserName:'鐢ㄦ埛涓诲姩鍙栨秷'}}</span></div>
           <div class="info-item-a">鍙栨秷璇存槑锛�<span>{{info.cancelInfo }}</span></div>
         </div>
         <div class="info-item"></div>
@@ -121,20 +121,47 @@
           <el-table-column prop="name" label="鍟嗗搧鍚嶇О"   align="center" min-width="150px">  </el-table-column>
           <el-table-column prop="categoryName" label="鍟嗗搧鍒嗙被"   align="center" min-width="150px">  </el-table-column>
           <el-table-column prop="goodsWeight" label="閲嶉噺(kg)" align="center" min-width="150px"></el-table-column>
-          <el-table-column prop="price" label="閿�鍞环(鍏�)" align="center" min-width="100px"></el-table-column>
+          <el-table-column prop="price" label="閿�鍞环(鍏�)" align="center" min-width="100px">
+            <template slot-scope="{row}">
+              <span>锟{(row.price || 0).toFixed(2)}}</span>
+            </template>
+          </el-table-column>
           <el-table-column prop="goodsNum" label="鏁伴噺" align="center" min-width="150px"></el-table-column>
-          <el-table-column prop="totalPrice" label="灏忚" align="center" min-width="150px"></el-table-column>
+          <el-table-column prop="totalPrice" label="灏忚(鍏�)" align="center" min-width="150px">
+            <template slot-scope="{row}">
+              <span class="orange">锟{(row.totalPrice || 0).toFixed(2)}}</span>
+            </template>
+          </el-table-column>
         </el-table>
       </div>
       <div class="info-item"  >
         <div class="info-item-a">鍟嗗搧鎬讳环锛�<span> 锟{((info.totalPrice||0)-(info.mailPrice || 0)).toFixed(2)}}</span></div>
         <div class="info-item-a">蹇�掕垂锛�<span>锟{(info.mailPrice||0).toFixed(2)}}</span></div>
-        <div class="info-item-a">璁㈠崟鎬讳环锛�<span > 锟{(info.totalPrice||0).toFixed(2)}}</span></div>
+        <div class="info-item-a">璁㈠崟鎬讳环锛�<span> 锟{(info.totalPrice||0).toFixed(2)}}</span></div>
       </div>
       <div class="info-item"  >
         <div class="info-item-a">浼樻儬鍏卞噺锛�<span> -锟{((info.integral||0) + (info.couponPrice||0)).toFixed(2) }}</span>
-          <span style="margin-left: 20px;" >
-           <el-button  type="text" @click="showCouponPrice">鏌ョ湅</el-button>
+          <span  v-if="((info.integral||0) + (info.couponPrice||0)).toFixed(2)>0">
+            <el-popover
+                style="margin-left: 20px;"
+                placement="right-start"
+                width="360px"
+                @show="visible2=true"
+                @hide="visible2=false"
+                trigger="click" >
+                <div style="margin-top: 10px;font-size: 12px;">
+                  <div style="margin-bottom: 20px;font-weight: 600;"> 浼樻儬鍏卞噺锛�<span class="red"> -锟{((info.integral||0) + (info.couponPrice||0)).toFixed(2) }}</span></div>
+                  <div style="margin-bottom: 10px;display: flex;align-items: baseline;" v-if="(info.integral||0)>0">
+                    <span  style="border-left: 3px solid red;font-size: 10px;margin-right: 10px;height: 10px;"></span>
+                    绉垎鎶垫墸锛�-锟{(info.integral||0).toFixed(2) +'  '}}浣跨敤{{(info.useIntegral||0)}}绉垎鎶垫墸锟{(info.integral||0).toFixed(2) +'  '}}鍏�
+                  </div>
+                  <div  style="margin-bottom: 10px;display: flex;align-items: baseline;" v-if="(info.couponPrice||0)>0">
+                     <span  style="border-left: 3px solid red;font-size: 10px;margin-right: 10px;height: 10px;"></span>
+                   {{' 浼�  鎯�  鍒� '}}锛歿{'  '}}-锟{(info.couponPrice||0).toFixed(2) +'  '}}浣跨敤{{info.couponName}}
+                  </div>
+                </div>
+                <el-button  slot="reference"  type="text">{{visible2?'鏀惰捣':'鏌ョ湅'}}</el-button>
+              </el-popover>
         </span>
         </div>
       </div>
@@ -150,6 +177,7 @@
     <OperaChangeIntegralWindow ref="OperaChangeIntegralWindow" @success="successBiz"/>
     <OperaOrderMarkWindow ref="operaOrderMarkWindow" @success="successBiz"/>
     <OperaOrderCancelWindow ref="OperaOrderCancelWindow" @success="successBiz"/>
+    <OperaOrderRefundWindow ref="OperaOrderRefundWindow" @success="successBiz"/>
   </GlobalWindow>
 </template>
 
@@ -161,13 +189,15 @@
 import OperaOrderCancelWindow from '@/components/business/OperaOrderCancelWindow'
 import OperaOrderMarkWindow from '@/components/business/OperaOrderMarkWindow'
 import OperaShipmentsWindow from '@/components/business/OperaShipmentsWindow'
+import OperaOrderRefundWindow from '@/components/business/OperaOrderRefundWindow'
 export default {
   name: 'OperaShopGoodsWindow',
   extends: BaseOpera,
-  components: { GlobalWindow, OperaChangeOrderRecordWindow, OperaChangeIntegralWindow,OperaOrderMarkWindow,OperaShipmentsWindow ,OperaOrderCancelWindow},
+  components: { OperaOrderRefundWindow, GlobalWindow, OperaChangeOrderRecordWindow, OperaChangeIntegralWindow, OperaOrderMarkWindow, OperaShipmentsWindow, OperaOrderCancelWindow },
   data () {
     return {
       title: '',
+      visible2: false,
       visible: false,
       tabelHeight: null,
       info: {},
@@ -192,7 +222,7 @@
       this.loadInfo()
       this.$emit('success')
     },
-    showCouponPrice(){
+    showCouponPrice () {
 
     },
     loadInfo () {
@@ -286,7 +316,7 @@
 
 }
 .info-item-a span{
-  font-weight: 600;
+  //font-weight: 500;
 }
 .info-item-a  .btn{
   font-size: 12px !important;
diff --git a/admin/src/components/business/OperaOrderCancelWindow.vue b/admin/src/components/business/OperaOrderCancelWindow.vue
index db44db8..c4c9b8f 100644
--- a/admin/src/components/business/OperaOrderCancelWindow.vue
+++ b/admin/src/components/business/OperaOrderCancelWindow.vue
@@ -7,7 +7,7 @@
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" label-width="120px" label-suffix="锛�"  :rules="rules" inline>
-      <p class="tip-warn" style="margin: 30px;">
+      <p class="tip-warn" style="margin: 30px;font-size: 14px;">
         <i class="el-icon-warning"></i>
         鎿嶄綔璇存槑锛氭偍姝e湪鍙栨秷璁㈠崟<span class="red">{{ form.code }} </span>锛岃璋ㄦ厧鎿嶄綔锛侊紒</p>
       <el-form-item label="澶囨敞" prop="cancelInfo">
diff --git a/admin/src/components/business/OperaOrderRefundWindow.vue b/admin/src/components/business/OperaOrderRefundWindow.vue
new file mode 100644
index 0000000..1fb9731
--- /dev/null
+++ b/admin/src/components/business/OperaOrderRefundWindow.vue
@@ -0,0 +1,249 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="100%"
+      :visible.sync="visible"
+  >
+    <div class="detail-box"  >
+      <p class="tip-warn" style="margin-bottom: 30px;font-size: 14px;">
+        <i class="el-icon-warning"></i>
+        鎿嶄綔璇存槑锛氭偍姝i拡瀵硅鍗�<span class="red">{{ info.code }} </span>杩涜閫�娆炬搷浣滐紝璇ユ搷浣滀笉鍙�嗚璋ㄦ厧鎿嶄綔锛侊紒</p>
+      <div class="header">
+        <div  class="header-b">鍟嗗搧淇℃伅</div>
+      </div>
+      <div class="info-item"  >
+        <el-table  :data="info.goodsorderDetailList||[]"  stripe  border >
+          <el-table-column prop="imgurl" label="鍟嗗搧鍥�" min-width="80px" align="center">
+            <template slot-scope="{row}">
+              <el-image style="width: 50px;height: 50px;" v-if="row.imgurl && row.imgurl!=''" :src="row.imgurl" :preview-src-list="[row.imgurl]"></el-image>
+            </template>
+          </el-table-column>
+          <el-table-column prop="name" label="鍟嗗搧鍚嶇О"   align="center" min-width="150px">  </el-table-column>
+          <el-table-column prop="categoryName" label="鍟嗗搧鍒嗙被"   align="center" min-width="150px">  </el-table-column>
+          <el-table-column prop="goodsWeight" label="閲嶉噺(kg)" align="center" min-width="150px"></el-table-column>
+          <el-table-column prop="price" label="閿�鍞环(鍏�)" align="center" min-width="100px">
+            <template slot-scope="{row}">
+              <span>锟{(row.price || 0).toFixed(2)}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="goodsNum" label="鏁伴噺" align="center" min-width="150px"></el-table-column>
+          <el-table-column prop="totalPrice" label="灏忚(鍏�)" align="center" min-width="150px">
+            <template slot-scope="{row}">
+              <span class="orange">锟{(row.totalPrice || 0).toFixed(2)}}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="info-item"  >
+        <div class="info-item-a">鍟嗗搧鎬讳环锛�<span> 锟{((info.totalPrice||0)-(info.mailPrice || 0)).toFixed(2)}}</span></div>
+        <div class="info-item-a">蹇�掕垂锛�<span>锟{(info.mailPrice||0).toFixed(2)}}</span></div>
+        <div class="info-item-a">璁㈠崟鎬讳环锛�<span> 锟{(info.totalPrice||0).toFixed(2)}}</span></div>
+      </div>
+      <div class="info-item"  >
+        <div class="info-item-a">绉垎鎶垫墸锛�<span v-if="(info.integral||0)>0">-锟{(info.integral||0).toFixed(2) +'  '}}浣跨敤{{(info.useIntegral||0)}}绉垎鎶垫墸锟{(info.integral||0).toFixed(2) +'  '}}鍏�</span></div>
+        <div class="info-item-a">浼樻儬鍒革細<span v-if="(info.couponPrice||0)>0">-锟{(info.couponPrice||0).toFixed(2) +'  '}} 浣跨敤{{info.couponName}}</span></div>
+        <div class="info-item-a">缁忛攢鍟嗙粨绠楋細<span> 锟{(info.totalPrice||0).toFixed(2)}}</span></div>
+      </div>
+      <div class="info-item"  >
+        <div class="info-item-a">瀹炰粯閲戦锛�<span class="red"> 锟{(info.price||0).toFixed(2)}}</span></div>
+        <div class="info-item-a">杩旇繕鐢ㄦ埛绉垎锛�<span class="orange"> {{(info.returnMemberIntegral||0)}}</span></div>
+        <div class="info-item-a">杩旇繕缁忛攢鍟嗙Н鍒嗭細<span class="orange">锟{(info.shopSettlement || 0).toFixed(2) }}</span></div>
+      </div>
+      <div class="header">
+        <div  class="header-b">閫�娆惧唴瀹�</div>
+        <div class="info-item"  >
+          <el-form :model="form" ref="form" label-width="120px" label-suffix="锛�"  :rules="rules" inline>
+            <el-form-item label="閫�娆鹃噾棰�" prop="price" style="display: block;">
+              <el-input type="number"  v-model="form.price" placeholder="璇疯緭鍏ラ��娆鹃噾棰�" v-trim>  <template slot="append"> 鍏�</template>  </el-input>
+              <span class="tip-warn" style="margin-bottom: 30px;font-size: 14px;">   <i class="el-icon-warning"></i>
+              鎻愮ず锛氬綋鍓嶈鍗曟渶澶氬彲閫�閲戦涓�<span class="red">{{(info.price||0).toFixed(2)}}</span></span>
+            </el-form-item>
+            <div style="display:flex;">
+              <el-form-item label="閫�杩�" prop="refundInfo"  style="display: inline;">
+                <el-checkbox style="border: none;" v-model="checked1" label="閫�杩樺鎴蜂紭鎯犲埜" border></el-checkbox>
+              </el-form-item>
+              <el-form-item label="" prop="refundInfo"  style="display: inline;">
+                <el-checkbox style="border: none"  v-model="checked1" label="閫�杩樺鎴风Н鍒�" border></el-checkbox>
+              </el-form-item>
+            </div>
+            <div style="display:flex;">
+              <el-form-item label="鎵i櫎" prop="refundInfo"  style="display: inline;">
+                <el-checkbox style="border: none"  v-model="checked1" label="鎵i櫎缁忛攢鍟嗗凡缁撶畻閲戦" border></el-checkbox>
+              </el-form-item>
+              <el-form-item label="" prop="refundInfo"  style="display: inline;">
+                <el-checkbox style="border: none"  v-model="checked1" label="鎵i櫎宸茶繑瀹㈡埛绉垎" border></el-checkbox>
+              </el-form-item>
+              <el-form-item label="" prop="refundInfo"  style="display: inline;">
+                <el-checkbox style="border: none"  v-model="checked1" label="鎵i櫎宸茶繑缁忛攢鍟嗙Н鍒�" border></el-checkbox>
+              </el-form-item>
+            </div>
+            <el-form-item label="澶囨敞" prop="refundInfo"  style="display: block;">
+              <el-input type="textarea" :autosize="{ minRows: 4, maxRows:4 }" style="width: 500px;" v-model="form.cancelInfo" placeholder="璇疯緭鍏ュ彇娑堣鏄�"  v-trim/>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+    </div>
+    <template  v-slot:footer>
+      <el-button type="primary" @click="confirm">纭</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 { shopDetail } from '@/api/business/shop'
+export default {
+  name: 'OperaOrderRefundWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      title: '',
+      visible2: false,
+      visible: false,
+      tabelHeight: null,
+      info: {},
+      shopInfo: {},
+      rules: {
+        price: [
+          { required: true, message: '璇疯緭鍏ラ��娆鹃噾棰�', tigger: 'blur' }
+        ]
+      },
+      // 鎼滅储
+      form: {
+        id: '',
+        checked1:false,
+        price: 0,
+        type: null
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璁㈠崟淇℃伅琛�',
+      api: '/business/goodsorder',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+  },
+  methods: {
+    successBiz () {
+      this.loadInfo()
+      this.$emit('success')
+    },
+    loadInfo () {
+      shopDetail(this.info.distributionShopId).then(res => {
+        this.shopInfo = res || this.shopInfo
+      })
+    },
+    open (title, info) {
+      this.title = title
+      this.visible = true
+      this.info = info || {}
+      this.form.price = ''
+
+      if (this.info.distributionShopId != null) {
+        this.loadInfo()
+      }
+    },
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.$dialog.messageWaring(`纭畾杩涜閫�娆捐璁㈠崟锛�${this.info.code}锛焋)
+          .then(() => {
+            this.isWorking = true
+            this.api.orderRefund(this.form)
+              .then(() => {
+                this.visible = false
+                this.$tip.apiSuccess('閫�娆炬垚鍔�')
+                this.$emit('success')
+              }).catch(e => {
+                this.$tip.apiFailed(e)
+              })
+              .finally(() => {
+                this.isWorking = false
+              })
+          })
+
+        // 璋冪敤鏂板缓鎺ュ彛
+      })
+    }
+  }
+}
+</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/components/business/OperaShipmentsWindow.vue b/admin/src/components/business/OperaShipmentsWindow.vue
index ff11517..4b93227 100644
--- a/admin/src/components/business/OperaShipmentsWindow.vue
+++ b/admin/src/components/business/OperaShipmentsWindow.vue
@@ -7,7 +7,7 @@
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix="锛�"  inline>
-      <p class="tip-warn" style="margin: 30px;"><i class="el-icon-warning"></i>鎿嶄綔璇存槑锛氭偍姝e湪閽堝璁㈠崟锛�<span class="red">{{ form.code }} </span>杩涜{{ form.status==2?'蹇�掑彉鏇�':'鍙戣揣' }}鎿嶄綔锛�</p>
+      <p class="tip-warn" style="margin: 30px;font-size: 14px;"><i class="el-icon-warning"></i>鎿嶄綔璇存槑锛氭偍姝e湪閽堝璁㈠崟锛�<span class="red">{{ form.code }} </span>杩涜{{ form.status==2?'蹇�掑彉鏇�':'鍙戣揣' }}鎿嶄綔锛�</p>
       <el-form-item label="蹇�掑叕鍙�" prop="kdId">
         <el-select
           v-model="form.kdId"
diff --git a/admin/src/views/business/goodsorder.vue b/admin/src/views/business/goodsorder.vue
index 3e5f518..fc80c6f 100644
--- a/admin/src/views/business/goodsorder.vue
+++ b/admin/src/views/business/goodsorder.vue
@@ -85,7 +85,7 @@
             <span  v-if="item.status ==1" class="orange">{{item.receiveType==1?'寰呰嚜鎻�':'寰呭彂璐�'}}</span>
             <span  v-if="item.status ==2" class="orange">寰呮敹璐�</span>
             <span  v-if="item.status ==3" class="grey">浜ゆ槗瀹屾垚</span>
-            <span  v-if="item.status ==4" class="grey">宸插叧闂�</span>
+            <span  v-if="item.status ==4" class="grey">宸插彇娑�</span>
             <span  v-if="item.status ==6" class="grey">宸查��娆�</span>
           </div>
         </div>
@@ -125,9 +125,9 @@
           <div class="action">
             <el-button v-if="item.status==1 && item.receiveType!=1" style=" width: 80%;" type="primary" @click="$refs.operaShipmentsWindow.open('鍙戣揣', item)">鍙戣揣</el-button>
             <div></div>
-            <el-button v-if="item.status == 0" style="color: red; "  type="text" @click="$refs.OperaOrderCancelWindow.open('鍙栨秷璁㈠崟', item)">鍙栨秷璁㈠崟</el-button>
+            <el-button v-if="item.status == 0 || item.status==1" style="color: red; "  type="text" @click="$refs.OperaOrderCancelWindow.open('鍙栨秷璁㈠崟', item)">鍙栨秷璁㈠崟</el-button>
             <div></div>
-            <el-button v-if="item.status == 3" style="color: red "  type="text" @click="cancelOrder(item)">璁㈠崟閫�娆�</el-button>
+            <el-button v-if="item.status == 3" style="color: red "  type="text"  @click="$refs.OperaOrderRefundWindow.open('璁㈠崟閫�娆�', item)">璁㈠崟閫�娆�</el-button>
             <div></div>
             <el-button v-if="item.status==2 && item.receiveType!=1" style="color: #666; " type="text"  @click="$refs.operaShipmentsWindow.open('蹇�掍俊鎭彉鏇�', item)">蹇�掑彉鏇�</el-button>
             <div></div>
@@ -149,6 +149,7 @@
     <!-- 鏂板缓/淇敼 -->
     <OperaShipmentsWindow ref="operaShipmentsWindow" @success="search"/>
     <OperaOrderMarkWindow ref="operaOrderMarkWindow" @success="handlePageChange"/>
+    <OperaOrderRefundWindow ref="OperaOrderRefundWindow" @success="handlePageChange"/>
     <OperaOrderCancelWindow ref="OperaOrderCancelWindow" @success="handlePageChange"/>
     <OperaGoodsOrderDetail ref="operaGoodsOrderDetail" @success="handlePageChange"/>
   </TableLayout>
@@ -162,10 +163,11 @@
 import OperaOrderMarkWindow from '@/components/business/OperaOrderMarkWindow'
 import OperaOrderCancelWindow from '@/components/business/OperaOrderCancelWindow'
 import OperaGoodsOrderDetail from '@/components/business/OperaGoodsOrderDetail'
+import OperaOrderRefundWindow from "@/components/business/OperaOrderRefundWindow";
 export default {
   name: 'Goodsorder',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaShipmentsWindow, OperaOrderMarkWindow, OperaGoodsOrderDetail,OperaOrderCancelWindow },
+  components: {OperaOrderRefundWindow, TableLayout, Pagination, OperaShipmentsWindow, OperaOrderMarkWindow, OperaGoodsOrderDetail,OperaOrderCancelWindow },
   data () {
     return {
       status: '10',
@@ -177,7 +179,7 @@
         { name: '2', label: '寰呮敹璐�', count: 0 },
         { name: '3', label: '浜ゆ槗瀹屾垚', count: 0 },
         { name: '6', label: '宸查��娆�', count: 0 },
-        { name: '4', label: '浜ゆ槗鍏抽棴', count: 0 }],
+        { name: '4', label: '宸插彇娑�', count: 0 }],
       // 鎼滅储
       searchForm: {
         id: '',
diff --git a/server/dmmall_admin/src/main/java/com/doumee/api/business/GoodsorderController.java b/server/dmmall_admin/src/main/java/com/doumee/api/business/GoodsorderController.java
index 776290f..8bbc807 100644
--- a/server/dmmall_admin/src/main/java/com/doumee/api/business/GoodsorderController.java
+++ b/server/dmmall_admin/src/main/java/com/doumee/api/business/GoodsorderController.java
@@ -142,6 +142,13 @@
         goodsorderService.orderPlanCancelOrder(goodsorder);
         return ApiResponse.success(null);
     }
+    @ApiOperation("璁㈠崟閫�娆�")
+    @PostMapping("/orderRefund")
+    @RequiresPermissions("business:goodsorder:update")
+    public ApiResponse orderRefund(@RequestBody Goodsorder goodsorder) {
+        goodsorderService.orderRefund(goodsorder);
+        return ApiResponse.success(null);
+    }
 
 
     @ApiOperation("鐗╂祦鏌ヨ")
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
index b1afc85..a21b33d 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -236,6 +236,9 @@
     @ApiModelProperty(value = "鐢ㄦ埛濮撳悕")
     @TableField(exist = false)
     private String memberName;
+    @ApiModelProperty(value = "浼樻儬鍒稿悕绉�")
+    @TableField(exist = false)
+    private String couponName;
     @ApiModelProperty(value = "鍙栨秷浜哄憳濮撳悕")
     @TableField(exist = false)
     private String cancelUserName;
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
index 3767b00..eb2de77 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -235,5 +235,5 @@
     PageData<Goodsorder> shopOrderPage(PageWrap<ShopOrderRequest> pageWrap);
 
 
-
+    void orderRefund(Goodsorder goodsorder);
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 0fa21e1..155c66e 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -388,7 +388,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage());
         }
 
-        cancelOrder( query.getId(),  user.getId(),goodsorder.getCancelInfo() );
+        cancelOrderNew( query.getId(),  user.getId(),goodsorder.getCancelInfo() );
 
     }
 
@@ -411,17 +411,27 @@
                 .selectAs(Member::getNickname,Goodsorder::getNickName)
                 .selectAs(Member::getPhone,Goodsorder::getPhone)
                 .selectAs(Member::getName,Goodsorder::getMemberName)
-                .selectAs(SystemUser::getRealname,Goodsorder::getKdUserName)
+                .selectAs(MemberCoupon::getName,Goodsorder::getCouponName)
+                .select("t4.realname",Goodsorder::getKdUserName)
+                .select("t5.realname",Goodsorder::getCancelUserName)
+                .select("t6.realname",Goodsorder::getRefundUserName)
                 .selectAs(Shop::getName,Goodsorder::getShopName)
+                .leftJoin(MemberCoupon.class,MemberCoupon::getId,Goodsorder::getCouponId)
                 .leftJoin(Shop.class,Shop::getId,Goodsorder::getDistributionShopId)
                 .leftJoin(Member.class,Member::getId,Goodsorder::getMemberId)
                 .leftJoin(SystemUser.class,SystemUser::getId,Goodsorder::getKdUser)
+                .leftJoin(SystemUser.class,SystemUser::getId,Goodsorder::getCancelUser)
+                .leftJoin(SystemUser.class,SystemUser::getId,Goodsorder::getRefundUserId)
                 .eq(Goodsorder::getId,id);
         Goodsorder result=goodsorderJoinMapper.selectJoinOne(Goodsorder.class,q);
         if(Objects.nonNull(result)){
             MPJLambdaWrapper<GoodsorderDetail> queryWrapper = new MPJLambdaWrapper<>();
             queryWrapper.selectAll(GoodsorderDetail.class)
+                    .selectAs(Labels::getName,GoodsorderDetail::getCategoryName)
                     .eq(GoodsorderDetail::getIsdeleted,Constants.ZERO)
+                    .leftJoin(GoodsSku.class,GoodsSku::getId,GoodsorderDetail::getGoodsSkuId)
+                    .leftJoin(Goods.class,Goods::getId,GoodsSku::getGoodsId)
+                    .leftJoin(Labels.class,Labels::getId,Goods::getCategoryId)
                     .eq(GoodsorderDetail::getOrderId,result.getId()) ;
             List<GoodsorderDetail> goodsorderDetailList=goodsorderDetailMapper.selectList(queryWrapper);
             String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
@@ -430,6 +440,8 @@
                 if(StringUtils.isNotBlank(model.getImgurl())){
                    model.setImgurl(path+ model.getImgurl());
                 }
+                //灏忚
+                model.setTotalPrice(Constants.formatBigdecimal(model.getPrice()).multiply(new BigDecimal(Constants.formatIntegerNum(model.getGoodsNum()))));
             }
             result.setGoodsorderDetailList(goodsorderDetailList);
         }
@@ -456,6 +468,8 @@
         queryWrapper.selectAll(Goodsorder.class);
         queryWrapper.selectAs(Shop::getName,Goodsorder::getShopName);
         initPageQueryWrapper(queryWrapper,pageWrap);
+        queryWrapper.selectAs(MemberCoupon::getName,Goodsorder::getCouponName);
+        queryWrapper.leftJoin(MemberCoupon.class,MemberCoupon::getId,Goodsorder::getCouponId);
         queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Goodsorder::getStatus,pageWrap.getModel().getStatus());
         queryWrapper.orderByDesc(Goodsorder::getCreateDate);
 
@@ -1352,11 +1366,12 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
         if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_PAY.getKey())
-        || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey()) 
-        || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_RECEIVE.getKey()) )){
+            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey())
+            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_RECEIVE.getKey()) )){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鍙栨秷澶辫触锛氳鍗曠姸鎬佸凡娴佽浆锛�");
         }
-        if(goodsorder.getPrice().compareTo(BigDecimal.ZERO)>Constants.ZERO){
+        if(Constants.formatBigdecimal(goodsorder.getPrice()).compareTo(BigDecimal.ZERO)>Constants.ZERO
+                && Constants.equalsObject(goodsorder.getPayStatus(),Constants.ONE) ){
             //寰俊鐜伴噾閫�娆�
             String refundCode = WxMiniUtilService.wxRefund(goodsorder.getCode().toString(), goodsorder.getPrice(), goodsorder.getPrice());
             Fund fund = new Fund();
@@ -1934,7 +1949,6 @@
         }
     }
 
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void orderComment(OrderCommentRequest orderCommentRequest){
@@ -1973,6 +1987,18 @@
         goodsorder.setIsComment(Constants.ONE);
         goodsorderMapper.updateById(goodsorder);
     }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public  void orderRefund(Goodsorder param){
+        Goodsorder goodsorder = goodsorderMapper.selectById(param.getId());
+        if(!goodsorder.getMemberId().equals(goodsorder.getMemberId())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎿嶄綔澶辫触锛氱敤鎴蜂俊鎭尮閰嶅け璐ワ紒");
+        }
+        if(!goodsorder.getStatus().equals(Constants.OrderStatus.DONE.getKey())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎿嶄綔澶辫触锛氳鍗曟湭瀹屾垚锛屾棤娉曢��娆撅紒");
+        }
+
+    }
 
 
     @Override

--
Gitblit v1.9.3