From 59460e9ffd1b58bc6d5dfd2007d43d0bffca282f Mon Sep 17 00:00:00 2001
From: mrsun <1078706823@qq.com>
Date: Mon, 5 Feb 2024 16:30:26 +0800
Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E5=8A=9F=E8=83=BD=E4=BF=AE?=
 =?UTF-8?q?=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/product/productAttr.js                |  12 +
 .../components/OilStationSelection.vue        | 230 +++++++++++++++---
 src/views/product/productAdd/index.vue        |  10 +-
 src/views/product/productAdd/newIndex.vue     |  28 ++-
 4 files changed, 234 insertions(+), 46 deletions(-)

diff --git a/src/api/product/productAttr.js b/src/api/product/productAttr.js
index de06fe7..e63d756 100644
--- a/src/api/product/productAttr.js
+++ b/src/api/product/productAttr.js
@@ -75,6 +75,18 @@ export default {
       data
     })
   },
+  getChannels() {
+    return request({
+      url: `/${service_name}/mallProductSiteRelation/getAllChannels`,
+      method: 'get',
+    })
+  },
+  getCheckedSites(productId) {
+    return request({
+      url: `/${service_name}/mallProductSiteRelation/getCheckedSites/${productId}`,
+      method: 'get',
+    })
+  },
   brandGetAll(data) {
     return request({
       url: `/${service_name}/mallProductBrands/getAll`,
diff --git a/src/views/product/productAdd/components/OilStationSelection.vue b/src/views/product/productAdd/components/OilStationSelection.vue
index 293a434..bfff141 100644
--- a/src/views/product/productAdd/components/OilStationSelection.vue
+++ b/src/views/product/productAdd/components/OilStationSelection.vue
@@ -1,30 +1,94 @@
 <template>
-  <div>
+  <div class="station-select">
     <el-form ref="artFrom" :model="page" label-width="80px" label-position="right" class="tabform"
              @submit.native.prevent inline>
       <el-form-item label="输入搜索">
         <el-input clearable v-model="page.params.siteName" placeholder="请输入油站名称"
                   class="form_content_width"></el-input>
       </el-form-item>
+      <el-form-item label="油站渠道">
+        <el-select v-model="page.params.channel" clearable style="width:100%">
+          <el-option
+            v-for="(item,index) in channelList"
+            :key="index"
+            :label="item"
+            :value="item"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="省市区">
+        <el-cascader
+          v-model="page.params.addrCodes"
+          placeholder="请选择省市区"
+          style="width: 100%"
+          :options="areaTree"
+          :props="{checkStrictly: true,value:'id', label:'areaName', children:'childList'}"
+          filterable
+          clearable
+        />
+      </el-form-item>
+      <el-form-item label="油站品牌">
+        <el-select v-model="page.params.siteBrand" clearable style="width:100%">
+          <el-option label="中国石油" :value="1" />
+          <el-option label="中国石化" :value="2" />
+          <el-option label="壳牌" :value="3" />
+          <el-option label="民营" :value="4" />
+          <el-option label="中海油" :value="5" />
+          <el-option label="京博" :value="6" />
+          <el-option label="中化石油" :value="7" />
+          <el-option label="山东高速" :value="9" />
+          <el-option label="其他" :value="8" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="油站账户" prop="siteChannelAccountId">
+        <el-select v-model="page.params.siteChannelAccountId" remote filterable clearable placeholder="请选择油站账户" style="width: 100%">
+          <el-option v-for="item in restaurants" :key="item.id" :label="item.value + '-' + item.id" :value="item.id">
+            {{ item.value }}-<span style="color: #bbbbbb">{{ item.id }}</span>
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="userSearchs">查询</el-button>
-        <el-button type="primary" @click="submit">确定选择</el-button>
       </el-form-item>
     </el-form>
-    <el-table max-height="500" @selection-change="selectionChange" v-loading="loading" ref="table" :data="tableList"
-              :row-key="(row) => row.siteId" highlight-current-row empty-text="暂无数据" class="mt14">
-      <el-table-column type="selection" reserve-selection width="55">
-      </el-table-column>
-      <el-table-column label="油站名称" prop="siteName"></el-table-column>
-      <el-table-column label="渠道" prop="channel"></el-table-column>
-    </el-table>
-    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
-                   :current-page="page.currentPage" :page-sizes="[10, 15, 20, 30]" :page-size="page.pageSize"
-                   layout="total, sizes, prev, pager, next, jumper" :total="page.totalCount" />
+    <el-row :gutter="24" class="table-area">
+      <el-col  :span="11">
+        <h3>待选择</h3>
+        <el-table :height="tableHeight" v-loading="loading" ref="table" :data="tableList"
+                  :row-key="(row) => row.siteId" highlight-current-row empty-text="暂无数据" class="mt14">
+          <el-table-column type="selection" reserve-selection width="55">
+          </el-table-column>
+          <el-table-column label="油站名称" prop="siteName" width="200"></el-table-column>
+          <el-table-column align="center"  label="渠道" prop="channel" width="120"></el-table-column>
+          <el-table-column header-align="center" label="地址" prop="address"></el-table-column>
+        </el-table>
+        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                       :current-page="page.currentPage" :page-sizes="[10, 15, 20, 30]" :page-size="page.pageSize"
+                       layout="total, sizes, prev, pager, next, jumper" :total="page.totalCount" />
+      </el-col>
+      <el-col  :span="2" class="transfer-button">
+        <el-button type="primary" @click="delSite" class="el-icon-back"></el-button>
+        <el-button type="primary" @click="addSite" class="el-icon-right"></el-button>
+      </el-col>
+      <el-col  :span="11">
+        <h3>已选择</h3>
+        <el-table :height="tableHeight" v-loading="checkedLoading" ref="checkedTable" :data="checkedSites"
+                  :row-key="(row) => row.siteId" highlight-current-row empty-text="暂无数据" class="mt14">
+          <el-table-column type="selection" reserve-selection width="55">
+          </el-table-column>
+          <el-table-column label="油站名称" prop="siteName" width="200"></el-table-column>
+          <el-table-column align="center"  label="渠道" prop="channel" width="120"></el-table-column>
+          <el-table-column header-align="center" label="地址" prop="address"></el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
+    <el-button type="primary" @click="submit" class="fr">确定</el-button>
   </div>
 </template>
 <script>
 import productApi from '@/api/product/productAttr.js'
+import dictAreaApi from '@/api/base/areaCode.js'
+import financeApi from '@/api/user/oilTerminalMarket.js'
 
 export default {
   name: 'OilStationSelection',
@@ -36,50 +100,87 @@ export default {
     selectAttrId: {
       type: String,
       default: () => ''
-    }
+    },
+    productId: {
+      type: String,
+      default: () => null
+    },
   },
   data() {
     return {
-      selectionList: [],
+      tableHeight: document.documentElement.clientHeight - 550,
+      // selectionList: [],
       loading: false,
+      checkedLoading: false,
       tableList: [],
+      areaTree: [],
+      restaurants: [],
       page: {
         'currentPage': 1,
         'pageSize': 10,
         'totalCount': 0,
         'params': {
-          'siteName': ''
+          addrCodes:[]
         }
-      }
-    }
-  },
-  watch: {
-    OilStationSelectionList: {
-      handler(n, o) {
-        this.$refs.table.clearSelection()
-        n.forEach(element => {
-          this.$refs.table.toggleRowSelection(element)
-        })
       },
-      deep: true
+      channelList:[],
+      checkedSites:[],
     }
   },
+  // watch: {
+  //   OilStationSelectionList: {
+  //     handler(n, o) {
+  //       this.$refs.table.clearSelection()
+  //       n.forEach(element => {
+  //         this.$refs.table.toggleRowSelection(element)
+  //       })
+  //     },
+  //     deep: true
+  //   }
+  // },
   created() {
     this.init()
+    this.getAreaData()
+    this.getChannlList()
+    this.getAccountNames()
+    this.getCheckedSites()
   },
   methods: {
     submit() {
       this.$emit('submit', this.getSelectionList())
     },
     getSelectionList() {
-      return this.selectionList
-    },
-    selectionChange(e) {
-      this.selectionList = e
+      return this.checkedSites
     },
     userSearchs() {
       this.getByPage()
     },
+    addSite(){
+      console.log(this.$refs.table.selection)
+      let arr = [...this.$refs.table.selection]
+      let arrSiteName = []
+      arr.forEach(v=>{
+        if (this.checkedSites.some(f=>f.siteId===v.siteId)){
+          arrSiteName.unshift(v.siteName)
+        }else {
+          this.checkedSites.push(v)
+        }
+      })
+      if (arrSiteName&&arrSiteName.length>0){
+        this.$message.warning('部分站点出现重复,已自动为您过滤:【'+arrSiteName.join('、')+'】')
+      }
+      this.$refs.table.clearSelection()
+    },
+    delSite(){
+      console.log(this.$refs.checkedTable.selection)
+      // 获取当前选中的行
+      const selectedRows = this.$refs.checkedTable.selection;
+      // 使用filter方法创建一个新数组,不包含已删除的元素
+      this.checkedSites = this.checkedSites.filter(site => {
+        return !selectedRows.some(row => row.siteId === site.siteId);
+      });
+      this.$refs.checkedTable.clearSelection()
+    },
     isStrictPromise(value) {
       return !!value
         && typeof value === 'object'
@@ -95,7 +196,30 @@ export default {
       }
 
     },
+    getAreaData(){
+      dictAreaApi.getTree().then(res => {
+        this.areaTree = res.data
+      })
+    },
     getByPage() {
+      if (this.page.params.addrCodes&&this.page.params.addrCodes.length>0){
+        this.page.params.provinceCode = this.page.params.addrCodes[0]
+        if (this.page.params.addrCodes.length>1){
+          this.page.params.areaCode = this.page.params.addrCodes[1]
+          if (this.page.params.addrCodes.length>2){
+            this.page.params.cityCode = this.page.params.addrCodes[2]
+          }else {
+            this.page.params.cityCode = null
+          }
+        }else {
+          this.page.params.areaCode = null
+          this.page.params.cityCode = null
+        }
+      }else {
+        this.page.params.provinceCode = null
+        this.page.params.areaCode = null
+        this.page.params.cityCode = null
+      }
       this.loadingFn(productApi.getAllSites(this.page).then(res => {
         if (res.code === 20000) {
           this.tableList = res.data.list
@@ -115,6 +239,15 @@ export default {
       this.page.pageSize = val
       this.getByPage()
     },
+    // 获取账户名称键值对
+    getAccountNames() {
+      financeApi.getChannelAccountMaps().then(res => {
+        if (res.code === 20000) {
+          const arr = [...res.data]
+          this.restaurants = arr.filter(f => f.accountState === '1')
+        }
+      })
+    },
     del(e) {
       productApi.delete(e).then(res => {
         if (res.code == 20000) {
@@ -123,6 +256,27 @@ export default {
         }
       })
     },
+    getChannlList(){
+      productApi.getChannels().then(res=>{
+        if (res.code === 20000) {
+         this.channelList = res.data
+        }
+      })
+    },
+    getCheckedSites(){
+      if (this.productId){
+        this.checkedLoading = true
+        productApi.getCheckedSites(this.productId).then(res=>{
+          if (res.code === 20000) {
+            let checkedData = res.data
+            this.checkedSites = checkedData.filter(f => {
+              return this.OilStationSelectionList.find(i => i.siteId === f.siteId);
+            });
+          }
+          this.checkedLoading = false
+        })
+      }
+    },
     edit(row) {
       let data = Object.assign({}, row, {
         name: this.selectAttrId.split('/')[1] || '',
@@ -148,4 +302,18 @@ export default {
 }
 </script>
 
-<style></style>
+<style lang="less" scoped>
+.station-select{
+  height: calc(100vh - 300px);
+  .table-area{
+    .transfer-button{
+      display: grid;
+      align-items: center;
+      grid-template-columns: auto auto;
+      button{
+        width: 50px;
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/product/productAdd/index.vue b/src/views/product/productAdd/index.vue
index e764d53..2032d07 100644
--- a/src/views/product/productAdd/index.vue
+++ b/src/views/product/productAdd/index.vue
@@ -36,7 +36,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="商品分类:" prop="cate_id"> 
+            <el-form-item label="商品分类:" prop="cate_id">
               <el-cascader
                 class="content_width"
                 v-model="formValidate.cate_id"
@@ -52,7 +52,7 @@
             <el-form-item label="商品名称:" prop="store_name">
               <el-input class="content_width" v-model.trim="formValidate.store_name" placeholder="请输入商品名称" />
             </el-form-item>
-          </el-col> 
+          </el-col>
           <el-col :span="24">
             <el-form-item label="单位:" prop="unit_name">
               <el-input class="content_width" v-model="formValidate.unit_name" placeholder="请输入单位" />
@@ -1166,7 +1166,7 @@
                 <div
                   class="color-item"
                   :class="activity[color]"
-                  v-for="color in formValidate.activity" 
+                  v-for="color in formValidate.activity"
                   :key="color"
                 >
                   {{ color }}
@@ -3052,7 +3052,7 @@ export default {
 }
 
 .box-video-style {
-  width: 375px; 
+  width: 375px;
   height: 211px;
   border-radius: 10px;
   background-color: #707070;
@@ -3276,7 +3276,7 @@ export default {
 .ifam {
   width: 344px;
   height: 644px;
- 
+
   background-size: 344px 644px;
   padding: 40px 20px;
   padding-top: 50px;
diff --git a/src/views/product/productAdd/newIndex.vue b/src/views/product/productAdd/newIndex.vue
index 3bf9a2b..d447d37 100644
--- a/src/views/product/productAdd/newIndex.vue
+++ b/src/views/product/productAdd/newIndex.vue
@@ -77,7 +77,7 @@
           </el-col> -->
           <el-col v-bind="grid2">
             <el-form-item label="自提油站" prop="siteIds">
-              <el-tag 
+              <el-tag
                 style="margin-left: 10px;"
                 :key="tagIndex"
                 v-for="(tag, tagIndex) in OilStationSelectionList"
@@ -216,6 +216,7 @@
                       :disabled="isDisabled"
                       maxlength="9"
                       min="0.01"
+                      required
                       v-model="scope.row[item.value]"
                       class="priceBox"
                       @blur="keyupEvent(iii, scope.row[item.value], scope.$index, 3)"
@@ -326,8 +327,8 @@
       </el-form>
     </el-card>
     <CreatTemplates ref="addTemplates" @getList="getShippingList" />
-    <el-dialog title="选择油站" :visible.sync="isOilStationSelection">
-      <OilStationSelection :OilStationSelectionList="OilStationSelectionList" @submit="oilStationSelectionSubmit"> </OilStationSelection>
+    <el-dialog width="80%" title="选择油站" :visible.sync="isOilStationSelection">
+      <OilStationSelection :product-id="this.$route.query.id" ref="selectSites" :OilStationSelectionList="OilStationSelectionList" @submit="oilStationSelectionSubmit"> </OilStationSelection>
     </el-dialog>
   </div>
 </template>
@@ -575,7 +576,7 @@ export default {
         this.$destroy();
     },
   methods: {
-    async chenkId() { 
+    async chenkId() {
       if (this.$route.query && this.$route.query.id) {
         await this.getproductInfo(this.$route.query.id)
       }
@@ -619,17 +620,17 @@ export default {
             } else {
               return null
             }
-          }).filter(item => item); 
+          }).filter(item => item);
         setTimeout(() => {
           this.ManyAttrValue.forEach((item, index) => {
             let data = this.formValidate.stockList.find(i => i.attributeJson == JSON.stringify(item.data));
             if (data) {
               Object.assign(item, data,{delect:false})
-            }else{  
-              Object.assign(item, data,{delect:true}) 
+            }else{
+              Object.assign(item, data,{delect:true})
             }
           })
-          this.ManyAttrValue = this.ManyAttrValue.filter(item=>!item.delect) 
+          this.ManyAttrValue = this.ManyAttrValue.filter(item=>!item.delect)
         }, 1000)
       })
     },
@@ -645,6 +646,9 @@ export default {
     },
     delectOilStationSelectionList(e, index) {
       this.OilStationSelectionList.splice(index, 1)
+      if (this.$refs.selectSites&&this.$refs.selectSites.checkedSites){
+        this.$refs.selectSites.checkedSites =  this.$refs.selectSites.checkedSites.filter(site => e.siteId !== site.siteId);
+      }
     },
     oilStationSelectionSubmit(e) {
       this.OilStationSelectionList = e
@@ -1181,6 +1185,10 @@ export default {
     },
     handleSubmitNest(name) {
       console.log(this.formValidate,"handleSubmitNest")
+      if (this.formValidate.attr<1){
+        this.$message.error('规格属性不能为空')
+        return
+      }
       this.$refs[name].validate(valid => {
         if (valid) {
           if (this.currentTab++ > 2) this.currentTab = 0
@@ -1235,7 +1243,7 @@ export default {
           skuNum,
           id
         }
-      }) 
+      })
       this.formValidate[isRecommendOrNewMark] = '1'
       loadingFn.call(
         this,
@@ -1253,7 +1261,7 @@ export default {
           if (res.code == 20000) {
             this.$message.success('操作成功')
             setTimeout(() => {
-              this.$router.push({ path: 'productList' })
+              this.$router.push({ path: 'productList', query: { refresh: true }})
               // this.$destroy()
             }, 1000)
           }
-- 
2.36.2