From 437d7c45481176d4766152cae26cf841a8bd458f Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 21 一月 2026 14:57:56 +0800
Subject: [PATCH] 经销商管理

---
 admin/src/views/business/shop.vue                                                          |   19 +
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java               |    6 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java  |   14 
 admin/src/views/business/platformGoods.vue                                                 |   35 +--
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java |  120 ++++++++++---
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Shop.java                |    6 
 admin/src/components/business/OperaGoodsShopWindow.vue                                     |  292 ++++++++++++++++++++++++++++++++
 7 files changed, 428 insertions(+), 64 deletions(-)

diff --git a/admin/src/components/business/OperaGoodsShopWindow.vue b/admin/src/components/business/OperaGoodsShopWindow.vue
new file mode 100644
index 0000000..a050866
--- /dev/null
+++ b/admin/src/components/business/OperaGoodsShopWindow.vue
@@ -0,0 +1,292 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="100%"
+      :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;width: 180px">
+          <el-input v-model="searchForm.name" placeholder="鍟嗗搧鍚嶇О" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="" prop="id" style="display: inline-block;margin-right: 30px;;width: 180px">
+          <el-input v-model="searchForm.id" placeholder="鍟嗗搧ID" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="" prop="categoryId" style="display: inline-block;margin-right: 30px;">
+          <!-- 0姝e父 1绂佺敤 -->
+          <el-select
+              v-model="searchForm.categoryId"
+              style="width: 120px"
+              placeholder="鎵�灞炲垎绫�"
+              clearable
+              @change="search"
+          >
+            <el-option
+                v-for="item in labels"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="" prop="brandId" style="display: inline-block;margin-right: 30px;">
+          <!-- 0姝e父 1绂佺敤 -->
+          <el-select
+              v-model="searchForm.brandId"
+              style="width: 120px"
+              placeholder="鎵�灞炲搧鐗�"
+              clearable
+              @change="search"
+          >
+            <el-option
+                v-for="item in brands"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></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"
+              style="width: 120px"
+              @change="search"
+              clearable
+              placeholder="涓婁笅鏋剁姸鎬�"
+          >
+            <el-option :key="0" :value="0" label="涓婃灦"></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>
+<!--        <ul class="toolbar" >
+          <li><el-button type="primary" icon="el-icon-plus" @click="setPriceBatch"  >鎵归噺瀹氫环</el-button></li>
+        </ul>-->
+        <div :style="'display: flex;height:'+tabelHeight+'px;'">
+        <el-table
+            :height="tabelHeight"
+            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="imgurl" label="鍟嗗搧淇℃伅" min-width="80px">
+            <template slot-scope="{row}">
+              <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="120px" ></el-table-column>
+          <el-table-column prop="name" label="鍟嗗搧鍚嶇О" min-width="180px" show-overflow-tooltip></el-table-column>
+          <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="stockNum" label="鍓╀綑搴撳瓨閲�" min-width="100px"></el-table-column>
+          <el-table-column prop="status" label="涓婁笅鏋剁姸鎬�" min-width="100px"   align="center">
+            <template slot-scope="{row}">
+              <span  v-if="row.status ==1" class="red">宸蹭笅鏋�</span>
+              <span v-else class="green">宸蹭笂鏋�</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="price" label="灞曠ず浠锋牸" min-width="100px" align="center"></el-table-column>
+          <el-table-column prop="skuPrice" label="閿�鍞环(鍏�)"  fixed="right" min-width="100px" align="center">
+            <template slot-scope="{row}">
+              <span  class="orange">{{ row.skuPrice }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="shopPrice" label="渚涜揣浠�(鍏�)" align="center" min-width="100px" fixed="right">
+            <template slot-scope="scope">
+              <el-input v-if="scope.row.isPriceSelected" v-model="scope.row.shopPrice"
+                        @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.shopPrice || '鏈缃�' }}</p>
+            </template>
+          </el-table-column>
+<!--          <el-table-column
+              label="鎿嶄綔"
+              min-width="160"
+              fixed="right"
+          >
+            <template slot-scope="{row}">
+              <el-button type="text" v-permissions="['business:goods:update']" @click="setPrice(row)">璁剧疆浠锋牸</el-button>
+            </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'
+import { findAll as labelList } from '@/api/business/labels'
+import { setGoodsPrice } from '@/api/business/shop'
+export default {
+  name: 'OperaShopGoodsWindow',
+  extends: BaseTable,
+  components: { GlobalWindow, TableLayout, Pagination },
+  data () {
+    return {
+      title: '',
+      price: null,
+      visible: false,
+      tabelHeight: null,
+      // 鎼滅储
+      searchForm: {
+        id: '',
+        name: '',
+        shopId: null,
+        categoryId: '',
+        brandId: '',
+        // 绫诲瀷 0骞冲彴鍟嗗煄 1鍜栬眴鍟嗗煄 2鍜栧暋璁″垝鍟嗗搧
+        type: '0', // 骞冲彴鍟嗗搧
+        status: '',
+        labels: ''
+      },
+      labels: [],
+      brands: []
+    }
+  },
+  mounted () {
+    window.addEventListener('resize', this.handleResize)
+  },
+  beforeDestroy () {
+    window.removeEventListener('resize', this.handleResize)
+  },
+  created: function () {
+    this.config({
+      module: '鍟嗗搧淇℃伅琛�',
+      api: '/business/goods',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.handleResize()
+    labelList({
+      type: 0 // 鍟嗗搧鍒嗙被
+    }).then(res => {
+      this.labels = res
+    })
+    labelList({
+      type: 1 // 鍟嗗搧鍝佺墝
+    })
+      .then(res => {
+        this.brands = res
+      })
+  },
+  directives: {
+    focus: {
+      inserted: function (el) {
+        el.querySelector('input').focus()
+      }
+    }
+  },
+  methods: {
+    setPrice (row) {
+      if (row.skuPrice == null) {
+        this.$tip.warning('璇峰厛璁剧疆鍟嗗搧閿�鍞环锛�')
+        return
+      }
+      console.log(row)
+    },
+    setPriceBatch () {
+    },
+    handleResize () {
+      this.tabelHeight = window.innerHeight - 400
+    },
+    open (title, info) {
+      this.title = title
+      this.visible = true
+      this.searchForm.shopId = info.id
+      this.search()
+      this.handleResize()
+    },
+    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.oldShopsPrice = row.shopPrice
+    },
+    blurEvent (row, curIndex, column) {
+      if ( !this.skuPrice || this.skuPrice <= row.shopPrice) {
+        this.$tip.error('渚涜揣浠蜂笉鑳戒綆浜庨攢鍞环')
+        row.isPriceSelected = !row.isPriceSelected
+        row.shopPrice = row.oldShopsPrice// 浠锋牸杩樺師
+        return
+      }
+      if (row.shopPrice == row.oldShopsPrice) {
+        row.isPriceSelected = !row.isPriceSelected
+        return
+      }
+      setGoodsPrice({
+        id: this.searchForm.shopId,
+        goodsId: row.id,
+        goodsPrice: row.shopPrice
+      }).then(res => {
+        row.oldShopsPrice = row.shopPrice
+        this.$tip.success('淇敼鎴愬姛')
+        this.$emit('success')
+      }).catch(e => {
+        row.shopPrice = row.oldShopsPrice// 浠锋牸杩樺師
+      }).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/platformGoods.vue b/admin/src/views/business/platformGoods.vue
index 6739063..b4d7273 100644
--- a/admin/src/views/business/platformGoods.vue
+++ b/admin/src/views/business/platformGoods.vue
@@ -2,11 +2,6 @@
   <TableLayout :permissions="['business:goods:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-<!--      <el-tabs v-model="activeName" @tab-click="handleClick">
-        <el-tab-pane label="鍏ㄩ儴鍟嗗搧" name="first"></el-tab-pane>
-        <el-tab-pane label="宸插敭缃勫晢鍝�" name="second"></el-tab-pane>
-        <el-tab-pane label="鍥炴敹绔欏晢鍝�" name="third"></el-tab-pane>
-      </el-tabs>-->
       <el-form-item label="鍟嗗搧鍚嶇О" prop="name">
         <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ晢鍝佸悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
@@ -49,6 +44,8 @@
         <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>
@@ -61,10 +58,11 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:goods:create', 'business:goods:delete']">
+      <ul class="toolbar" >
         <li><el-button type="primary" icon="el-icon-plus" @click="$refs.operaGoodsWindow.open('鏂板缓鍟嗗搧', null, 0)" v-permissions="['business:goods:create']">鏂板缓</el-button></li>
         <li><el-button type="primary"  icon="el-icon-edit"  @click="issued(0)">涓婃灦</el-button></li>
         <li><el-button type="danger"  icon="el-icon-edit"  @click="issued(1)">涓嬫灦</el-button></li>
+        <li><p class="tip-warn" style="width: 100%;margin-left: 20px;"><i class="el-icon-warning"></i>鎻愮ず锛氥�愪緵璐т环璁剧疆銆戝彧缁熻鍚敤鐘舵�佺殑渚涢攢鍟嗚缃暟鎹�</p></li>
       </ul>
       <el-table
         v-loading="isWorking.search"
@@ -87,7 +85,7 @@
         <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.pricedShopNum||0}}</span> / <span class="green"> {{row.shopNum||0}}</span>  </div>
+            <div title="閽堝鍚敤渚涢攢鍟嗕环鏍艰缃粺璁�" @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>
@@ -107,12 +105,12 @@
         </el-table-column>
         <el-table-column
           label="鎿嶄綔"
-          min-width="250"
+          min-width="160"
           fixed="right"
         >
           <template slot-scope="{row}">
              <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" v-permissions="['business:goods:update']" @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>-->
           </template>
@@ -152,32 +150,17 @@
       // 鎼滅储
       searchForm: {
         id: '',
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        remark: '',
-        imgurl: '',
         name: '',
-        info: '',
         categoryId: '',
         brandId: '',
-        price: '',
-        salenum: '',
-        content: '',
-        sortnum: '',
-        looknum: '',
         // 绫诲瀷 0骞冲彴鍟嗗煄 1鍜栬眴鍟嗗煄 2鍜栧暋璁″垝鍟嗗搧
         type: '0', // 骞冲彴鍟嗗搧
         status: '',
-        isrec: '',
-        styleImg: '',
         labels: ''
       },
       labels: [],
-      serials: [],
-      brands: []
+      brands: [],
+      serials: []
     }
   },
   provide () {
diff --git a/admin/src/views/business/shop.vue b/admin/src/views/business/shop.vue
index 301effe..1f91fc3 100644
--- a/admin/src/views/business/shop.vue
+++ b/admin/src/views/business/shop.vue
@@ -29,9 +29,10 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:shop:create', 'business:shop:delete']">
+      <ul class="toolbar" >
         <li><el-button type="primary" @click="$refs.operaShopWindow.open('鏂板缓缁忛攢鍟�')" icon="el-icon-plus" v-permissions="['business:shop:create']">鏂板缓</el-button></li>
         <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:shop:delete']">鍒犻櫎</el-button></li> -->
+        <li><p class="tip-warn" style="width: 100%;margin-left: 20px;"><i class="el-icon-warning"></i>鎻愮ず锛氥�愪緵璐т环璁剧疆銆戝彧缁熻涓婃灦鐘舵�佺殑鍟嗗搧浠锋牸璁剧疆鏁版嵁</p></li>
       </ul>
       <el-table
         v-loading="isWorking.search"
@@ -77,6 +78,11 @@
             {{ row.saleType == 1?'鑷富閲囪喘':'骞冲彴閾鸿揣'}}
           </template>
         </el-table-column>
+        <el-table-column prop="shopPrice" label="渚涜揣浠疯缃�" min-width="100px" align="center">
+          <template slot-scope="{row}" >
+            <div title="閽堝涓婃灦鍟嗗搧浠锋牸璁剧疆缁熻" @click="goPriceSet(row)" style="cursor:pointer;"><span  class="red"> {{row.pricedGoodsNum||0}}</span> / <span class="green"> {{row.goodsNum||0}}</span>  </div>
+          </template>
+        </el-table-column>
         <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" align="center" min-width="140px"></el-table-column>
         <el-table-column prop="status" label="鐘舵��" align="center" min-width="100px" fixed="right">
           <template slot-scope="{row}">
@@ -93,15 +99,15 @@
         <el-table-column
           v-if="containPermissions(['business:shop:update', 'business:shop:delete'])"
           label="鎿嶄綔"
-          min-width="200"
+          min-width="280"
           fixed="right"
           align="center"
         >
           <template slot-scope="{row}">
             <el-button type="text" @click="$refs.operaShopWindow.open('缂栬緫缁忛攢鍟�', row)" icon="el-icon-edit" v-permissions="['business:shop:update']">缂栬緫</el-button>
+            <el-button type="text" v-permissions="['business:shop:update']" icon="el-icon-edit" @click="goPriceSet(row)">渚涜揣浠�</el-button>
             <el-button type="text" @click="resetPwd(row)" icon="el-icon-edit"  v-permissions="['business:shop:update']">閲嶇疆瀵嗙爜</el-button>
             <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:shop:delete']">鍒犻櫎</el-button>
-
           </template>
         </el-table-column>
       </el-table>
@@ -116,6 +122,7 @@
     <OperaShopWindow ref="operaShopWindow" @success="handlePageChange"/>
     <OperaShopInfoWindow ref="OperaShopInfoWindow" />
     <ResetPwdShopWindow ref="resetPwdWindow"/>
+    <OperaGoodsShopWindow ref="OperaGoodsShopWindow" @success="handlePageChange"/>
   </TableLayout>
 </template>
 
@@ -125,12 +132,13 @@
 import Pagination from '@/components/common/Pagination'
 import OperaShopWindow from '@/components/business/OperaShopWindow'
 import OperaShopInfoWindow from '@/components/business/OperaShopInfoWindow'
+import OperaGoodsShopWindow from '@/components/business/OperaGoodsShopWindow'
 import { resetPwd, updateIsRecById } from '@/api/business/shop'
 import ResetPwdShopWindow from '@/components/business/ResetPwdShopWindow'
 export default {
   name: 'Shop',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaShopWindow, OperaShopInfoWindow, ResetPwdShopWindow },
+  components: { TableLayout, Pagination, OperaShopWindow, OperaShopInfoWindow, ResetPwdShopWindow,OperaGoodsShopWindow },
   data () {
     return {
 
@@ -154,6 +162,9 @@
     this.search()
   },
   methods: {
+    goPriceSet(row){
+      this.$refs.OperaGoodsShopWindow.open('璁剧疆渚涜揣浠� - '+row.name, row )
+    },
     resetPwd (row) {
       this.$dialog.messageWaring('纭閲嶇疆璇ョ粡閿�鍟嗐��' + row.name + '銆戠殑鐧诲綍瀵嗙爜鍚楋紵')
         .then(() => {
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 ef29758..1335c8a 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
@@ -209,5 +209,11 @@
     @TableField(exist = false)
     private Long pricedShopNum;
 
+    @ApiModelProperty(value = "shopId" )
+    @TableField(exist = false)
+    private Integer shopId;
+    @ApiModelProperty(value = "鍟嗗渚涜揣浠�" )
+    @TableField(exist = false)
+    private BigDecimal shopPrice;
 
 }
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 91eaecf..3b14490 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
@@ -271,6 +271,12 @@
     @ApiModelProperty(value = "鍟嗗搧缂栫爜")
     @TableField(exist = false)
     private Integer  goodsId;
+    @ApiModelProperty(value = "宸茶缃环鏍间骇鍝佹暟閲�")
+    @TableField(exist = false)
+    private Long  pricedGoodsNum;
+    @ApiModelProperty(value = "鍟嗗搧鎬婚噺")
+    @TableField(exist = false)
+    private Long  goodsNum;
 
     @ApiModelProperty(value = "浼樻儬鍒革細浼樻儬鍒镐娇鐢ㄦ�绘暟(寮�)")
     @TableField(exist = false)
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 f275e49..43968bc 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
@@ -29,6 +29,7 @@
 import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.bouncycastle.jcajce.provider.asymmetric.GOST;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -56,6 +57,8 @@
 
     @Autowired
     private GoodsMapper goodsMapper;
+    @Autowired
+    private ShopGoodsRelationMapper shopGoodsRelationMapper;
 
 
 
@@ -311,6 +314,8 @@
         goods.setEditor(user.getId());
         goods.setId(id);
         goodsMapper.updateById(goods);
+        //鍒犻櫎渚涜揣浠�
+        shopGoodsRelationMapper.delete(new UpdateWrapper<ShopGoodsRelation>().lambda().eq(ShopGoodsRelation::getGoodsId,id));
     }
 
     @Override
@@ -329,29 +334,79 @@
 
     @Override
     public void updateStatusById(List<Goods> list) {
-        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
-
-
-
-        for(Goods model:list){
-            if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)){
-                MPJLambdaWrapper<Goods> queryWrapper = new MPJLambdaWrapper<>();
-                queryWrapper.selectAll(Goods.class);
-                queryWrapper.innerJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId);
-                queryWrapper.eq(GoodsSku::getIsdeleted,Constants.ZERO);
-                queryWrapper.eq(Goods::getId,model.getId());
-                List<Goods> query= goodsAdminJoinMapper.selectJoinList(Goods.class,queryWrapper);
-                if(query==null||query.size()<=0){
-                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), model.getName()+":鍟嗗搧鏈厤缃甋KU锛屾棤娉曚笂鏋�");
-                }
-            }
-            Goods update=new Goods();
-            update.setEditor(user.getId());
-            update.setEditDate(new Date());
-            update.setStatus(model.getStatus());
-            update.setId(model.getId());
-            goodsMapper.updateById(model);
+        if(list == null || list.size()==0){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
         }
+        List<Integer> idList = new ArrayList<>();
+        for(Goods model:list){
+            idList.add(model.getId() );
+        }
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        if(Constants.formatIntegerNum(list.get(0).getStatus()) == Constants.ONE){
+            //濡傛灉鏄壒閲忎笅鏋�
+            goodsMapper.update(null,new UpdateWrapper<Goods>().lambda()
+                    .set(Goods::getEditDate,new Date() )
+                    .set(Goods::getEditor,user.getId())
+                    .set(Goods::getStatus,Constants.ONE )
+                    .in(Goods::getId,idList));
+            return;
+        }
+        long shopNum   = shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
+                .eq(Shop::getIsdeleted,Constants.ZERO)
+                .eq(Shop::getStatus,Constants.ZERO));
+        MPJLambdaWrapper<Goods> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Goods.class);
+        queryWrapper.select("(select count(s.id) from shop_goods_relation s  " +
+                "left join shop g on s.SHOP_ID =g.id " +
+                "where g.status=0 and s.ISDELETED=0 and s.GOODS_ID=t.id) as pricedShopNum ");
+        queryWrapper.eq(GoodsSku::getIsdeleted,Constants.ZERO);
+        queryWrapper.in(Goods::getId,idList);
+        List<Goods> goodsList= goodsAdminJoinMapper.selectJoinList(Goods.class,queryWrapper);
+        if(goodsList==null || goodsList.size() == 0){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鍟嗗搧淇℃伅鏌ヨ鏃犳晥 ");
+        }
+        //鏌ヨ鍏ㄩ儴sku淇℃伅
+        List<GoodsSku> goodsSkuList=goodsSkuMapper.selectList(new QueryWrapper<GoodsSku>().lambda()
+                        .eq(GoodsSku::getIsdeleted,Constants.ZERO)
+                        .in(GoodsSku::getGoodsId,idList) );
+        if(goodsSkuList==null || goodsSkuList.size() == 0){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鍟嗗搧灏氭湭璁剧疆闆跺敭浠凤紝璇峰厛璁剧疆浠锋牸锛� ");
+        }
+        for(Goods param: list){
+            Goods goods = getGoodsFromListById(param.getId(),goodsList,goodsSkuList);
+            if(goods ==null ){
+                continue;
+            }
+            //濡傛灉鏄笂鏋�
+            goods.setGoodsSkuList(goodsSkuList);
+            if(goods.getSkuPrice() == null || goods.getSkuPrice().compareTo(new BigDecimal(0)) <=0){
+                //榛樿sku淇℃伅
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), goods.getName()+":鍟嗗搧鍟嗗搧灏氭湭璁剧疆闆跺敭浠凤紝鏃犳硶涓婃灦");
+            }
+            if(Constants.formatLongNum(goods.getPricedShopNum()) <= shopNum){
+                //榛樿sku淇℃伅
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), goods.getName()+":鏈夋湭璁剧疆渚涜揣浠风殑缁忛攢鍟嗭紝鏃犳硶涓婃灦");
+            }
+        }
+        goodsMapper.update(null,new UpdateWrapper<Goods>().lambda()
+                .set(Goods::getEditDate,new Date() )
+                .set(Goods::getEditor,user.getId())
+                .set(Goods::getStatus,Constants.ZERO )
+                .in(Goods::getId,idList));
+    }
+
+    private Goods getGoodsFromListById(Integer id, List<Goods> goodsList, List<GoodsSku> skuList) {
+        for(Goods model: goodsList){
+            if(Constants.equalsObject(model.getIdList(),id)){
+                for(GoodsSku sku :skuList){
+                    if(Constants.equalsInteger(sku.getGoodsId(),id)){
+                        model.setSkuPrice(sku.getPrice());
+                    }
+                }
+                return  model;
+            }
+        }
+        return null;
     }
 
 
