From 22aaacd9e51da58ed10221639b6bd2fd9a13c6e5 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期五, 16 一月 2026 18:49:23 +0800
Subject: [PATCH] 经销商管理

---
 admin/src/components/base/BaseOpera.vue                                                         |    6 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java       |   61 +
 admin/src/api/business/userAction.js                                                            |   16 
 server/dmmall_service/src/main/java/com/doumee/dao/business/UserActionMapper.java               |   12 
 admin/src/components/business/OperaMemberCouponWindow.vue                                       |    1 
 server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java                   |   11 
 admin/src/views/business/platformGoods.vue                                                      |   34 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java     |  131 +++
 admin/src/components/business/OperaCouponGoodsWindow.vue                                        |   24 
 server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java              |    5 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java      |   11 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java |  158 +++++
 admin/src/components/business/OperaShopGoodsWindow.vue                                          |  217 +++++++
 admin/src/views/business/memberCoupon.vue                                                       |    4 
 admin/src/api/business/member.js                                                                |   13 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java                    |    6 
 admin/src/components/business/OperaMemberDetail.vue                                             |  212 +++++-
 server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java                        |   49 +
 admin/src/components/business/OperaChangeShopWindow.vue                                         |  109 +++
 server/dmmall_service/src/main/java/com/doumee/dao/business/MemberMapper.java                   |    3 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java   |    1 
 server/dmmall_admin/src/main/java/com/doumee/api/business/IntegralController.java               |    1 
 server/dmmall_admin/src/main/java/com/doumee/api/business/MemberController.java                 |   21 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java                     |    6 
 admin/src/components/business/OperaChangeIntegralWindow.vue                                     |  104 +++
 admin/src/components/business/OperaChangeShopRecordWindow.vue                                   |  120 ++++
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java                   |   69 +-
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/UserAction.java               |   97 +++
 admin/src/views/business/member.vue                                                             |   79 ++
 server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java                |    2 
 server/dmmall_admin/src/main/java/com/doumee/api/business/UserActionController.java             |   90 +++
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/ShopGoodsRelation.java        |    3 
 admin/src/api/business/shop.js                                                                  |    9 
 server/dmmall_service/src/main/java/com/doumee/service/business/UserActionService.java          |   98 +++
 34 files changed, 1,626 insertions(+), 157 deletions(-)

diff --git a/admin/src/api/business/member.js b/admin/src/api/business/member.js
index b871d19..26ed30c 100644
--- a/admin/src/api/business/member.js
+++ b/admin/src/api/business/member.js
@@ -11,8 +11,19 @@
 export function findAll (data) {
   return request.post('/business/member/findAll', data)
 }
-
+export function updateShop (data) {
+  return request.post('/business/member/updateShop', data)
+}
+export function updateIntegral (data) {
+  return request.post('/business/member/updateIntegral', data)
+}
 
 export function updateById (data) {
   return request.post('/business/member/updateById', data)
 }
+export function exportExcel (data) {
+  return request.post('/business/member/exportExcelList', data, {
+    trim: true,
+    download: true
+  })
+}
diff --git a/admin/src/api/business/shop.js b/admin/src/api/business/shop.js
index 75c541a..6ee04e1 100644
--- a/admin/src/api/business/shop.js
+++ b/admin/src/api/business/shop.js
@@ -6,6 +6,11 @@
     trim: true
   })
 }
