20 次代码提交 e518878af1 ... ad541a5177

作者 SHA1 备注 提交日期
  xiebaomin ad541a5177 updated 1 年之前
  xiebaomin 755cc7c4a0 Merge branch 'developer' of http://git.caimei365.com/caimei365/caimei365-manager-ui into developerC 1 年之前
  xiebaomin bcbf0eed63 updated: 修改服务商地区选择 1 年之前
  xiebaomin 66bbe829e2 fixed:服务商入驻编辑 1 年之前
  zhengjinyi 37f7ddb160 数据报表 1 年之前
  zhengjinyi 0e39a57d65 报表 1 年之前
  zhengjinyi 87892f375e 数据报表 1 年之前
  zhengjinyi 7ae6849d15 Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi e596734611 本地提交 1 年之前
  zhengjinyi 7dd2f694a7 Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi 0bd942e878 数据报表 1 年之前
  zhengjinyi e8fc14844f Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi 14759f785a 数据报表 1 年之前
  zhengjinyi 228a830208 Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi 028937ddbd 优化 1 年之前
  zhengjinyi 82a4a222e7 Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi 95dea048e9 报表 1 年之前
  zhengjinyi 490264c13d Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi 80722764c6 Merge remote-tracking branch 'origin/developer' into developerA 1 年之前
  zhengjinyi 288492da6f 数据报表 1 年之前
共有 44 个文件被更改,包括 2180 次插入255 次删除
  1. 4 3
      .env.development
  2. 1 1
      .env.staging
  3. 二进制
      public/temp/供应商报表文件上传模板.zip
  4. 二进制
      public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图1.jpg
  5. 二进制
      public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图2.jpg
  6. 二进制
      public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图3.jpg
  7. 二进制
      public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图4.jpg
  8. 二进制
      public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图5.jpg
  9. 二进制
      public/temp/供应商报表文件上传模板/advert广告图片/信息中心-图1.jpg
  10. 二进制
      public/temp/供应商报表文件上传模板/advert广告图片/信息中心-图2.jpg
  11. 二进制
      public/temp/供应商报表文件上传模板/advert广告图片/首页-图1.jpg
  12. 二进制
      public/temp/供应商报表文件上传模板/advert广告图片/首页-图2.jpg
  13. 二进制
      public/temp/供应商报表文件上传模板/供应商数据报表模板.xlsx
  14. 49 0
      src/api/contentLibrary/context.js
  15. 25 0
      src/api/contentLibrary/store.js
  16. 135 0
      src/api/user/customer/customer.js
  17. 14 6
      src/components/Editor/index.vue
  18. 21 0
      src/router/modules/user.js
  19. 0 8
      src/styles/index.scss
  20. 186 0
      src/views/dataBase/components/UploadFile.vue
  21. 115 0
      src/views/dataBase/components/data-select.vue
  22. 2 1
      src/views/dataBase/components/dataManageTab.vue
  23. 30 18
      src/views/dataBase/components/dialogTable.vue
  24. 143 0
      src/views/dataBase/components/dialogTypeTable.vue
  25. 18 10
      src/views/dataBase/components/storeItem.vue
  26. 32 23
      src/views/dataBase/mixins/index.js
  27. 147 33
      src/views/dataBase/store-list/data-management/edit.vue
  28. 89 51
      src/views/dataBase/store-list/data-management/list.vue
  29. 101 27
      src/views/dataBase/store-list/edit.vue
  30. 33 21
      src/views/dataBase/store-list/index.vue
  31. 1 0
      src/views/library/tag/list.vue
  32. 0 3
      src/views/library/tag/tag-form.vue
  33. 6 12
      src/views/serviceSettlement/list/edit.vue
  34. 8 3
      src/views/user/customer/advertis-edit.vue
  35. 150 0
      src/views/user/customer/components/shop-market-dialog.vue
  36. 0 3
      src/views/user/customer/customer-ambition-edit.vue
  37. 0 3
      src/views/user/customer/customer-ambition-sum.vue
  38. 0 3
      src/views/user/customer/customer-popup-edit.vue
  39. 0 3
      src/views/user/customer/customer-remarks-add .vue
  40. 158 13
      src/views/user/customer/list.vue
  41. 212 0
      src/views/user/customer/market-edit.vue
  42. 293 0
      src/views/user/customer/market-list.vue
  43. 188 0
      src/views/user/customer/market-report-list.vue
  44. 19 10
      src/views/user/record/list.vue

+ 4 - 3
.env.development

@@ -5,12 +5,13 @@ ENV = 'development'
 # VUE_APP_BASE_API = 'http://192.168.2.67:18015'
 # VUE_APP_BASE_API = 'http://localhost:18015'
 # VUE_APP_BASE_API = 'http://192.168.2.102:18015'
-VUE_APP_BASE_API = 'https://mapi-b.caimei365.com'
+ VUE_APP_BASE_API = 'http://192.168.2.103:18015'
+#VUE_APP_BASE_API = 'https://mapi-b.caimei365.com'
 # 图片上传,索引更新等
 VUE_APP_CORE_API = 'https://core-b.caimei365.com'
 
 # 采美网站url
-VUE_APP_CAIMEI_URL = 'https://zzjtest.gz.aeert.com'
+VUE_APP_CAIMEI_URL = 'http://120.79.25.27:8009'
 
 # 采美旧后台
-VUE_APP_ADMIN_URL = 'https://admin-b.caimei365.com'
+VUE_APP_ADMIN_URL = 'https://admin-b.caimei365.com'

+ 1 - 1
.env.staging

@@ -9,7 +9,7 @@ VUE_APP_BASE_API = 'https://mapi-b.caimei365.com'
 VUE_APP_CORE_API = 'https://core-b.caimei365.com'
 
 # 采美网站url
-VUE_APP_CAIMEI_URL = 'https://www.caimei365.com'
+VUE_APP_CAIMEI_URL = 'http://120.79.25.27:8009'
 
 # 采美旧后台
 VUE_APP_ADMIN_URL = 'https://admin-b.caimei365.com'

二进制
public/temp/供应商报表文件上传模板.zip


二进制
public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图1.jpg


二进制
public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图2.jpg


二进制
public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图3.jpg


二进制
public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图4.jpg


二进制
public/temp/供应商报表文件上传模板/SEO汇总图片/seo-图5.jpg


二进制
public/temp/供应商报表文件上传模板/advert广告图片/信息中心-图1.jpg


二进制
public/temp/供应商报表文件上传模板/advert广告图片/信息中心-图2.jpg


二进制
public/temp/供应商报表文件上传模板/advert广告图片/首页-图1.jpg


二进制
public/temp/供应商报表文件上传模板/advert广告图片/首页-图2.jpg


二进制
public/temp/供应商报表文件上传模板/供应商数据报表模板.xlsx


+ 49 - 0
src/api/contentLibrary/context.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+export const getContextList = (params) => request({
+  url: '/productArchive/content/list',
+  method: 'GET',
+  params
+})
+
+export const getLabelKey = (params) => request({
+  url: process.env.VUE_APP_CORE_API + '/commodity/product/archive/findKeyWordList',
+  method: 'GET',
+  params
+})
+
+export const addContext = (data) => request({
+  url: '/productArchive/content/add',
+  method: 'POST',
+  data
+})
+
+export const getContextDetail = (params) => request({
+  url: '/productArchive/content/from',
+  method: 'GET',
+  params
+})
+
+export const uploadFile = (data) => request({
+  url: '/formData/oss/MultiPictareaddData',
+  method: 'POST',
+  headers: {
+    'Content-Type': 'multipart/form-data'
+  },
+  data
+})
+
+export const deleteContext = (data) => request({
+  url: '/productArchive/content/del',
+  method: 'POST',
+  headers: {
+    'Content-Type': 'multipart/form-data'
+  },
+  data
+})
+
+export const findKeyWordList = (params) => request({
+  url: '/home/findKeyWordList',
+  method: 'GET',
+  params
+})

+ 25 - 0
src/api/contentLibrary/store.js

@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+export const getStoreBaseList = (params) => request({
+  url: '/home/findProductList',
+  method: 'GET',
+  params
+})
+
+export const getStoreList = (params) => request({
+  url: '/productArchive/list',
+  method: 'GET',
+  params
+})
+
+export const getStoreDetail = (params) => request({
+  url: '/productArchive/from',
+  method: 'GET',
+  params
+})
+
+export const addStore = (data) => request({
+  url: '/productArchive/add',
+  method: 'POST',
+  data
+})

+ 135 - 0
src/api/user/customer/customer.js

@@ -423,3 +423,138 @@ export function saveInformation(data) {
     data: data
   })
 }