@@ -736,7 +791,11 @@
         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 ");
+        if(pageWrap.getModel().getShopId() !=null){
+            queryWrapper.select("(select  s.price from shop_goods_relation s  where s.ISDELETED=0 and s.GOODS_ID=t.id  and s.shop_id="+pageWrap.getModel().getShopId()+" limit 1) as shopPrice");//鍟嗗渚涜揣浠�
+        }else{
+            queryWrapper.select("(select count(s.id) from shop_goods_relation s  left join shop g on s.SHOP_ID =g.id where g.status=0 and 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" +
@@ -759,9 +818,12 @@
         queryWrapper.eq(pageWrap.getModel().getBrandId() != null, Goods::getBrandId, pageWrap.getModel().getBrandId());
         queryWrapper.eq(pageWrap.getModel().getStatus() != null, Goods::getStatus, pageWrap.getModel().getStatus());
         queryWrapper.in(pageWrap.getModel().getIdList() != null && pageWrap.getModel().getIdList().size()>0, Goods::getId, pageWrap.getModel().getIdList());
+        if(pageWrap.getModel().getShopId() !=null){
+            queryWrapper.orderByAsc("shopPrice");
+        }
         queryWrapper.orderByDesc(Goods::getId);
         IPage<Goods> result = goodsAdminJoinMapper.selectJoinPage(page, Goods.class, queryWrapper);
-        initResult(result.getRecords());
+        initResult(result.getRecords(),pageWrap.getModel().getShopId()==null);
         return PageData.from(result);
     }
 
@@ -784,12 +846,16 @@
 
 
 
-    private void initResult(List<Goods> list) {
+    private void initResult(List<Goods> list,boolean shopId) {
         if (list == null || list.size() == 0) {
             return;
         }
-       long shopNum = shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
-                .eq(Shop::getIsdeleted,Constants.ZERO));
+        long shopNum = 0;
+        if(shopId){//涓嶉拡瀵瑰晢瀹舵悳绱㈢殑璇濓紝
+            shopNum   = shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
+                    .eq(Shop::getIsdeleted,Constants.ZERO)
+                    .eq(Shop::getStatus,Constants.ZERO));
+        }
         String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                 + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_FILE).getCode();
         for (Goods goods : list) {
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 45362a4..0a5ea0a 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
@@ -206,6 +206,7 @@
         shop.setEditDate(new Date());
         shop.setIsdeleted(Constants.ONE);
         shopMapper.updateById(shop);
+        shopGoodsRelationMapper.delete(new UpdateWrapper<ShopGoodsRelation>().lambda().eq(ShopGoodsRelation::getShopId,id));
     }
 
     @Override