+export function allList (data) {
+  return request.post('/business/shop/findAll', data, {
+    trim: true
+  })
+}
 
 // 鍒涘缓
 export function create (data) {
@@ -16,10 +21,14 @@
 export function updateById (data) {
   return request.post('/business/shop/updateById', data)
 }
+
 // 淇敼
 export function updateIsRecById (data) {
   return request.post('/business/shop/updateIsRecById', data)
 }
+export function setGoodsPrice (data) {
+  return request.post('/business/shop/setGoodsPrice', data)
+}
 
 // 鍒犻櫎
 export function deleteById (id) {
diff --git a/admin/src/api/business/userAction.js b/admin/src/api/business/userAction.js
new file mode 100644
index 0000000..cc8ca79
--- /dev/null
+++ b/admin/src/api/business/userAction.js
@@ -0,0 +1,16 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/userAction/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/userAction/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
diff --git a/admin/src/components/base/BaseOpera.vue b/admin/src/components/base/BaseOpera.vue
index d05c144..e086d09 100644
--- a/admin/src/components/base/BaseOpera.vue
+++ b/admin/src/components/base/BaseOpera.vue
@@ -68,7 +68,11 @@
         this.api.create(this.form)
           .then((res) => {
             this.visible = false
-            this.$tip.apiSuccess(res  || '鏂板缓鎴愬姛')
+            if (res && res.length > 8) {
+              this.$tip.apiSuccess(res)
+            } else {
+              this.$tip.apiSuccess('鏂板缓鎴愬姛')
+            }
             this.$emit('success')
           })
           .catch(e => {
diff --git a/admin/src/components/business/OperaChangeIntegralWindow.vue b/admin/src/components/business/OperaChangeIntegralWindow.vue
new file mode 100644
index 0000000..97f1cd9
--- /dev/null
+++ b/admin/src/components/business/OperaChangeIntegralWindow.vue
@@ -0,0 +1,104 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="60%"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
+  >
+    <p class="tip-warn" style="margin: 30px;"><i class="el-icon-warning"></i>鎿嶄綔璇存槑锛氱Н鍒嗗鍔犳垨鍑忓皯鍚庝細鍦ㄦ秷璐硅�呯灞曠ず锛岃璋ㄦ厧鎿嶄綔锛�</p>
+    <el-form :model="form" ref="form" :rules="rules" label-width="100px"  label-suffix="锛�" inline>
+      <el-form-item label="褰撳墠浣欓"   >
+        <span class="green" ><b>{{info.integral}}</b></span>
+      </el-form-item>
+      <el-form-item label="璋冩暣鏂瑰紡"   prop="type"   >
+        <el-radio-group v-model="form.type">
+          <el-radio :value="0" :label="0">澧炲姞</el-radio>
+          <el-radio :value="1" :label="1">鍑忓皯</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="鏁伴噺"   prop="num"   >
+        <el-input v-model="form.num" type="number"   placeholder="璇疯緭鍏ユ暟閲�"  ></el-input>
+      </el-form-item>
+      <el-form-item label="澶囨敞"   prop="remark"   >
+        <el-input v-model="form.remark" type="textarea"   placeholder="璇疯緭鍏ュ娉�"  ></el-input>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { allList as shopList } from '@/api/business/shop'
+export default {
+  name: 'OperaChangeShopWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      searchLoading: false,
+      info:{},
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        memberId: null,
+        remark: null,
+        num: null,
+        type: 0
+      },
+      rules: {
+        type: [
+          { required: true, message: '璇烽�夋嫨璋冩暣鏂瑰紡' }
+        ],
+        num: [
+          { required: true, message: '璇疯緭鍏ヨ皟鏁存暟閲�' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/member',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.isWorking = true
+        this.api.updateIntegral(this.form)
+          .then(() => {
+            this.visible = false
+            this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+            this.$emit('success')
+          })
+          .catch(e => {
+            this.$tip.apiFailed(e)
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    },
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.info = target
+      this.form.type = 0
+      this.form.memberId = target.id
+      this.form.num = null
+      this.form.remark = null
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/alertstyle.scss";
+::v-deep .el-form-item__content {
+  flex: 0.6;
+}
+</style>
diff --git a/admin/src/components/business/OperaChangeShopRecordWindow.vue b/admin/src/components/business/OperaChangeShopRecordWindow.vue
new file mode 100644
index 0000000..8432c33
--- /dev/null
+++ b/admin/src/components/business/OperaChangeShopRecordWindow.vue
@@ -0,0 +1,120 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="80%"
+      :visible.sync="visible"
+  >
+    <div style="display: block;">
+      <TableLayout >
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                border
+                @selection-change="handleSelectionChange"
+            >
+              <el-table-column prop="beforeInfo" label="鍙樻洿鍓�" fixed align="center" min-width="150px">  </el-table-column>
+              <el-table-column prop="afterInfo" label="鍙樻洿鍚�" fixed align="center" min-width="150px">  </el-table-column>
+              <el-table-column prop="remark" label="澶囨敞" align="center" min-width="300px"></el-table-column>
+              <el-table-column prop="createName" label="鎿嶄綔浜�" align="center" min-width="100px"></el-table-column>
+              <el-table-column prop="createDate" label="鎿嶄綔鏃堕棿" align="center" min-width="150px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+      </TableLayout>
+    </div>
+    <template  v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'OperaChangeShopRecordWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination },
+  data () {
+    return {
+      title: '',
+      visible: false,
+      // 鎼滅储
+      searchForm: {
+        memberId: '',
+        type: 0
+      }
+    }
+  },
+
+  created () {
+    this.config({
+      module: '鐢ㄦ埛鎿嶄綔璁板綍琛ㄤ俊鎭〃',
+      api: '/business/userAction',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+  },
+  methods: {
+    open (title, goods) {
+      this.title = title
+      this.visible = true
+      this.searchForm.memberId = goods.id
+      this.search()
+    }
+  }
+}
+</script>
+<style scoped>
+.table-pagination{
+  position: fixed !important;
+  bottom: 50px;
+}
+.header-b{
+  display: inline-block;
+  font-size: 16px;
+  font-weight: bold;
+}
+.header-blue{
+  display: inline-block;
+  font-size: 12px;
+  border: 1px solid #216EEE;
+  padding: 2px 10px;
+  margin-left: 20px;
+  color: #216EEE;
+  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;
+}
+</style>
diff --git a/admin/src/components/business/OperaChangeShopWindow.vue b/admin/src/components/business/OperaChangeShopWindow.vue
new file mode 100644
index 0000000..a966340
--- /dev/null
+++ b/admin/src/components/business/OperaChangeShopWindow.vue
@@ -0,0 +1,109 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="60%"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
+  >
+    <p class="tip-warn" style="margin: 30px;"><i class="el-icon-warning"></i>鎿嶄綔璇存槑锛氳鎿嶄綔鍙拡瀵瑰凡缁戝畾缁忛攢鍟嗙殑瀹㈡埛鏈夋晥锛�</p>
+    <el-form :model="form" ref="form" :rules="rules"  label-suffix="锛�" inline>
+      <el-form-item label="褰撳墠宸茬粦瀹氱殑缁忛攢鍟�"   label-width="200px" >
+        <span>{{form.shopName}}</span>
+      </el-form-item>
+      <el-form-item label="閫夋嫨鏂扮殑缁忛攢鍟�" label-width="200px" prop="bindShopId"   >
+        <el-select v-model="form.bindShopId" clearable filterable   placeholder="璇烽�夋嫨浼樻儬鍒�"  >
+          <el-option  v-for="item in shops"  :key="item.id" :label="item.name"  :value="item.id">  </el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { allList as shopList } from '@/api/business/shop'
+export default {
+  name: 'OperaChangeShopWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      searchLoading: false,
+      users: [],
+      // 琛ㄥ崟鏁版嵁
+      oldId:null,
+      form: {
+        id: null,
+        shopName: null,
+        bindShopId: null
+      },
+      shops: [],
+      rules: {
+        bindShopId: [
+          { required: true, message: '璇烽�夋嫨鏂扮殑缁忛攢鍟�' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/member',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.isWorking = true
+        this.api.updateShop(this.form)
+          .then(() => {
+            this.visible = false
+            this.$tip.apiSuccess('鎿嶄綔鎴愬姛')
+            this.$emit('success')
+          })
+          .catch(e => {
+            this.$tip.apiFailed(e)
+          })
+          .finally(() => {
+            this.isWorking = false
+          })
+      })
+    },
+    getShopList () {
+      shopList({ status: 0 })
+        .then(res => {
+          if (res) {
+            this.shops = res || []
+          }
+        })
+    },
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.oldId=target.bindShopId
+      this.form.id = target.id
+      this.form.shopName = target.shopName
+      this.form.bindShopId = null
+      this.getShopList()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/alertstyle.scss";
+::v-deep .el-form-item__content {
+  flex: 0.6;
+}
+::v-deep .el-select {
+  width: 100%;
+  .el-input__inner {
+    width: 100%;
+  }
+}
+</style>
diff --git a/admin/src/components/business/OperaCouponGoodsWindow.vue b/admin/src/components/business/OperaCouponGoodsWindow.vue
index 3bfdb05..fefba70 100644
--- a/admin/src/components/business/OperaCouponGoodsWindow.vue
+++ b/admin/src/components/business/OperaCouponGoodsWindow.vue
@@ -5,7 +5,7 @@
     :visible.sync="visible"
     @confirm="confirm"
   >
-    <TableLayout :permissions="['business:goods:query']">
+    <TableLayout>
       <!-- 鎼滅储琛ㄥ崟 -->
       <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" style="display: block;" >
         <el-form-item label="" prop="name" label-width="5px" style="display: inline-block;margin-right: 30px;">
@@ -100,31 +100,15 @@
   components: { GlobalWindow, TableLayout, Pagination },
   data () {
     return {
-      activeName: 'first',
       title: '',
       visible: false,
-      tabelHeight: null,
       // 鎼滅储
       searchForm: {
-        name: '',
-        categoryId: '',
-        brandId: '',
-        type: '0', // 骞冲彴鍟嗗搧
-        status: '',
-        isrec: '',
-        labels: ''
+        id: '',
+        bindShopId: ''
       },
-      labels: [],
-      serials: [],
-      brands: [],
-      selectGoods: []
+      shops: []
     }
-  },
-  mounted() {
-    window.addEventListener('resize', this.handleResize);
-  },
-  beforeDestroy() {
-    window.removeEventListener('resize', this.handleResize);
   },
   created () {
     this.config({
diff --git a/admin/src/components/business/OperaMemberCouponWindow.vue b/admin/src/components/business/OperaMemberCouponWindow.vue
index 3999607..f1d5f3e 100644
--- a/admin/src/components/business/OperaMemberCouponWindow.vue
+++ b/admin/src/components/business/OperaMemberCouponWindow.vue
@@ -6,6 +6,7 @@
       :confirm-working="isWorking"
       @confirm="confirm"
   >
+    <p class="tip-warn" style="margin: 30px;"><i class="el-icon-warning"></i>鎿嶄綔璇存槑锛氬畾鍚戝彂鏀句笉鍙楀彂鏀炬�绘暟闄愬埗锛屽畾鍚戝彂鏀句紭鎯犲埜涓嶈鍏ヤ紭鎯犲埜宸插彂鏀剧粺璁�</p>
     <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix="锛�" inline>
       <el-form-item label="鍙戞斁瀵硅薄" prop="addType" >
         <el-radio-group v-model="form.addType" @change="changeType">
diff --git a/admin/src/components/business/OperaMemberDetail.vue b/admin/src/components/business/OperaMemberDetail.vue
index a20e0f9..8734a5f 100644
--- a/admin/src/components/business/OperaMemberDetail.vue
+++ b/admin/src/components/business/OperaMemberDetail.vue
@@ -1,65 +1,187 @@
 <template>
-  <GlobalAlertWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
+  <GlobalWindow
+      :title="title"
+      width="100%"
+      :visible.sync="visible"
   >
-    <el-descriptions direction="horizontal" labelClassName="descriptions-label" :column="1">
-      <el-descriptions-item label="浼氬憳鏄电О">{{ form.nickName }}</el-descriptions-item>
-      <el-descriptions-item label="鐪熷疄濮撳悕">{{ form.name }}</el-descriptions-item>
-      <el-descriptions-item label="鎵嬫満鍙�">{{ form.phone }}</el-descriptions-item>
-      <el-descriptions-item label="韬唤璇佸彿">{{ form.idcard }}</el-descriptions-item>
-      <el-descriptions-item label="鎬у埆">{{ form.sex==0?'鐢�':form.sex==1?'濂�':'鏈煡' }}</el-descriptions-item>
-      <el-descriptions-item label="鍦板尯">{{ form.addr }}</el-descriptions-item>
-      <el-descriptions-item label="涓�鍙ヨ瘽浠嬬粛">{{ form.info }}</el-descriptions-item>
-    </el-descriptions>
-    <div slot="footer"></div>
-  </GlobalAlertWindow>
+    <div style="display: block">
+      <div class="header">
+        <div  class="header-b">鐢ㄦ埛淇℃伅</div>
+        <div v-if="info.phone!=null && info.phone!=''" class="header-blue">宸叉巿鏉冩墜鏈哄彿</div>
+      </div>
+      <div class="info-item">
+          <div class="info-item-a">寰俊openid锛�<span>{{info.openId}}</span></div>
+          <div class="info-item-a">鏄电О锛�<span>{{info.nickname}}</span></div>
+          <div class="info-item-a">瀹㈡埛濮撳悕锛�<span>{{info.name}}</span></div>
+      </div>
+      <div class="info-item">
+        <div class="info-item-a">鎺堟潈鎵嬫満鍙凤細<span>{{info.phone}}</span></div>
+        <div class="info-item-a">鍏宠仈缁忛攢鍟嗭細<span>{{info.shopName}}</span> <span class="blue btn" @click="showChangeRecord">鍙樻洿璁板綍</span></div>
+        <div class="info-item-a"></div>
+      </div>
+      <div class="info-item"></div>
+    </div>
+    <div style="display: block">
+      <div class="header">
+        <div  class="header-b">绉垎鏄庣粏</div>
+        <div v-if="info.phone!=null && info.phone!=''" class="header-btn">
+          <el-button style="display: inline" type="primary" @click="changeIntegral">绉垎璋冩暣</el-button>
+        </div>
+      </div>
+      <TableLayout >
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <div >
+              <div style="float: left; margin-bottom: 20px;width:50%;">
+                  <div class="info-item">
+                    <div class="info-item-a">鐜版湁绉垎锛�<span>{{info.integral || 0}}</span></div>
+                    <div class="info-item-a">绱绉垎锛�<span>{{info.totalIntegral||0}}</span></div>
+                  </div>
+              </div>
+              <div style="float: right; margin-bottom: 20px;">
+                <el-select  v-model="searchForm.type"  placeholder="鍏ㄩ儴"  clearable @change="search" style="width: 120px;" >
+                  <el-option  :key="0" :value="0"  label="鑾峰緱"  ></el-option>
+                  <el-option   :key="1" :value="1" label="鎵i櫎"  ></el-option>
+                </el-select>
+                <el-button @click="search" type="鐐瑰嚮鍒锋柊"  icon="el-icon-refresh"  style="margin-left: 10px;" ></el-button>
+              </div>
+            </div>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                border
+                @selection-change="handleSelectionChange"
+            >
+              <el-table-column prop="type"  label="鑾峰緱/鎵i櫎" align="center" min-width="150px">
+                <template slot-scope="{row}">
+                  {{ row.saleType == 1?'鎵i櫎':'鑾峰緱'}}
+                </template>
+              </el-table-column>
+              <el-table-column prop="num" label="鏁伴噺" fixed align="center" min-width="100px">  </el-table-column>
+              <el-table-column prop="strObjType" label="娑堣垂绫诲瀷" align="center" min-width="100px"></el-table-column>
+              <el-table-column prop="orderCode" label="鍏宠仈璁㈠崟" align="center" min-width="150px"></el-table-column>
+              <el-table-column prop="remark" label="澶囨敞" align="center" min-width="200px"></el-table-column>
+              <el-table-column prop="createDate" label="鍙樺姩鏃堕棿" align="center" min-width="200px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+      </TableLayout>
+    </div>
+    <template  v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+    <OperaChangeShopRecordWindow ref="OperaChangeShopRecordWindow"/>
+    <OperaChangeIntegralWindow ref="OperaChangeIntegralWindow" @success="successBiz"/>
+  </GlobalWindow>
 </template>
 
 <script>
-import BaseOpera from '@/components/base/BaseOpera'
-import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaChangeShopRecordWindow from '@/components/business/OperaChangeShopRecordWindow'
+import OperaChangeIntegralWindow from '@/components/business/OperaChangeIntegralWindow'
 export default {
-  name: 'OperaCouponWindow',
-  extends: BaseOpera,
-  components: { GlobalAlertWindow },
+  name: 'OperaShopGoodsWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination, OperaChangeShopRecordWindow,OperaChangeIntegralWindow },
   data () {
-    
     return {
-      getDate: [],
-      // 琛ㄥ崟鏁版嵁
-      form: {
-        id: null,
-        name: '',
-        nickName: '',
-        sex: '',
-        addr: '',
-        phone: '',
-        idcard: '',
-        info: ''
-      },
-      
+      title: '',
+      visible: false,
+      tabelHeight: null,
+      info: {},
+      // 鎼滅储
+      searchForm: {
+        memberId: '',
+        userType: 0,
+        type: null
+      }
     }
   },
+
   created () {
     this.config({
-      api: '/business/coupon',
-      'field.id': 'id'
+      module: '鐢ㄦ埛淇℃伅琛�',
+      api: '/business/integral',
+      'field.id': 'id',
+      'field.main': 'id'
     })
   },
   methods: {
-    
-  },
+    successBiz(){
+      this.handlePageChange()
+      this.$emit('success')
+    },
+    showChangeRecord () {
+      if (this.info) {
+        this.$refs.OperaChangeShopRecordWindow.open('瀹㈡埛缁忛攢鍟嗗彉鏇磋褰�', this.info)
+      }
+    },
+    changeIntegral () {
+      if (this.info) {
+        this.$refs.OperaChangeIntegralWindow.open('瀹㈡埛绉垎璋冩暣', this.info)
+      }
+    },
+    open (title, goods) {
+      this.title = title
+      this.visible = true
+      this.info = goods
+      this.searchForm.memberId = goods.id
+      this.search()
+    },
+    handleClick (val) {
+    }
+  }
 }
 </script>
+<style scoped>
+.table-pagination{
+  position: fixed !important;
+  bottom: 50px;
+}
+.header-b{
+  display: inline-block;
+  font-size: 16px;
+  font-weight: bold;
+}
+.header-blue{
+  display: inline-block;
+  font-size: 12px;
+  border: 1px solid #216EEE;
+  padding: 2px 10px;
+  margin-left: 20px;
+  color: #216EEE;
+  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;
 
-<style lang="scss">
-.descriptions-label {
-  width: 80px;
-  text-align: right !important;
-  display: block !important;;
+}
+.info-item-a span{
+  font-weight: 600;
+}
+.info-item-a  .btn{
+  font-size: 12px !important;
+  cursor: pointer !important;
 }
 </style>
-
diff --git a/admin/src/components/business/OperaShopGoodsWindow.vue b/admin/src/components/business/OperaShopGoodsWindow.vue
new file mode 100644
index 0000000..736be16
--- /dev/null
+++ b/admin/src/components/business/OperaShopGoodsWindow.vue
@@ -0,0 +1,217 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    width="80%"
+    :visible.sync="visible"
+  >
+    <TableLayout >
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <el-form ref="searchForm" slot="search-form" :model="searchForm"  label-width="10px" style="display: block;" >
+        <el-form-item label="" prop="name" style="display: inline-block;margin-right: 30px;">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="" prop="code" style="display: inline-block;margin-right: 30px;">
+          <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ラ棬搴桰D" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="" prop="saleType" style="display: inline-block;margin-right: 30px;">
+          <!-- 0姝e父 1绂佺敤 -->
+          <el-select     v-model="searchForm.saleType"  placeholder="閿�鍞ā寮�"  @change="search"  >
+            <el-option  :key="0" :value="0"  label="骞冲彴閾鸿揣"  ></el-option>
+            <el-option   :key="1" :value="1" label="鑷富閲囪喘"  ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="" prop="status" style="display: inline-block;margin-right: 30px;">
+          <!-- 0姝e父 1绂佺敤 -->
+          <el-select     v-model="searchForm.status"  placeholder="璇烽�夋嫨鐘舵��"    @change="search"   >
+            <el-option  :key="0" :value="0"  label="姝e父"  ></el-option>
+            <el-option   :key="1" :value="1" label="绂佺敤"  ></el-option>
+          </el-select>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+      <!-- 琛ㄦ牸鍜屽垎椤� -->
+      <template v-slot:table-wrap>
+        <div :style="'display: flex;height:'+tabelHeight+'px;'">
+          <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="name" label="鍚嶇О" fixed align="center" min-width="100px">  </el-table-column>
+            <el-table-column prop="code" label="闂ㄥ簵ID" align="center" min-width="100px"></el-table-column>
+            <el-table-column prop="bigAreaName" label="鎵�灞炲尯鍩�" align="center" min-width="100px"></el-table-column>
+            <el-table-column prop="areaFullName" label="鐪佸競鍖�" align="center" min-width="150px" show-overflow-tooltip>
+              <template slot-scope="{row}">
+                <span v-if="row.areas!=null">{{(row.areas.provinceName||'') + (row.areas.cityName||'') + (row.areas.name||'')}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="saleType"  label="閿�鍞ā寮�" align="center" min-width="150px">
+              <template slot-scope="{row}">
+                {{ row.saleType == 1?'鑷富閲囪喘':'骞冲彴閾鸿揣'}}
+              </template>
+            </el-table-column>
+            <el-table-column prop="status" label="鐘舵��" align="center" min-width="100px" fixed="right">
+              <template slot-scope="{row}">
+                {{ row.status == 1?'绂佺敤':'姝e父'}}
+              </template>
+            </el-table-column>
+            <el-table-column prop="price" label="閿�鍞环" align="center" min-width="100px" fixed="right">
+                {{ price}}
+            </el-table-column>
+            <el-table-column prop="goodsPrice" label="渚涜揣浠�" align="center" min-width="100px" fixed="right">
+              <template slot-scope="scope">
+                <el-input v-if="scope.row.isPriceSelected" v-model="scope.row.goodsPrice"
+                          @focus="focusEvent(scope.row,scope.$index,scope.column)"
+                          @blur="blurEvent(scope.row,scope.$index,scope.column)" v-focus></el-input>
+                <p style="cursor: pointer" class="blue" title="鐐瑰嚮缂栬緫" @click="cellClick(scope.row, scope.column)" v-else>{{scope.row.goodsPrice || '鏈缃�' }}</p>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination
+              @size-change="handleSizeChange"
+              @current-change="handlePageChange"
+              :pagination="tableData.pagination"
+          >
+          </pagination>
+          </div>
+      </template>
+    </TableLayout>
+    <template  v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'OperaShopGoodsWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination },
+  data () {
+    return {
+      activeName: 'first',
+      title: '',
+      price : null,
+      visible: false,
+      tabelHeight: null,
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        goodsId: null,
+        username: '',
+        status: '',
+        saleType: '',
+        isrec: ''
+      }
+    }
+  },
+  mounted () {
+    window.addEventListener('resize', this.handleResize)
+  },
+  beforeDestroy () {
+    window.removeEventListener('resize', this.handleResize)
+  },
+  created () {
+    this.config({
+      module: '鍟嗗搧淇℃伅琛�',
+      api: '/business/shop',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.handleResize()
+  },
+  directives: {
+    focus: {
+      inserted: function (el) {
+        el.querySelector('input').focus()
+      }
+    }
+  },
+  methods: {
+    handleResize () {
+      this.tabelHeight = window.innerHeight - 300
+    },
+    open (title, goods) {
+      this.title = title
+      this.visible = true
+      this.price = goods.skuPrice
+      this.searchForm.goodsId = goods.id
+      this.search()
+    },
+    handlePageChange: function (pageIndex) {
+      this.__checkApi()
+      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 => {
+          (data.records|| []).forEach((item) => {
+            item.isPriceSelected = false
+          })
+          this.tableData.list = data.records || []
+          this.tableData.pagination.total = data.total
+          console.log(this.tableData.list)
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.isWorking.search = false
+        })
+    },
+    cellClick (row, column) {
+      row.isPriceSelected = !row.isPriceSelected
+    },
+    focusEvent (row, index, column) {
+      row.oldGoodsPrice = row.goodsPrice
+    },
+    blurEvent (row, curIndex, column) {
+      if(this.price >= row.goodsPrice) {
+        this.$tip.error('渚涜揣浠蜂笉鑳戒綆浜庨攢鍞环')
+        row.isPriceSelected = !row.isPriceSelected
+        row.goodsPrice = row.oldGoodsPrice// 浠锋牸杩樺師
+        return
+      }
+      if( row.goodsPrice == row.oldGoodsPrice){
+        row.isPriceSelected = !row.isPriceSelected
+        return;
+      }
+      this.api.setGoodsPrice({
+        id: row.id,
+        goodsId: this.searchForm.goodsId,
+        goodsPrice: row.goodsPrice
+      }).then(res => {
+        row.oldGoodsPrice = row.goodsPrice
+        this.$tip.success('淇敼鎴愬姛')
+        this.$emit('success')
+      }).catch(e => {
+        row.goodsPrice = row.oldGoodsPrice// 浠锋牸杩樺師
+      }).finally(() => {
+        row.isPriceSelected = !row.isPriceSelected
+      })
+    },
+    handleClick (val) {
+    }
+  }
+}
+</script>
+<style scoped>
+.table-pagination{
+  position: fixed !important;
+  bottom: 50px;
+}
+</style>
diff --git a/admin/src/views/business/member.vue b/admin/src/views/business/member.vue
index 1440ee6..5e28235 100644
--- a/admin/src/views/business/member.vue
+++ b/admin/src/views/business/member.vue
@@ -2,9 +2,43 @@
   <TableLayout :permissions="['business:member:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="鐢ㄦ埛" prop="nickname">
-        <el-input v-model="searchForm.nickname" placeholder="璇疯緭鍏ユ樀绉�/鎵嬫満鍙�/鐪熷疄濮撳悕" @keypress.enter.native="search"></el-input>
+      <el-form-item label="鐢ㄦ埛" prop="nickname ">
+        <el-input v-model="searchForm.nickname"  style="width: 160px" placeholder="鏄电О/鎵嬫満鍙�/鐪熷疄濮撳悕" @keypress.enter.native="search"></el-input>
       </el-form-item>
+      <el-form-item label="鐘舵��" prop="status"  >
+        <el-select   v-model="searchForm.status" placeholder="鐘舵��"  clearable @change="search">
+          <el-option :key="0" :value="0" label="鍚敤"></el-option>
+          <el-option :key="1" :value="1" label="绂佺敤"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍏宠仈缁忛攢鍟�" prop="shopName ">
+        <el-input v-model="searchForm.shopName"  style="width: 160px" placeholder="缁忛攢鍟嗗悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <div class="date-style" style="display: inline">
+        <el-form-item label="鍒涘缓鏃堕棿" prop="queryStartDate" >
+          <el-date-picker
+              style="width: 160px"
+            v-model="searchForm.starttime"
+            type="datetime"
+            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="queryEndDate" >
+          <el-date-picker
+              style="width: 160px"
+              v-model="searchForm.endtime"
+              type="datetime"
+              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>
@@ -12,23 +46,24 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:member:exportExcel' ]">
+        <li> <el-button type="primary" :loading="isWorking.export" v-permissions="['business:member:exportExcel']" @click="exportExcel">瀵煎嚭</el-button></li>
+      </ul>
       <el-table
         v-loading="isWorking.search"
         :data="tableData.list"
         stripe
         border
       >
-        <el-table-column prop="creator" label="鐢ㄦ埛" align="center" min-width="100px">
-          <template slot-scope="{row}">
-            <el-image style="width: 60px; height: 60px; border-radius: 50%;" :src="row.imgFullUrl"></el-image>
-            {{ row.nickName }}
-          </template>
-        </el-table-column>
+        <el-table-column prop="openid" label="寰俊openid" align="center"  min-width="100px"></el-table-column>
         <el-table-column prop="nickname" label="鏄电О" align="center"  min-width="100px"></el-table-column>
-        <el-table-column prop="name" label="鐪熷疄濮撳悕" align="center"  min-width="100px"></el-table-column>
-        <el-table-column prop="phone" label="鎵嬫満鍙�" align="center"  min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="瀹㈡埛濮撳悕" align="center"  min-width="100px"></el-table-column>
+        <el-table-column prop="phone" label="鎺堟潈鎵嬫満鍙�" align="center"  min-width="100px"></el-table-column>
         <el-table-column prop="idcard" label="韬唤璇佸彿" align="center"  min-width="100px"></el-table-column>
-        <el-table-column prop="integral" label="绉垎鏁伴噺" align="center"  min-width="100px"></el-table-column>
+        <el-table-column prop="integral" label="鐜版湁绉垎" align="center"  min-width="100px"></el-table-column>
+        <el-table-column prop="totalIntegral" label="绱绉垎" align="center"  min-width="100px"></el-table-column>
+        <el-table-column prop="totalIntegral" label="绱鎵i櫎" align="center"  min-width="100px"></el-table-column>
+        <el-table-column prop="shopName" 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 label="鐘舵��" align="center"  min-width="100px">
           <template slot-scope="{row}">
@@ -42,9 +77,10 @@
             ></el-switch>
           </template>
         </el-table-column>
-        <el-table-column label="鎿嶄綔" align="center"  min-width="100px">
+        <el-table-column label="鎿嶄綔" align="center"  min-width="200px">
           <template slot-scope="{row}">
             <el-button type="text" @click="showMemberDetail(row)">璇︽儏</el-button>
+            <el-button type="text" v-if="row.bindShopId !=null" @click="changeShop(row)">鏇存崲缁忛攢鍟�</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -54,7 +90,8 @@
         :pagination="tableData.pagination"
       >
       </pagination>
-      <OperaMemberDetail ref="operaMemberDetail" />
+      <OperaChangeShopWindow ref="OperaChangeShopWindow" @success="handlePageChange" />
+      <OperaMemberDetail ref="operaMemberDetail" @success="handlePageChange"/>
     </template>
   </TableLayout>
 </template>
@@ -64,16 +101,21 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaMemberDetail from '@/components/business/OperaMemberDetail'
+import OperaChangeShopWindow from '@/components/business/OperaChangeShopWindow'
 import { updateById } from '@/api/business/member'
 export default {
   name: 'Member',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaMemberDetail },
+  components: { TableLayout, Pagination, OperaMemberDetail ,OperaChangeShopWindow},
   data () {
     return {
       // 鎼滅储
       searchForm: {
-        nickname: ''
+        starttime: null,
+        endtime: null,
+        status: null,
+        nickname: '',
+        shopName: ''
       }
     }
   },
@@ -87,6 +129,9 @@
     this.search()
   },
   methods: {
+    changeShop(row){
+      this.$refs.OperaChangeShopWindow.open('鏇存崲缁忛攢鍟�',row)
+    },
     statusChange(row) {
       console.log(row);
       updateById(row)
@@ -108,7 +153,7 @@
 </script>
 
 <style scoped>
-::v-deep .el-input{
+/*::v-deep .el-input{
   width: 200px;
-}
+}*/
 </style>
diff --git a/admin/src/views/business/memberCoupon.vue b/admin/src/views/business/memberCoupon.vue
index 7875ad1..18a6639 100644
--- a/admin/src/views/business/memberCoupon.vue
+++ b/admin/src/views/business/memberCoupon.vue
@@ -2,7 +2,7 @@
   <TableLayout :permissions="['business:membercoupon:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="鐢ㄦ埛" prop="nikeName">
+      <el-form-item label="鐢ㄦ埛" prop="nikeName" >
         <el-input v-model="searchForm.nikeName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�/鎵嬫満鍙� " clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
       <el-form-item label="浼樻儬鍒稿悕绉�" prop="name">
@@ -47,7 +47,7 @@
         :data="tableData.list"
         stripe
       >
-        <el-table-column prop="nikeName" label="鐢ㄦ埛" min-width="100px"></el-table-column>
+        <el-table-column prop="nikeName" label="鐢ㄦ埛" min-width="180px"></el-table-column>
         <el-table-column prop="name" label="浼樻儬鍒稿悕绉�" min-width="100px"></el-table-column>
         <el-table-column prop="couponType" label="浼樻儬鍒哥被鍨�" min-width="100px">
           <template slot-scope="{row}">
diff --git a/admin/src/views/business/platformGoods.vue b/admin/src/views/business/platformGoods.vue
index 8add1f5..b37bda1 100644
--- a/admin/src/views/business/platformGoods.vue
+++ b/admin/src/views/business/platformGoods.vue
@@ -68,9 +68,9 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="imgurl" label="鍟嗗搧淇℃伅" min-width="100px">
+        <el-table-column prop="imgurl" label="鍟嗗搧淇℃伅" min-width="80px">
           <template slot-scope="{row}">
-            <el-image style="width: 80px;height: 80px;" v-if="row.imgurl && row.imgurl!=''" :src="row.resourcePath+row.imgurl" :preview-src-list="[row.resourcePath+row.imgurl]"></el-image>
+            <el-image style="width: 50px;height: 50px;" v-if="row.imgurl && row.imgurl!=''" :src="row.resourcePath+row.imgurl" :preview-src-list="[row.resourcePath+row.imgurl]"></el-image>
           </template>
         </el-table-column>
         <el-table-column prop="id" label="鍟嗗搧ID" min-width="150px" ></el-table-column>
@@ -78,14 +78,14 @@
         <el-table-column prop="categoryName" label="鎵�灞炲垎绫�" min-width="120px"></el-table-column>
         <el-table-column prop="brandName" label="鎵�灞炲搧鐗�" min-width="120px"></el-table-column>
         <el-table-column prop="price" label="灞曠ず浠锋牸" min-width="100px"></el-table-column>
-        <el-table-column prop="stockNum" label="鍓╀綑搴撳瓨閲�" min-width="100px"></el-table-column>
-        <el-table-column prop="salesVolume" label="瀹為檯閿�閲�" min-width="100px"></el-table-column>
-        <el-table-column prop="skuPrice" label="闆跺敭浠�(鍏�)" min-width="100px"></el-table-column>
+        <el-table-column prop="skuPrice" label="閿�鍞环(鍏�)" min-width="100px"></el-table-column>
         <el-table-column prop="shopPrice" label="渚涜揣浠疯缃�" min-width="100px" align="center">
           <template slot-scope="{row}" >
-          <div @click="goPriceSet(row)" style="cursor:pointer;"><span  class="red"> {{row.shopPriceNum||0}}</span> / <span class="green"> {{row.shopNum||0}}</span>  </div>
+            <div @click="goPriceSet(row)" style="cursor:pointer;"><span  class="red"> {{row.pricedShopNum||0}}</span> / <span class="green"> {{row.shopNum||0}}</span>  </div>
           </template>
         </el-table-column>
+        <el-table-column prop="stockNum" label="鍓╀綑搴撳瓨閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="salesVolume" label="瀹為檯閿�閲�" min-width="100px"></el-table-column>
         <el-table-column prop="editDate" label="鏈�杩戞洿鏂版椂闂�" min-width="100px"></el-table-column>
         <el-table-column prop="status" label="涓婁笅鏋剁姸鎬�" min-width="100px" fixed="right" align="center">
           <template slot-scope="{row}">
@@ -105,10 +105,10 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-             <el-button type="text" @click="$refs.operaGoodsWindow.open('缂栬緫鍟嗗搧', row, 0)" v-permissions="['business:goods:update']">缂栬緫</el-button>
+             <el-button type="text" v-if="row.status == 1" @click="$refs.operaGoodsWindow.open('缂栬緫鍟嗗搧', row, 0)" v-permissions="['business:goods:update']">缂栬緫</el-button>
             <el-button type="text"  @click="goPriceSet(row)">渚涜揣浠�</el-button>
             <el-button type="text" style="color: red;" @click="deleteById(row)" v-permissions="['business:goods:delete']">鍒犻櫎</el-button>
-            <!--              <el-button type="text" @click="$refs.operaGoodsDetailWindow.open('鍟嗗搧璇︽儏', row, 0)">鏌ョ湅璇︽儏</el-button>-->
+            <!-- <el-button type="text" @click="$refs.operaGoodsDetailWindow.open('鍟嗗搧璇︽儏', row, 0)">鏌ョ湅璇︽儏</el-button>-->
           </template>
         </el-table-column>
       </el-table>
@@ -123,6 +123,7 @@
     <OperaGoodsWindow ref="operaGoodsWindow" @success="handlePageChange"/>
     <OperaGoodsDetailWindow ref="operaGoodsDetailWindow"/>
     <OperaPlatformGoodsSkuWindow ref="operaPlatformGoodsSkuWindow"/>
+    <OperaShopGoodsWindow ref="OperaShopGoodsWindow" @success="priceSuccess"/>
   </TableLayout>
 </template>
 
@@ -133,11 +134,12 @@
 import OperaGoodsWindow from '@/components/business/OperaGoodsWindow'
 import OperaGoodsDetailWindow from '@/components/business/OperaGoodsDetailWindow'
 import OperaPlatformGoodsSkuWindow from '@/components/business/OperaPlatformGoodsSkuWindow'
+import OperaShopGoodsWindow from '@/components/business/OperaShopGoodsWindow'
 import { findAll as labelList } from '@/api/business/labels'
 export default {
   name: 'Goods',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaGoodsWindow, OperaGoodsDetailWindow, OperaPlatformGoodsSkuWindow },
+  components: { TableLayout, Pagination, OperaGoodsWindow, OperaGoodsDetailWindow, OperaPlatformGoodsSkuWindow ,OperaShopGoodsWindow},
   data () {
     return {
       activeName: 'first',
@@ -199,10 +201,18 @@
       })
   },
   methods: {
+    priceSuccess(){
+      this.handlePageChange()
+    },
     goPriceSet(row){
-
+      if(row.skuPrice == null){
+        this.$tip.warning('璇峰厛璁剧疆鍟嗗搧閿�鍞环锛�')
+        return
+      }
+      this.$refs.OperaShopGoodsWindow.open('璁剧疆渚涜揣浠� - '+row.name, row )
     },
     handleClick (val) {
+
     },
     /**
      *
@@ -224,10 +234,10 @@
     statusChangeBiz (rows) {
       this.api.updateStatus(rows)
         .then(() => {
-          this.search()
+          this.handlePageChange()
         })
         .catch(e => {
-          this.search()
+          this.handlePageChange()
         })
     }
   }
diff --git a/server/dmmall_admin/src/main/java/com/doumee/api/business/IntegralController.java b/server/dmmall_admin/src/main/java/com/doumee/api/business/IntegralController.java
index 001cc11..4cfcad6 100644
--- a/server/dmmall_admin/src/main/java/com/doumee/api/business/IntegralController.java
+++ b/server/dmmall_admin/src/main/java/com/doumee/api/business/IntegralController.java
@@ -89,7 +89,6 @@
                 model.setStrType("鏀嚭");
             }
             model.setStrObjType(Constants.IntegralObjType.getName(model.getObjType()));
-
         }
         ExcelExporter.build(Integral.class).export(list, "鐢ㄦ埛绉垎鏄庣粏"+ DateUtil.getNowLongTime(), response);
     }
diff --git a/server/dmmall_admin/src/main/java/com/doumee/api/business/MemberController.java b/server/dmmall_admin/src/main/java/com/doumee/api/business/MemberController.java
index 24a5071..2d732a7 100644
--- a/server/dmmall_admin/src/main/java/com/doumee/api/business/MemberController.java
+++ b/server/dmmall_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -7,6 +7,7 @@
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.Integral;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.system.dto.MemberRechargeDTO;
 import com.doumee.service.business.MemberService;
@@ -72,6 +73,20 @@
         memberService.updateById(member);
         return ApiResponse.success(null);
     }
+    @ApiOperation("鏇存崲缁忛攢鍟�")
+    @PostMapping("/updateShop")
+    @RequiresPermissions("business:member:update")
+    public ApiResponse updateShop(@RequestBody Member member) {
+        memberService.updateShop(member);
+        return ApiResponse.success(null);
+    }
+    @ApiOperation("璋冩暣绉垎")
+    @PostMapping("/updateIntegral")
+    @RequiresPermissions("business:member:update")
+    public ApiResponse updateIntegral(@RequestBody Integral param) {
+        memberService.updateIntegral(param);
+        return ApiResponse.success(null);
+    }
 
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
@@ -104,6 +119,12 @@
             ExcelExporter.build(MemberRechargeDTO.class).export(collect, "鐢ㄦ埛淇℃伅琛�", response);
         }
     }
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcelList")
+    @RequiresPermissions("business:member:exportExcel")
+    public void exportExcelList (@RequestBody PageWrap<Member> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(Member.class).export( memberService.findPage(pageWrap).getRecords(), "鐢ㄦ埛淇℃伅琛�", response);
+    }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
diff --git a/server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java b/server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java
index 66a9497..758da45 100644
--- a/server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java
+++ b/server/dmmall_admin/src/main/java/com/doumee/api/business/ShopController.java
@@ -40,6 +40,13 @@
     public ApiResponse create(@RequestBody Shop shop) {
         return ApiResponse.success(shopService.create(shop));
     }
+    @PreventRepeat
+    @ApiOperation("璁剧疆渚涜揣浠�")
+    @PostMapping("/setGoodsPrice")
+    @RequiresPermissions("business:shop:update")
+    public ApiResponse setGoodsPrice(@RequestBody Shop shop) {
+        return ApiResponse.success(shopService.setGoodsPrice(shop));
+    }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
@@ -90,8 +97,8 @@
     @ApiOperation("鏌ヨ鎵�鏈夋暟鎹�")
     @PostMapping("/findAll")
     @RequiresPermissions("business:shop:query")
-    public ApiResponse<List<Shop>> findAll (@RequestBody PageWrap<Shop> pageWrap) {
-        return ApiResponse.success(shopService.findAll(pageWrap));
+    public ApiResponse<List<Shop>> findAll (@RequestBody Shop pageWrap) {
+        return ApiResponse.success(shopService.findList(pageWrap));
     }
 
 
diff --git a/server/dmmall_admin/src/main/java/com/doumee/api/business/UserActionController.java b/server/dmmall_admin/src/main/java/com/doumee/api/business/UserActionController.java
new file mode 100644
index 0000000..3725cca
--- /dev/null
+++ b/server/dmmall_admin/src/main/java/com/doumee/api/business/UserActionController.java
@@ -0,0 +1,90 @@
+package com.doumee.api.business;
+
+import com.doumee.api.BaseController;
+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.UserAction;
+import com.doumee.service.business.UserActionService;
+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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/12/14 13:57
+ */
+@Api(tags = "浜哄憳鎿嶄綔璁板綍鏃ュ織")
+@RestController
+@RequestMapping("/business/userAction")
+public class UserActionController extends BaseController {
+
+    @Autowired
+    private UserActionService userActionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:useraction:create")
+    public ApiResponse create(@RequestBody UserAction userAction) {
+        return ApiResponse.success(userActionService.create(userAction));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:useraction:delete")
+    public ApiResponse deleteById(@PathVariable Integer id) {
+        userActionService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:useraction:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(Integer.valueOf(id));
+        }
+        userActionService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:useraction:update")
+    public ApiResponse updateById(@RequestBody UserAction userAction) {
+        userActionService.updateById(userAction);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:useraction:query")
+    public ApiResponse<PageData<UserAction>> findPage (@RequestBody PageWrap<UserAction> pageWrap) {
+        return ApiResponse.success(userActionService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:useraction:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<UserAction> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(UserAction.class).export(userActionService.findPage(pageWrap).getRecords(), "浜哄憳鎿嶄綔璁板綍鏃ュ織", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:useraction:query")
+    public ApiResponse findById(@PathVariable Integer id) {
+        return ApiResponse.success(userActionService.findById(id));
+    }
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
index 9a78203..b2cb97c 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -864,8 +864,6 @@
         SYSTEM_RECHARGE(12,"骞冲彴鍏呭��","骞冲彴鍏呭��",0),
         SYSTEM_DEDUCT(13,"骞冲彴鎵f","骞冲彴鎵f",0),
         SHOP_ORDER_CANCEL(14,"绉垎鎶垫墸鍟嗗搧閫�杩�","绉垎鎶垫墸鍟嗗搧閫�杩�",0),
-
-
         ORDER_DONATE(15,"璁㈠崟璧犻�佺Н鍒�","璁㈠崟璧犻�佺Н鍒�",0),
         ORDER_DONE_AMOUNT(16,"璁㈠崟缁撶畻閲戦","璁㈠崟缁撶畻閲戦",0),
 
@@ -1147,5 +1145,52 @@
         }
     }
 
+    public  enum UserActionType {
+        CHANGE_SHOP(0, "缁忛攢鍟嗘洿鎹�","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愮粡閿�鍟嗘洿鎹€��" ),
+        ;
 
+        // 鎴愬憳鍙橀噺
+        private int key;
+        private String name;
+        private String info;
+
+        // 鏋勯�犳柟娉�
+        UserActionType(int key, String name,String info ) {
+            this.key = key;
+            this.info = info;
+            this.name = name;
+        }
+        public static String getName(int index) {
+            for (UserActionType c : UserActionType.values()) {
+                if (c.getKey() == index) {
+                    return c.name;
+                }
+            }
+            return null;
+        }
+
+        public int getKey() {
+            return key;
+        }
+
+        public void setKey(int key) {
+            this.key = key;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getInfo() {
+            return info;
+        }
+
+        public void setInfo(String info) {
+            this.info = info;
+        }
+    }
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/MemberMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/MemberMapper.java
index ff16de5..2d166c9 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/MemberMapper.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/MemberMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.Member;
+import com.github.yulichang.base.MPJBaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
@@ -11,7 +12,7 @@
  * @author 姹熻箘韫�
  * @date 2023/03/21 15:48
  */
-public interface MemberMapper extends BaseMapper<Member> {
+public interface MemberMapper extends MPJBaseMapper<Member> {
 
 
     /**
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/UserActionMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/UserActionMapper.java
new file mode 100644
index 0000000..1f8abd8
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/UserActionMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.doumee.dao.business.model.UserAction;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface UserActionMapper extends MPJBaseMapper<UserAction> {
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
index f836338..ef29758 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
@@ -202,6 +202,12 @@
     @ApiModelProperty(value = "鍟嗗搧SKU瑙勬牸缁�")
     @TableField(exist = false)
     private List<GoodsSku>  goodsSkuList;
+    @ApiModelProperty(value = "渚涢姺鍟嗘暟閲�")
+    @TableField(exist = false)
+    private Long shopNum;
+    @ApiModelProperty(value = "宸茶缃緵閵峰晢鏁伴噺")
+    @TableField(exist = false)
+    private Long pricedShopNum;
 
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
index a9e72fa..4a5c6f2 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -23,130 +23,129 @@
 public class Member {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
-    @ExcelColumn(name="涓婚敭")
+   // @ExcelColumn(name="涓婚敭")
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
     @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+   // @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
     private Integer creator;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @ExcelColumn(name="鍒涘缓鏃堕棿")
-    
+    @ExcelColumn(name="鍒涘缓鏃堕棿",width = 10,index = 8,dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+   // @ExcelColumn(name="鏇存柊浜虹紪鐮�")
     private Integer editor;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @ExcelColumn(name="鏇存柊鏃堕棿")
+   // @ExcelColumn(name="鏇存柊鏃堕棿")
     
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
-    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+   // @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
     private Integer isdeleted;
 
     @ApiModelProperty(value = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
+   // @ExcelColumn(name="澶囨敞")
     private String remark;
 
     @ApiModelProperty(value = "鏄电О")
-    @ExcelColumn(name="鏄电О")
+    @ExcelColumn(name="鏄电О",width = 10,index = 2)
     private String nickname;
 
     @ApiModelProperty(value = "澶村儚")
-    @ExcelColumn(name="澶村儚")
+   // @ExcelColumn(name="澶村儚")
     private String imgurl;
 
     @ApiModelProperty(value = "鐪熷疄濮撳悕")
-    @ExcelColumn(name="鐪熷疄濮撳悕")
+    @ExcelColumn(name="瀹㈡埛濮撳悕",width = 10,index = 3)
     private String name;
 
     @ApiModelProperty(value = "鎵嬫満鍙�")
-    @ExcelColumn(name="鎵嬫満鍙�")
+    @ExcelColumn(name="鎺堟潈鎵嬫満鍙�",width = 10,index = 4)
     private String phone;
 
     @ApiModelProperty(value = "韬唤璇佸彿")
-    @ExcelColumn(name="韬唤璇佸彿")
+   // @ExcelColumn(name="韬唤璇佸彿")
     private String idcard;
 
     @ApiModelProperty(value = "韬唤璇佹闈㈢収")
-    @ExcelColumn(name="韬唤璇佹闈㈢収")
+   // @ExcelColumn(name="韬唤璇佹闈㈢収")
     private String idcardImg;
 
     @ApiModelProperty(value = "韬唤璇佸弽闈㈢収")
-    @ExcelColumn(name="韬唤璇佸弽闈㈢収")
+   // @ExcelColumn(name="韬唤璇佸弽闈㈢収")
     private String idcardImgBack;
 
     @ApiModelProperty(value = "绉垎浣欓", example = "1")
-    @ExcelColumn(name="绉垎浣欓")
+    @ExcelColumn(name="绉垎浣欓",width = 10,index = 5)
     private BigDecimal integral;
 
     @ApiModelProperty(value = "绉垎绱", example = "1")
-    @ExcelColumn(name="绉垎绱")
+    @ExcelColumn(name="绉垎绱鑾峰緱",width = 10,index = 6)
     private BigDecimal totalIntegral;
 
     @ApiModelProperty(value = "鐘舵��0姝e父 1寮傚父", example = "1")
-    @ExcelColumn(name="鐘舵��0姝e父 1寮傚父")
+    @ExcelColumn(name="鐘舵��",width = 10,index =9,valueMapping = "0=鍚敤;1=绂佺敤")
     private Integer status;
 
     @ApiModelProperty(value = "鎬у埆 0鐢� 1濂� 2鏈煡", example = "1")
-    @ExcelColumn(name="鎬у埆 0鐢� 1濂� 2鏈煡")
+   // @ExcelColumn(name="鎬у埆 0鐢� 1濂� 2鏈煡")
     private Integer sex;
 
     @ApiModelProperty(value = "瀹氫綅缁忓害", example = "1")
-    @ExcelColumn(name="瀹氫綅缁忓害")
+   // @ExcelColumn(name="瀹氫綅缁忓害")
     private BigDecimal longitude;
 
     @ApiModelProperty(value = "瀹氫綅缁村害", example = "1")
-    @ExcelColumn(name="瀹氫綅缁村害")
+   // @ExcelColumn(name="瀹氫綅缁村害")
     private BigDecimal latitude;
 
     @ApiModelProperty(value = "褰撳墠鎵�鍦ㄥ煄甯傜紪鐮侊紙鍏宠仈areas琛級", example = "1")
-    @ExcelColumn(name="褰撳墠鎵�鍦ㄥ煄甯傜紪鐮侊紙鍏宠仈areas琛級")
+   // @ExcelColumn(name="褰撳墠鎵�鍦ㄥ煄甯傜紪鐮侊紙鍏宠仈areas琛級")
     private Integer cityId;
 
     @ApiModelProperty(value = "鍦板潃")
-    @ExcelColumn(name="鍦板潃")
+   // @ExcelColumn(name="鍦板潃")
     private String addr;
 
     @ApiModelProperty(value = "绫诲瀷 0鏅�氱敤鎴�", example = "1")
-    @ExcelColumn(name="绫诲瀷 0鏅�氱敤鎴�")
+   // @ExcelColumn(name="绫诲瀷 0鏅�氱敤鎴�")
     private Integer type;
 
     @ApiModelProperty(value = "涓�鍙ヨ瘽浠嬬粛")
-    @ExcelColumn(name="涓�鍙ヨ瘽浠嬬粛")
+   // @ExcelColumn(name="涓�鍙ヨ瘽浠嬬粛")
     private String info;
 
     @ApiModelProperty(value = "鏁版嵁鏉ユ簮 0灏忕▼搴忔敞鍐� 1鍚庡彴褰曞叆", example = "1")
-    @ExcelColumn(name="鏁版嵁鏉ユ簮 0灏忕▼搴忔敞鍐� 1鍚庡彴褰曞叆")
+   // @ExcelColumn(name="鏁版嵁鏉ユ簮 0灏忕▼搴忔敞鍐� 1鍚庡彴褰曞叆")
     private Integer origin;
 
     @ApiModelProperty(value = "閭�璇蜂汉缂栫爜锛堝叧鑱攎ember琛級", example = "1")
-    @ExcelColumn(name="閭�璇蜂汉缂栫爜锛堝叧鑱攎ember琛級")
+   // @ExcelColumn(name="閭�璇蜂汉缂栫爜锛堝叧鑱攎ember琛級")
     private Integer recId;
 
     @ApiModelProperty(value = "閭�璇峰鍔卞挅璞�", example = "1")
-    @ExcelColumn(name="閭�璇峰鍔卞挅璞�")
+   // @ExcelColumn(name="閭�璇峰鍔卞挅璞�")
     private BigDecimal recIntegral;
 
     @ApiModelProperty(value = "娉ㄥ唽濂栧姳鍜栬眴", example = "1")
-    @ExcelColumn(name="娉ㄥ唽濂栧姳鍜栬眴")
+   // @ExcelColumn(name="娉ㄥ唽濂栧姳鍜栬眴")
     private BigDecimal registerIntegral;
 
     @ApiModelProperty(value = "寰俊openId")
-    @ExcelColumn(name="寰俊openId")
+    @ExcelColumn(name="寰俊openId",width = 10,index = 1)
     private String openId;
 
     @ApiModelProperty(value = "鐢熸棩")
-    @ExcelColumn(name="birthday")
+   // @ExcelColumn(name="birthday")
     private Date birthday;
 
     @ApiModelProperty(value = "寰俊鍒嗕韩鐮�")
-    @ExcelColumn(name="sharingCode")
+   // @ExcelColumn(name="sharingCode")
     private String sharingCode;
 
     @ApiModelProperty(value = "缁戝畾鍟嗛摵涓婚敭 shop:id 鍒嗛攢浜�")
@@ -159,8 +158,10 @@
     @ApiModelProperty(value = "鐢ㄦ埛鎵�鍦ㄥ煄甯�")
     @TableField(exist = false)
     private String cityName;
-
-
+    @ApiModelProperty(value = "缁忛攢鍟嗗悕绉�")
+    @TableField(exist = false)
+    @ExcelColumn(name = "鍏宠仈缁忛攢鍟�",width = 10,index = 7)
+    private String shopName;
     @ApiModelProperty(value = "寮�濮嬫椂闂� ")
     @TableField(exist = false)
     private Date starttime;
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
index 0530b95..ee9dd3f 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -265,6 +265,9 @@
     @ApiModelProperty(value = "浼樻儬鍒革細浼樻儬鍒搁鍙栨�绘暟")
     @TableField(exist = false)
     private BigDecimal  couponDrawCount;
+    @ApiModelProperty(value = "鍟嗗搧缂栫爜")
+    @TableField(exist = false)
+    private Integer  goodsId;
 
     @ApiModelProperty(value = "浼樻儬鍒革細浼樻儬鍒镐娇鐢ㄦ�绘暟(寮�)")
     @TableField(exist = false)
@@ -273,6 +276,9 @@
     @ApiModelProperty(value = "浼樻儬鍒革細浼樻儬鍒镐娇鐢ㄩ噾棰�(鍏�)")
     @TableField(exist = false)
     private BigDecimal  couponUserMoney;
+    @ApiModelProperty(value = "鏌愬晢鍝佷緵璐т环(鍏�)")
+    @TableField(exist = false)
+    private BigDecimal  goodsPrice;
 
 
     @ApiModelProperty(value = "搴楅摵鏍囩")
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/ShopGoodsRelation.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/ShopGoodsRelation.java
index 593640d..a513aa9 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/ShopGoodsRelation.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/ShopGoodsRelation.java
@@ -55,6 +55,9 @@
     @ApiModelProperty(value = "鍟嗘埛涓婚敭锛坰hop涓婚敭锛�", example = "1")
     @ExcelColumn(name="鍟嗘埛涓婚敭锛坰hop涓婚敭锛�")
     private Integer shopId;
+    @ApiModelProperty(value = "鍟嗗搧缂栫爜锛坓oods涓婚敭锛�", example = "1")
+    @ExcelColumn(name="鍟嗗搧缂栫爜锛坓oods涓婚敭锛�")
+    private Integer goodsId;
 
     @ApiModelProperty(value = "鍟嗗搧SKU ID锛坓oods_sku涓婚敭锛�", example = "1")
     @ExcelColumn(name="鍟嗗搧SKU ID锛坓oods_sku涓婚敭锛�")
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/UserAction.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/UserAction.java
new file mode 100644
index 0000000..5eecd04
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/UserAction.java
@@ -0,0 +1,97 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浜哄憳淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("浜哄憳淇℃伅琛�")
+@TableName("`user_action`")
+public class UserAction  {
+
+        @TableId(type = IdType.AUTO)
+        @ApiModelProperty(value = "涓婚敭", example = "1")
+        @ExcelColumn(name="涓婚敭")
+        private Integer id;
+
+        @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+        @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+        private Integer creator;
+
+        @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+        @ExcelColumn(name="鍒涘缓鏃堕棿")
+        private Date createDate;
+
+        @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+        @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+        private Integer editor;
+
+        @ApiModelProperty(value = "鏇存柊鏃堕棿")
+        @ExcelColumn(name="鏇存柊鏃堕棿")
+        private Date editDate;
+
+        @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+        @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+        private Integer isdeleted;
+
+        @ApiModelProperty(value = "澶囨敞")
+        @ExcelColumn(name="澶囨敞")
+        private String remark;
+        @ApiModelProperty(value = "淇敼璇︾粏鍐呭")
+        @ExcelColumn(name="淇敼璇︾粏鍐呭")
+        private String content;
+
+        @ApiModelProperty(value = "鏇存敼鍓嶅唴瀹�", example = "1")
+        private String beforeInfo;
+
+        @ApiModelProperty(value = "鏇存敼鍚庡唴瀹�", example = "1")
+        private String afterInfo;
+
+        @ApiModelProperty(value = "绫诲瀷 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎浜哄憳 10鏇存柊浜哄憳", example = "1")
+        @ExcelColumn(name="绫诲瀷 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎浜哄憳 10鏇存柊浜哄憳")
+        private Integer type;
+
+        @ApiModelProperty(value = "浜哄憳鎿嶄綔璁板綍鏃ュ織")
+        @ExcelColumn(name="浜哄憳鎿嶄綔璁板綍鏃ュ織")
+        private String memberId;
+
+        @ApiModelProperty(value = "鎿嶄綔鍓嶇姸鎬� 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎", example = "1")
+        @ExcelColumn(name="鎿嶄綔鍓嶇姸鎬� 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎")
+        private Integer beforeStatus;
+
+        @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
+        @TableField(exist = false)
+        private String createName;
+
+        @ApiModelProperty(value = "浜哄憳绫诲瀷锛�0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳", example = "1")
+        @TableField(exist = false)
+        private String memberType;
+
+        @ApiModelProperty(value = "鎿嶄綔瀵硅薄", example = "1")
+        @TableField(exist = false)
+        private String memberName;
+
+        @ApiModelProperty(value = "绫诲瀷鍚嶇О", example = "1")
+        @TableField(exist = false)
+        private String typeName;
+
+        @ApiModelProperty(value = "鎵嬫満鍙�", example = "1")
+        @TableField(exist = false)
+        private String mobile;
+        @ApiModelProperty(value = "鏌ヨ瀵硅薄绫诲瀷  0浜哄憳鎿嶄綔 1鍏朵粬涓氬姟鎿嶄綔", example = "1")
+        @TableField(exist = false)
+        private Integer objType;
+
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
index 74b10eb..cb33f25 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -3,6 +3,7 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Areas;
+import com.doumee.dao.business.model.Integral;
 import com.doumee.dao.business.model.Member;
 import com.doumee.dao.system.dto.MemberRechargeDTO;
 import com.doumee.dao.web.dto.MemberOwnDTO;
@@ -193,4 +194,8 @@
      * @return
      */
     Integer changeMemberRechargeBatch(MemberRechargeDTO memberRechargeDTO);
+
+    void updateShop(Member member);
+
+    void updateIntegral(Integral param);
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java
index d2e7d19..a1414f0 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/ShopService.java
@@ -160,4 +160,6 @@
     ShopDataStatisticsDTO getShopDataStatisticsDTO(Integer shopId);
 
     void resetPwd(Shop dto);
+
+    String setGoodsPrice(Shop shop);
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/UserActionService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/UserActionService.java
new file mode 100644
index 0000000..df101c2
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/UserActionService.java
@@ -0,0 +1,98 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.UserAction;
+
+import java.util.List;
+
+/**
+ * 浜哄憳鎿嶄綔璁板綍鏃ュ織Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/12/14 13:57
+ */
+public interface UserActionService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param userAction 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(UserAction userAction);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param userAction 瀹炰綋瀵硅薄
+     */
+    void delete(UserAction userAction);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param userAction 瀹炰綋瀵硅薄
+     */
+    void updateById(UserAction userAction);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param userActions 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<UserAction> userActions);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return UserAction
+     */
+   UserAction findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param userAction 瀹炰綋瀵硅薄
+     * @return UserAction
+     */
+   UserAction findOne(UserAction userAction);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param userAction 瀹炰綋瀵硅薄
+     * @return List<UserAction>
+     */
+    List<UserAction> findList(UserAction userAction);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<UserAction>
+     */
+    PageData<UserAction> findPage(PageWrap<UserAction> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param userAction 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(UserAction userAction);
+}
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
index 741055a..2d8af53 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -89,6 +89,8 @@
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private ShopMapper shopMapper;
 
     @Autowired
     private GoodsSkuAttrJoinMapper goodsSkuAttrJoinMapper;
@@ -214,8 +216,9 @@
                     || goods.getDeductRata() == null
                     || goods.getPrice() == null
                     || goods.getSkuPrice() == null
-                    || StringUtils.isBlank(goods.getImgurl())
-                    || org.apache.commons.collections.CollectionUtils.isEmpty(goods.getFileList())) {
+//                    || StringUtils.isBlank(goods.getImgurl())
+//                    || org.apache.commons.collections.CollectionUtils.isEmpty(goods.getFileList())
+            ) {
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), ResponseStatus.BAD_REQUEST.getMessage());
             }
 
@@ -730,6 +733,7 @@
         queryWrapper.leftJoin(Labels.class,Labels::getId,Goods::getParentCategoryId);
         //搴撳瓨閲�
         queryWrapper.select("(select sum(STOCK) from goods_sku where ISDELETED=0 and GOODS_ID=t.id) as stockNum ");
+        queryWrapper.select("(select count(id) from shop_goods_relation s where s.ISDELETED=0 and s.GOODS_ID=t.id) as pricedShopNum ");
         //瀹為檯閿�閲�
         queryWrapper.select("(select sum(gd.GOODS_NUM) from  goodsorder_detail gd" +
                 "        inner join  goods_sku gs on gs.id=gd.GOODS_SKU_ID" +
@@ -781,9 +785,12 @@
         if (list == null || list.size() == 0) {
             return;
         }
+       long shopNum = shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
+                .eq(Shop::getIsdeleted,Constants.ZERO));
         String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                 + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_FILE).getCode();
         for (Goods goods : list) {
+            goods.setShopNum(shopNum);
             goods.setResourcePath(path);
             //鏌ヨsku
             MPJLambdaWrapper<GoodsSku> queryWrapper = new MPJLambdaWrapper<GoodsSku>()
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
index bd8aeb3..16cf274 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -339,6 +339,7 @@
 
         String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode();
         for (Integral model : result.getRecords()) {
+            model.setStrObjType(Constants.IntegralObjType.getName(model.getObjType()));
             if (StringUtils.isNotBlank(model.getImgurl())) {
                 model.setImgurl(path + model.getImgurl());
             }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 1dfd46f..017cbe5 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -19,13 +19,9 @@
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.core.wx.WxMiniConfig;
-import com.doumee.dao.business.MemberMapper;
-import com.doumee.dao.business.SmsrecordMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.join.MemberJoinMapper;
-import com.doumee.dao.business.model.Areas;
-import com.doumee.dao.business.model.Goodsorder;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.business.model.Smsrecord;
+import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.SystemUserMapper;
 import com.doumee.dao.system.dto.MemberRechargeDTO;
 import com.doumee.dao.web.dto.MemberOwnDTO;
@@ -67,7 +63,7 @@
 import java.util.stream.Collectors;
 
 /**
- * 鐢ㄦ埛淇℃伅琛⊿ervice瀹炵幇
+ * 瀹㈡埛淇℃伅琛⊿ervice瀹炵幇
  * @author 姹熻箘韫�
  * @date 2023/03/21 15:48
  */
@@ -77,6 +73,12 @@
 
     @Autowired
     private MemberMapper memberMapper;
+    @Autowired
+    private IntegralMapper integralMapper;
+    @Autowired
+    private ShopMapper shopMapper;
+    @Autowired
+    private UserActionMapper userActionMapper;
 
     @Autowired
     private SmsrecordMapper smsrecordMapper;
@@ -136,6 +138,109 @@
         member.setEditor(user.getId());
         memberMapper.updateById(member);
     }
+    @Override
+    @Transactional
+    public void updateShop(Member member) {
+        if(member.getBindShopId()==null || member.getId()==null){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        MPJLambdaWrapper<Member> queryWrapper =new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Member.class);
+        queryWrapper.selectAs(Shop::getName,Member::getShopName);
+        queryWrapper.leftJoin(Shop.class, Shop::getId,Member::getBindShopId);
+        queryWrapper.eq(Member::getId,member.getId());
+        Member model = memberMapper.selectJoinOne(Member.class,queryWrapper);
+        if(model == null ||Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀹㈡埛淇℃伅鏌ヨ鏃犳晥锛�");
+        }
+        if(model.getBindShopId() == null){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀹㈡埛灏氭湭缁戝畾缁忛攢鍟嗕俊鎭紝鏃犳硶鏇存崲锛�");
+        }
+        if(Constants.equalsInteger(model.getBindShopId() ,member.getBindShopId())){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"璇烽�夋嫨鏂扮殑缁忛攢鍟嗭紒");
+        }
+
+        Shop shop = shopMapper.selectById(member.getBindShopId());
+        if(shop == null ||Constants.equalsObject(shop.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"缁忛攢鍟嗕俊鎭煡璇㈡棤鏁堬紒");
+        }
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        Date date = new Date();
+        memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+                .eq(Member::getId,member.getId())
+                .set(Member::getEditDate,date)
+                .set(Member::getEditor,user.getId())
+                .set(Member::getBindShopId,member.getBindShopId())
+        );
+        //鏇存崲鏃ュ織璁板綍
+        UserActionServiceImpl.saveUserActionBiz(user,member.getId(),
+                Constants.UserActionType.CHANGE_SHOP,
+                userActionMapper,
+                date,
+                new String[]{user.getUsername(),DateUtil.getPlusTime2(date)},
+                JSONObject.toJSONString(member) ,
+                model.getShopName(), shop.getName());
+    }
+    @Override
+    @Transactional
+    public void updateIntegral(Integral param) {
+        if(param.getMemberId()==null || param.getType()==null
+                || param.getType()<0
+                || param.getType()>2
+                || Constants.formatBigdecimal(param.getNum()).compareTo(new BigDecimal(0))<=0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+
+        MPJLambdaWrapper<Member> queryWrapper =new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Member.class);
+        queryWrapper.selectAs(Shop::getName,Member::getShopName);
+        queryWrapper.leftJoin(Shop.class, Shop::getId,Member::getBindShopId);
+        queryWrapper.eq(Member::getId,param.getMemberId());
+        Member model = memberMapper.selectJoinOne(Member.class,queryWrapper);
+        if(model == null ||Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀹㈡埛淇℃伅鏌ヨ鏃犳晥锛�");
+        }
+
+        BigDecimal num = param.getNum();
+        if(param.getType() == 1 &&Constants.formatBigdecimal(model.getIntegral()).compareTo(param.getNum())<0){
+            //濡傛灉鏄噺灏戯紝鍒ゆ柇鐢ㄦ埛浣欓鏄惁婊¤冻
+            num = num.multiply(new BigDecimal(-1));//鍑忓皯
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢ㄦ埛璐︽埛浣欓涓嶈冻锛�");
+        }
+
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        Date date = new Date();
+        //璐︽埛浣欓
+        memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+                .eq(Member::getId,model.getId())
+                .set(Member::getEditDate,date)
+                .set(Member::getEditor,user.getId())
+                .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//绱澧炲姞
+                .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
+                .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
+
+        Constants.IntegralObjType integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
+
+        Integral integral = new Integral();
+        integral.setMemberId(model.getId());
+        integral.setCreateDate(new Date());
+        integral.setCreator(user.getId());
+        integral.setIsdeleted(Constants.ZERO);
+        integral.setTitle(integralObjType.getName());
+        integral.setContent(integralObjType.getNoteinfo());
+        integral.setObjId(model.getId());
+        integral.setObjType(integralObjType.getKey());
+        integral.setType(param.getType());
+        integral.setRemark(param.getRemark());
+        integral.setNum(param.getNum());
+        integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(integral.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(integral.getNum()));
+        integral.setOrderCode(null);
+        integral.setUserType(Constants.ZERO);
+        integralMapper.insert(integral);
+
+    }
 
     @Override
     public void updateByIdInBatch(List<Member> members) {
@@ -179,13 +284,15 @@
         MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
         queryWrapper.selectAll(Member.class);
+        queryWrapper.selectAs(Shop::getName,Member::getShopName);
+        queryWrapper.leftJoin(Shop.class, Shop::getId,Member::getBindShopId);
         queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNickname()),ms->ms.like(Member::getNickname,pageWrap.getModel().getNickname())
                  .or().like(Member::getName,pageWrap.getModel().getNickname())
                 .or().like(Member::getPhone,pageWrap.getModel().getNickname())
         );
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getShopName()),Shop::getStatus,pageWrap.getModel().getShopName());
         queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Member::getStatus,pageWrap.getModel().getStatus());
         queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
-
         queryWrapper.ge(pageWrap.getModel().getStarttime()!=null, Member::getCreateDate,pageWrap.getModel().getStarttime());
         queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Member::getCreateDate, pageWrap.getModel().getEndtime());
 
@@ -245,7 +352,7 @@
             if (member == null) {
                 member = new Member();
                 member.setImgurl("20230410/4010b821-2137-4e6d-86e4-5ab9c06184a4.png");
-                member.setNickname("寰俊鐢ㄦ埛"+ CodeVerifyUtils.createVerificationCode(4));
+                member.setNickname("寰俊瀹㈡埛"+ CodeVerifyUtils.createVerificationCode(4));
                 member.setCreateDate(new Date());
                 member.setIsdeleted(Constants.ZERO);
                 member.setType(Constants.ZERO);
@@ -373,7 +480,7 @@
 
         Integer mId = Optional.ofNullable(userInfo)
                 .map(s -> s.getMemberId())
-                .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛ID缂哄け"));
+                .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀹㈡埛ID缂哄け"));
         Member member = new Member();
         member.setId(mId);
         member.setEditor(userInfo.getId());
@@ -505,7 +612,7 @@
             if(phoneNums.size() != members.size()){
                 List<String> collect = members.stream().map(s -> s.getPhone()).collect(Collectors.toList());
                 List<String> unFindMember = phoneNums.stream().filter(s -> !collect.contains(s)).collect(Collectors.toList());
-                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),unFindMember.toString()+"涓嶅瓨鍦ㄨ鎵嬫満鍙风爜鐢ㄦ埛");
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),unFindMember.toString()+"涓嶅瓨鍦ㄨ鎵嬫満鍙风爜瀹㈡埛");
             }
             Map<String, MemberRechargeDTO> collect = dataList.stream().collect(Collectors.toMap(s -> s.getPhone(), s -> s));
             members.forEach(s->{
@@ -550,7 +657,7 @@
 
         Member member = memberMapper.selectById(memberRechargeDTO.getMemberId());
 
-        //濡傛灉鎵i櫎閲戦澶т簬鐢ㄦ埛鎷ラ噾棰� 鍙栫敤鎴峰墿浣欓噾棰�
+        //濡傛灉鎵i櫎閲戦澶т簬瀹㈡埛鎷ラ噾棰� 鍙栧鎴峰墿浣欓噾棰�
         BigDecimal integralNum = new BigDecimal(memberRechargeDTO.getNum());
         if (Constants.equalsInteger(memberRechargeDTO.getIntegralType(),Constants.ONE)
         && (member.getIntegral().compareTo(integralNum) == -1)
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
index bf94f58..28eff80 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -10,10 +10,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.LabelsMapper;
-import com.doumee.dao.business.MemberMapper;
-import com.doumee.dao.business.ShopJoinMapper;
-import com.doumee.dao.business.ShopMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.join.ProductLabelJoinMapper;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.business.model.Labels;
@@ -61,6 +58,12 @@
 
     @Autowired
     private ShopMapper shopMapper;
+    @Autowired
+    private GoodsMapper goodsMapper;
+    @Autowired
+    private GoodsSkuMapper goodsSkuMapper;
+    @Autowired
+    private ShopGoodsRelationMapper shopGoodsRelationMapper;
 
     @Autowired
     private ShopCommentService shopCommentService;
@@ -330,6 +333,7 @@
 
     @Override
     public List<Shop> findList(Shop shop) {
+        shop.setIsdeleted(Constants.ZERO);
         QueryWrapper<Shop> wrapper = new QueryWrapper<>(shop);
         return shopMapper.selectList(wrapper);
     }
@@ -341,6 +345,10 @@
         Utils.MP.blankToNull(pageWrap.getModel());
 
         queryWrapper.selectAll(Shop.class);
+        if(pageWrap.getModel().getGoodsId()!=null){
+            //鏌ヨ鏌愬晢鍝佺殑渚涜揣浠�
+            queryWrapper.select("(select s.price from shop_goods_relation s where s.ISDELETED=0 and s.shop_id = t.id and s.GOODS_ID="+pageWrap.getModel().getGoodsId()+") as goodsPrice ");
+        }
         queryWrapper.selectAs(Labels::getName,Shop::getBigAreaName);
         queryWrapper.selectAs(Member::getNickname,Shop::getNickName);
         queryWrapper.selectAs(Member::getImgurl,Shop::getMemberImgurl);
@@ -356,7 +364,10 @@
         queryWrapper.eq(pageWrap.getModel().getSaleType()!=null, Shop::getSaleType, pageWrap.getModel().getSaleType());
         queryWrapper.eq(pageWrap.getModel().getStatus()!=null, Shop::getStatus, pageWrap.getModel().getStatus());
         queryWrapper.eq(pageWrap.getModel().getIsrec()!=null, Shop::getIsrec, pageWrap.getModel().getIsrec());
-        queryWrapper.orderByDesc(Shop::getCreateDate);
+        if(pageWrap.getModel().getGoodsId()!=null){
+            queryWrapper.orderByAsc("goodsPrice");
+        }
+        queryWrapper.orderByDesc(Shop::getId);
         IPage<Shop> result = shopJoinMapper.selectJoinPage(page, Shop.class, queryWrapper);
         String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                 + systemDictDataBiz.queryByCode(Constants.OSS, Constants.SHOP_FILE).getCode();
@@ -585,4 +596,44 @@
         updateUserDto.setPassword(Utils.Secure.encryptPassword( shop.getCode()+"@123456", shop.getSalt()));
         shopMapper.updateById(updateUserDto);
     }
+    @Override
+    @Transactional
+    public  String setGoodsPrice(Shop dto){
+        // 鏌ヨ鐢ㄦ埛
+        Shop shop = shopMapper.selectById(dto.getId());
+        if (shop == null) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝渚涢攢鍟嗕俊鎭煡璇㈡棤鏁堬紒");
+        }
+        GoodsSku queryGoodsSku=new GoodsSku();
+        queryGoodsSku.setGoodsId(dto.getGoodsId());
+        queryGoodsSku.setIsdeleted(Constants.ZERO);
+        List<GoodsSku> goodsSkuList=goodsSkuMapper.selectList(new QueryWrapper<>(queryGoodsSku));
+        if(goodsSkuList==null || goodsSkuList.size() ==0){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝璇风‘璁ゅ晢鍝佷俊鎭湁鏁堜笖銆愰攢鍞环銆戝凡璁剧疆锛�");
+        }
+        //榛樿sku淇℃伅
+        GoodsSku goodsSku = goodsSkuList.get(0);
+        if(Constants.formatBigdecimal(goodsSku.getPrice()).compareTo(Constants.formatBigdecimal(dto.getGoodsPrice())) >=0){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝渚涜揣浠蜂笉鍏佽澶т簬鍟嗗搧閿�鍞环锛�");
+        }
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        //鍏堝垹闄ゅ師鏉ョ殑鏁版嵁
+        shopGoodsRelationMapper.delete(new QueryWrapper<ShopGoodsRelation>().lambda()
+                .eq(ShopGoodsRelation::getGoodsId,dto.getGoodsId())
+                .eq(ShopGoodsRelation::getShopId,shop.getId())
+         );
+        ShopGoodsRelation add =new ShopGoodsRelation();
+        add.setCreator(user.getId());
+        add.setCreateDate(new Date());
+        add.setIsdeleted(Constants.ZERO);
+        add.setEditor(add.getCreator());
+        add.setEditDate(add.getCreateDate());
+        add.setShopId(dto.getId());
+        add.setGoodsId(dto.getGoodsId());
+        add.setGoodsSkuId(goodsSku.getId());
+        add.setPrice(dto.getGoodsPrice());
+        add.setStatus(Constants.ZERO);
+        shopGoodsRelationMapper.insert(add);
+        return "鎿嶄綔鎴愬姛";
+    }
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java
new file mode 100644
index 0000000..61d1d72
--- /dev/null
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java
@@ -0,0 +1,158 @@
+package com.doumee.service.business.impl;
+
+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.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.UserActionMapper;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.UserAction;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.UserActionService;
+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.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 浜哄憳鎿嶄綔璁板綍鏃ュ織Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/12/14 13:57
+ */
+@Service
+public class UserActionServiceImpl implements UserActionService {
+
+    @Autowired
+    private UserActionMapper userActionMapper;
+
+
+    @Override
+    public Integer create(UserAction userAction) {
+        userActionMapper.insert(userAction);
+        return userAction.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        userActionMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(UserAction userAction) {
+        UpdateWrapper<UserAction> deleteWrapper = new UpdateWrapper<>(userAction);
+        userActionMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        userActionMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(UserAction userAction) {
+        userActionMapper.updateById(userAction);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<UserAction> userActions) {
+        if (CollectionUtils.isEmpty(userActions)) {
+            return;
+        }
+        for (UserAction userAction: userActions) {
+            this.updateById(userAction);
+        }
+    }
+    public static void saveUserActionBiz(LoginUserInfo user,
+                                         Integer bizId,
+                                         Constants.UserActionType type,
+                                         UserActionMapper userActionMapper,
+                                         Date date,
+                                         String[] params,
+                                         String modelInfo,
+                                         String before,
+                                         String after) {
+        String info = type.getInfo();
+        if(params!=null){
+            for (int i = 0; i < params.length; i++) {
+                info = info.replace("${param"+(i+1)+"}",params[i]);
+            }
+        }
+       UserAction userAction=new UserAction();
+        userAction.setIsdeleted(Constants.ZERO);
+        userAction.setCreateDate(date);
+        userAction.setCreator(user.getId());
+        userAction.setBeforeStatus(Constants.ZERO);
+        userAction.setType(type.getKey());
+        userAction.setContent(modelInfo);
+        userAction.setRemark(info);
+        userAction.setBeforeInfo(before);
+        userAction.setAfterInfo(after);
+        userAction.setMemberId(bizId+"");
+        userActionMapper.insert(userAction);
+    }
+    @Override
+    public UserAction findById(Integer id) {
+        return userActionMapper.selectById(id);
+    }
+
+    @Override
+    public UserAction findOne(UserAction userAction) {
+        QueryWrapper<UserAction> wrapper = new QueryWrapper<>(userAction);
+        return userActionMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<UserAction> findList(UserAction userAction) {
+        QueryWrapper<UserAction> wrapper = new QueryWrapper<>(userAction);
+        return userActionMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<UserAction> findPage(PageWrap<UserAction> pageWrap) {
+        IPage<UserAction> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<UserAction> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+       UserAction queryModel =  pageWrap.getModel();
+        queryWrapper.selectAll(UserAction.class)
+                .leftJoin(Member.class,Member::getId,UserAction::getMemberId)
+                .leftJoin(SystemUser.class,SystemUser::getId,UserAction::getCreator)
+                .selectAs(SystemUser::getRealname,UserAction::getCreateName)
+                .selectAs(Member::getName,UserAction::getMemberName)
+                .selectAs(Member::getPhone,UserAction::getMobile)
+                .like(StringUtils.isNotBlank(queryModel.getCreateName()),SystemUser::getRealname,queryModel.getCreateName())
+                .like(StringUtils.isNotBlank(queryModel.getMemberName()),Member::getName,queryModel.getMemberName())
+                .like(StringUtils.isNotBlank(queryModel.getMobile()),Member::getPhone,queryModel.getMobile())
+                .like(StringUtils.isNotBlank(queryModel.getRemark()),Member::getPhone,queryModel.getRemark())
+                .eq(!Objects.isNull(queryModel.getMemberType()),Member::getType,queryModel.getMemberType())
+                .eq(!Objects.isNull(queryModel.getBeforeStatus()),UserAction::getBeforeStatus,queryModel.getBeforeStatus())
+                .eq(!Objects.isNull(queryModel.getType()),UserAction::getType,queryModel.getType())
+                .orderByDesc(UserAction::getCreateDate)
+        ;
+        IPage<UserAction> result =  userActionMapper.selectJoinPage(page,UserAction.class,queryWrapper);
+        if(result!=null &&result.getRecords()!=null){
+            for(UserAction model :result.getRecords()){
+                model.setTypeName(Constants.UserActionType.getName(model.getType()));
+            }
+        }
+        return PageData.from(result);
+    }
+
+    @Override
+    public long count(UserAction userAction) {
+        QueryWrapper<UserAction> wrapper = new QueryWrapper<>(userAction);
+        return userActionMapper.selectCount(wrapper);
+    }
+}

--
Gitblit v1.9.3