+/**
+ * 选择已上线供应商列表
+ * @param {*} shopName
+ * @param {*} pageNum,
+ * @param {*} pageSize
+ * @returns
+ */
+export function getMarketShopList(params) {
+  return request({
+    url: '/user/market/getShop',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 营销供应商列表
+ * @param {*} shopName
+ * @param {*} pageNum,
+ * @param {*} pageSize
+ * @returns
+ */
+export function getMarkShopList(params) {
+  return request({
+    url: '/user/market/getMarkShopList',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 保存数据报表供应商
+ * @param {*} shopIds
+ * @returns
+ */
+export function saveMarketShop(params) {
+  return request({
+    url: '/user/market/saveMarketShop',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 保存logo
+ * @param {*} id
+ * @param {*} logo
+ * @returns
+ */
+export function uploadShopLogo(params) {
+  return request({
+    url: '/user/market/uploadShopLogo	',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 数据报表列表
+ * @param {*} marketId
+ * @param {*} reportName
+ * @param {*} pageNum,
+ * @param {*} pageSize
+ * @returns
+ */
+export function getMarketReportList(params) {
+  return request({
+    url: '/user/market/getMarketReport',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 数据报表编辑回显
+ * @param {*} id
+ * @returns
+ */
+export function getMarketReportById(params) {
+  return request({
+    url: '/user/market/getMarketReportById',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 生成报表
+ * @param {*} id
+ * @returns
+ */
+export function updateVisible(params) {
+  return request({
+    url: '/user/market/updateVisible',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 删除报表
+ * @param {*} id
+ * @returns
+ */
+export function deleteMarketReport(params) {
+  return request({
+    url: '/user/market/deleteMarketReport',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 上传数据文件
+ * @param {*} reportDate 报表月份
+ * @param {*} reportName 报表名称
+ * @param {*} reportFile 文件
+ * @returns
+ */
+export function saveMarketReport(data) {
+  return request({
+    url: '/user/market/saveMarketReport',
+    method: 'post',
+    data,
+    headers: {
+      'Content-Type': 'multipart/form-data'
+    }
+  })
+}
+/**
+ * 保存报表
+ * @param {*} reportDate 报表月份
+ * @param {*} reportName 报表名称
+ * @param {*} filePath 文件
+ * @returns
+ */
+export function saveReport(params) {
+  return request({
+    url: '/user/market/saveReport',
+    method: 'get',
+    params
+  })
+}

+ 14 - 6
src/components/Editor/index.vue

@@ -29,10 +29,16 @@ import '/node_modules/@wangeditor/editor/dist/css/style.css'
 
 export default Vue.extend({
   components: { Editor, Toolbar },
+  props: {
+    value: {
+      type: String,
+      default: () => ''
+    }
+  },
   data() {
     return {
       editor: null,
-      html: '<p>hello</p>',
+      html: '',
       toolbarConfig: {},
       editorConfig: {
         MENU_CONF: {
@@ -56,11 +62,13 @@ export default Vue.extend({
       mode: 'simple' // or 'simple'
     }
   },
-  mounted() {
-    // 模拟 ajax 请求,异步渲染编辑器
-    setTimeout(() => {
-      this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
-    }, 1500)
+  watch: {
+    html(val) {
+      this.$emit('input', val)
+    },
+    value(val) {
+      this.html = val
+    }
   },
   beforeDestroy() {
     const editor = this.editor

+ 21 - 0
src/router/modules/user.js

@@ -36,6 +36,27 @@ const userRouter = {
           component: () => import('@/views/user/customer/list'),
           meta: { title: '供应商列表' }
         },
+        {
+          path: 'market-list',
+          name: 'MarketList',
+          component: () => import('@/views/user/customer/market-list'),
+          meta: { title: '营销数据报表' },
+          hidden: true
+        },
+        {
+          path: 'market-report-list',
+          name: 'MarketReportList',
+          component: () => import('@/views/user/customer/market-report-list'),
+          meta: { title: '数据报表' },
+          hidden: true
+        },
+        {
+          path: 'market-edit',
+          name: 'MarketEdit',
+          component: () => import('@/views/user/customer/market-edit'),
+          meta: { title: '数据报表上传/编辑' },
+          hidden: true
+        },
         {
           path: 'customer-stat-list',
           name: 'CustomerStatsList',

+ 0 - 8
src/styles/index.scss

@@ -252,11 +252,3 @@ aside {
 .el-submenu [class^='el-icon-'] {
   font-size: 16px;
 }
-.uploader-tips {
-  position: absolute;
-  bottom: 0;
-  left: 160px;
-  line-height: 28px;
-  color: red;
-  margin: 0;
-}

+ 186 - 0
src/views/dataBase/components/UploadFile.vue

@@ -0,0 +1,186 @@
+<template>
+  <div>
+    <input
+      ref="uploadInp"
+      type="file"
+      :accept="accept"
+      required
+      style="display: none;"
+      @change="handleChange($event)"
+    />
+    <div class="tips">{{ tip }}</div>
+    <el-button size="mini" type="primary" @click="triggerInput">选择文件</el-button>
+    <div v-for="(file, index) in dataList" :key="index" class="file-list">
+      <span>{{ file.fileName }} </span>
+      <div>
+        <el-button type="text" size="small" @click="handlePreview(file.ossUrl)">预览</el-button>
+        <el-button type="text" size="small" style="color: red" @click="handleRemove(index)">删除</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { uploadFile } from '@/api/contentLibrary/context'
+export default {
+  name: 'UploadFile',
+  props: {
+    tip: {
+      type: String,
+      default: ''
+    },
+    multiple: {
+      type: Boolean,
+      default: false
+    },
+    limit: {
+      type: Number,
+      default: 1
+    },
+    accept: {
+      type: String,
+      default: '.docx,.pptx,.pdf,.mp4'
+    },
+    listType: {
+      type: String,
+      default: 'picture-card'
+    },
+    fileList: {
+      type: Array,
+      default: () => []
+    },
+    uuid: {
+      type: Number,
+      default: 0
+    },
+    beforeUpload: {
+      type: Function,
+      default: () => true
+    },
+    autoUpload: {
+      type: Boolean,
+      default: true
+    },
+    mode: {
+      type: String,
+      default: 'brand'
+    },
+    list: {
+      type: Array,
+      default: () => []
+    },
+    isCheck: {
+      type: Boolean,
+      default: () => true
+    },
+    actionUrl: {
+      type: String,
+      default: () => '/formData/MultiPictareaddData'
+    },
+    dataParams: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      dialogImageUrl: '',
+      dataList: [],
+      iframUrl: '',
+      dataObj: {
+        multipartFile: ''
+      },
+      count: 0,
+      loading: false
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    chooseState() {
+      return this.dataList.length < this.limit
+    },
+    action() {
+      return process.env.VUE_APP_BASE_API + this.actionUrl
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  watch: {
+    list: {
+      handler(val) {
+        console.log(val)
+        this.dataList = val
+      },
+      deep: true
+    }
+  },
+  methods: {
+    triggerInput() {
+      this.$refs.uploadInp.click()
+    },
+    // 删除
+    handleRemove(index) {
+      this.dataList = this.dataList.filter((_, i) => index !== i)
+      this.$emit('remove', { fileList: this.dataList })
+    },
+    // 变化
+    async handleChange(file) {
+      console.log(file)
+      const f = file.target.files[0]
+      const formData = new FormData()
+      formData.append('multipartFile', f)
+      try {
+        this.$emit('change-loading')
+        const data = await uploadFile(formData)
+        if (data.success) {
+          this.dataList.push({ fileName: data.fileName, ossUrl: data.url, ossName: data.ossName })
+          this.$emit('success', { fileList: this.dataList })
+          this.$emit('change-loading')
+          this.$message({
+            type: 'success',
+            message: '上传成功'
+          })
+        }
+      } catch (error) {
+        this.$message({
+          type: 'error',
+          message: '上传失败'
+        })
+        console.error(error)
+      }
+    },
+    // 上传失败
+    uploadError(err, file, fileList) {
+      this.dataList = fileList
+      this.$emit('error', { err, file, fileList })
+    },
+    handlePreview(f) {
+      if (f.indexOf('.docx') !== -1 || f.indexOf('.pptx') !== -1) {
+        window.open(`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(f)}`)
+      } else {
+        window.open('javascript:window.name;', '<script>location.replace("' + f + '")<\/script>')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-upload-list {
+  display: none;
+}
+::v-deep .el-upload__tip {
+  position: static;
+}
+.file-list {
+  display: flex;
+  justify-content: space-between;
+  padding-right: 30px;
+  margin-top: 10px;
+}
+</style>

+ 115 - 0
src/views/dataBase/components/data-select.vue

@@ -0,0 +1,115 @@
+<template>
+  <div style="display: inline-block;">
+    <el-select
+      ref="select"
+      v-model="arr"
+      placeholder="标签"
+      filterable
+      remote
+      :multiple="isMultiple"
+      reserve-keyword
+      :remote-method="remoteMethod"
+      :loading="loading"
+    >
+      <el-option v-for="(i, index) in options" :key="index" :label="i.keyword" :value="i.id" @click.native="handleClick(i)" />
+    </el-select>
+    <div v-if="isEdit">
+      <el-tag
+        v-for="tag in emitArr"
+        :key="tag.id"
+        closable
+        :disable-transitions="false"
+        @close="handleClose(tag)"
+      >
+        {{ tag.keyword }}
+      </el-tag>
+    </div>
+  </div>
+</template>
+
+<script>
+import { findKeyWordList } from '@/api/contentLibrary/context'
+export default {
+  props: {
+    labelIds: {
+      type: Array,
+      default: () => []
+    },
+    isEdit: {
+      type: Boolean,
+      default: () => true
+    },
+    isMultiple: {
+      type: Boolean,
+      default: () => false
+    }
+  },
+  data() {
+    return {
+      emitArr: [],
+      list: [],
+      options: [],
+      loading: false,
+      arr: ''
+    }
+  },
+  watch: {
+    labelIds(val) {
+      console.log('传递来的emitArr', val)
+      this.emitArr = val
+    },
+    arr(val) {
+      if (this.isMultiple) {
+        this.$emit('handle-emit', val)
+      }
+    }
+  },
+  methods: {
+    async remoteMethod(v) {
+      if (v !== '') {
+        this.loading = true
+        try {
+          const { data } = await findKeyWordList({ keyword: v, pageSize: 10, pageNum: 1 })
+          this.list = data.results
+          const isShow = (i) => {
+            if (this.isMultiple) return !this.arr.some(e => e === i.id)
+            return !this.emitArr.some(e => Number(e.id) === Number(i.id))
+          }
+          this.options = this.list.filter(item => {
+            return ((item.keyword.toLowerCase()
+              .indexOf(v.toLowerCase()) > -1) && isShow(item))
+          })
+          console.log(this.options, this.labelIds)
+          this.loading = false
+        } catch (error) {
+          this.options = []
+          console.error(error)
+        }
+      } else {
+        this.options = []
+      }
+    },
+    handleClose(tag) {
+      this.emitArr = this.emitArr.filter(e => e.id !== tag.id)
+      this.$emit('handle-emit', this.emitArr)
+    },
+    handleClick($event) {
+      setTimeout(() => {
+        this.$refs.select.blur()
+        this.options = []
+      }, 200)
+      if (!this.isMultiple) {
+        this.emitArr.push($event)
+        console.log('传过去的', this.emitArr)
+        this.$emit('handle-emit', this.emitArr)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-tag {
+  margin: 5px 5px 5px 0;
+}
+</style>

+ 2 - 1
src/views/dataBase/components/dataManageTab.vue

@@ -18,13 +18,14 @@ export default {
   mixins: [databaseMixin],
   data() {
     return {
-      activeName: '1'
+      activeName: sessionStorage.getItem('TabStorage') || '3'
     }
   },
   watch: {
     activeName: {
       handler(val) {
         if (val) {
+          sessionStorage.setItem('TabStorage', val)
           this.$emit('change', val)
         }
       },

+ 30 - 18
src/views/dataBase/components/dialogTable.vue

@@ -2,23 +2,24 @@
   <div class="supplier-list-selector">
     <div class="filter-container">
       <div class="filter-control">
-        <span>商品编号:</span>
-        <el-input v-model="listQuery.name" size="mini" placeholder="商品编号" @keyup.enter.native="filterList" />
+        <span>商品ID:</span>
+        <el-input v-model="listQuery.productId" size="mini" placeholder="商品ID" @keyup.enter.native="filterList" />
       </div>
       <div class="filter-control">
         <span>商品名称:</span>
-        <el-input v-model="listQuery.name" size="mini" placeholder="商品名称" @keyup.enter.native="filterList" />
+        <el-input v-model="listQuery.productName" size="mini" placeholder="商品名称" @keyup.enter.native="filterList" />
       </div>
       <div class="filter-control">
         <span>供应商名称:</span>
-        <el-input v-model="listQuery.name" size="mini" placeholder="供应商名称" @keyup.enter.native="filterList" />
+        <el-input v-model="listQuery.shopName" size="mini" placeholder="供应商名称" @keyup.enter.native="filterList" />
       </div>
       <div class="filter-control">
         <el-button type="primary" size="mini" @click="filterList">查询</el-button>
       </div>
     </div>
     <el-table
-      ref="multipleTable"
+      ref="Table"
+      v-loading="isLoading"
       :data="list"
       border
       fit
@@ -27,10 +28,14 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column prop="id" label="商品ID" width="55" align="center" />
-      <el-table-column prop="name" label="商品图片" align="center" />
-      <el-table-column prop="serviceLevel" label="商品名称" align="center" />
-      <el-table-column prop="contractStartDate" label="供应商名称" align="center" />
+      <el-table-column prop="productId" label="商品ID" align="center" />
+      <el-table-column prop="productImage" label="商品图片" align="center">
+        <template slot-scope="scope">
+          <el-image style="width: 150px;height: 100px" fit="contain" :src="scope.row.productImage" />
+        </template>
+      </el-table-column>
+      <el-table-column prop="productName" label="商品名称" align="center" />
+      <el-table-column prop="shopName" label="供应商名称" align="center" />
     </el-table>
     <!-- 页码 -->
     <pagination :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
@@ -41,24 +46,20 @@
   </div>
 </template>
 <script>
-import { getProviderList } from '@/api/serviceSettlement/service'
+import { getStoreBaseList } from '@/api/contentLibrary/store'
 
 export default {
   name: 'ClubListSelector',
   data() {
     return {
       listQuery: {
-        authUserId: '',
-        authParty: '',
-        auditStatus: '',
-        status: '',
-        name: '',
         pageNum: 1, // 页码
         pageSize: 10 // 分页
       },
       list: [],
       total: 0,
-      multipleSelection: []
+      multipleSelection: [],
+      isLoading: false
     }
   },
   computed: {
@@ -79,14 +80,17 @@ export default {
         this.$message.warning('选择列表不能为空')
         return
       }
-      this.$emit('confirm', this.multipleSelection)
+      this.$emit('confirm', this.multipleSelection[0])
     },
 
     // 获取机构列表
     async getList() {
-      const { data } = await getProviderList(this.listQuery)
+      this.isLoading = true
+      const { data } = await getStoreBaseList(this.listQuery)
+      console.log(data)
       this.list = data.results
       this.total = data.totalRecord
+      this.isLoading = false
     },
 
     // 筛选机构列表
@@ -102,6 +106,11 @@ export default {
 
     // 表格列选择
     handleSelectionChange(rows) {
+      if (rows.length > 1) {
+        rows.shift()
+        this.$refs.Table.clearSelection()
+        this.$refs.Table.toggleRowSelection(rows[0])
+      }
       this.multipleSelection = rows
     },
 
@@ -122,4 +131,7 @@ export default {
   text-align: right;
   margin-top: 15px;
 }
+::v-deep .el-table__header-wrapper .el-table__header .el-checkbox {
+  display: none;
+}
 </style>

+ 143 - 0
src/views/dataBase/components/dialogTypeTable.vue

@@ -0,0 +1,143 @@
+<template>
+  <div class="supplier-list-selector">
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>标题:</span>
+        <el-input v-model="listQuery.title" size="mini" placeholder="标题" @keyup.enter.native="filterList" />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" size="mini" @click="filterList">查询</el-button>
+      </div>
+    </div>
+    <el-table
+      ref="Table"
+      v-loading="isLoading"
+      :data="list"
+      border
+      highlight-current-row
+      header-row-class-name="tableHeader"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column
+        label="ID"
+        prop="id"
+        align="center"
+        width="80"
+      />
+      <el-table-column prop="title" label="标题" align="center" />
+      <el-table-column prop="stageStatus" label="用户阶段" align="center">
+        <template slot-scope="scope">
+          <div>
+            {{ scope.row.stageStatus | userStateFilter(userClass) }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="labelIds" label="标签" align="center">
+        <template slot-scope="scope">
+          <div>
+            {{ scope.row.labelIds }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="pv" label="浏览量" align="center" />
+      <el-table-column prop="addTime" label="添加时间" align="center" />
+      <el-table-column prop="createBy" label="创建人" align="center" />
+    </el-table>
+    <!-- 页码 -->
+    <pagination :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+    <div class="control-footer">
+      <el-button type="primary" @click="onCancel">取消</el-button>
+      <el-button type="primary" @click="onConfirm">确认</el-button>
+    </div>
+  </div>
+</template>
+<script>
+import { getContextList } from '@/api/contentLibrary/context'
+import databaseMixin from '../mixins/index'
+
+export default {
+  name: 'Selector',
+  mixins: [databaseMixin],
+  props: {
+    typeId: {
+      type: Number,
+      default: () => 0
+    }
+  },
+  data() {
+    return {
+      listQuery: {
+        pageNum: 1, // 页码
+        pageSize: 10, // 分页
+        title: ''
+      },
+      list: [],
+      total: 0,
+      multipleSelection: [],
+      isLoading: false
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 取消
+    onCancel() {
+      this.multipleSelection = []
+      this.$emit('cancel', [])
+    },
+
+    // 确认
+    onConfirm() {
+      if (this.multipleSelection.length === 0) {
+        this.$message.warning('选择列表不能为空')
+        return
+      }
+      this.$emit('confirm', this.multipleSelection)
+    },
+
+    // 获取机构列表
+    async getList() {
+      this.isLoading = true
+      const { data } = await getContextList(Object.assign(this.listQuery, { productArchiveId: this.id, type: this.typeId }))
+      console.log(data)
+      this.list = data.results
+      this.total = data.totalRecord
+      this.isLoading = false
+    },
+
+    // 筛选机构列表
+    filterList() {
+      this.listQuery.pageNum = 1
+      this.getList()
+    },
+
+    // 设置选中的行
+    setSelection() {
+      this.list.forEach((row) => {})
+    },
+
+    // 表格列选择
+    handleSelectionChange(rows) {
+      this.multipleSelection = rows
+    },
+
+    // 表格索引
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+::v-deep {
+  .pagination-container {
+    padding: 0 !important;
+  }
+}
+.control-footer {
+  text-align: right;
+  margin-top: 15px;
+}
+</style>

+ 18 - 10
src/views/dataBase/components/storeItem.vue

@@ -1,19 +1,24 @@
 <template>
   <div class="store-item">
-    <el-image :src="storeObj.image" />
-    <div class="store-name">{{ storeObj.name }}</div>
+    <el-image :src="productImage" />
+    <div class="store-name">{{ productName }}</div>
   </div>
 </template>
 
 <script>
 export default {
   props: {
-    storeObj: {
-      type: Object,
-      default: () => ({
-        name: '12346',
-        image: ''
-      })
+    productImage: {
+      type: String,
+      default: () => ''
+    },
+    productName: {
+      type: String,
+      default: () => ''
+    }
+  },
+  data() {
+    return {
     }
   }
 }
@@ -22,15 +27,18 @@ export default {
 <style lang="scss" scoped>
 .store-item {
   padding: 10px;
-  margin: 10px;
+  margin: 10px 0;
   display: flex;
   align-items: center;
-  background: #fff;
+  background: #66666636;
   margin-bottom: 10px;
   .el-image {
     width: 80px;
     height: 80px;
     margin-right: 10px;
   }
+  .store-name {
+    width: calc(100% - 80px);
+  }
 }
 </style>

+ 32 - 23
src/views/dataBase/mixins/index.js

@@ -1,16 +1,27 @@
+import { mapGetters } from 'vuex'
+import { getServiceList } from '@/api/library/keyword'
+
 export default {
   data() {
     return {
       storeAttributes: [
         {
-          id: 1,
-          value: '仪器'
+          id: '',
+          value: '请选择'
+        },
+        {
+          id: '1',
+          value: '产品'
         }, {
-          id: 2,
-          value: '设备'
+          id: '2',
+          value: '仪器'
         }
       ],
       storeClass: [
+        {
+          id: '',
+          value: '请选择'
+        },
         {
           id: 1,
           value: '医美'
@@ -56,8 +67,8 @@ export default {
       },
       userClass: [
         {
-          id: 0,
-          value: '全部'
+          id: '',
+          value: '请选择'
         },
         {
           id: 1,
@@ -76,23 +87,10 @@ export default {
           value: '购买阶段'
         }
       ],
-      userType: [
-        {
-          id: 0,
-          value: '全部'
-        },
-        {
-          id: 1,
-          value: '标签一'
-        },
-        {
-          id: 2,
-          value: '标签二'
-        }
-      ],
+      userType: [],
       dataManageListType: [
         {
-          id: '1',
+          id: '3',
           value: '文件'
         },
         {
@@ -100,7 +98,7 @@ export default {
           value: '视频'
         },
         {
-          id: '3',
+          id: '1',
           value: '图片'
         },
         {
@@ -111,10 +109,12 @@ export default {
           id: '5',
           value: '话术'
         }
-      ]
+      ],
+      sellerList: []
     }
   },
   computed: {
+    ...mapGetters(['userId', 'username', 'fullName', 'phone']),
     type() {
       return Number(this.$route.query.t) || false
     },
@@ -123,6 +123,9 @@ export default {
     },
     tId() {
       return this.$route.query.tId || false
+    },
+    pId() {
+      return this.$route.query.pid || false
     }
   },
   filters: {
@@ -132,5 +135,11 @@ export default {
     userTypeFilter(val, list) {
       return list.filter(e => e.id === val)[0].value
     }
+  },
+  methods: {
+    async getServiceList() {
+      const { data } = await getServiceList()
+      this.sellerList = data
+    }
   }
 }

+ 147 - 33
src/views/dataBase/store-list/data-management/edit.vue

@@ -1,30 +1,34 @@
 <template>
   <div>
-    <el-form ref="form" :model="form" :rules="fileAddRules" label-width="120px">
-      <el-form-item label="标题:">
-        <el-input v-model="form.name" />
+    <el-form ref="form" v-loading="loading" :model="form" :rules="fileAddRules" label-width="120px">
+      <el-form-item label="标题:" prop="title">
+        <el-input v-model="form.title" />
       </el-form-item>
-      <el-form-item v-if="type === 1" label="文件路径:">
+      <el-form-item v-if="type === 3" label="文件路径:" prop="archiveFiles">
         <file-upload
           :limit="20"
           :is-check="false"
-          :file-list="fileList"
+          :list="fileList"
+          :accept="'.docx,.pptx,.pdf'"
           :tip="'支持上传pdf、docx、pptx文件格式'"
+          @change-loading="() => (loading = !loading)"
           @success="UploadSuccess($event)"
           @remove="HandleRemove($event)"
         />
       </el-form-item>
-      <el-form-item v-if="type === 2" label="视频路径:">
+      <el-form-item v-if="type === 2" label="视频路径:" prop="archiveFiles">
         <file-upload
           :limit="20"
           :is-check="false"
-          :file-list="fileList"
-          :tip="'支持上传pdf、docx、pptx文件格式'"
+          :list="fileList"
+          :accept="'.mp4'"
+          :tip="'支持上传.mp4文件格式'"
+          @change-loading="() => (loading = !loading)"
           @success="UploadSuccess($event)"
           @remove="HandleRemove($event)"
         />
       </el-form-item>
-      <el-form-item v-if="type === 3" label="图片路径:">
+      <el-form-item v-if="type === 1" label="图片路径:" prop="archiveFiles">
         <image-upload
           :limit="6"
           :image-list="fileList"
@@ -32,19 +36,19 @@
           @remove="handleImageRemove($event, 'textRelateds')"
         />
       </el-form-item>
-      <el-form-item v-if="type === 4" label="文本内容:">
-        <editor-input />
+      <el-form-item v-if="type === 4" label="文本内容:" prop="content">
+        <editor-input v-model="form.content" />
       </el-form-item>
-      <el-form-item v-if="type === 5" label="话术内容:">
+      <el-form-item v-if="type === 5" label="话术内容:" prop="content">
         <el-input
-          v-model="form.textarea2"
+          v-model="form.content"
           type="textarea"
           :autosize="{ minRows: 2, maxRows: 4}"
           placeholder="请输入内容"
         />
       </el-form-item>
-      <el-form-item label="用户阶段:">
-        <el-select v-model="form.userClass" placeholder="用户阶段">
+      <el-form-item label="用户阶段:" prop="stageStatus">
+        <el-select v-model="form.stageStatus" placeholder="用户阶段">
           <el-option
             v-for="(i, index) in userClass"
             :key="index"
@@ -53,15 +57,8 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="标签:">
-        <el-select v-model="form.userType" placeholder="标签">
-          <el-option
-            v-for="(i, index) in userType"
-            :key="index"
-            :label="i.value"
-            :value="i.id"
-          />
-        </el-select>
+      <el-form-item label="标签:" prop="labelIds">
+        <data-select :label-ids="labelIds" @handle-emit="handleSelect" />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="submitForm('form')">提交</el-button>
@@ -73,31 +70,148 @@
 
 <script>
 import ImageUpload from '@/components/UploadImage/index.vue'
-import FileUpload from '@/views/serviceSettlement/components/UploadFile.vue'
+import FileUpload from '../../components/UploadFile.vue'
 import databaseMixin from '../../mixins/index'
 import EditorInput from '@/components/Editor/index.vue'
+import dataSelect from '../../components/data-select.vue'
+import { addContext, getContextDetail } from '@/api/contentLibrary/context'
 
 export default {
   components: {
     ImageUpload,
     FileUpload,
-    EditorInput
+    EditorInput,
+    dataSelect
   },
   mixins: [databaseMixin],
   data() {
     return {
       form: {
-        infoType: 1
+        stageStatus: '',
+        productArchiveId: 0,
+        archiveFiles: [],
+        labelIds: '123'
       },
-      fileList: []
+      fileList: [],
+      labelIds: [],
+      loading: false,
+      fileAddRules: {
+        stageStatus: [
+          {
+            required: true,
+            message: '选择用户阶段',
+            trigger: 'blur'
+          }
+        ],
+        archiveFiles: [
+          {
+            required: true,
+            message: '请上传文件',
+            trigger: 'change'
+          }
+        ],
+        title: [
+          {
+            required: true,
+            message: '请输入标题',
+            trigger: 'blur'
+          }
+        ],
+        labelIds: [
+          {
+            required: true,
+            message: '请选择标签',
+            trigger: 'blur'
+          }
+        ]
+      }
+    }
+  },
+  mounted() {
+    if (this.tId) {
+      this.getContextDetail()
     }
   },
   methods: {
-    HandleRemove() {},
-    UploadSuccess() {},
-    handleImageSuccess() {},
-    handleImageRemove() {},
-    submitForm(form) {}
+    async getContextDetail() {
+      const { data } = await getContextDetail({ id: this.tId })
+      this.form = data
+      const isArray = (a) => a?.indexOf(',') !== -1
+      const k = isArray(data.keywords) ? data.keywords?.split(',') : [data.keywords]
+      const v = isArray(data.labelIds) ? data.labelIds?.split(',') : [data.labelIds]
+      this.labelIds = k?.map((e, i) => ({
+        id: v[i],
+        keyword: e
+      }))
+      this.fileList = data.type !== '1' ? data.archiveFiles : data.archiveFiles.map(e => ({
+        uid: e.id,
+        url: e.ossUrl,
+        name: e.id,
+        response: {
+          data: e.ossUrl
+        }
+      }))
+      console.log(this.labelIds)
+    },
+    HandleRemove(file) {
+      console.log(file)
+      this.form.archiveFiles = file.fileList
+    },
+    UploadSuccess(file) {
+      console.log(file)
+      this.form.archiveFiles = file.fileList
+    },
+    handleImageSuccess(file) {
+      console.log(file)
+      this.form.archiveFiles = file.fileList.map(e => ({
+        ossUrl: e.response.data,
+        fileName: e.name,
+        ossName: e.name
+      }))
+    },
+    handleImageRemove(file) {
+      this.form.archiveFiles = file.fileList.map(e => ({
+        ossUrl: e.response.data,
+        fileName: e.name,
+        ossName: e.name
+      }))
+    },
+    submitForm(form) {
+      this.$refs[form].validate(async valid => {
+        if (valid) {
+          try {
+            console.log(this.form.content)
+            const form = {
+              stageStatus: this.form.stageStatus.toString(),
+              type: this.type.toString(),
+              archiveFiles: this.form.archiveFiles || [],
+              productArchiveId: this.id,
+              labelIds: this.form.labelIds,
+              createBy: this.fullName,
+              title: this.form.title,
+              id: this.form.id || '',
+              content: this.form.content || ''
+            }
+            const data = await addContext(form)
+            if (data.code === 0) {
+              this.$router.back()
+            } else {
+              this.$message({
+                type: 'error',
+                message: data.msg
+              })
+            }
+          } catch (error) {
+            console.error(error)
+          }
+        }
+      })
+    },
+    handleSelect(val) {
+      console.log(val)
+      this.form.labelIds = val.map(e => e.k).join(',')
+      console.log(this.form.labelIds)
+    }
   }
 }
 </script>

+ 89 - 51
src/views/dataBase/store-list/data-management/list.vue

@@ -5,7 +5,7 @@
       <manage-tab @change="handleChange" />
 
       <div v-if="listQuery.type === 5">
-        <el-tabs v-model="listQuery.type2">
+        <el-tabs v-model="listQuery.allStatus" @tab-click="handleChange(listQuery.type)">
           <el-tab-pane label="企业话术" name="1" />
           <el-tab-pane label="个人话术" name="2" />
         </el-tabs>
@@ -14,16 +14,16 @@
       <div class="filter-control">
         <span>标题:</span>
         <el-input
-          v-model="listQuery.name"
+          v-model="listQuery.title"
           placeholder="标题"
           clearable
           @keyup.enter.native="handleChange(listQuery.type)"
           @clear="handleChange(listQuery.type)"
         />
       </div>
-      <div v-if="listQuery.type !== 5" class="filter-control">
+      <div v-if="listQuery.allStatus !== '2'" class="filter-control">
         <span>用户阶段:</span>
-        <el-select v-model="listQuery.userClass" placeholder="用户阶段" @change="handleChange(listQuery.type)">
+        <el-select v-model="listQuery.stageStatus" placeholder="用户阶段" @change="handleChange(listQuery.type)">
           <el-option
             v-for="(i, index) in userClass"
             :key="index"
@@ -32,32 +32,25 @@
           />
         </el-select>
       </div>
-      <div v-if="listQuery.type !== 5" class="filter-control">
+      <div v-if="listQuery.allStatus !== '2'" class="filter-control">
         <span>标签:</span>
-        <el-select v-model="listQuery.userType" placeholder="标签" @change="handleChange(listQuery.type)">
-          <el-option
-            v-for="(i, index) in userType"
-            :key="index"
-            :label="i.value"
-            :value="i.id"
-          />
-        </el-select>
+        <data-select :is-edit="false" :is-multiple="true" @handle-emit="handleSelect" />
       </div>
-      <div v-if="listQuery.type === 5" class="filter-control">
+      <div v-if="listQuery.allStatus === '2'" class="filter-control">
         <span>上传者:</span>
-        <el-select v-model="listQuery.userClass" placeholder="上传者" @change="handleChange(listQuery.type)">
+        <el-select v-model="listQuery.spId" placeholder="上传者" @change="handleChange(listQuery.type)">
           <el-option
-            v-for="(i, index) in userClass"
-            :key="index"
-            :label="i.value"
-            :value="i.id"
+            v-for="item in sellerList"
+            :key="item.serviceProviderId"
+            :label="item.linkMan"
+            :value="item.serviceProviderId"
           />
         </el-select>
       </div>
       <div class="filter-control">
         <el-button type="primary" @click="handleChange(listQuery.type)">查询</el-button>
-        <el-button v-if="listQuery.type !== 5" type="primary" @click="$router.push('/database/store-list/data-manage/edit?id=' + id + '&t=' + listQuery.type)">添加</el-button>
-        <el-button v-if="listQuery.type !== 5" type="primary" @click="exportDialogVisible = true">删除</el-button>
+        <el-button v-if="listQuery.allStatus !== '2'" type="primary" @click="$router.push('/database/store-list/data-manage/edit?id=' + id + '&t=' + listQuery.type)">添加</el-button>
+        <el-button v-if="listQuery.allStatus !== '2'" type="primary" @click="exportDialogVisible = true">删除</el-button>
       </div>
     </div>
 
@@ -67,50 +60,49 @@
       :data="list"
       border
     >
-      <!--<el-table-column type="selection" width="55" align="center" />-->
       <el-table-column
         label="ID"
         prop="id"
         align="center"
         width="80"
       />
-      <el-table-column prop="serviceLevel" label="标题" align="center" />
-      <el-table-column prop="userClass" label="用户阶段" align="center">
+      <el-table-column prop="title" label="标题" align="center" />
+      <el-table-column prop="stageStatus" label="用户阶段" align="center">
         <template slot-scope="scope">
           <div>
-            {{ scope.row.userClass | userStateFilter(userClass) }}
+            {{ scope.row.stageStatus | userStateFilter(userClass) }}
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="userType" label="标签" align="center">
+      <el-table-column prop="labelIds" label="标签" align="center">
         <template slot-scope="scope">
           <div>
-            {{ scope.row.userType | userTypeFilter(userType) }}
+            {{ scope.row.keywords }}
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="contractStartDate" label="浏览量" align="center" />
-      <el-table-column prop="contractStartDate" label="添加时间" align="center" />
-      <el-table-column prop="contractStartDate" label="创建人" align="center" />
+      <el-table-column prop="pv" label="浏览量" align="center" />
+      <el-table-column prop="addTime" label="添加时间" align="center" />
+      <el-table-column prop="createBy" label="创建人" align="center" />
       <el-table-column label="操作" align="center" width="250">
         <template slot-scope="{ row }">
           <div class="labelCenter">
             <el-button
-              v-if="listQuery.type2 === '1'"
+              v-if="listQuery.allStatus === '1'"
               type="primary"
               size="mini"
               @click="$router.push('/database/store-list/data-manage/edit?id=' + id + '&t=' + listQuery.type + '&tId=' + row.id)"
             >编辑</el-button>
             <el-button
-              v-if="listQuery.type2 === '1'"
+              v-if="listQuery.allStatus === '1'"
               type="primary"
               size="mini"
               @click="
-                handleDelete(row.id)
+                handleDelete({ ids: row.id, productArchiveId: id, type: listQuery.type.toString() })
               "
             >删除</el-button>
             <el-button
-              v-if="listQuery.type === 5 && listQuery.type2 === '2'"
+              v-if="listQuery.type === 5 && listQuery.allStatus === '2'"
               type="primary"
               size="mini"
               @click="
@@ -133,6 +125,7 @@
     <el-dialog title="选择商品" :visible.sync="exportDialogVisible" width="70%">
       <data-list-selector
         v-if="exportDialogVisible"
+        :type-id="listQuery.type"
         @cancel="onSelectorCancel"
         @confirm="onSelectorConfirm"
       />
@@ -142,13 +135,16 @@
 
 <script>
 import ManageTab from '../../components/dataManageTab.vue'
-import DataListSelector from '../../components/dialogTable.vue'
+import DataListSelector from '../../components/dialogTypeTable.vue'
 import databaseMixin from '../../mixins/index'
+import { getContextList, deleteContext } from '@/api/contentLibrary/context'
+import dataSelect from '../../components/data-select.vue'
 
 export default {
   components: {
     ManageTab,
-    DataListSelector
+    DataListSelector,
+    dataSelect
   },
   mixins: [databaseMixin],
   data() {
@@ -157,37 +153,79 @@ export default {
         type: '',
         pageNum: 1,
         pageSize: 10,
-        userType: 0,
-        userClass: 0,
-        type2: '1'
+        labelIds: '',
+        stageStatus: '',
+        allStatus: '1',
+        spId: ''
       },
-      list: [
-        {
-          id: 1,
-          userClass: 1,
-          userType: 1
-        }
-      ],
+      list: [],
       total: 0,
       isLoading: false,
       exportDialogVisible: false
     }
   },
+  watch: {
+    'listQuery.allStatus': {
+      handler(val) {
+        if (val) {
+          this.listQuery.labelIds = ''
+          this.listQuery.spId = ''
+        }
+      }
+    }
+  },
+  mounted() {
+    this.getServiceList()
+  },
   methods: {
-    getInfo() {
+    async getInfo() {
+      this.isLoading = true
+      const { data } = await getContextList(Object.assign(this.listQuery, { productArchiveId: this.id, productId: this.pId || '' }))
+      this.list = data.results
+      this.total = data.totalRecord
       this.isLoading = false
     },
+    handleSelect($event) {
+      this.listQuery.labelIds = $event.join(',')
+      this.handleChange(this.listQuery.type)
+    },
     handleChange($event) {
       if (this.id && $event) {
         this.listQuery.type = Number($event)
-        this.listQuery.type2 = '1'
         this.isLoading = true
         this.getInfo()
       }
     },
-    handleDelete(val) {},
-    onSelectorCancel() {},
-    onSelectorConfirm() {}
+    handleDelete(val) {
+      this.$confirm(`是否删除该资料?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(async() => {
+        try {
+          const form = new FormData()
+          form.append('ids', val.ids)
+          form.append('type', val.type)
+          form.append('productArchiveId', val.productArchiveId)
+          await deleteContext(form)
+          this.$message({
+            message: '删除成功',
+            type: 'success'
+          })
+          this.handleChange(this.listQuery.type)
+        } catch (error) {
+          console.error(error)
+        }
+      })
+    },
+    onSelectorCancel() {
+      this.exportDialogVisible = false
+    },
+    onSelectorConfirm(row) {
+      console.log(row)
+      this.handleDelete({ ids: row.map(e => e.id).join(','), type: this.listQuery.type.toString(), productArchiveId: this.id })
+      this.exportDialogVisible = false
+    }
   }
 }
 </script>

+ 101 - 27
src/views/dataBase/store-list/edit.vue

@@ -2,36 +2,34 @@
   <div class="store-edit">
     <el-form ref="form" :model="form" :rules="storeAddRules" label-width="120px">
       <el-form-item label="商品信息:">
-        <el-radio-group v-model="form.info">
-          <el-radio v-for="i in storeInfo" :key="i.id" :label="i.id">{{ i.value }}</el-radio>
+        <el-radio-group :key="radioKey" v-model="form.info" @change="handleRadio">
+          <el-radio v-for="i in storeInfo" :key="i.id" :label="i.id">{{
+            i.value
+          }}</el-radio>
         </el-radio-group>
       </el-form-item>
-      <el-form-item v-if="form.info === 1" label="添加商品:">
-        <el-button type="primary" @click="exportDialogVisible = true">添加</el-button>
-        <store-item
-          v-for="i in selectStoreList"
-          :key="i.id"
-          :store-obj="i"
-        />
+      <el-form-item v-if="form.info === 1" label="添加商品:" prop="productId">
+        <store-item v-if="selectStore.productName" :product-image="selectStore.productImage" :product-name="selectStore.productName" />
+        <el-button type="primary" @click="exportDialogVisible = true">{{ selectStore.productName ? '选择商品' : '添加' }}</el-button>
       </el-form-item>
       <div v-if="form.info === 2">
-        <el-form-item label="商品名称:" prop="name">
-          <el-input v-model="form.name" />
+        <el-form-item label="商品名称:" prop="productName">
+          <el-input v-model="form.productName" />
         </el-form-item>
-        <el-form-item label="商品图片:" prop="image">
+        <el-form-item label="商品图片:" prop="productImage">
           <image-upload
             :limit="1"
-            :image-list="textRelateds"
-            @success="handleImageSuccess($event, 'textRelateds')"
-            @remove="handleImageRemove($event, 'textRelateds')"
+            :image-list="productImage"
+            @success="handleImageSuccess($event, 'productImage')"
+            @remove="handleImageRemove($event, 'productImage')"
           />
         </el-form-item>
-        <el-form-item label="供应商名称:" prop="linkMan">
-          <el-input v-model="form.linkMan" />
+        <el-form-item label="供应商名称:" prop="shopName">
+          <el-input v-model="form.shopName" />
         </el-form-item>
       </div>
       <el-form-item label="商品属性:">
-        <el-select v-model="form.storeAttributes" placeholder="请选择商品属性">
+        <el-select v-model="form.productType" placeholder="请选择商品属性">
           <el-option
             v-for="(i, index) in storeAttributes"
             :key="index"
@@ -41,7 +39,7 @@
         </el-select>
       </el-form-item>
       <el-form-item label="商品分类:">
-        <el-select v-model="form.storeClass" placeholder="请选择商品分类">
+        <el-select v-model="form.productClassify" placeholder="请选择商品分类">
           <el-option
             v-for="(i, index) in storeClass"
             :key="index"
@@ -71,6 +69,7 @@ import databaseMixin from '../mixins/index'
 import StoreListSelector from '../components/dialogTable.vue'
 import StoreItem from '../components/storeItem.vue'
 import ImageUpload from '@/components/UploadImage/index.vue'
+import { getStoreDetail, addStore } from '@/api/contentLibrary/store'
 
 export default {
   components: {
@@ -82,25 +81,100 @@ export default {
   data() {
     return {
       form: {
-        info: 1
+        info: 1,
+        productClassify: '',
+        productType: '',
+        productId: '',
+        productName: ''
       },
+      selectStore: {},
+      radioKey: 0,
       exportDialogVisible: false,
-      textRelateds: [],
-      selectStoreList: []
+      productImage: [],
+      storeAddRules: {
+        productId: [
+          {
+            required: true,
+            message: '请选择添加商品',
+            trigger: 'blur'
+          }
+        ],
+        productName: [
+          {
+            required: true,
+            message: '请输入商品名称',
+            trigger: 'blur'
+          }
+        ],
+        productImage: [
+          {
+            required: true,
+            message: '请上传商品图片',
+            trigger: 'blur'
+          }
+        ],
+        shopName: [
+          {
+            required: true,
+            message: '请输入供应商名称',
+            trigger: 'change'
+          }
+        ]
+      }
+    }
+  },
+  async mounted() {
+    if (this.id) {
+      await this.getInfo()
     }
   },
-  mounted() {},
   methods: {
-    onSelectorCancel(val) {},
+    async getInfo() {
+      const { data } = await getStoreDetail({ id: this.id })
+      this.form = data
+      this.form.info = data.productId ? 1 : 2
+      this.selectStore.productImage = data.productImage
+      this.selectStore.productName = data.productName
+      this.selectStore.productId = data.productId
+      this.productImage = [{ uid: 1, url: data.productImage }]
+      console.log(this.selectStore.productImage)
+    },
+    onSelectorCancel() {
+      this.exportDialogVisible = false
+    },
     onSelectorConfirm(val) {
       console.log(val)
+      const v = {
+        productId: val.productId,
+        productImage: val.productImage,
+        productName: val.productName,
+        shopName: val.shopName
+      }
+      this.form = Object.assign(this.form, v)
+      this.selectStore = val
+      this.exportDialogVisible = false
+    },
+    handleRadio($event) {
+      if ($event) {
+        this.radioKey = Math.random() * 1000
+      }
     },
     handleImageRemove() {},
-    handleImageSuccess() {},
+    handleImageSuccess(file, name) {
+      this.form[name] = file.file.response.data
+    },
     submitForm(form) {
-      this.$refs[form].validate(valid => {
+      this.$refs[form].validate(async(valid) => {
         if (valid) {
-          console.log(this.form)
+          if (this.form.info === 2) {
+            delete this.form.productId
+          }
+          try {
+            await addStore(this.form)
+            this.$router.back()
+          } catch (error) {
+            console.error(error)
+          }
         }
       })
     }

+ 33 - 21
src/views/dataBase/store-list/index.vue

@@ -5,7 +5,7 @@
       <div class="filter-control">
         <span>商品名称:</span>
         <el-input
-          v-model="listQuery.name"
+          v-model="listQuery.productName"
           placeholder="商品名称"
           clearable
           @keyup.enter.native="getList"
@@ -14,7 +14,7 @@
       </div>
       <div class="filter-control">
         <span>商品属性:</span>
-        <el-select v-model="listQuery.storeAttributes" placeholder="请选择商品属性" @change="getList">
+        <el-select v-model="listQuery.productType" placeholder="请选择商品属性" @change="getList">
           <el-option
             v-for="(i, index) in storeAttributes"
             :key="index"
@@ -25,7 +25,7 @@
       </div>
       <div class="filter-control">
         <span>商品分类:</span>
-        <el-select v-model="listQuery.storeClass" placeholder="请选择商品分类" @change="getList">
+        <el-select v-model="listQuery.productClassify" placeholder="请选择商品分类" @change="getList">
           <el-option
             v-for="(i, index) in storeClass"
             :key="index"
@@ -56,25 +56,27 @@
         align="center"
         width="80"
       />
-      <el-table-column prop="name" label="商品名称" align="center" />
-      <el-table-column prop="serviceLevel" label="商品图片" align="center">
-        <el-image src="" />
+      <el-table-column prop="productName" label="商品名称" align="center" />
+      <el-table-column prop="productImage" label="商品图片" align="center" width="150">
+        <template slot-scope="scope">
+          <el-image :src="scope.row.productImage" />
+        </template>
       </el-table-column>
-      <el-table-column prop="serviceCategory" label="商品属性" align="center">
+      <el-table-column prop="productType" label="商品属性" align="center">
         <template slot-scope="scope">
           <div>
-            {{ scope.row.serviceCategory == "1" ? "产品" : "仪器" }}
+            {{ scope.row.productType == "1" ? "产品" : "仪器" }}
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="serviceCategory" label="商品分类" align="center">
+      <el-table-column prop="productClassify" label="商品分类" align="center">
         <template slot-scope="scope">
           <div>
-            {{ scope.row.serviceCategory == "1" ? "生美" : "医美" }}
+            {{ scope.row.productClassify === 1 ? "医美" : "生美" }}
           </div>
         </template>
       </el-table-column>
-      <el-table-column prop="contractStartDate" label="添加时间" align="center" />
+      <el-table-column prop="addTime" label="添加时间" align="center" />
       <el-table-column label="操作" align="center" width="200">
         <template slot-scope="{ row }">
           <div class="labelCenter">
@@ -87,7 +89,7 @@
               type="primary"
               size="mini"
               @click="
-                $router.push('/database/store-list/data-manage/list?id=' + row.id)
+                $router.push('/database/store-list/data-manage/list?id=' + row.id + '&pId=' + (row.productId || ''))
               "
             >资料管理</el-button>
           </div>
@@ -107,24 +109,34 @@
 
 <script>
 import databaseMixin from '../mixins/index'
+import { getStoreList } from '@/api/contentLibrary/store'
 
 export default {
   mixins: [databaseMixin],
   data() {
     return {
-      listQuery: {},
-      list: [
-        {
-          id: 1
-        }
-      ],
-      total: 10,
+      listQuery: {
+        pageNum: 1,
+        pageSize: 10,
+        productType: '',
+        productClassify: ''
+      },
+      list: [],
+      total: 0,
       isLoading: false
     }
   },
-  mounted() {},
+  async mounted() {
+    await this.getList()
+  },
   methods: {
-    getList() {}
+    async getList() {
+      this.isLoading = true
+      const { data } = await getStoreList(this.listQuery)
+      this.list = data.results
+      this.total = data.totalRecord
+      this.isLoading = false
+    }
   }
 }
 </script>

+ 1 - 0
src/views/library/tag/list.vue

@@ -403,6 +403,7 @@ export default {
     handleUploadSuccess(response, file, fileList) {
       this.importForm.fileUrl = response.url
       this.fileList = fileList
+      console.log('fileList', this.fileList)
     },
 
     // 上传文件删除

+ 0 - 3
src/views/library/tag/tag-form.vue

@@ -168,9 +168,6 @@ export default {
   line-height: 20px;
   color: red;
   text-align: left;
-  position: absolute;
-  right: -50%;
-  bottom: 0;
 }
 .span_tip {
   font-size: 12px;

+ 6 - 12
src/views/serviceSettlement/list/edit.vue

@@ -19,8 +19,8 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="服务商地区:" prop="area">
-        <el-cascader
+      <el-form-item label="服务商地区:" prop="address">
+        <!--<el-cascader
           ref="cascader"
           :key="areaKey"
           v-model="formLabelAlign.area"
@@ -30,7 +30,8 @@
           style="width: 100%"
           :placeholder="cascaderPlaceholder"
           @change="handleChange"
-        />
+        />-->
+        <el-input v-model="formLabelAlign.address" placeholder="请服务商地区" />
       </el-form-item>
       <el-form-item label="服务商类型:" prop="serviceCategory">
         <el-select v-model="formLabelAlign.serviceCategory" placeholder="服务商类型">
@@ -164,13 +165,12 @@ export default {
           { required: true, message: '请输入服务商名称', trigger: 'blur' },
           { max: 50, message: '长度最多50个汉字', trigger: 'blur' }
         ],
-        area: [{ required: true, message: '请选择地址', trigger: 'change' }],
+        address: [{ required: true, message: '请输入地址', trigger: 'blur' }],
         serviceLevel: [
           { required: true, message: '请选择服务商级别', trigger: 'change' }
         ],
         mobile: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
         linkMan: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
-        text: [{ required: true, message: '请输入简介', trigger: 'blur' }],
         serviceCategory: [
           { required: true, message: '请选择服务商类型', trigger: 'change' }
         ],
@@ -186,10 +186,7 @@ export default {
           contractRelateds: [
             { required: true, message: '请上传合同文件', trigger: 'change' }
           ]
-        },
-        infoRelateds: [
-          { required: true, message: '请上传资料文件', trigger: 'change' }
-        ]
+        }
       }
     }
   },
@@ -236,9 +233,6 @@ export default {
       this.textRelateds = data.textRelateds.map((e, i) => ({ uid: i, url: e.image }))
       this.formLabelAlign.area = data.address.split('/').map(e => e.trim())
       this.qualificationImage = data.qualificationImage
-      setTimeout(() => {
-        this.areaKey = Math.random() * 1000
-      }, 500)
     },
     // 地区选择
     handleChange($event) {

+ 8 - 3
src/views/user/customer/advertis-edit.vue

@@ -285,9 +285,6 @@ export default {
   line-height: 20px;
   color: red;
   text-align: left;
-  position: absolute;
-  right: -50%;
-  bottom: 0;
 }
 .span_tip {
   font-size: 12px;
@@ -297,4 +294,12 @@ export default {
 .filter-item-temp {
   width: 100px;
 }
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
 </style>

+ 150 - 0
src/views/user/customer/components/shop-market-dialog.vue

@@ -0,0 +1,150 @@
+<template>
+  <el-dialog
+    title="添加供应商"
+    :visible.sync="visible"
+    width="1200px"
+    :close-on-click-modal="false"
+    :show-close="false"
+  >
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>供应商名称:</span>
+        <el-input
+          v-model="listQuery.shopName"
+          placeholder="供应商名称"
+          clearable
+          style="width: 160px"
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+      </div>
+    </div>
+    <el-table
+      ref="table"
+      v-loading="isLoading"
+      :data="list"
+      height="400px"
+      border
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" :selectable="selectable" />
+      <el-table-column label="供应商名称" prop="name" align="center" />
+      <el-table-column label="联系人" prop="linkMan" align="center" />
+      <el-table-column label="手机号" prop="contractMobile" align="center">
+        <template slot-scope="{ row }">
+          {{ row.contractMobile ? row.contractMobile : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column label="供应商状态" prop="status" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.status === 90" type="success" size="small">已上线</el-tag>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[100, 200]"
+      :page-size="100"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getShopList"
+    />
+    <div slot="footer">
+      <el-button @click="handleCanle"> 取 消 </el-button>
+      <el-button type="primary" :disabled="disabled" @click="handleConfirm"> 确 定 </el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getMarketShopList } from '@/api/user/customer/customer'
+
+export default {
+  name: 'ShopDialog',
+  filters: {
+    NumFormat(value) {
+      // 处理金额
+      return Number(value).toFixed(2)
+    }
+  },
+  data() {
+    return {
+      visible: true,
+      listQuery: {
+        pageNum: 1, // 页码
+        pageSize: 100, // 页面数据数
+        shopName: '' // 供应商公司名称
+      },
+      list: [],
+      total: 0,
+      shopsRadio: null,
+      isLoading: true
+    }
+  },
+  computed: {
+    disabled() {
+      return this.shopsRadio === null
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取所有供应商列表
+    async getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.getShopList()
+    },
+    // 获取所有供应商列表
+    async getShopList() {
+      try {
+        const res = await getMarketShopList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 选择供应商
+    handleSelectionChange(row) {
+      this.shopsRadio = row
+      console.log('row', row)
+    },
+    // 确认选择供应商
+    handleConfirm() {
+      this.$emit('confirm', this.shopsRadio)
+    },
+    handleCanle() {
+      // 取消弹窗
+      this.$emit('cancel')
+    },
+    // 已选择的禁用勾选框
+    selectable(row) {
+      if (row.flag) {
+        return true
+      } else {
+        return false
+      }
+    },
+    checkedInput(event, type) {
+      let pattern = ''
+      switch (type) {
+        case 1:
+          pattern = /[^\d]/g
+          break
+        case 2:
+          pattern = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!,。?!…—&$=()-+/*{}[]]|s/g
+          break
+      }
+      return event.replace(pattern, '')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped></style>

+ 0 - 3
src/views/user/customer/customer-ambition-edit.vue

@@ -196,9 +196,6 @@ export default {
   line-height: 20px;
   color: red;
   text-align: left;
-  position: absolute;
-  right: -50%;
-  bottom: 0;
 }
 .span_tip {
   font-size: 12px;

+ 0 - 3
src/views/user/customer/customer-ambition-sum.vue

@@ -150,9 +150,6 @@ export default {
   line-height: 20px;
   color: red;
   text-align: left;
-  position: absolute;
-  right: -50%;
-  bottom: 0;
 }
 .span_tip {
   font-size: 12px;

+ 0 - 3
src/views/user/customer/customer-popup-edit.vue

@@ -192,9 +192,6 @@ export default {
   line-height: 20px;
   color: red;
   text-align: left;
-  position: absolute;
-  right: -50%;
-  bottom: 0;
 }
 .span_tip {
   font-size: 12px;

+ 0 - 3
src/views/user/customer/customer-remarks-add .vue

@@ -273,9 +273,6 @@ export default {
   line-height: 20px;
   color: red;
   text-align: left;
-  position: absolute;
-  right: -50%;
-  bottom: 0;
 }
 .span_tip {
   font-size: 12px;

+ 158 - 13
src/views/user/customer/list.vue

@@ -45,16 +45,30 @@
           <el-tag v-if="row.status === 1" type="danger" size="small">暂停统计</el-tag>
         </template>
       </el-table-column>
-      <el-table-column prop="addTime" label="添加时间" align="center">
+      <el-table-column prop="status" label="logo" align="center" width="180">
+        <template slot-scope="{ row }">
+          <el-popover v-if="row.logo" placement="top-start" title="" width="180" trigger="hover">
+            <img :src="row.logo" alt="" style="width: 94px; height: 50px" />
+            <img slot="reference" :src="row.logo" alt="" style="width: 94px; height: 50px" />
+          </el-popover>
+          <span v-else>---</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="recentlyTime" label="最近报表时间" align="center">
+        <template slot-scope="{ row }">
+          {{ row.recentlyTime ? row.recentlyTime : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="addTime" label="添加时间" align="center" width="100">
         <template slot-scope="{ row }">
           {{ row.addTime ? row.addTime : '---' }}
         </template>
       </el-table-column>
       <el-table-column fixed="right" label="操作" align="center" width="400">
         <template slot-scope="{ row }">
-          <!-- <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(7, row)">
-            意向客户数据
-          </el-button> -->
+          <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(7, row)">
+            营销数据报表
+          </el-button>
           <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(1, row)">
             潜客统计列表
           </el-button>
@@ -64,6 +78,9 @@
           <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(3, row)">
             相关搜索词
           </el-button>
+          <el-button type="success" size="mini" style="margin: 4px" @click="handleRecordDetail(8, row)">
+            上传LOGO
+          </el-button>
           <el-button type="success" size="mini" style="margin: 4px" @click="handleRecordDetail(4, row)">
             页面访问统计
           </el-button>
@@ -79,8 +96,8 @@
     <!-- 页码 -->
     <pagination
       :total="total"
-      :page-sizes="[100]"
-      :page-size="100"
+      :page-sizes="[10, 20, 30, 100]"
+      :page-size="20"
       :page.sync="listQuery.pageNum"
       :limit.sync="listQuery.pageSize"
       @pagination="getCustomerShopList"
@@ -100,11 +117,48 @@
         <el-button type="primary" @click="handleConfirm">确定</el-button>
       </div>
     </el-dialog>
+    <!-- 上传LOGO -->
+    <el-dialog title="上传LOGO" :visible.sync="logoFormVisible" width="500px">
+      <el-form ref="logoForm" :model="logoForm" :rules="rules" label-position="right">
+        <el-form-item prop="logo" label="logo">
+          <div class="form-el-upload" style="width: 126px; height: 126px">
+            <el-upload
+              class="avatar-uploader"
+              :action="actionUrl"
+              :headers="getToken"
+              :show-file-list="false"
+              :on-success="handleSuccess"
+              :before-upload="beforeUpload"
+            >
+              <div v-loading="loadImgLoading" class="avatar" style="width: 126px; height: 126px; display: block">
+                <img
+                  v-if="logoForm.logo"
+                  :src="logoForm.logo"
+                  style="width: 126px; height: 126px; display: block"
+                  @error="reloadImage"
+                  @load="loadSucess"
+                />
+                <i
+                  v-else
+                  class="el-icon-plus avatar-uploader-icon"
+                  style="width: 126px; height: 126px; line-height: 126px"
+                ></i>
+              </div>
+            </el-upload>
+            <p class="uploader-tips">注:请尽量上传126*50(px)尺寸的图片。</p>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="logoFormVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleConfirmLogo">确定</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { getCustomerShopList, saveCustomerShop, renewCustomerShop } from '@/api/user/customer/customer'
+import { getCustomerShopList, saveCustomerShop, renewCustomerShop, uploadShopLogo } from '@/api/user/customer/customer'
 import ShopDialog from './components/shop-dialog'
 export default {
   name: 'RecordList',
@@ -123,16 +177,32 @@ export default {
       total: 0,
       shopDialogVisible: false,
       dialogFormVisible: false,
+      logoFormVisible: false,
+      loadImgLoading: false,
       renewCustome: {
         id: '',
         status: ''
       },
+      logoForm: {
+        id: '',
+        logo: ''
+      },
       rules: {
-        status: [{ required: true, message: '请设置统计状态', trigger: 'blur' }]
+        status: [{ required: true, message: '请设置统计状态', trigger: 'blur' }],
+        logo: [{ required: true, message: '请上传弹窗图片', trigger: 'blur' }]
       }
     }
   },
-  computed: {},
+  computed: {
+    getToken() {
+      return {
+        token: this.$store.getters.token
+      }
+    },
+    actionUrl() {
+      return process.env.VUE_APP_BASE_API + '/formData/MultiPictareaddData'
+    }
+  },
   created() {
     this.getList()
   },
@@ -202,6 +272,28 @@ export default {
         console.log(error)
       }
     },
+    // 上传logo
+    handleConfirmLogo() {
+      this.$refs['logoForm'].validate((valid) => {
+        if (valid) {
+          this.uploadShopLogo(this.logoForm)
+        } else {
+          return false
+        }
+      })
+    },
+    // 上传logo
+    async uploadShopLogo(params) {
+      try {
+        await uploadShopLogo(params)
+        this.logoFormVisible = false
+        this.$message.success('操作成功')
+        this.$refs['logoForm'].clearValidate()
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
     // 查看详情
     handleRecordDetail(type, row) {
       switch (type) {
@@ -241,16 +333,69 @@ export default {
           console.log('renewCustome', this.renewCustome)
           this.dialogFormVisible = true
           break
-        case 7: // 意向客户数据
+        case 7: // 跳转数据报表
           this.$router.push({
-            path: '/user/customer/customer-ambition-list',
-            query: { shopId: row.shopId }
+            path: '/user/customer/market-report-list',
+            query: { marketId: row.id, shopName: row.shopName }
           })
           break
+        case 8: // 上传LOGO
+          this.logoForm.id = row.id
+          this.logoFormVisible = true
+          break
+      }
+    },
+    // 上传图标事件
+    handleSuccess(res, file) {
+      this.loadImgLoading = true
+      this.$nextTick(() => {
+        setTimeout(() => {
+          this.logoForm.logo = res.data
+        }, 1000 * 2)
+      })
+    },
+    // 对上传图片的大小、格式进行限制
+    beforeUpload(file) {
+      const isJPG = file.type === 'image/jpeg'
+      const isJPG2 = file.type === 'image/jpg'
+      const isPNG = file.type === 'image/png'
+      const isLt5M = file.size / 1024 / 1024 < 5
+      if (!isJPG && !isJPG2 && !isPNG) {
+        this.$message.error('只支持jpg或png格式图片')
       }
+      if (!isLt5M) {
+        this.$message.error('请上传5MB以内的图片!')
+      }
+      return (isJPG || isJPG2 || isPNG) && isLt5M
+    },
+    reloadImage() {
+      this.loadImgLoading = true
+      setTimeout(() => {
+        this.logoForm.logo = this.logoForm.logo.split('?')[0] + '?r=' + Math.floor(Math.random() * 1000)
+      }, 1000 * 2)
+    },
+    loadSucess() {
+      this.loadImgLoading = false
     }
   }
 }
 </script>
 
-<style></style>
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
+</style>

+ 212 - 0
src/views/user/customer/market-edit.vue

@@ -0,0 +1,212 @@
+<template>
+  <div class="app-container" style="width: 800px; margin: 0 auto">
+    <div class="form-tips">
+      <p>文件上传完成,保存后进行预览报表。等数据最终确定了,可重新上传新文件,最后再生成报表。</p>
+    </div>
+    <el-form ref="importForm" :model="form" label-width="100px">
+      <el-form-item label="报表月份:" prop="reportDate" :rules="rules.reportDate">
+        <el-date-picker
+          v-model="form.reportDate"
+          type="month"
+          format="yyyy-MM"
+          value-format="yyyy-MM"
+          placeholder="选择月份"
+          style="width: 280px"
+        />
+      </el-form-item>
+      <el-form-item label="报表名称:" prop="reportName" :rules="rules.reportName">
+        <el-input v-model="form.reportName" placeholder="请输入报表名称" maxlength="30" style="width: 280px" />
+      </el-form-item>
+      <el-form-item label="报表文件" prop="filePath" :rules="rules.filePath">
+        <el-upload
+          ref="upload"
+          accept=".zip, .rar"
+          action="https://jsonplaceholder.typicode.com/posts/"
+          :limit="1"
+          :file-list="fileList"
+          :on-success="handleUploadSuccess"
+          :on-remove="handleUploadRemove"
+          :on-change="handleUploadChange"
+          :auto-upload="false"
+        >
+          <el-button slot="trigger" size="small" type="primary"> 选取文件 </el-button>
+          <div slot="tip" class="el-upload__tip">只支持.zip 和 .rar 格式的压缩包文件</div>
+        </el-upload>
+        <input v-show="false" v-model="form.filePath" type="text" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleImportConfirm"> 保存 </el-button>
+        <el-button plain @click="backToList"> 返回 </el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { saveMarketReport, saveReport, getMarketReportById } from '@/api/user/customer/customer'
+
+export default {
+  name: 'MarketEdit',
+  data() {
+    return {
+      form: {
+        marketId: this.$route.query.marketId,
+        id: '',
+        filePath: '', // 数据文件
+        reportDate: '', // 报表月份
+        reportName: '' // 报表月份
+      },
+      loadImgLoading: false,
+      fileList: [],
+      rules: {
+        filePath: [{ required: true, message: '请选择压缩包文件', trigger: ['change'] }],
+        reportDate: [{ required: true, message: '请选择报表数据月份', trigger: 'blur' }],
+        reportName: [{ required: true, message: '请输入报表名称', trigger: 'blur' }]
+      }
+    }
+  },
+  computed: {
+    getToken() {
+      return {
+        token: this.$store.getters.token
+      }
+    },
+    actionUrl() {
+      return process.env.VUE_APP_BASE_API + '/formData/MultiPictareaddData'
+    }
+  },
+  created() {
+    if (this.$route.query.type === 'edit') {
+      this.getMarketReportById({ id: this.$route.query.id })
+    }
+  },
+  methods: {
+    // 获取供应商弹窗详情
+    async getMarketReportById(params) {
+      try {
+        const res = await getMarketReportById(params)
+        this.form = { ...this.form, ...res.data }
+        const file = {
+          name: res.data.fileName,
+          url: ''
+        }
+        this.fileList.push(file)
+      } catch (error) {
+        console.log('error', error)
+      }
+    },
+    // 确定保存
+    async handleImportConfirm() {
+      try {
+        await this.$refs.importForm.validate()
+        this.saveReport()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 保存数据报表
+    async saveReport() {
+      try {
+        await saveReport(this.form)
+        this.fileList = []
+        this.$message.success('数据报表保存成功')
+        this.backToList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 文件上传成功
+    handleUploadSuccess(response, file, fileList) {
+      this.form.filePath = response.url
+      this.fileList = fileList
+    },
+    // 上传文件删除
+    handleUploadRemove(file, fileList) {
+      this.fileList = fileList
+    },
+    handleUploadChange(file, fileList) {
+      this.fileList = fileList
+      this.form.filePath = file.name
+      console.log('222222222222', this.fileList)
+      this.saveMarketReport()
+    },
+    // 上传文件
+    async saveMarketReport() {
+      const file = this.fileList.length > 0 && this.fileList[0]
+      if (!file) return
+      try {
+        const formData = new FormData()
+        formData.append('reportFile', file.raw)
+        const res = await saveMarketReport(formData)
+        this.form.filePath = res.data
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    backToList() {
+      this.$store.dispatch('tagsView/delView', this.$route).then(() => {
+        this.$nextTick(() => {
+          this.$router.replace({
+            path: '/user/customer/market-report-list',
+            query: { marketId: this.$route.query.marketId, shopName: this.$route.query.shopName }
+          })
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style>
+.form-tips {
+  width: 100%;
+  height: 48px;
+  line-height: 48px;
+  background: #f7f7f7;
+  font-size: 12px;
+  color: #333333;
+  border-radius: 8px;
+  box-sizing: border-box;
+  padding: 0 10px;
+  margin-bottom: 40px;
+}
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 30px;
+  color: #999999;
+}
+.el-form-item__label {
+  text-align: right !important;
+}
+.el-upload__tip {
+  line-height: 20px;
+  color: red;
+  text-align: left;
+}
+.span_tip {
+  font-size: 12px;
+  color: red;
+  margin-left: 5px;
+}
+.filter-item-temp {
+  width: 100px;
+}
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
+</style>

+ 293 - 0
src/views/user/customer/market-list.vue

@@ -0,0 +1,293 @@
+<template>
+  <div class="app-container">
+    <!-- 顶部操作区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>供应商名称:</span>
+        <el-input
+          v-model="listQuery.shopName"
+          placeholder="供应商名称"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+        <el-button type="primary" @click="shopDialogVisible = true"> 添加供应商 </el-button>
+      </div>
+    </div>
+    <!-- 列表 -->
+    <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="660">
+      <el-table-column prop="shopName" fixed label="供应商名称" align="center" />
+      <el-table-column prop="linkMan" label="联系人" align="center" />
+      <el-table-column prop="contractMobile" label="手机号" align="center">
+        <template slot-scope="{ row }">
+          {{ row.contractMobile ? row.contractMobile : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="status" label="供应商状态" align="center" width="100">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.status === 90" type="success" size="small">已上线</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="status" label="logo" align="center" width="180">
+        <template slot-scope="{ row }">
+          <el-popover v-if="row.logo" placement="top-start" title="" width="180" trigger="hover">
+            <img :src="row.logo" alt="" style="width: 94px; height: 50px" />
+            <img slot="reference" :src="row.logo" alt="" style="width: 94px; height: 50px" />
+          </el-popover>
+          <span v-else>---</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="recentlyTime" label="最近报表时间" align="center">
+        <template slot-scope="{ row }">
+          {{ row.recentlyTime ? row.recentlyTime : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="addTime" label="添加时间" align="center">
+        <template slot-scope="{ row }">
+          {{ row.addTime ? row.addTime : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" width="400">
+        <template slot-scope="{ row }">
+          <el-button type="success" size="mini" style="margin: 4px" @click="handleRecordDetail(1, row)">
+            上传LOGO
+          </el-button>
+          <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(2, row)">
+            数据报表
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[100]"
+      :page-size="100"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getMarkShopList"
+    />
+    <!--  选择供应商弹窗 -->
+    <shop-dialog v-if="shopDialogVisible" ref="shopDialog" @confirm="handleAddShopConfirm" @cancel="handleCancel" />
+    <!-- 上传LOGO -->
+    <el-dialog title="上传LOGO" :visible.sync="dialogFormVisible" width="500px">
+      <el-form ref="dataForm" :model="renewCustome" :rules="rules" label-position="right">
+        <el-form-item prop="logo" label="logo">
+          <div class="form-el-upload" style="width: 148px; height: 148px">
+            <el-upload
+              class="avatar-uploader"
+              :action="actionUrl"
+              :headers="getToken"
+              :show-file-list="false"
+              :on-success="handleSuccess"
+              :before-upload="beforeUpload"
+            >
+              <div v-loading="loadImgLoading" class="avatar" style="width: 148px; height: 148px; display: block">
+                <img
+                  v-if="renewCustome.logo"
+                  :src="renewCustome.logo"
+                  style="width: 148px; height: 148px; display: block"
+                  @error="reloadImage"
+                  @load="loadSucess"
+                />
+                <i
+                  v-else
+                  class="el-icon-plus avatar-uploader-icon"
+                  style="width: 148px; height: 148px; line-height: 148px"
+                ></i>
+              </div>
+            </el-upload>
+            <p class="uploader-tips">注:请尽量上传126*50(px)尺寸的图片。</p>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleConfirm">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getMarkShopList, saveMarketShop, uploadShopLogo } from '@/api/user/customer/customer'
+import ShopDialog from './components/shop-market-dialog'
+export default {
+  name: 'RecordList',
+  components: { ShopDialog },
+  filters: {},
+  data() {
+    return {
+      isLoading: true,
+      listQuery: {
+        shopName: '',
+        status: '',
+        pageNum: 1,
+        pageSize: 20
+      },
+      list: [],
+      total: 0,
+      shopDialogVisible: false,
+      dialogFormVisible: false,
+      loadImgLoading: false,
+      renewCustome: {
+        id: '',
+        logo: ''
+      },
+      rules: {
+        logo: [{ required: true, message: '请上传弹窗图片', trigger: 'blur' }]
+      }
+    }
+  },
+  computed: {
+    getToken() {
+      return {
+        token: this.$store.getters.token
+      }
+    },
+    actionUrl() {
+      return process.env.VUE_APP_BASE_API + '/formData/MultiPictareaddData'
+    }
+  },
+  created() {
+    this.getList()
+  },
+  mounted() {},
+  methods: {
+    // 获取行为记录列表
+    getList() {
+      this.list = []
+      this.listQuery.pageNum = 1
+      this.getMarkShopList()
+    },
+    // 确认选择供应商
+    handleAddShopConfirm(data) {
+      console.log('data', data)
+      const shopIds = []
+      data.forEach((ele) => {
+        shopIds.push(ele.shopId)
+      })
+      this.saveMarketShop({ shopIds: shopIds.join(',') })
+    },
+    // 取消选择供应商
+    handleCancel() {
+      this.shopDialogVisible = false
+      this.$refs.shopDialog.visible = false
+    },
+    // 上传logo
+    handleConfirm() {
+      this.$refs['dataForm'].validate((valid) => {
+        if (valid) {
+          this.uploadShopLogo(this.renewCustome)
+        } else {
+          return false
+        }
+      })
+    },
+    // 获取潜客搜集供应商列表
+    async getMarkShopList() {
+      try {
+        this.isLoading = true
+        const res = await getMarkShopList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 保存添加统计供应商
+    async saveMarketShop(params) {
+      try {
+        await saveMarketShop(params)
+        this.shopDialogVisible = false
+        this.$message.success('操作成功')
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 上传logo
+    async uploadShopLogo(params) {
+      try {
+        await uploadShopLogo(params)
+        this.dialogFormVisible = false
+        this.$message.success('操作成功')
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 操作
+    handleRecordDetail(type, row) {
+      switch (type) {
+        case 1: // 上传logo
+          this.renewCustome.id = row.id
+          console.log('renewCustome', this.renewCustome)
+          this.dialogFormVisible = true
+          break
+        case 2: // 跳转数据报表
+          this.$router.push({
+            path: '/user/customer/market-report-list',
+            query: { marketId: row.id, shopName: row.shopName }
+          })
+          break
+      }
+    },
+    // 上传图标事件
+    handleSuccess(res, file) {
+      this.loadImgLoading = true
+      this.$nextTick(() => {
+        setTimeout(() => {
+          this.renewCustome.logo = res.data
+        }, 1000 * 2)
+      })
+    },
+    // 对上传图片的大小、格式进行限制
+    beforeUpload(file) {
+      const isJPG = file.type === 'image/jpeg'
+      const isJPG2 = file.type === 'image/jpg'
+      const isPNG = file.type === 'image/png'
+      const isLt5M = file.size / 1024 / 1024 < 5
+      if (!isJPG && !isJPG2 && !isPNG) {
+        this.$message.error('只支持jpg或png格式图片')
+      }
+      if (!isLt5M) {
+        this.$message.error('请上传5MB以内的图片!')
+      }
+      return (isJPG || isJPG2 || isPNG) && isLt5M
+    },
+    reloadImage() {
+      this.loadImgLoading = true
+      setTimeout(() => {
+        this.renewCustome.logo = this.renewCustome.logo.split('?')[0] + '?r=' + Math.floor(Math.random() * 1000)
+      }, 1000 * 2)
+    },
+    loadSucess() {
+      this.loadImgLoading = false
+    }
+  }
+}
+</script>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.uploader-tips {
+  position: absolute;
+  bottom: 0;
+  left: 160px;
+  line-height: 28px;
+  color: red;
+  margin: 0;
+}
+</style>

+ 188 - 0
src/views/user/customer/market-report-list.vue

@@ -0,0 +1,188 @@
+<template>
+  <div class="app-container">
+    <!-- 顶部操作区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>报表名称:</span>
+        <el-input
+          v-model="listQuery.reportName"
+          placeholder="报表名称"
+          clearable
+          @keyup.enter.native="getList"
+          @clear="getList"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList"> 查询 </el-button>
+        <el-button type="primary" @click="handleUpdate('add')"> 上传报表 </el-button>
+        <el-button type="primary" @click="handleDownloadTemp"> 下载模板 </el-button>
+      </div>
+    </div>
+    <div class="tags-sms">
+      <span class="tags-sms-span">供应商:{{ shopName }}</span>
+    </div>
+    <!-- 列表 -->
+    <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="600">
+      <el-table-column label="序号" align="center" width="60">
+        <template slot-scope="scope">{{ scope.$index + 1 }}</template>
+      </el-table-column>
+      <el-table-column prop="reportDate" label="报表数据日期" align="center" width="200" />
+      <el-table-column prop="reportName" label="报表名称" align="center" />
+      <el-table-column prop="visible" label="报表生成状态" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.visible === 1" type="success" size="small">已生成</el-tag>
+          <el-tag v-if="row.visible === 2" type="danger" size="small">未生成</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="reportTime" label="最近生成时间" align="center">
+        <template slot-scope="{ row }">
+          {{ row.reportTime ? row.reportTime : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="addTime" label="添加时间" align="center">
+        <template slot-scope="{ row }">
+          {{ row.addTime ? row.addTime : '---' }}
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center">
+        <template slot-scope="{ row }">
+          <el-button type="primary" size="mini" style="margin: 2px" @click="handleSitting(row)">生成报表</el-button>
+          <el-button type="primary" size="mini" style="margin: 2px" @click="handleUpdate('edit', row)"> 编辑</el-button>
+          <el-button type="success" size="mini" style="margin: 2px" @click="handlePreview(row)">预览</el-button>
+          <el-button type="danger" size="mini" style="margin: 2px" @click="handleDeleteTag(row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 页码 -->
+    <pagination
+      :total="total"
+      :page-sizes="[100]"
+      :page-size="100"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getMarketReportList"
+    />
+  </div>
+</template>
+
+<script>
+import { getMarketReportList, updateVisible, deleteMarketReport } from '@/api/user/customer/customer'
+import { downloadWithUrl } from '@/utils'
+export default {
+  name: 'CustomerStatList',
+  filters: {},
+  data() {
+    return {
+      shopName: this.$route.query.shopName,
+      isLoading: true,
+      time: '',
+      listQuery: {
+        marketId: this.$route.query.marketId,
+        reportName: '',
+        pageNum: 1,
+        pageSize: 100
+      },
+      list: [],
+      total: 0
+    }
+  },
+  computed: {},
+  created() {
+    this.getList()
+  },
+  mounted() {},
+  methods: {
+    // 获取列表
+    async getList() {
+      // this.list = []
+      this.listQuery.pageNum = 1
+      this.getMarketReportList()
+    },
+    // 获取列表
+    async getMarketReportList() {
+      try {
+        this.isLoading = true
+        const res = await getMarketReportList(this.listQuery)
+        this.list = res.data.results
+        this.total = res.data.totalRecord
+        this.isLoading = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 生成报表
+    handleSitting(row) {
+      this.updateVisible({ id: row.id })
+    },
+    // 调用生成报表API
+    async updateVisible(params) {
+      try {
+        await updateVisible(params)
+        this.$message.success('报表生成成功')
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 删除报表
+    async handleDeleteTag(row) {
+      try {
+        await this.$confirm('确定删除该报表数据吗?', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        this.deleteMarketReport({ id: row.id })
+      } catch (error) {
+        this.$message.info('已取消删除操作')
+      }
+    },
+    // 调用删除报备
+    async deleteMarketReport(params) {
+      try {
+        await deleteMarketReport(params)
+        this.$message.success('报表删除成功')
+        this.getList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 下载数据报表模板
+    handleDownloadTemp() {
+      downloadWithUrl('/temp/供应商报表文件上传模板.zip', '供应商报表文件上传模板.zip')
+    },
+    // 跳转预览
+    handlePreview(row) {
+      const urls = `${process.env.VUE_APP_CAIMEI_URL}/supplier/charts.html?type=1&shopId=${row.shopId}&marketReportId=${row.id}`
+      window.open(urls, '_blank')
+    },
+    // 添加/编辑
+    handleUpdate(type, row) {
+      if (type === 'add') {
+        this.$router.push({
+          path: '/user/customer/market-edit',
+          query: { marketId: this.listQuery.marketId, type: type, shopName: this.$route.query.shopName }
+        })
+      } else {
+        this.$router.push({
+          path: '/user/customer/market-edit',
+          query: { marketId: this.listQuery.marketId, type: type, id: row.id, shopName: this.$route.query.shopName }
+        })
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.tags-sms {
+  width: 100%;
+  height: auto;
+  font-size: 16px;
+  color: #333333;
+  line-height: 28px;
+  box-sizing: border-box;
+  padding: 5px;
+}
+</style>

+ 19 - 10
src/views/user/record/list.vue

@@ -100,15 +100,15 @@
           />
         </div>
         <div class="filter-control">
-          <span>协销ID:</span>
-          <el-input
-            v-model="listQuery.spName"
-            placeholder="协销"
-            clearable
-            style="width: 120px"
-            @keyup.enter.native="getList"
-            @clear="getList"
-          />
+          <span>协销:</span>
+          <el-select v-model="listQuery.headUserId" placeholder="协销" @change="getList">
+            <el-option
+              v-for="item in sellerList"
+              :key="item.serviceProviderId"
+              :label="item.linkMan"
+              :value="item.serviceProviderId"
+            />
+          </el-select>
         </div>
         <div class="filter-control">
           <span>内容库ID:</span>
@@ -232,6 +232,7 @@ import { fetchRecordList, getKeyword, getPageType } from '@/api/user/record/reco
 import { fetchShopRelevanceList, searchBehaviorList } from '@/api/user/supplier/supplier'
 import { export_json_to_excel } from '@/vendor/Export2Excel'
 import pickerOptions from '@/utils/time-picker.js'
+import { getServiceList } from '@/api/library/keyword'
 const defaultListQuery = {
   todayType: 0, // 0 今日数据 1 以往数据
   ip: '', // 访问人ID
@@ -249,7 +250,9 @@ const defaultListQuery = {
   startTime: '',
   endTime: '',
   pageNum: 1,
-  pageSize: 100
+  pageSize: 100,
+  headUserId: '', // 协销id
+  productArchiveId: '' // 内容库id
 }
 export default {
   name: 'RecordList',
@@ -294,6 +297,7 @@ export default {
       typesOptions: [], // 页面类型
       tagsOptions: [],
       tagsList: [],
+      sellerList: [], // 协销列表
       tabsCurrent: 0,
       tableHeight: window.innerHeight - 120, // 表格动态高度
       screenHeight: window.innerHeight // 内容区域高度
@@ -320,6 +324,7 @@ export default {
     this.getList()
     this.getKeyword()
     this.getPageType()
+    this.getServiceList()
   },
   mounted() {
     // window.onresize:浏览器尺寸变化响应事件
@@ -545,6 +550,10 @@ export default {
         return array
       }
       return value.split(',')
+    },
+    async getServiceList() {
+      const { data } = await getServiceList()
+      this.sellerList = data
     }
   }
 }