@@ -378,8 +379,9 @@
         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.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()+" limit 1) as goodsPrice ");
         }
+        queryWrapper.select("(select count(s.id) from shop_goods_relation s left join goods g on s.goods_id =g.id where g.status=0 and s.ISDELETED=0 and s.shop_id=t.id) as pricedGoodsNum ");
         queryWrapper.selectAs(Labels::getName,Shop::getBigAreaName);
         queryWrapper.selectAs(Member::getNickname,Shop::getNickName);
         queryWrapper.selectAs(Member::getImgurl,Shop::getMemberImgurl);
@@ -402,9 +404,13 @@
         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();
+        long goodsNum = goodsMapper.selectCount(new QueryWrapper<Goods>().lambda()
+                .eq(Goods::getIsdeleted,Constants.ZERO)
+                .eq(Goods::getStatus,Constants.ZERO));
         for(Shop model:result.getRecords()){
             model.setImgFullUrl(path);
             model.setAreas( AreasServiceImpl.getAddressByAreaId(model.getAreaId()));
+            model.setGoodsNum(goodsNum);
             if(model.getLatitude()!=null && model.getLongitude()!=null){
                 model.setLocationInfo(model.getLatitude().doubleValue()+","+model.getLongitude().doubleValue());
             }
@@ -876,12 +882,6 @@
         }
         return  saleReportResponse;
     }
-
-
-
-
-
-
 
     @Override
     @Transactional

--
Gitblit v1.9.3