Browse Source

达人公海分支

朱鑫波 2 years ago
parent
commit
52707e6eb1
39 changed files with 10628 additions and 1112 deletions
  1. 227 0
      src/api/accountManagement/accountManagement.js
  2. 128 0
      src/api/goodsManagement/goods.js
  3. 30 0
      src/api/index.js
  4. 138 0
      src/api/operation/operation.js
  5. 20 0
      src/api/promoter/promoter.js
  6. 57 0
      src/api/supplyChain/supplyChain.js
  7. 31 0
      src/main.js
  8. 1 0
      src/store/modules/user.js
  9. 37 35
      src/utils/request.js
  10. 402 0
      src/views/accountManagement/accountClaim.vue
  11. 396 0
      src/views/accountManagement/advertiserList.vue
  12. 432 0
      src/views/accountManagement/myAccount.vue
  13. 418 0
      src/views/accountManagement/myProject.vue
  14. 556 0
      src/views/accountManagement/projectList.vue
  15. 461 0
      src/views/accountManagement/transferList.vue
  16. 236 93
      src/views/goodsManagement/collectSample.vue
  17. 202 83
      src/views/goodsManagement/goodsDetail.vue
  18. 423 144
      src/views/goodsManagement/goodslist.vue
  19. 23 12
      src/views/goodsManagement/promoterSelect.vue
  20. 23 8
      src/views/goodsManagement/samplingDetail.vue
  21. 622 73
      src/views/goodsManagement/samplingList.vue
  22. 64 29
      src/views/goodsManagement/selectTree.vue
  23. 136 14
      src/views/goodsManagement/setSampleCollection.vue
  24. 155 0
      src/views/goodsManagement/textEditor.vue
  25. BIN
      src/views/goodsManagement/zg.png
  26. 371 390
      src/views/index.vue
  27. 153 47
      src/views/promoter/promoterList.vue
  28. 554 0
      src/views/promoter/promoterSeas.vue
  29. 838 0
      src/views/report/operationHome.vue
  30. 835 0
      src/views/report/statistics.vue
  31. 1067 0
      src/views/staging.vue
  32. 530 0
      src/views/supplyChain/channelDetails.vue
  33. 352 0
      src/views/supplyChain/channelList.vue
  34. 7 26
      src/views/supplyChain/goodsDetails.vue
  35. 11 47
      src/views/supplyChain/indexDetails.vue
  36. 9 24
      src/views/supplyChain/investment.vue
  37. 18 48
      src/views/supplyChain/investmentDetails.vue
  38. 654 0
      src/views/supplyChain/queryProduct.vue
  39. 11 39
      src/views/supplyChain/service.vue

+ 227 - 0
src/api/accountManagement/accountManagement.js

@@ -0,0 +1,227 @@
+import request from '@/utils/request'
+
+// 广告主列表
+export function getAdvertiserList(query) {
+    return request({
+        url: '/kuaishou/advertiser/list',
+        method: 'get',
+        params: query
+    })
+}
+// 新增广告主
+export function addAdvertiser(query) {
+    return request({
+        url: '/kuaishou/advertiser/add',
+        method: 'post',
+        data: query
+    })
+}
+// 修改广告主
+export function editAdvertiser(query) {
+    return request({
+        url: '/kuaishou/advertiser/edit',
+        method: 'post',
+        data: query
+    })
+}
+
+// 删除广告主
+export function deleteById(query) {
+    return request({
+        url: '/kuaishou/advertiser/deleteById',
+        method: 'get',
+        params: query
+    })
+}
+
+
+
+
+
+
+// 项目列表
+export function getProjectList(query) {
+    return request({
+        url: '/kuaishou/project/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 获取优化目标
+export function getOcpxActionType(query) {
+    return request({
+        url: '/kuaishou/project/getOcpxActionType',
+        method: 'get',
+        params: query
+    })
+}
+
+// 新增项目
+export function addProject(query) {
+    return request({
+        url: '/kuaishou/project/add',
+        method: 'post',
+        data: query
+    })
+}
+// 修改项目
+export function editProject(query) {
+    return request({
+        url: '/kuaishou/project/edit',
+        method: 'post',
+        data: query
+    })
+}
+// 删除项目
+export function peojectDeleteById(query) {
+    return request({
+        url: '/kuaishou/project/deleteById',
+        method: 'get',
+        params: query
+    })
+}
+
+
+// 我的项目列表
+export function getMyProjects(query) {
+    return request({
+        url: '/kuaishou/project/getMyProjects',
+        method: 'get',
+        params: query
+    })
+}
+
+// 通过项目id查账户
+export function getAccountByProjectId(query) {
+    return request({
+        url: '/kuaishou/account/getAccountByProjectId',
+        method: 'get',
+        params: query
+    })
+}
+
+// 项目参与人员
+export function queryProjectUsers(query) {
+    return request({
+        url: '/kuaishou/project/queryProjectUsers',
+        method: 'get',
+        params: query
+    })
+}
+
+// 删除项目参与人员
+export function deleteProjectUsers(query) {
+    return request({
+        url: '/kuaishou/project/deleteProjectUsers',
+        method: 'post',
+        params: query
+    })
+}
+
+// 新增项目参与人员
+export function addProjectUsers(query) {
+    return request({
+        url: '/kuaishou/project/addProjectUsers',
+        method: 'post',
+        data: query
+    })
+}
+
+
+
+
+
+// 未认领账户
+export function getUnboundAccountList(query) {
+    return request({
+        url: '/kuaishou/account/unboundAccountList',
+        method: 'get',
+        params: query
+    })
+}
+
+// 我的账户
+export function getAccountList(query) {
+    return request({
+        url: '/kuaishou/account/list',
+        method: 'get',
+        params: query
+    })
+}
+// 我的账户-删除
+export function accountDeleteById(query) {
+    return request({
+        url: '/kuaishou/account/deleteById',
+        method: 'get',
+        params: query
+    })
+}
+// 我的账户-转让
+export function addTransferAccount(query) {
+    return request({
+        url: '/kuaishou/transfer/addTransferAccount',
+        method: 'post',
+        data: query
+    })
+}
+// 我的账户-转让
+export function editTransferAccountStatus(query) {
+    return request({
+        url: '/kuaishou/transfer/editTransferAccountStatus',
+        method: 'post',
+        data: query
+    })
+}
+// 我的账户-修改
+export function editAccountStatus(query) {
+    return request({
+        url: '/kuaishou/account/edit',
+        method: 'get',
+        params: query
+    })
+}
+
+
+// 转让审核列表
+export function transferList(query) {
+    return request({
+        url: '/kuaishou/transfer/list',
+        method: 'get',
+        params: query
+    })
+}
+
+
+// 认领账户
+export function claimAccount(query) {
+    return request({
+        url: '/kuaishou/account/claimAccount',
+        method: 'post',
+        data: query
+    })
+}
+
+// 取消认领
+export function deleteClaimAccount(query) {
+    return request({
+        url: '/kuaishou/account/deleteClaimAccount',
+        method: 'get',
+        params: query
+    })
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 128 - 0
src/api/goodsManagement/goods.js

@@ -8,6 +8,22 @@ export function getItemPreview(query) {
         params: query
     })
 }
+// 商品解绑
+export function unbindingItem(query) {
+    return request({
+        url: '/item/unbindingItem',
+        method: 'delete',
+        params: query
+    })
+}
+// 商品批量审核
+export function batchItemProcess(query) {
+    return request({
+        url: '/item/batchItemProcess',
+        method: 'post',
+        data: query
+    })
+}
 
 // 获取商品列表
 export function getItemList(query) {
@@ -66,6 +82,26 @@ export function editItem(query) {
     })
 }
 
+// 品类下拉
+
+export function getCategoryIds(query) {
+    return request({
+        url: '/item/getCategoryIds',
+        method: 'get',
+        params: query
+    })
+}
+
+// 活动ID下拉
+
+export function getActivityIds(query) {
+    return request({
+        url: '/item/getActivityIds',
+        method: 'get',
+        params: query
+    })
+}
+
 //领样预览
 
 export function preview(query) {
@@ -96,6 +132,47 @@ export function editPreview(query) {
     })
 }
 
+//修改状态-直接跳到待上传作业
+
+export function toUpdateTask(query) {
+    return request({
+        url: '/itemCollectSamples/updateTask',
+        method: 'put',
+        data: query
+    })
+}
+
+
+//批量审核
+
+export function batchProcess(query) {
+    return request({
+        url: '/itemCollectSamples/batchProcess',
+        method: 'post',
+        data: query
+    })
+}
+
+
+//领样作废
+
+export function removePreview(query) {
+    return request({
+        url: '/itemCollectSamples/remove',
+        method: 'delete',
+        params: query
+    })
+}
+
+//详情编辑
+
+export function updatePreview(query) {
+    return request({
+        url: '/itemCollectSamples/update',
+        method: 'put',
+        data: query
+    })
+}
 
 // 领样列表
 export function getList(query) {
@@ -115,6 +192,15 @@ export function getCompany(query) {
         params: query
     })
 }
+// 修改快递单号
+export function updateCourierNumber(query) {
+    return request({
+        url: '/itemCollectSamples/updateCourierNumber',
+        method: 'get',
+        params: query
+    })
+}
+
 
 
 //  详情
@@ -136,6 +222,48 @@ export function getPromoterInfo(query) {
     })
 }
 
+//  物流详情
+export function courierNumberInfo(query) {
+    return request({
+        url: '/itemCollectSamples/courierNumberInfo',
+        method: 'get',
+        params: query
+    })
+}
+
+
+
+//  达人详情
+export function copyInfo(query) {
+    return request({
+        url: '/itemCollectSamples/copyInfo',
+        method: 'get',
+        params: query
+    })
+}
+
+
+//获取图片文字
+
+export function readImage(query) {
+    return request({
+        url: '/kuaishou/promoter/readImage',
+        method: 'post',
+        data: query
+    })
+}
+
+
+//获取图片文字
+
+export function getItemDetailByItemId(query) {
+    return request({
+        url: '/item/getItemDetailByItemId',
+        method: 'get',
+        params: query
+    })
+}
+
 
 
 

+ 30 - 0
src/api/index.js

@@ -70,6 +70,36 @@ export function getTimeRatio(query) {
     })
 }
 
+// 工作台-个人信息
+
+export function getPersonalInfo(query) {
+    return request({
+        url: '/itemCollectSamples/getPersonalInfo',
+        method: 'get',
+        params: query
+    })
+}
+
+// 工作台-订单数据
+export function getOrderData(query) {
+    return request({
+        url: '/itemCollectSamples/getOrderData',
+        method: 'get',
+        params: query
+    })
+}
+
+// 工作台-订单数据
+export function getDataAnalysis(query) {
+    return request({
+        url: '/itemCollectSamples/getDataAnalysis',
+        method: 'get',
+        params: query
+    })
+}
+
+
+
 
 
 

+ 138 - 0
src/api/operation/operation.js

@@ -0,0 +1,138 @@
+import request from '@/utils/request'
+
+// 运营首页-头部数据汇总
+export function getOperateHomePageHead(query) {
+    return request({
+        url: '/report/account/operateHomePageHead',
+        method: 'get',
+        params: query
+    })
+}
+// 项目维度数据
+export function getProjectCostList(query) {
+    return request({
+        url: '/report/account/getProjectCostList',
+        method: 'get',
+        params: query
+    })
+}
+// 运营组维度数据
+export function getOperationsGroupCostList(query) {
+    return request({
+        url: '/report/account/getOperationsGroupCostList',
+        method: 'get',
+        params: query
+    })
+}
+// 运营数据
+export function getOperateCostList(query) {
+    return request({
+        url: '/report/account/getOperateCostList',
+        method: 'get',
+        params: query
+    })
+}
+// 运营数据-趋势图
+export function getOperateCostTrendChartList(query) {
+    return request({
+        url: '/report/account/getOperateCostTrendChartList',
+        method: 'get',
+        params: query
+    })
+}
+
+
+//  项目列表
+
+export function getProjectAndAccountByUserId(query) {
+    return request({
+        url: '/kuaishou/project/getProjectAndAccountByUserId',
+        method: 'get',
+        params: query
+    })
+}
+//  统计报表-总计
+
+export function getStatisticalReportHead(query) {
+    return request({
+        url: '/report/account/getStatisticalReportHead',
+        method: 'post',
+        data: query
+    })
+}
+
+// 访问量统计趋势图
+export function getvisitorStatisticsTrendChartList(query) {
+    return request({
+        url: '/report/account/getvisitorStatisticsTrendChartList',
+        method: 'post',
+        data: query
+    })
+}
+
+// 访问量统计趋势图-点击展示数据
+export function nodeAccountCost(query) {
+    return request({
+        url: '/report/account/nodeAccountCost',
+        method: 'post',
+        data: query
+    })
+}
+
+// 账户数据报表
+export function getAccountDataReport(query) {
+    return request({
+        url: '/report/account/getAccountDataReport',
+        method: 'post',
+        data: query
+    })
+}
+
+// 自定义列
+export function getReportFields(query) {
+    return request({
+        url: '/report/account/getReportFields',
+        method: 'get',
+        params: query
+    })
+}
+
+// 自定义列-存储
+export function addKuaishouFields(query) {
+    return request({
+        url: '/report/account/addKuaishouFields',
+        method: 'post',
+        data: query
+    })
+}
+// 自定义列-获取
+export function getKuaishouFieldsByUserId(query) {
+    return request({
+        url: '/report/account/getKuaishouFieldsByUserId',
+        method: 'get',
+        params: query
+    })
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 20 - 0
src/api/promoter/promoter.js

@@ -9,6 +9,15 @@ export function getPromoterList(query) {
     })
 }
 
+// 获取达人公海
+export function getPromoterList2(query) {
+    return request({
+        url: '/kuaishou/promoter/list2',
+        method: 'get',
+        params: query
+    })
+}
+
 // 获取达人列表
 export function getPromoterDetail(query) {
     return request({
@@ -36,6 +45,17 @@ export function editPromoter(query) {
     })
 }
 
+// 删除达人
+export function deleteById(query) {
+    return request({
+        url: '/kuaishou/promoter/deleteById',
+        method: 'get',
+        params: query
+    })
+}
+
+
+
 
 
 

+ 57 - 0
src/api/supplyChain/supplyChain.js

@@ -16,6 +16,16 @@ export function downFilePost(url, parameter) {
   })
 }
 
+export function downFile(url, parameter) {
+  return request({
+    url: url,
+    data: parameter,
+    method: 'get',
+    responseType: 'blob',
+    timeout: 12000000, // 请求超时时间
+  })
+}
+
 // 获取达人top3
 export function getTopPromoterByItemId(query) {
   return request({
@@ -158,6 +168,53 @@ export function getUserItemTotal(query) {
   })
 }
 
+//查询商品列表
+export function getQueryProductListl(query) {
+  return request({
+    url: '/itemCollectSamples/queryProductList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+//查询渠道列表
+export function getBdReportList(query) {
+  return request({
+    url: '/isv/supply_chain/bdReportList',
+    method: 'get',
+    params: query
+  })
+}
+//查询渠道详情
+export function getBdDetailList(query) {
+  return request({
+    url: '/isv/supply_chain/bdDetailList',
+    method: 'get',
+    params: query
+  })
+}
+//查询渠道详情汇总
+export function getBdTotal(query) {
+  return request({
+    url: '/isv/supply_chain/bdTotal',
+    method: 'get',
+    params: query
+  })
+}
+//查询渠道详情-导出
+export function exportBdDetail(query) {
+  return request({
+    url: '/isv/supply_chain/exportBdDetail',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+
+
 
 
 

+ 31 - 0
src/main.js

@@ -70,6 +70,37 @@ Vue.use(plugins)
 Vue.use(VueMeta)
 DictData.install()
 
+
+Vue.prototype.allMoney = function (num, n) {
+  n = n || 2;
+  let symbol = ",";
+  if (num === null) return num;
+  if (typeof num !== "number")
+    throw new TypeError("num参数应该是一个number类型");
+  if (n < 0) throw new Error("参数n不应该小于0");
+  let hasDot = parseInt(num) != num; //这里检测num是否为小数,true表示小数
+  let m = n != undefined && n != null ? n : 1;
+  num =
+    m == 0
+      ? num.toFixed(m) + "."
+      : hasDot
+        ? n
+          ? num.toFixed(n)
+          : num
+        : num.toFixed(m);
+  symbol = symbol || ",";
+  num = num
+    .toString()
+    .replace(/(\d)(?=(\d{3})+\.)/g, function (match, p1, p2) {
+      return p1 + symbol;
+    });
+  if (n == 0 || (!hasDot && !n)) {
+    //如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
+    num = num.substring(0, num.indexOf("."));
+  }
+  return num;
+}
+
 /**
  * If you don't want to use mock-server
  * you want to use MockJs for mock api

+ 1 - 0
src/store/modules/user.js

@@ -88,6 +88,7 @@ const user = {
           commit('SET_TOKEN', '')
           commit('SET_ROLES', [])
           commit('SET_PERMISSIONS', [])
+          localStorage.clear()
           removeToken()
           resolve()
         }).catch(error => {

+ 37 - 35
src/utils/request.js

@@ -18,7 +18,7 @@ const service = axios.create({
   // http://ruixuan.api.tjyourong.com.cn 线上
   // http://192.168.0.195:9003 测试
   // http://192.168.1.143:9003 西安
-  // http://192.168.0.216:9003 蒙蒙
+  // http://192.168.1.148:9003 蒙蒙
   baseURL: 'http://192.168.0.195:9003',
   // 超时
   timeout: 300000
@@ -65,28 +65,28 @@ service.interceptors.request.use(config => {
   }
   return config
 }, error => {
-    console.log(error)
-    Promise.reject(error)
+  console.log(error)
+  Promise.reject(error)
 })
 
 // 响应拦截器
 service.interceptors.response.use(res => {
-    // 未设置状态码则默认成功状态
-    const code = res.data.code || 200;
-    // 获取错误信息
-    const msg = errorCode[code] || res.data.msg || errorCode['default']
-    // 二进制数据则直接返回
-    if(res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer'){
-      return res.data
-    }
-    if (code === 401) {
-      if (!isRelogin.show) {
-        isRelogin.show = true;
-        MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
-          confirmButtonText: '重新登录',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }
+  // 未设置状态码则默认成功状态
+  const code = res.data.code || 200;
+  // 获取错误信息
+  const msg = errorCode[code] || res.data.msg || errorCode['default']
+  // 二进制数据则直接返回
+  if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
+    return res.data
+  }
+  if (code === 401) {
+    if (!isRelogin.show) {
+      isRelogin.show = true;
+      MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+        confirmButtonText: '重新登录',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }
       ).then(() => {
         isRelogin.show = false;
         store.dispatch('LogOut').then(() => {
@@ -96,22 +96,24 @@ service.interceptors.response.use(res => {
         isRelogin.show = false;
       });
     }
-      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
-    } else if (code === 500) {
-      Message({
-        message: msg,
-        type: 'error'
-      })
-      return Promise.reject(new Error(msg))
-    } else if (code !== 200 && code !== 1) {
-      Notification.error({
-        title: msg
-      })
-      return Promise.reject('error')
-    } else {
-      return res.data
-    }
-  },
+    return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+  } 
+  else if (code === 500) {
+    Message({
+      message: res.data.message,
+      type: 'error'
+    })
+    return Promise.reject(new Error(res.data.message))
+  } 
+  else if (code !== 200 && code !== 1) {
+    Notification.error({
+      title: res.message
+    })
+    return Promise.reject('error')
+  } else {
+    return res.data
+  }
+},
   error => {
     console.log('err' + error)
     let { message } = error;

+ 402 - 0
src/views/accountManagement/accountClaim.vue

@@ -0,0 +1,402 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="账户ID" prop="accountId">
+        <el-input
+          v-model="queryParams.accountId"
+          placeholder="请输入账户ID"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="快手ID" prop="ksId">
+        <el-input
+          v-model="queryParams.ksId"
+          placeholder="请输入快手ID"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="账户名称" prop="accountName">
+        <el-input
+          v-model="queryParams.accountName"
+          placeholder="请输入账户名称"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+
+      <el-form-item label="认领状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="选择认领状态"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.statusList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <el-table-column
+        label="账户ID"
+        align="center"
+        prop="accountId"
+        width="200px"
+        fixed="left"
+      />
+      <el-table-column label="账户名称" align="center" prop="accountName" width="200px" />
+      <el-table-column label="媒体" align="center" prop="type">
+        <template slot-scope="scope">
+          <div v-if="scope.row.type">
+            {{ scope.row.type | mediaName }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="快手昵称(快手ID)"
+        align="center"
+        prop="ksName"
+        width="200px"
+      >
+        <template slot-scope="scope">
+          <div v-if="scope.row.ksName">{{ scope.row.ksName }}({{ scope.row.ksId }})</div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="accountCreateTime"
+        width="200px"
+      />
+      <el-table-column label="产品名称" align="center" prop="productName" width="200px" />
+      <el-table-column label="运营" align="center" prop="operatorName"> </el-table-column>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" @click="getAccount(scope.row)"
+            >认领</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            :disabled="
+              $store.getters.roles[0] == 'admin' ? false : userId != scope.row.operatorId
+            "
+            @click="cancelAccount(scope.row)"
+            >取消</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改参数配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="150px">
+        <el-form-item label="媒体类型" prop="mediaCode">
+          <el-radio-group v-model="form.mediaCode">
+            <el-radio-button label="JN">磁力金牛</el-radio-button>
+            <el-radio-button label="QC" disabled>千川</el-radio-button>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="账户类型" prop="accountType">
+          <el-radio-group v-model="form.accountType">
+            <el-radio-button :label="1">自运营</el-radio-button>
+            <el-radio-button :label="2">代运营</el-radio-button>
+          </el-radio-group>
+        </el-form-item>
+
+        <el-form-item label="项目" prop="projectId">
+          <el-select
+            ref="optionAdvertiser"
+            v-model="form.projectId"
+            placeholder="选择项目"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.projectList"
+              :key="item.id"
+              :label="item.projectName"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :loading="confirmLoading"
+          >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getAccountList,
+  getMyProjects,
+  getUnboundAccountList,
+  claimAccount,
+  deleteClaimAccount,
+  getAccountByProjectId,
+} from "@/api/accountManagement/accountManagement";
+import { listUser } from "@/api/system/user";
+import { ifError } from "assert";
+export default {
+  name: "AccountClaim",
+  data() {
+    return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      accountId: undefined,
+      // 编辑所用id
+      updateId: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        accountId: undefined,
+        ksId: undefined,
+        accountName: undefined,
+        status: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {
+        statusList: [
+          { value: 1, label: "认领" },
+          { value: 2, label: "未认领" },
+        ],
+      },
+      // 表单参数
+      form: {
+        ocpxActionTypeList: [],
+      },
+      //上传报表下拉数据
+      formList: {
+        personList: [], //新增下拉人员列表
+        projectList: [], //项目列表
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        projectId: [{ required: true, message: "项目必选", trigger: "change" }],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+  },
+  filters: {
+    ocpxActionTypeName(status) {
+      const statusMap = {
+        72: "涨粉",
+        395: "订单支付",
+        192: "直播推广 ROI",
+      };
+      return statusMap[status];
+    },
+    mediaName(status) {
+      const statusMap = {
+        JN: "磁力金牛",
+      };
+      return statusMap[status];
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.getList();
+    });
+  },
+  methods: {
+    listUser() {
+      listUser({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.personList = res.rows;
+      });
+    },
+    getProject() {
+      getMyProjects({ pageNum: 1, pageSize: 10000, userId: this.userId }).then((res) => {
+        this.formList.projectList = res.rows;
+      });
+    },
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+    },
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getUnboundAccountList({ ...this.queryParams, userId: this.userId }).then(
+        (response) => {
+          this.typeList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      // this.handleQuery();
+      this.getList();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+
+    getAccount(item) {
+      //   getAccountByProjectId({ projectId: item.id }).then((res) => {});
+      this.open = true;
+      this.title = "账户绑定";
+      this.getProject();
+      this.accountId = item.accountId;
+      this.reset();
+      this.$nextTick(() => {
+        this.$set(this.form, "mediaCode", "JN");
+        this.$set(this.form, "accountType", 1);
+      });
+    },
+
+    cancelAccount(item) {
+      this.$modal
+        .confirm(`请确认是否取消认领?`)
+        .then(() => {
+          var params = {};
+          params.accountId = item.accountId;
+          params.userId = this.$store.getters.userId;
+          deleteClaimAccount(params)
+            .then((res) => {
+              this.$modal.msgSuccess("取消认领成功");
+              this.resetQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          var params = { ...this.form };
+          params.accountId = this.accountId;
+          params.userId = this.userId;
+          //   params.advertiserId = 2;
+
+          claimAccount({ ...params }).then((res) => {
+            this.open = false;
+            this.confirmLoading = false;
+            this.resetQuery();
+          });
+        }
+      });
+    },
+  },
+};
+</script>

+ 396 - 0
src/views/accountManagement/advertiserList.vue

@@ -0,0 +1,396 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="开户主体名称" prop="advertiserName">
+        <el-input
+          v-model="queryParams.advertiserName"
+          placeholder="请输入广告主开户主体名称"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-document-add"
+          size="mini"
+          @click="handleAdd"
+          >新增广告主</el-button
+        >
+      </el-col>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <el-table-column label="广告主开户主体名称" align="center" prop="advertiserName">
+        <template slot-scope="scope">
+          <a style="color: #409eff; display: block" @click="toProjectList(scope.row)">{{
+            scope.row.advertiserName
+          }}</a>
+        </template>
+      </el-table-column>
+      <el-table-column label="联系人" align="center" prop="userName" />
+      <el-table-column label="联系方式" align="center" prop="mobile">
+        <template slot-scope="scope">
+          {{ scope.row.mobile ? scope.row.mobile : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column label="联系邮箱" align="center" prop="email" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            >编辑</el-button
+          >
+          <el-button size="mini" type="text" @click="handleDelete(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改参数配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="150px">
+        <el-form-item label="创建人" prop="createBy">
+          {{ $store.getters.name }}
+        </el-form-item>
+        <el-form-item label="广告主开户主体名称" prop="advertiserName">
+          <el-input
+            v-model="form.advertiserName"
+            placeholder="请输入广告主开户主体名称"
+            clearable
+            style="width: 240px"
+          />
+        </el-form-item>
+        <el-form-item label="负责人" prop="userId">
+          <el-select
+            v-model="form.userId"
+            placeholder="选择负责人"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="联系方式" prop="mobile">
+          <el-input
+            placeholder="请输入联系方式"
+            style="width: 240px"
+            v-model="form.mobile"
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="联系邮箱" prop="email">
+          <el-input
+            placeholder="请输入联系邮箱"
+            style="width: 240px"
+            v-model="form.email"
+          >
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :loading="confirmLoading"
+          >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getAdvertiserList,
+  addAdvertiser,
+  editAdvertiser,
+  deleteById,
+} from "@/api/accountManagement/accountManagement";
+import { listUser } from "@/api/system/user";
+export default {
+  name: "AccountManagement",
+  data() {
+    let validatePhone = (rule, value, callback) => {
+      /*console.log(rule);
+      console.log(value);
+      console.log(callback);*/
+      if (!value) {
+        callback(new Error("联系方式不能为空!"));
+      }
+      //使用正则表达式进行验证手机号码
+      if (!/^1[3456789]\d{9}$/.test(value)) {
+        callback(new Error("手机号不正确!"));
+      }
+      callback();
+    };
+    var checkEmail = (rules, value, callback) => {
+      if (!value) {
+        callback(new Error("邮箱不能为空!"));
+      } else {
+        // 验证邮箱的正则表达式
+        const regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
+        if (regEmail.test(value)) {
+          return callback();
+        }
+        callback(new Error("请输入合法的邮箱"));
+      }
+    };
+
+    return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 编辑所用id
+      updateId: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        advertiserName: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {},
+      // 表单参数
+      form: {},
+      //上传报表下拉数据
+      formList: {
+        personList: [], //新增下拉人员列表
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        advertiserName: [
+          { required: true, message: "广告主开户主体名称必填", trigger: "blur" },
+        ],
+        userId: [{ required: true, message: "请选择负责人", trigger: "change" }],
+        mobile: {
+          required: true,
+          // message: "联系方式必填",
+          validator: validatePhone,
+          trigger: "blur",
+        },
+        email: {
+          required: true,
+          // message: "联系方式必填",
+          validator: checkEmail,
+          trigger: "blur",
+        },
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.getList();
+      this.listUser();
+    });
+  },
+  methods: {
+    listUser() {
+      listUser({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.personList = res.rows;
+      });
+    },
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+      // if (!!row.saleName) {
+      //   return false;
+      // } else {
+      //   return true;
+      // }
+    },
+    toProjectList(item) {
+      this.$router.replace({
+        path: "/account/projectList",
+        query: {
+          id: item.id,
+          name: item.advertiserName,
+        },
+      });
+    },
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getAdvertiserList(this.queryParams).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      // this.handleQuery();
+      this.getList();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "新建广告主";
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+
+    handleUpdate(item) {
+      this.reset();
+      this.open = true;
+      this.title = "修改广告主";
+      this.$nextTick(() => {
+        this.updateId = item.id;
+        this.$set(this.form, "advertiserName", item.advertiserName);
+        this.$set(this.form, "userId", item.userId);
+        this.$set(this.form, "mobile", item.mobile);
+        this.$set(this.form, "email", item.email);
+      });
+    },
+    /** 删除按钮 */
+    handleDelete(item) {
+      this.$modal
+        .confirm(`请确认是否删除此广告主?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          params.userId = this.$store.getters.userId;
+          deleteById(params)
+            .then((res) => {
+              this.$modal.msgSuccess("删除成功");
+              this.resetQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          var params = { ...this.form };
+          params.createBy = this.userId;
+          if (!!this.updateId) {
+            editAdvertiser({ ...params, id: this.updateId }).then((res) => {
+              this.open = false;
+              this.confirmLoading = false;
+              this.resetQuery();
+            });
+          } else {
+            addAdvertiser(params).then((res) => {
+              this.open = false;
+              this.confirmLoading = false;
+              this.resetQuery();
+            });
+          }
+        }
+      });
+    },
+  },
+};
+</script>

+ 432 - 0
src/views/accountManagement/myAccount.vue

@@ -0,0 +1,432 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="账户ID" prop="accountId">
+        <el-input
+          v-model="queryParams.accountId"
+          placeholder="请输入账户ID"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="账户名称" prop="accountName">
+        <el-input
+          v-model="queryParams.accountName"
+          placeholder="请输入账户名称"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="运营名称" prop="operatorName">
+        <el-input
+          v-model="queryParams.operatorName"
+          placeholder="请输入运营名称"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input
+          v-model="queryParams.projectName"
+          placeholder="请输入项目名称"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <el-table-column
+        label="账户所属人"
+        align="center"
+        prop="operatorName"
+        width="200px"
+      />
+      <el-table-column label="项目名称" align="center" prop="projectName" width="200px" />
+      <el-table-column label="账户ID" align="center" prop="accountId" width="200px" />
+      <el-table-column label="账户名称" align="center" prop="accountName" width="200px" />
+      <el-table-column label="媒体" align="center" prop="mediaCode">
+        <template slot-scope="scope">
+          <div v-if="scope.row.mediaCode">
+            {{ scope.row.mediaCode | mediaName }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="账户状态" align="center" prop="accountStatus" width="200px">
+        <template slot-scope="scope">
+          <div v-if="scope.row.accountStatus">
+            <el-switch
+              v-model="scope.row.accountStatusShow"
+              @change="changeStatus($event, scope.row)"
+            >
+            </el-switch>
+            <!-- {{ scope.row.accountStatus == 1 ? "有效" : "失效" }} -->
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" @click="getAccount(scope.row)"
+            >转移账户</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            :disabled="
+              $store.getters.roles[0] == 'admin' ? false : userId != scope.row.operatorId
+            "
+            @click="cancelAccount(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改参数配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="180px">
+        <el-form-item label="转户人" prop="transferor">
+          {{ personName }}
+        </el-form-item>
+
+        <el-form-item label="受让人" prop="assignee">
+          <el-select
+            ref="optionAdvertiser"
+            v-model="form.assignee"
+            placeholder="选择受让人"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="转户人绩效统计截止日期" prop="transferorDate">
+          <el-date-picker
+            v-model="form.transferorDate"
+            value-format="yyyy-MM-dd"
+            type="date"
+            style="width: 240px"
+            placeholder="选择日期"
+            @change="getTomorrow"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="受让人绩效统计开始日期" prop="assigneeDate">
+          {{ form.assigneeDate }}
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :loading="confirmLoading"
+          >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getAccountList,
+  getMyProjects,
+  getUnboundAccountList,
+  claimAccount,
+  accountDeleteById,
+  addTransferAccount,
+  editAccountStatus,
+  getAccountByProjectId,
+  deleteClaimAccount,
+} from "@/api/accountManagement/accountManagement";
+import { listUser } from "@/api/system/user";
+import { ifError } from "assert";
+export default {
+  name: "MyAccount",
+  data() {
+    return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      accountId: undefined,
+      projectId: undefined,
+      personId: undefined,
+      personName: undefined,
+      // 编辑所用id
+      updateId: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        accountId: undefined,
+        ksId: undefined,
+        accountName: undefined,
+        operatorName: undefined,
+        projectName: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {
+        statusList: [
+          { value: 1, label: "认领" },
+          { value: 2, label: "未认领" },
+        ],
+      },
+      // 表单参数
+      form: {
+        ocpxActionTypeList: [],
+      },
+      //上传报表下拉数据
+      formList: {
+        personList: [], //新增下拉人员列表
+        projectList: [], //项目列表
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        assignee: [{ required: true, message: "受让人必选", trigger: "change" }],
+        transferorDate: [
+          { required: true, message: "转户人绩效截至日期必填", trigger: "change" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+  },
+  filters: {
+    ocpxActionTypeName(status) {
+      const statusMap = {
+        72: "涨粉",
+        395: "订单支付",
+        192: "直播推广 ROI",
+      };
+      return statusMap[status];
+    },
+    mediaName(status) {
+      const statusMap = {
+        JN: "磁力金牛",
+      };
+      return statusMap[status];
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.getList();
+    });
+  },
+  methods: {
+    listUser() {
+      listUser({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.personList = res.rows;
+      });
+    },
+    getProject() {
+      getMyProjects({ pageNum: 1, pageSize: 10000, userId: this.userId }).then((res) => {
+        this.formList.projectList = res.rows;
+      });
+    },
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+    },
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getAccountList({ ...this.queryParams, userId: this.userId }).then((response) => {
+        this.typeList = response.rows.map((item) => {
+          return {
+            ...item,
+            accountStatusShow: item.accountStatus == 1 ? true : false,
+          };
+        });
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      // this.handleQuery();
+      this.getList();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+    changeStatus(value, item) {
+      editAccountStatus({ accountStatus: value ? 1 : 2, id: item.id }).then((res) => {
+        this.$message.success("状态修改成功");
+      });
+    },
+    getAccount(item) {
+      //   getAccountByProjectId({ projectId: item.id }).then((res) => {});
+      this.open = true;
+      this.title = "账户转让";
+      this.listUser();
+      this.accountId = item.accountId;
+      this.projectId = item.projectId;
+      this.personId = item.operatorId;
+      this.personName = item.operatorName;
+      this.reset();
+      this.$nextTick(() => {
+        this.$refs["form"].clearValidate("assignee");
+      });
+    },
+
+    cancelAccount(item) {
+      this.$modal
+        .confirm(`请确认是否删除此项目?`)
+        .then(() => {
+          var params = {};
+          params.accountId = item.accountId;
+          params.userId = this.$store.getters.userId;
+          deleteClaimAccount(params)
+            .then((res) => {
+              this.$modal.msgSuccess("删除成功");
+              this.resetQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+    getTomorrow(value) {
+      console.log(value);
+      if (value) {
+        const date = new Date(value);
+        date.setTime(date.getTime() + 3600 * 1000 * 24);
+
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? "0" + MM : MM;
+        let dd = date.getDate();
+        dd = dd < 10 ? "0" + dd : dd;
+        this.$set(this.form, "assigneeDate", `${y}-${MM}-${dd}`);
+      } else {
+        this.$set(this.form, "assigneeDate", "-");
+      }
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          var params = { ...this.form };
+          params.accountId = this.accountId;
+          params.projectId = this.projectId;
+          params.transferor = this.personId;
+          params.userId = this.userId;
+
+          console.log(params);
+
+          addTransferAccount({ ...params }).then((res) => {
+            this.open = false;
+            this.confirmLoading = false;
+            this.resetQuery();
+          });
+        }
+      });
+    },
+  },
+};
+</script>

+ 418 - 0
src/views/accountManagement/myProject.vue

@@ -0,0 +1,418 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input
+          v-model="queryParams.projectName"
+          placeholder="请输入项目名称"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <el-table-column label="项目名称" align="center" prop="projectName" />
+      <el-table-column label="广告主名称" align="center" prop="advertiserName" />
+      <el-table-column label="媒体" align="center" prop="mediaCode">
+        <template slot-scope="scope">
+          <div v-if="scope.row.mediaCode">
+            {{ scope.row.mediaCode | mediaName }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="销售" align="center" prop="saleName" />
+      <el-table-column label="运营" align="center" prop="operatorName" />
+      <el-table-column label="设计" align="center" prop="designResponsibleName" />
+      <el-table-column
+        label="转化目标"
+        align="center"
+        prop="ocpxActionType"
+        width="200px"
+      >
+        <template slot-scope="scope">
+          <div v-if="scope.row.ocpxActionType">
+            <span
+              v-for="(item, index) in JSON.parse(scope.row.ocpxActionType)"
+              :key="index"
+            >
+              {{ item.ocpxName + "(" + (item.maxValue / 1000).toFixed(2) + ")" }}
+              <br />
+            </span>
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        width="300px"
+      >
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" @click="getAccount(scope.row, 1)"
+            >查看账户</el-button
+          >
+          <el-button size="mini" type="text" @click="getAccount(scope.row, 2)"
+            >查看人员</el-button
+          >
+          <el-button size="mini" type="text" @click="getAccount(scope.row, 3)"
+            >新增人员</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <el-dialog title="查看账户" :visible.sync="lookAccount" width="800px" append-to-body>
+      <el-table
+        v-loading="lookAccountLoading"
+        :data="accountData.lookAccountList"
+        ref="lookAccount"
+      >
+        <el-table-column label="账户ID" align="center" prop="accountId" width="200px" />
+        <el-table-column
+          label="账户名称"
+          align="center"
+          prop="accountName"
+          width="200px"
+        />
+        <el-table-column label="所属人" align="center" prop="operatorName">
+        </el-table-column>
+        <el-table-column label="绑定日期" align="center" prop="createTime">
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="accountData.total > 0"
+        :total="accountData.total"
+        :page.sync="accountData.pageNum"
+        :limit.sync="accountData.pageSize"
+        @pagination="changeAccount"
+      />
+    </el-dialog>
+
+    <el-dialog title="查看人员" :visible.sync="lookPerson" width="800px" append-to-body>
+      <el-tag
+        v-for="tag in personList"
+        :key="tag.userId"
+        closable
+        @close="handleClose(tag)"
+        style="margin: 0 10px 10px 10px"
+      >
+        {{ tag.userName + " | " + (tag.roleName ? tag.roleName : "-") }}
+      </el-tag>
+    </el-dialog>
+
+    <!-- 添加或修改参数配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="150px">
+        <el-form-item label="人员" prop="userIds">
+          <el-select
+            ref="optionOperator"
+            v-model="form.userIds"
+            placeholder="选择人员"
+            multiple
+            clearable
+            filterable
+            style="width: 240px"
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :loading="confirmLoading"
+          >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getMyProjects,
+  getAccountByProjectId,
+  queryProjectUsers,
+  deleteProjectUsers,
+  addProjectUsers,
+} from "@/api/accountManagement/accountManagement";
+import { listUser } from "@/api/system/user";
+export default {
+  name: "MyProject",
+  data() {
+    return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      projectId: undefined,
+      projectName: undefined,
+      // 编辑所用id
+      updateId: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      lookAccount: false,
+      lookAccountLoading: false,
+
+      lookPerson: false,
+      personList: [],
+      accountData: {
+        pageNum: 1,
+        pageSize: 10,
+        total: 0,
+        lookAccountList: [],
+      },
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        projectName: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {},
+      // 表单参数
+      form: {
+        ocpxActionTypeList: [],
+      },
+      //上传报表下拉数据
+      formList: {
+        personList: [], //新增下拉人员列表
+        ocpxActionList: [], //优化目标列表
+        advertiserList: [], //广告主列表
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        userIds: [{ required: true, message: "请选择人员", trigger: "change" }],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+  },
+  filters: {
+    ocpxActionTypeName(status) {
+      const statusMap = {
+        72: "涨粉",
+        395: "订单支付",
+        192: "直播推广 ROI",
+      };
+      return statusMap[status];
+    },
+    mediaName(status) {
+      const statusMap = {
+        JN: "磁力金牛",
+      };
+      return statusMap[status];
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.getList();
+    });
+  },
+  methods: {
+    listUser() {
+      listUser({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.personList = res.rows;
+      });
+    },
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+    },
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getMyProjects({ ...this.queryParams, userId: this.userId }).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      // this.handleQuery();
+      this.getList();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+
+    getAccount(item, type) {
+      this.projectId = item.id;
+      this.projectName = item.projectName;
+      if (type == 1) {
+        this.lookAccount = true;
+        this.accountData.lookAccountList = [];
+        this.lookAccountLoading = true;
+        getAccountByProjectId({
+          projectId: item.id,
+          pageNum: this.accountData.pageNum,
+          pageSize: 10,
+        }).then((res) => {
+          this.accountData.lookAccountList = res.rows;
+          this.accountData.total = res.total;
+          this.lookAccountLoading = false;
+        });
+      } else if (type == 2) {
+        this.lookPerson = true;
+        this.getProjectUsers();
+      } else if (type == 3) {
+        this.open = true;
+        this.title = "新增人员";
+        this.listUser();
+        this.reset();
+        this.$nextTick(() => {
+          this.$refs["form"].clearValidate("userIds");
+        });
+      }
+    },
+    getProjectUsers() {
+      queryProjectUsers({
+        projectId: this.projectId,
+      }).then((res) => {
+        this.personList = res.result;
+      });
+    },
+    handleClose(item) {
+      console.log(item);
+      deleteProjectUsers({ userId: item.userId, projectId: item.projectId }).then(
+        (res) => {
+          this.$message.success("删除成功");
+          this.getProjectUsers();
+        }
+      );
+    },
+    changeAccount() {
+      this.accountData.lookAccountList = [];
+      this.lookAccountLoading = true;
+      getAccountByProjectId({
+        projectId: this.projectId,
+        pageNum: this.accountData.pageNum,
+        pageSize: 10,
+      }).then((res) => {
+        this.accountData.lookAccountList = res.rows;
+        this.accountData.total = res.total;
+        this.lookAccountLoading = false;
+      });
+    },
+
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          var params = {};
+          params.projectId = this.projectId;
+          params.projectName = this.projectName;
+          params.userIds = JSON.stringify(this.form.userIds);
+
+          addProjectUsers(params)
+            .then((res) => {
+              this.open = false;
+              this.confirmLoading = false;
+              this.resetQuery();
+            })
+            .catch((err) => {
+              this.confirmLoading = false;
+            });
+        }
+      });
+    },
+  },
+};
+</script>

+ 556 - 0
src/views/accountManagement/projectList.vue

@@ -0,0 +1,556 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input
+          v-model="queryParams.projectName"
+          placeholder="请输入项目名称"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-document-add"
+          size="mini"
+          @click="handleAdd"
+          >新增</el-button
+        >
+      </el-col>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <el-table-column label="项目名称" align="center" prop="projectName" />
+      <el-table-column label="广告主名称" align="center" prop="advertiserName" />
+      <el-table-column label="媒体" align="center" prop="mediaCode">
+        <template slot-scope="scope">
+          <div v-if="scope.row.mediaCode">
+            {{ scope.row.mediaCode | mediaName }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="销售" align="center" prop="saleName" />
+      <el-table-column label="运营" align="center" prop="operatorName" />
+      <el-table-column label="设计" align="center" prop="designResponsibleName" />
+      <el-table-column label="转化目标" align="center" prop="ocpxActionType">
+        <template slot-scope="scope">
+          <div v-if="scope.row.ocpxActionType">
+            <span
+              v-for="(item, index) in JSON.parse(scope.row.ocpxActionType)"
+              :key="index"
+            >
+              {{ item.ocpxName + "(" + (item.maxValue / 1000).toFixed(2) + ")" }}
+              <br />
+            </span>
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            >编辑</el-button
+          >
+          <el-button size="mini" type="text" @click="handleDelete(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改参数配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="150px">
+        <el-form-item label="媒体类型" prop="mediaCode">
+          <el-radio-group v-model="form.mediaCode">
+            <el-radio-button label="JN">磁力金牛</el-radio-button>
+            <el-radio-button label="QC" disabled>千川</el-radio-button>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="项目名称" prop="projectName">
+          <el-input
+            v-model="form.projectName"
+            placeholder="请输入项目名称"
+            clearable
+            style="width: 240px"
+          />
+        </el-form-item>
+        <el-form-item label="供应商" prop="supplierCode">
+          <el-input
+            v-model="form.supplierCode"
+            placeholder="请输入供应商"
+            clearable
+            style="width: 240px"
+          />
+        </el-form-item>
+
+        <el-form-item label="广告主" prop="advertiserId">
+          <el-select
+            ref="optionAdvertiser"
+            v-model="form.advertiserId"
+            placeholder="选择广告主"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.advertiserList"
+              :key="item.id"
+              :label="item.advertiserName"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="销售" prop="saleId">
+          <el-select
+            ref="optionSale"
+            v-model="form.saleId"
+            placeholder="选择销售"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="运营" prop="operatorId">
+          <el-select
+            ref="optionOperator"
+            v-model="form.operatorId"
+            placeholder="选择运营"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="设计" prop="designResponsibleId">
+          <el-select
+            ref="optionDesignResponsible"
+            v-model="form.designResponsibleId"
+            placeholder="选择设计"
+            clearable
+            style="width: 240px"
+            filterable
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="优化目标" prop="ocpxActionType">
+          <el-select
+            v-model="form.ocpxActionType"
+            placeholder="选择优化目标"
+            clearable
+            style="width: 240px"
+            multiple
+            @change="selectOcpx"
+            filterable
+            ref="optionOcpx"
+          >
+            <el-option
+              v-for="item in formList.ocpxActionList"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code + '@' + item.name"
+            />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="进入直播间最高出价" prop="mobile">
+          <el-input-number
+            style="width: 240px"
+            v-model="form.commissionRate"
+            :precision="2"
+            :step="0.1"
+            :min="0"
+            placeholder="请输入进入直播间最高出价"
+          ></el-input-number>
+        </el-form-item> -->
+        <el-form-item
+          v-for="(domain, index) in form.ocpxActionTypeList"
+          :label="domain.ocpxName + '最高出价'"
+          :key="domain.ocpxCode"
+          :prop="'ocpxActionTypeList.' + index + '.maxValue'"
+          :rules="{
+            required: true,
+            message: '出价不能为空',
+            trigger: 'blur',
+          }"
+        >
+          <el-input-number
+            :precision="2"
+            :step="0.1"
+            :min="0"
+            v-model="domain.maxValue"
+            style="width: 240px"
+          ></el-input-number>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :loading="confirmLoading"
+          >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getProjectList,
+  addProject,
+  editProject,
+  peojectDeleteById,
+  getOcpxActionType,
+  getAdvertiserList,
+} from "@/api/accountManagement/accountManagement";
+import { listUser } from "@/api/system/user";
+export default {
+  name: "ProjectList",
+  data() {
+    return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 编辑所用id
+      updateId: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        projectName: undefined,
+        advertiserId: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {},
+      // 表单参数
+      form: {
+        ocpxActionTypeList: [],
+      },
+      //上传报表下拉数据
+      formList: {
+        personList: [], //新增下拉人员列表
+        ocpxActionList: [], //优化目标列表
+        advertiserList: [], //广告主列表
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        projectName: [{ required: true, message: "项目名称必填", trigger: "blur" }],
+        saleId: [{ required: true, message: "请选择销售", trigger: "change" }],
+        operatorId: [{ required: true, message: "请选择运营", trigger: "change" }],
+        advertiserId: [{ required: true, message: "请选择广告主", trigger: "change" }],
+        ocpxActionType: [
+          { required: true, message: "请选择转化目标", trigger: "change" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+  },
+  filters: {
+    ocpxActionTypeName(status) {
+      const statusMap = {
+        72: "涨粉",
+        395: "订单支付",
+        192: "直播推广 ROI",
+      };
+      return statusMap[status];
+    },
+    mediaName(status) {
+      const statusMap = {
+        JN: "磁力金牛",
+      };
+      return statusMap[status];
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      if (this.$route && this.$route.query.id) {
+        this.queryParams.advertiserId = this.$route.query.id;
+      }
+      this.getList();
+      this.listUser();
+      this.getOcpxActionType();
+      this.getAdvertiserList();
+    });
+  },
+  methods: {
+    listUser() {
+      listUser({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.personList = res.rows;
+      });
+    },
+    getAdvertiserList() {
+      getAdvertiserList({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.advertiserList = res.rows;
+      });
+    },
+
+    getOcpxActionType() {
+      getOcpxActionType().then((res) => {
+        this.formList.ocpxActionList = res.result;
+      });
+    },
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+      // if (!!row.saleName) {
+      //   return false;
+      // } else {
+      //   return true;
+      // }
+    },
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getProjectList({ ...this.queryParams, userId: this.userId }).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      // this.handleQuery();
+      this.getList();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "新建项目";
+      this.$nextTick(() => {
+        this.$set(this.form, "mediaCode", "JN");
+        this.$refs["form"].clearValidate("ocpxActionType");
+      });
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+
+    selectOcpx(item) {
+      console.log(item);
+
+      this.$set(
+        this.form,
+        "ocpxActionTypeList",
+        item.map((value) => {
+          return {
+            ocpxCode: value.split("@")[0],
+            ocpxName: value.split("@")[1],
+            maxValue: undefined,
+          };
+        })
+      );
+      console.log(this.form.ocpxActionTypeList);
+    },
+    handleUpdate(item) {
+      this.reset();
+      this.open = true;
+      this.title = "修改项目";
+      this.$nextTick(() => {
+        this.updateId = item.id;
+        this.$set(this.form, "projectName", item.projectName);
+        this.$set(this.form, "mediaCode", item.mediaCode);
+        this.$set(this.form, "supplierCode", item.supplierCode);
+        this.$set(this.form, "saleId", item.saleId);
+        this.$set(this.form, "operatorId", item.operatorId);
+        this.$set(this.form, "designResponsibleId", item.designResponsibleId);
+        this.$set(
+          this.form,
+          "ocpxActionType",
+          JSON.parse(item.ocpxActionType).map((value) => {
+            return value.ocpxCode + "@" + value.ocpxName;
+          })
+        );
+        this.$set(
+          this.form,
+          "ocpxActionTypeList",
+          JSON.parse(item.ocpxActionType).map((value) => {
+            return {
+              ocpxCode: value.ocpxCode,
+              ocpxName: value.ocpxName,
+              maxValue: value.maxValue / 1000,
+            };
+          })
+        );
+        this.$set(this.form, "advertiserId", +item.advertiserId);
+      });
+    },
+    /** 删除按钮 */
+    handleDelete(item) {
+      this.$modal
+        .confirm(`请确认是否删除此项目?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          params.userId = this.$store.getters.userId;
+          peojectDeleteById(params)
+            .then((res) => {
+              this.$modal.msgSuccess("删除成功");
+              this.resetQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          var params = { ...this.form };
+          params.createBy = this.userId;
+          params.ocpxActionType = JSON.stringify(
+            this.form.ocpxActionTypeList.map((item) => {
+              return {
+                ...item,
+                maxValue: item.maxValue * 1000,
+              };
+            })
+          );
+          params.saleName = this.$refs.optionSale.selected.label;
+          params.operatorName = this.$refs.optionOperator.selected.label;
+          params.designResponsibleName = this.$refs.optionDesignResponsible.selected.label;
+
+          params.advertiserName = this.$refs.optionAdvertiser.selected.label;
+          //   params.advertiserId = 2;
+          if (!!this.updateId) {
+            editProject({ ...params, id: this.updateId }).then((res) => {
+              this.open = false;
+              this.confirmLoading = false;
+              this.resetQuery();
+            });
+          } else {
+            addProject(params).then((res) => {
+              this.open = false;
+              this.confirmLoading = false;
+              this.resetQuery();
+            });
+          }
+        }
+      });
+    },
+  },
+};
+</script>

+ 461 - 0
src/views/accountManagement/transferList.vue

@@ -0,0 +1,461 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input
+          v-model="queryParams.projectName"
+          placeholder="请输入项目名称"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="账户名称" prop="accountName">
+        <el-input
+          v-model="queryParams.accountName"
+          placeholder="请输入账户名称"
+          clearable
+          style="width: 240px"
+        />
+      </el-form-item>
+
+      <el-form-item label="转让人" prop="transferor">
+        <el-select
+          v-model="queryParams.transferor"
+          placeholder="选择转让人"
+          clearable
+          style="width: 240px"
+          filterable
+        >
+          <el-option
+            v-for="item in formList.personList"
+            :key="item.userId"
+            :label="item.nickName"
+            :value="item.userId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="受让人" prop="assignee">
+        <el-select
+          v-model="queryParams.assignee"
+          placeholder="选择受让人"
+          clearable
+          style="width: 240px"
+          filterable
+        >
+          <el-option
+            v-for="item in formList.personList"
+            :key="item.userId"
+            :label="item.nickName"
+            :value="item.userId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="选择认领状态"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.statusList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <el-table-column
+        label="转让人"
+        align="center"
+        prop="transferorName"
+        width="200px"
+      />
+      <el-table-column label="受让人" align="center" prop="assigneeName" width="200px" />
+      <el-table-column label="项目名称" align="center" prop="projectName" width="200px" />
+      <el-table-column label="账户ID" align="center" prop="accountId" width="200px" />
+      <el-table-column label="账户名称" align="center" prop="accountName" width="200px" />
+      <el-table-column
+        label="转户人绩效统计截止日期"
+        align="center"
+        prop="transferorDate"
+        width="200px"
+      />
+      <el-table-column
+        label="受让人绩效统计开始日期"
+        align="center"
+        prop="assigneeDate"
+        width="200px"
+      />
+
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          {{
+            scope.row.status == 1
+              ? "审核通过"
+              : scope.row.status == 2
+              ? "审核驳回"
+              : "待审核"
+          }}
+        </template>
+      </el-table-column>
+
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            :disabled="scope.row.status == 1 || scope.row.status == 2"
+            @click="cancelAccount(scope.row, 1)"
+            >通过</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            :disabled="scope.row.status == 1 || scope.row.status == 2"
+            @click="cancelAccount(scope.row, 2)"
+            >驳回</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改参数配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="180px">
+        <el-form-item label="转户人" prop="transferor">
+          {{ personName }}
+        </el-form-item>
+
+        <el-form-item label="受让人" prop="assignee">
+          <el-select
+            ref="optionAdvertiser"
+            v-model="form.assignee"
+            placeholder="选择受让人"
+            clearable
+            filterable
+            style="width: 240px"
+          >
+            <el-option
+              v-for="item in formList.personList"
+              :key="item.userId"
+              :label="item.nickName"
+              :value="item.userId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="转户人绩效统计截止日期" prop="transferorDate">
+          <el-date-picker
+            v-model="form.transferorDate"
+            value-format="yyyy-MM-dd"
+            type="date"
+            style="width: 240px"
+            placeholder="选择日期"
+            @change="getTomorrow"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="受让人绩效统计开始日期" prop="assigneeDate">
+          {{ form.assigneeDate }}
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" :loading="confirmLoading"
+          >确 定</el-button
+        >
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  transferList,
+  getMyProjects,
+  getUnboundAccountList,
+  claimAccount,
+  accountDeleteById,
+  addTransferAccount,
+  editTransferAccountStatus,
+  getAccountByProjectId,
+} from "@/api/accountManagement/accountManagement";
+import { listUser } from "@/api/system/user";
+import { ifError } from "assert";
+export default {
+  name: "TransferList",
+  data() {
+    return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      accountId: undefined,
+      projectId: undefined,
+      personId: undefined,
+      personName: undefined,
+      // 编辑所用id
+      updateId: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        projectName: undefined,
+        accountName: undefined,
+        transferor: undefined,
+        assignee: undefined,
+        status: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {
+        statusList: [
+          { value: 1, label: "审核通过" },
+          { value: 2, label: "审核拒绝" },
+        ],
+      },
+      // 表单参数
+      form: {
+        ocpxActionTypeList: [],
+      },
+      //上传报表下拉数据
+      formList: {
+        personList: [], //新增下拉人员列表
+        projectList: [], //项目列表
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        assignee: [{ required: true, message: "受让人必选", trigger: "change" }],
+        transferorDate: [
+          { required: true, message: "转户人绩效截至日期必填", trigger: "change" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+  },
+  filters: {
+    ocpxActionTypeName(status) {
+      const statusMap = {
+        72: "涨粉",
+        395: "订单支付",
+        192: "直播推广 ROI",
+      };
+      return statusMap[status];
+    },
+    mediaName(status) {
+      const statusMap = {
+        JN: "磁力金牛",
+      };
+      return statusMap[status];
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.getList();
+      this.listUser();
+    });
+  },
+  methods: {
+    listUser() {
+      listUser({ pageNum: 1, pageSize: 10000 }).then((res) => {
+        this.formList.personList = res.rows;
+      });
+    },
+    getProject() {
+      getMyProjects({ pageNum: 1, pageSize: 10000, userId: this.userId }).then((res) => {
+        this.formList.projectList = res.rows;
+      });
+    },
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+    },
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      transferList({ ...this.queryParams, userId: this.userId }).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      // this.handleQuery();
+      this.getList();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+
+    getAccount(item) {
+      //   getAccountByProjectId({ projectId: item.id }).then((res) => {});
+      this.open = true;
+      this.title = "账户转让";
+      this.listUser();
+      this.accountId = item.accountId;
+      this.projectId = item.projectId;
+      this.personId = item.operatorId;
+      this.personName = item.operatorName;
+      this.reset();
+      this.$nextTick(() => {
+        this.$refs["form"].clearValidate("assignee");
+      });
+    },
+
+    cancelAccount(item, type) {
+      this.$modal
+        .confirm(`请确认是否${type == 1 ? "通过" : "驳回"}此申请?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          params.status = type;
+          editTransferAccountStatus(params)
+            .then((res) => {
+              this.$modal.msgSuccess("成功");
+              this.resetQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+    getTomorrow(value) {
+      console.log(value);
+      if (value) {
+        const date = new Date(value);
+        date.setTime(date.getTime() + 3600 * 1000 * 24);
+
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? "0" + MM : MM;
+        let dd = date.getDate();
+        dd = dd < 10 ? "0" + dd : dd;
+        this.$set(this.form, "assigneeDate", `${y}-${MM}-${dd}`);
+      } else {
+        this.$set(this.form, "assigneeDate", "-");
+      }
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          var params = { ...this.form };
+          params.accountId = this.accountId;
+          params.projectId = this.projectId;
+          params.transferor = this.personId;
+          params.userId = this.userId;
+
+          console.log(params);
+
+          addTransferAccount({ ...params }).then((res) => {
+            this.open = false;
+            this.confirmLoading = false;
+            this.resetQuery();
+          });
+        }
+      });
+    },
+  },
+};
+</script>

+ 236 - 93
src/views/goodsManagement/collectSample.vue

@@ -24,18 +24,27 @@
         >
         </el-input>
       </el-form-item>
-
+      <el-form-item label="类目" prop="categoryId">
+        <el-select
+          filterable
+          v-model="queryParams.categoryId"
+          placeholder="选择行业"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.categoryIdList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
@@ -47,31 +56,80 @@
           icon="el-icon-document-add"
           size="mini"
           @click="addNew"
+          :disabled="
+            $store.getters.roles[0] == 'courtshipManager' ||
+            $store.getters.roles[0] == 'courtship'
+          "
           >领样申请</el-button
         >
       </el-col>
     </el-row>
-
     <el-table
       v-loading="loading"
       :data="typeList"
       ref="multipleTable"
       @selection-change="handleSelectionChange"
+      style="width: 100%"
+      :row-key="getRowKeys"
     >
-      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column
+        type="selection"
+        :reserve-selection="true"
+        width="50"
+        align="center"
+        :selectable="selectHandle"
+      />
       <el-table-column
         label="商品名称"
         align="center"
         prop="itemTitle"
         width="300"
+        fixed="left"
       >
         <template slot-scope="scope">
           <div style="display: flex; width: 100%">
             <div style="width: 40%">
+              <!-- <i
+                :class="
+                  scope.row.activityItemStatus == 3 ||
+                  scope.row.activityItemStatus == 4 ||
+                  scope.row.activityItemStatus == 5
+                    ? 'el-icon-warning'
+                    : 'el-icon-success'
+                "
+                :style="{
+                  color:
+                    scope.row.activityItemStatus == 3 ||
+                    scope.row.activityItemStatus == 4 ||
+                    scope.row.activityItemStatus == 5
+                      ? 'crimson'
+                      : 'chartreuse',
+                }"
+                style="
+                  width: 40px;
+                  height: 40px;
+                  font-size: 30px;
+                  position: relative;
+                  top: -15px;
+                  left: -10px;
+                "
+              ></i> -->
+              <img :src="scope.row.itemImgUrl" alt="" style="width: 70px; height: 70px" />
               <img
-                :src="scope.row.itemImgUrl"
+                v-if="
+                  scope.row.activityItemStatus == 3 ||
+                  scope.row.activityItemStatus == 4 ||
+                  scope.row.activityItemStatus == 5
+                "
+                src="./zg.png"
                 alt=""
-                style="width: 70px; height: auto"
+                style="
+                  width: 70px;
+                  height: auto;
+                  position: absolute;
+                  left: 30px;
+                  top: 15px;
+                "
               />
             </div>
             <div style="width: 60%" class="item-name-calss">
@@ -86,31 +144,40 @@
               >
                 {{ scope.row.itemTitle }}
               </a>
-              <p>商品Id {{ scope.row.itemId }}</p>
+              <p>商品Id: {{ scope.row.itemId }}</p>
               <p>商品单价: {{ scope.row.itemPrice / 100 }}元</p>
 
               <p>
                 佣金率:
-                {{
-                  scope.row.commissionRate
-                    ? scope.row.commissionRate / 10 + "%"
-                    : "-"
-                }}
+                {{ scope.row.commissionRate ? scope.row.commissionRate / 10 + "%" : "-" }}
               </p>
             </div>
           </div>
         </template>
       </el-table-column>
       <el-table-column
-        label="预估服务费"
+        label="服务费"
         align="center"
-        prop="regimentalPromotion"
+        prop="regimentalPromotionRate"
+        width="150"
       >
+        <template slot-scope="scope">
+          {{ (scope.row.regimentalPromotionRate / 10).toFixed(2) + "%" }}
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="userName" width="150">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.userName">
+            {{ scope.row.userName }}
+          </div>
+          <div v-else>-</div>
+        </template>
       </el-table-column>
       <el-table-column
         label="平台领样要求"
         align="center"
         prop="sampleRequirement"
+        width="150"
       >
         <template slot-scope="scope">
           <div v-if="!!scope.row.sampleRequirement">
@@ -119,7 +186,7 @@
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column label="样品数量" align="center" prop="sampleCount">
+      <el-table-column label="样品数量" align="center" prop="sampleCount" width="150">
         <template slot-scope="scope">
           <div v-if="!!scope.row.sampleCount">
             {{ scope.row.sampleCount }}
@@ -127,23 +194,49 @@
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column label="领样人数" align="center" prop="remark">
+      <el-table-column label="已领样数" align="center" prop="samplesReceived" width="150">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.samplesReceived">
+            {{ scope.row.samplesReceived }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="领样人数" align="center" prop="samplesPeoples" width="150">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.samplesPeoples">
+            {{ scope.row.samplesPeoples }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="有效订单数" align="center" prop="validOrderNum" width="150">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.validOrderNum">
+            {{ scope.row.validOrderNum }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="有效金额" align="center" prop="validAmount" width="150">
         <template slot-scope="scope">
-          <div v-if="!!scope.row.remark">
-            {{ scope.row.remark }}
+          <div v-if="!!scope.row.validAmount">
+            {{ allMoney(scope.row.validAmount / 100) }}
           </div>
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column label="领样份数" align="center" prop="remark">
+      <el-table-column label="类目" align="center" prop="categoryName" width="150">
         <template slot-scope="scope">
-          <div v-if="!!scope.row.remark">
-            {{ scope.row.remark }}
+          <div v-if="!!scope.row.categoryName">
+            {{ scope.row.categoryName.split(">")[0] }}
           </div>
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column label="状态" align="center" prop="activityItemStatus">
+
+      <el-table-column label="状态" align="center" prop="activityItemStatus" width="150">
         <template slot-scope="scope">
           <div v-if="!!scope.row.activityItemStatus">
             {{ scope.row.activityItemStatus | activityItemStatusName }}
@@ -151,7 +244,7 @@
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
+      <el-table-column label="创建时间" align="center" prop="createTime" width="150">
         <template slot-scope="scope">
           <div v-if="!!scope.row.createTime">
             {{ scope.row.createTime.split(" ")[0] }}
@@ -163,33 +256,50 @@
         label="手卡信息"
         align="center"
         prop="partnerRecommendText"
+        width="250"
       >
         <template slot-scope="scope">
-          <div v-if="!!scope.row.partnerRecommendText">
+          <div
+            v-if="!!scope.row.partnerRecommendText"
+            style="
+              text-overflow: ellipsis;
+              white-space: nowrap;
+              overflow: hidden;
+              width: 100%;
+            "
+            :title="scope.row.partnerRecommendText"
+          >
             {{ scope.row.partnerRecommendText }}
           </div>
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column label="归属人" align="center" prop="userName">
-      </el-table-column>
       <el-table-column
         label="操作"
         align="center"
         class-name="small-padding fixed-width"
         width="200px"
+        fixed="right"
       >
         <template slot-scope="scope">
-          <el-button size="mini" type="text" @click="okInfomation(scope.row)"
+          <el-button
+            size="mini"
+            type="text"
+            :disabled="
+              $store.getters.roles[0] == 'courtshipManager' ||
+              $store.getters.roles[0] == 'courtship' ||
+              scope.row.activityItemStatus == 3 ||
+              scope.row.activityItemStatus == 4 ||
+              scope.row.activityItemStatus == 5
+            "
+            @click="okInfomation(scope.row)"
             >领样申请</el-button
           >
           <el-button size="mini" type="text" @click="copyInfomation(scope.row)"
             >商品复制</el-button
           >
 
-          <el-button size="mini" type="text" @click="toDetail(scope.row)"
-            >详情</el-button
-          >
+          <el-button size="mini" type="text" @click="toDetail(scope.row)">详情</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -208,6 +318,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -337,10 +448,7 @@
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button
-          type="primary"
-          @click="submitFormBroadcast"
-          :loading="confirmLoading"
+        <el-button type="primary" @click="submitFormBroadcast" :loading="confirmLoading"
           >确 定</el-button
         >
         <el-button
@@ -360,6 +468,7 @@
       :visible.sync="refuseVisible"
       width="500px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-input
         placeholder="请输入拒绝原因"
@@ -395,10 +504,11 @@ import {
   getCity,
   checkItem,
   editItem,
+  getCategoryIds,
 } from "@/api/goodsManagement/goods";
 import selectTree from "./selectTree.vue";
 export default {
-  name: "account-list",
+  name: "CollectSample",
   components: {
     selectTree,
   },
@@ -421,7 +531,8 @@ export default {
       loading: true,
       // 选中数组
       ids: null,
-      okIds: null,
+      okIds: [],
+      allOkIds: [],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -468,6 +579,7 @@ export default {
           { value: "1", label: "待审核" },
           { value: "3", label: "审核拒绝" },
         ],
+        categoryIdList: [],
       },
       // 表单参数
       form: {},
@@ -539,7 +651,6 @@ export default {
           },
           {
             min: 5,
-            max: 200,
             message: "手卡内容最少输入5个字符",
             trigger: "change",
           },
@@ -554,24 +665,64 @@ export default {
       itemId: null,
     };
   },
+  activated() {
+    if (localStorage.getItem("clearData") && localStorage.getItem("clearData") == 1) {
+      this.$nextTick(() => {
+        this.allOkIds = [];
+        this.okIds = [];
+        this.typeList = [];
+        this.$refs.multipleTable.clearSelection();
+        this.resetQuery();
+        localStorage.removeItem("clearData");
+      });
+    }
+  },
   created() {
     this.userId = this.$store.getters.userId;
     this.getList();
+    this.getCategoryIds();
   },
   filters: {
     activityItemStatusName(status) {
       const statusMap = {
         1: "待审核",
-        2: "审核通过",
+        2: "已上架",
         3: "审核失败(拒绝)",
+        4: "活动结束",
         5: "失效",
       };
       return statusMap[status];
     },
   },
   methods: {
+    selectHandle(row) {
+      if (
+        row.activityItemStatus == 3 ||
+        row.activityItemStatus == 4 ||
+        row.activityItemStatus == 5
+      ) {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    getCategoryIds() {
+      getCategoryIds().then((res) => {
+        this.queryParamsList.categoryIdList = res.map((item) => {
+          return {
+            label: item.categoryName,
+            value: item.categoryId,
+          };
+        });
+      });
+    },
+    getRowKeys(row) {
+      return row.itemId;
+    },
     handleSelectionChange(selection) {
       this.okIds = selection.map((item) => item.itemId);
+      // this.allOkIds[this.queryParams.pageNum - 1] = this.okIds;
+      // console.log(this.allOkIds);
     },
     okInfomation(item) {
       this.$router.replace({
@@ -582,10 +733,7 @@ export default {
       });
     },
     toDetail(item) {
-      localStorage.setItem(
-        "addItemInfo",
-        JSON.stringify({ ...item, type: "look" })
-      );
+      localStorage.setItem("addItemInfo", JSON.stringify({ ...item, type: "lookElse" }));
       this.$router.replace({
         path: "/goodsManagement/goodsPreview",
       });
@@ -595,12 +743,12 @@ export default {
         navigator.clipboard
           .writeText(
             `
-店铺: ${item.shopTitle}
-商品体验: ${item.shopScore}
-商家服务: ${item.mallServiceScore}
+店铺: ${item.shopTitle ? item.shopTitle : "-"}
+商品体验: ${item.shopScore ? item.shopScore : "-"}
+商家服务: ${item.mallServiceScore ? item.mallServiceScore : "-"}
 产品: ${item.itemTitle}
 直播价: ¥${item.zkFinalPrice / 100}
-佣金比例: ${item.commissionRate}%
+佣金比例: ${item.commissionRate / 10}%
 团长推荐: ${item.partnerRecommendText}
 链接: ${item.detailUrl}`
           )
@@ -614,12 +762,12 @@ export default {
         // 创建text area
         const textArea = document.createElement("textarea");
         textArea.value = `
-店铺: ${item.shopTitle}
-商品体验: ${item.shopScore}
-商家服务: ${item.mallServiceScore}
+店铺: ${item.shopTitle ? item.shopTitle : "-"}
+商品体验: ${item.shopScore ? item.shopScore : "-"}
+商家服务: ${item.mallServiceScore ? item.mallServiceScore : "-"}
 产品: ${item.itemTitle}
 直播价: ¥${item.zkFinalPrice / 100}
-佣金比例: ${item.commissionRate}%
+佣金比例: ${item.commissionRate / 10}%
 团长推荐: ${item.partnerRecommendText}
 链接: ${item.detailUrl}`;
         // 使text area不在viewport,同时设置不可见
@@ -628,9 +776,7 @@ export default {
         textArea.select();
         return new Promise((resolve, reject) => {
           // 执行复制命令并移除文本框
-          document.execCommand("copy")
-            ? resolve()
-            : reject(new Error("出错了"));
+          document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
           textArea.remove();
         }).then(
           () => {
@@ -717,6 +863,12 @@ export default {
     getList() {
       this.loading = true;
 
+      // if (this.allOkIds[this.queryParams.pageNum - 1]) {
+      //   this.okIds = this.allOkIds[this.queryParams.pageNum - 1];
+      //   this.$refs.multipleTable.toggleAllSelection();
+      // } else {
+      //   this.okIds = [];
+      // }
       getItemList({ ...this.queryParams }).then((response) => {
         this.typeList = response.rows;
         this.total = response.total;
@@ -747,15 +899,25 @@ export default {
       this.handleQuery();
     },
     addNew() {
-      this.getAreaList();
-      this.openAllocation = true;
-      this.edit = false;
-      this.ids = null;
-      this.confirmLoading = false;
-      this.formBroadcast = {};
-      setTimeout(() => {
-        this.$refs.formBroadcast.clearValidate();
-      }, 0);
+      // this.getAreaList();
+      // this.openAllocation = true;
+      // this.edit = false;
+      // this.ids = null;
+      // this.confirmLoading = false;
+      // this.formBroadcast = {};
+      // setTimeout(() => {
+      //   this.$refs.formBroadcast.clearValidate();
+      // }, 0);
+      if (!!this.okIds && this.okIds.length > 0) {
+        this.$router.replace({
+          path: "/goodsManagement/promoterSelect",
+          query: {
+            itemIds: JSON.stringify(this.okIds),
+          },
+        });
+      } else {
+        this.$message.error("请选择商品");
+      }
     },
     /** 编辑地址 新增达人*/
     handleAddbroadcast(item) {
@@ -770,29 +932,17 @@ export default {
         this.$set(this.formBroadcast, "noPostArea", item.noPostArea);
         this.$set(this.formBroadcast, "commissionRate", item.commissionRate);
 
-        this.$set(
-          this.formBroadcast,
-          "regimentalPromotion",
-          item.regimentalPromotion
-        );
+        this.$set(this.formBroadcast, "regimentalPromotion", item.regimentalPromotion);
         this.$set(
           this.formBroadcast,
           "regimentalPromotionRate",
           item.regimentalPromotionRate
         );
-        this.$set(
-          this.formBroadcast,
-          "sampleRequirement",
-          item.sampleRequirement
-        );
+        this.$set(this.formBroadcast, "sampleRequirement", item.sampleRequirement);
         this.$set(this.formBroadcast, "sampleCount", item.sampleCount);
         this.$set(this.formBroadcast, "detailUrl", item.detailUrl);
         this.$set(this.formBroadcast, "deliveryRate", item.deliveryRate);
-        this.$set(
-          this.formBroadcast,
-          "partnerRecommendText",
-          item.partnerRecommendText
-        );
+        this.$set(this.formBroadcast, "partnerRecommendText", item.partnerRecommendText);
       });
     },
     /** 修改按钮操作 */
@@ -804,10 +954,7 @@ export default {
       this.$refs["formBroadcast"].validate((valid) => {
         if (valid) {
           if (!this.edit) {
-            localStorage.setItem(
-              "addItemInfo",
-              JSON.stringify(this.formBroadcast)
-            );
+            localStorage.setItem("addItemInfo", JSON.stringify(this.formBroadcast));
             this.$router.replace({
               path: "/goodsManagement/goodsPreview",
             });
@@ -838,11 +985,7 @@ export default {
           var fileList = this.$refs.fileUploadDialog.fileList;
           var dapanUrls = this.$refs.fileUpload.fileList;
           var portraitUrls = this.$refs.fileUploadFx.fileList;
-          if (
-            fileList.length == 0 &&
-            dapanUrls.length == 0 &&
-            portraitUrls.length == 0
-          ) {
+          if (fileList.length == 0 && dapanUrls.length == 0 && portraitUrls.length == 0) {
             this.$message.error("直播数据,数据大盘,画像分析必须最少上传一项");
             return;
           } else {

+ 202 - 83
src/views/goodsManagement/goodsDetail.vue

@@ -1,11 +1,23 @@
 <template>
   <div class="app-container">
-    <el-card
-      shadow="never"
-      class="card-show"
-      v-if="itemJson"
-      style="margin-bottom: 24px"
+    <el-button
+      type="primary"
+      icon="el-icon-document-add"
+      size="mini"
+      @click="addNew"
+      style="float: right; position: fixed; right: 40px; bottom: 2%; z-index: 10"
+      :loading="loading"
+      v-if="itemInfo.type != 'lookElse'"
+      >{{ itemInfo.type != "look" ? "新增" : "修改" }}</el-button
     >
+    <el-button
+      size="mini"
+      @click="addClose"
+      style="float: right; position: fixed; right: 120px; bottom: 2%; z-index: 10"
+      v-if="itemInfo.type == 'look'"
+      >取消</el-button
+    >
+    <el-card shadow="never" class="card-show" v-if="itemJson" style="margin-bottom: 24px">
       <div>
         <h3 style="font-weight: blod">
           {{ itemJson.itemTitle }}({{ itemJson.itemId }})
@@ -16,8 +28,8 @@
             @click="addNew"
             style="float: right"
             :loading="loading"
-            v-if="itemInfo.type != 'look'"
-            >新增</el-button
+            v-if="itemInfo.type != 'look' && itemInfo.type != 'lookElse'"
+            >{{ itemInfo.type != "look" ? "新增" : "修改" }}</el-button
           >
         </h3>
       </div>
@@ -26,11 +38,7 @@
       <el-col :span="6">
         <el-card shadow="never" class="card-show">
           <div>
-            <img
-              :src="itemJson.itemImgUrl"
-              alt=""
-              style="width: 100%; height: auto"
-            />
+            <img :src="itemJson.itemImgUrl" alt="" style="width: 100%; height: auto" />
           </div>
           <div>
             <div class="swiper">
@@ -59,15 +67,11 @@
             <div style="width: 100%" class="item-name-calss dh-data">
               <p>
                 店铺名称:{{
-                  judgeStatus == 2
-                    ? itemJson.sellerNickName
-                    : itemJson.shopTitle
+                  judgeStatus == 2 ? itemJson.sellerNickName : itemJson.shopTitle
                 }}
               </p>
               <p v-if="judgeStatus == 1">
-                小店星级:{{ itemJson.shopStar }} | 小店评分:{{
-                  itemJson.shopScore
-                }}
+                小店星级:{{ itemJson.shopStar }} | 小店评分:{{ itemJson.shopScore }}
               </p>
               <p v-if="judgeStatus == 1">
                 店铺服务分:{{ itemJson.mallServiceScore }} | 店铺质量分:{{
@@ -78,26 +82,46 @@
               <p v-if="judgeStatus == 1">
                 到手价格:¥{{ itemJson.zkFinalPrice / 100 }}元
               </p>
-              <p v-if="judgeStatus == 2">
-                商品价格:¥{{ itemJson.itemPrice / 100 }}元
-              </p>
-              <p v-if="judgeStatus == 1">
-                预估服务费:{{ itemInfo.regimentalPromotion }}
-              </p>
-              <p v-if="judgeStatus == 2">
-                预估服务费率:{{ itemJson.investmentPromotionRate }}%
-              </p>
-              <p>佣金率:{{ itemInfo.commissionRate }}%</p>
+              <p v-if="judgeStatus == 2">商品价格:¥{{ itemJson.itemPrice / 100 }}元</p>
+              <p>服务费率:{{ (itemJson.regimentalPromotionRate / 10).toFixed(2) }}%</p>
+              <p>佣金率:{{ (itemJson.commissionRate / 10).toFixed(2) }}%</p>
               <p>
-                领样要求:{{ itemInfo.sampleRequirement }} | 样品数量:{{
-                  itemInfo.sampleCount
-                }}
+                领样要求:
+                <span v-if="!editSampleRequirement">{{
+                  itemInfo.sampleRequirement
+                }}</span>
+                <el-input
+                  v-else
+                  v-model="itemInfo.sampleRequirement"
+                  placeholder="请输入内容"
+                  style="width: 240px"
+                ></el-input>
+                <a
+                  v-if="itemInfo.type != 'lookElse'"
+                  :class="!editSampleRequirement ? 'el-icon-edit' : 'el-icon-check'"
+                  @click="editSampleRequirement = !editSampleRequirement"
+                  style="color: deepskyblue; margin-left: 10px; display: inline"
+                ></a>
+
+                | 样品数量:
+
+                <span v-if="!editSampleCount">{{ itemInfo.sampleCount }}</span>
+                <el-input
+                  v-else
+                  v-model.number="itemInfo.sampleCount"
+                  placeholder="请输入内容"
+                  style="width: 240px"
+                ></el-input>
+                <a
+                  v-if="itemInfo.type != 'lookElse'"
+                  :class="!editSampleCount ? 'el-icon-edit' : 'el-icon-check'"
+                  @click="editSampleCount = !editSampleCount"
+                  style="color: deepskyblue; margin-left: 10px; display: inline"
+                ></a>
               </p>
               <p>
                 类目:{{
-                  judgeStatus == 1
-                    ? itemJson.categoryName
-                    : itemJson.itemCategoryName
+                  judgeStatus == 1 ? itemJson.categoryName : itemJson.itemCategoryName
                 }}
               </p>
 
@@ -113,11 +137,7 @@
               </p>
             </div>
           </el-card>
-          <el-card
-            shadow="never"
-            class="card-show main-top"
-            v-if="judgeStatus == 1"
-          >
+          <el-card shadow="never" class="card-show main-top" v-if="judgeStatus == 1">
             <h4><span class="prefix"></span>商品信息</h4>
             <div style="width: 100%" class="item-name-calss dh-data">
               <p v-for="(item, index) in itemJson.skuList" :key="index">
@@ -128,44 +148,77 @@
           <el-card shadow="never" class="card-show main-top">
             <h4><span class="prefix"></span>发货信息</h4>
             <div style="width: 100%" class="item-name-calss dh-data">
-              <p>发货地:{{ itemInfo.postArea }}</p>
-              <p>未发货地区:{{ itemInfo.noPostArea }}</p>
-              <p>发货时间:48小时内发货</p>
-              <p>发货率:{{ itemInfo.deliveryRate }}</p>
+              <p>发货地:{{ itemJson.postArea }}</p>
+              <p>
+                不发货地区:<span v-if="!editNoPostArea">{{ itemInfo.noPostArea }}</span>
+                <el-input
+                  v-else
+                  v-model="itemInfo.noPostArea"
+                  placeholder="请输入内容"
+                  style="width: 240px"
+                ></el-input>
+                <a
+                  v-if="itemInfo.type != 'lookElse'"
+                  :class="!editNoPostArea ? 'el-icon-edit' : 'el-icon-check'"
+                  @click="editNoPostArea = !editNoPostArea"
+                  style="color: deepskyblue; margin-left: 10px; display: inline"
+                ></a>
+              </p>
+              <p>发货时间:{{ itemJson.deliveryRate }}</p>
             </div>
           </el-card>
           <el-card shadow="never" class="card-show main-top">
-            <h4><span class="prefix"></span>商品卖点</h4>
+            <h4>
+              <span class="prefix"></span>商品卖点
+              <a
+                v-if="itemInfo.type != 'lookElse'"
+                :class="!editDesc ? 'el-icon-edit' : 'el-icon-check'"
+                @click="editDesc = !editDesc"
+                style="color: deepskyblue; margin-left: 10px; display: inline"
+              ></a>
+            </h4>
             <div style="width: 100%" class="item-name-calss dh-data">
-              <p>{{ itemInfo.partnerRecommendText }}</p>
+              <!-- {{ itemInfo.partnerRecommendText }} -->
+              <p v-if="!editDesc" v-html="itemInfo.partnerRecommendText"></p>
+              <el-input
+                v-else
+                type="textarea"
+                :rows="2"
+                v-model="itemInfo.partnerRecommendText"
+                placeholder="请输入内容"
+                style="width: 100%"
+                minlength="5"
+              ></el-input>
             </div>
           </el-card>
-          <el-card
-            shadow="never"
-            class="card-show main-top"
-            v-if="judgeStatus == 1"
-          >
+          <el-card shadow="never" class="card-show main-top" v-if="judgeStatus == 1">
             <h4><span class="prefix"></span>商品备注</h4>
             <div style="width: 100%" class="item-name-calss dh-data">
               <pre>{{ itemJson.itemDesc }}</pre>
             </div>
           </el-card>
-          <el-card
-            shadow="never"
-            class="card-show main-top"
-            v-if="judgeStatus == 1"
-          >
+          <el-card shadow="never" class="card-show main-top">
             <h4><span class="prefix"></span>商品详情</h4>
             <div
               style="
-                width: 100%;
+                width: 50%;
                 display: flex;
                 flex-wrap: wrap;
                 justify-content: space-between;
+                position: relative;
+                left: 50%;
+                margin-left: -25%;
               "
               class="item-name-calss dh-data"
             >
-              <el-image
+              <img
+                :src="item"
+                alt=""
+                v-for="(item, index) in itemJson.itemDescUrls"
+                style="width: 100%"
+                :key="index"
+              />
+              <!-- <el-image
                 style="width: 200px; height: 200px; margin-bottom: 20px"
                 :src="item"
                 :previewSrcList="itemJson.itemDescUrls"
@@ -183,7 +236,7 @@
                   padding: 0;
                   width: 200px;
                 "
-              ></div>
+              ></div> -->
             </div>
           </el-card>
         </el-card>
@@ -193,7 +246,12 @@
 </template>
 
 <script>
-import { getItemPreview, insertItem } from "@/api/goodsManagement/goods";
+import {
+  getItemPreview,
+  insertItem,
+  editItem,
+  getItemDetailByItemId,
+} from "@/api/goodsManagement/goods";
 import { swiper, swiperSlide } from "vue-awesome-swiper";
 import "swiper/dist/css/swiper.css";
 export default {
@@ -204,6 +262,10 @@ export default {
   },
   data() {
     return {
+      editNoPostArea: false,
+      editSampleRequirement: false,
+      editSampleCount: false,
+      editDesc: false,
       // 遮罩层
       loading: false,
       // 选中数组
@@ -269,52 +331,109 @@ export default {
   watch: {},
   methods: {
     getItemPreview() {
-      getItemPreview({
-        activityId: this.itemInfo.activityId,
-        itemId: this.itemInfo.itemId,
-      }).then((res) => {
-        this.itemJson = res.itemJson;
-        this.judgeStatus = res.judgeStatus;
-      });
+      if (this.itemInfo.type != "look" && this.itemInfo.type != "lookElse") {
+        getItemPreview({
+          activityId: this.itemInfo.activityId,
+          itemId: this.itemInfo.itemId,
+        }).then((res) => {
+          this.itemJson = res.itemJson;
+          this.judgeStatus = res.judgeStatus;
+        });
+      } else {
+        getItemDetailByItemId({ itemId: this.itemInfo.itemId }).then((res) => {
+          this.itemJson = res.itemJson
+            ? {
+                ...res.itemJson,
+                skuList: JSON.parse(res.itemJson.skuList),
+                itemDescUrls: JSON.parse(res.itemJson.itemDescUrls),
+                itemGalleryUrls: JSON.parse(res.itemJson.itemGalleryUrls),
+              }
+            : null;
+
+          this.judgeStatus = res.judgeStatus;
+        });
+      }
+    },
+    addClose() {
+      const obj = {
+        path: "/goodsManagement/list",
+      };
+      localStorage.removeItem("addItemInfo");
+      this.$tab.closeOpenPage(obj);
     },
     addNew() {
       this.loading = true;
+      console.log(this.itemJson);
       if (this.judgeStatus == 1) {
         var params = {
           ...this.itemInfo,
           ...this.itemJson,
-          userId: this.$store.getters.userId,
-          userName: this.$store.getters.name,
           itemGalleryUrls: this.itemJson.itemGalleryUrls
             ? JSON.stringify(this.itemJson.itemGalleryUrls)
             : null,
           itemDescUrls: this.itemJson.itemDescUrls
             ? JSON.stringify(this.itemJson.itemDescUrls)
             : null,
-          skuList: this.itemJson.skuList
-            ? JSON.stringify(this.itemJson.skuList)
-            : null,
+          skuList: this.itemJson.skuList ? JSON.stringify(this.itemJson.skuList) : null,
+          sampleRequirement: this.itemInfo.sampleRequirement,
+          sampleCount: this.itemInfo.sampleCount,
+          noPostArea: this.itemInfo.noPostArea,
+          partnerRecommendText: this.itemInfo.partnerRecommendText,
         };
       } else if (this.judgeStatus == 2) {
         var params = {
           ...this.itemInfo,
-          userId: this.$store.getters.userId,
-          userName: this.$store.getters.name,
-          itemImgUrl: this.itemJson.itemImgUrl,
-          itemTitle: this.itemJson.itemTitle,
-          shopTitle: this.itemJson.sellerNickName,
-          itemPrice: this.itemJson.itemPrice,
-          zkFinalPrice: this.itemJson.itemPrice,
-          skuPrice: this.itemJson.itemPrice,
-          categoryName: this.itemJson.itemCategoryName,
+          ...this.itemJson,
+          categoryName: this.itemJson.categoryName,
           activityItemStatus: 5,
           detailUrl: this.itemJson.detailUrl,
+          categoryId: this.itemJson.categoryId,
+          postArea: this.itemJson.postArea,
+          deliveryRate: this.itemJson.deliveryRate,
+          commissionRate: this.itemJson.commissionRate,
+          itemGalleryUrls: this.itemJson.itemGalleryUrls
+            ? JSON.stringify(this.itemJson.itemGalleryUrls)
+            : null,
+          itemDescUrls: this.itemJson.itemDescUrls
+            ? JSON.stringify(this.itemJson.itemDescUrls)
+            : null,
+          skuList: this.itemJson.skuList ? JSON.stringify(this.itemJson.skuList) : null,
         };
       }
 
-      insertItem(params).then((res) => {
-        this.loading = false;
-      });
+      if (this.itemInfo.type != "look") {
+        params.userId = this.$store.getters.userId;
+        params.userName = this.$store.getters.name;
+        insertItem(params)
+          .then((res) => {
+            this.loading = false;
+            const obj = {
+              path: "/goodsManagement/list",
+            };
+            localStorage.removeItem("addItemInfo");
+            this.$tab.closeOpenPage(obj);
+            this.$message.success("新增成功");
+          })
+          .catch((err) => {
+            this.loading = false;
+            this.$message.error(err);
+          });
+      } else {
+        editItem(params)
+          .then((res) => {
+            this.loading = false;
+            const obj = {
+              path: "/goodsManagement/list",
+            };
+            localStorage.removeItem("addItemInfo");
+            this.$tab.closeOpenPage(obj);
+            this.$message.success("修改成功");
+          })
+          .catch((err) => {
+            this.loading = false;
+            this.$message.error(err);
+          });
+      }
     },
   },
 };

+ 423 - 144
src/views/goodsManagement/goodslist.vue

@@ -24,18 +24,27 @@
         >
         </el-input>
       </el-form-item>
-
+      <el-form-item label="类目" prop="categoryId">
+        <el-select
+          filterable
+          v-model="queryParams.categoryId"
+          placeholder="选择行业"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.categoryIdList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
@@ -58,12 +67,34 @@
         v-for="(item, index) in queryParamsList.tagList"
         :key="index"
       >
-        <el-table v-loading="loading" :data="typeList" ref="multipleTable">
+        <el-button
+          type="primary"
+          plain
+          size="mini"
+          @click="batchProcess"
+          v-if="queryParams.examineStatus == 1"
+          style="margin-bottom: 15px"
+          >批量审核</el-button
+        >
+        <el-table
+          v-loading="loading"
+          :data="typeList"
+          ref="multipleTable"
+          style="width: 100%"
+          @selection-change="handleSelectionChange"
+          :row-key="getRowKeys"
+        >
+          <el-table-column
+            type="selection"
+            width="50"
+            align="center"
+          />
           <el-table-column
             label="商品名称"
             align="center"
             prop="itemTitle"
             width="300"
+            fixed="left"
           >
             <template slot-scope="scope">
               <div style="display: flex; width: 100%">
@@ -92,9 +123,7 @@
                   <p>
                     佣金率:
                     {{
-                      scope.row.commissionRate
-                        ? scope.row.commissionRate / 10 + "%"
-                        : "-"
+                      scope.row.commissionRate ? scope.row.commissionRate / 10 + "%" : "-"
                     }}
                   </p>
                 </div>
@@ -102,15 +131,28 @@
             </template>
           </el-table-column>
           <el-table-column
-            label="预估服务费"
+            label="服务费"
             align="center"
-            prop="regimentalPromotion"
+            prop="regimentalPromotionRate"
+            width="150"
           >
+            <template slot-scope="scope">
+              {{ (scope.row.regimentalPromotionRate / 10).toFixed(2) + "%" }}
+            </template>
+          </el-table-column>
+          <el-table-column label="创建人" align="center" prop="userName" width="150">
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.userName">
+                {{ scope.row.userName }}
+              </div>
+              <div v-else>-</div>
+            </template>
           </el-table-column>
           <el-table-column
             label="平台领样要求"
             align="center"
             prop="sampleRequirement"
+            width="150"
           >
             <template slot-scope="scope">
               <div v-if="!!scope.row.sampleRequirement">
@@ -119,7 +161,7 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <el-table-column label="样品数量" align="center" prop="sampleCount">
+          <el-table-column label="样品数量" align="center" prop="sampleCount" width="150">
             <template slot-scope="scope">
               <div v-if="!!scope.row.sampleCount">
                 {{ scope.row.sampleCount }}
@@ -127,26 +169,59 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <!-- <el-table-column label="领样人数" align="center" prop="sampleCount">
+          <el-table-column
+            label="已领样数"
+            align="center"
+            prop="samplesReceived"
+            width="150"
+          >
             <template slot-scope="scope">
-              <div v-if="!!scope.row.sampleCount">
-                {{ scope.row.sampleCount }}
+              <div v-if="!!scope.row.samplesReceived">
+                {{ scope.row.samplesReceived }}
               </div>
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <el-table-column label="领样份数" align="center" prop="sampleCount">
+          <el-table-column
+            label="领样人数"
+            align="center"
+            prop="samplesPeoples"
+            width="150"
+          >
             <template slot-scope="scope">
-              <div v-if="!!scope.row.sampleCount">
-                {{ scope.row.sampleCount }}
+              <div v-if="!!scope.row.samplesPeoples">
+                {{ scope.row.samplesPeoples }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            label="有效订单数"
+            align="center"
+            prop="validOrderNum"
+            width="150"
+          >
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.validOrderNum">
+                {{ scope.row.validOrderNum }}
               </div>
               <div v-else>-</div>
             </template>
-          </el-table-column> -->
+          </el-table-column>
+          <el-table-column label="有效金额" align="center" prop="validAmount" width="150">
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.validAmount">
+                {{ allMoney(scope.row.validAmount / 100) }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
           <el-table-column
-            label="状态"
+            label="商品活动状态"
             align="center"
             prop="activityItemStatus"
+            width="150"
           >
             <template slot-scope="scope">
               <div v-if="!!scope.row.activityItemStatus">
@@ -155,7 +230,16 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <el-table-column label="创建时间" align="center" prop="createTime">
+          <el-table-column label="类目" align="center" prop="categoryName" width="150">
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.categoryName">
+                {{ scope.row.categoryName.split(">")[0] }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="创建时间" align="center" prop="createTime" width="150">
             <template slot-scope="scope">
               <div v-if="!!scope.row.createTime">
                 {{ scope.row.createTime.split(" ")[0] }}
@@ -167,9 +251,19 @@
             label="手卡信息"
             align="center"
             prop="partnerRecommendText"
+            width="250"
           >
             <template slot-scope="scope">
-              <div v-if="!!scope.row.partnerRecommendText">
+              <div
+                v-if="!!scope.row.partnerRecommendText"
+                style="
+                  text-overflow: ellipsis;
+                  white-space: nowrap;
+                  overflow: hidden;
+                  width: 100%;
+                "
+                :title="scope.row.partnerRecommendText"
+              >
                 {{ scope.row.partnerRecommendText }}
               </div>
               <div v-else>-</div>
@@ -194,23 +288,18 @@
             align="center"
             class-name="small-padding fixed-width"
             width="200px"
+            fixed="right"
           >
             <template slot-scope="scope">
               <el-button
                 size="mini"
                 type="text"
-                @click="copyInfomation(scope.row)"
-                v-if="queryParams.examineStatus == '2'"
-                >商品复制</el-button
-              >
-              <el-button
-                size="mini"
-                type="text"
                 @click="okInfomation(scope.row)"
-                v-if="queryParams.examineStatus == '1'"
+                v-show="queryParams.examineStatus == '1'"
                 :disabled="
                   $store.getters.roles[0] != 'admin' &&
-                  $store.getters.roles[0] != 'supplyChainAdmin'
+                  $store.getters.roles[0] != 'supplyChainAdmin' &&
+                  $store.getters.roles[0] != 'associationManager'
                 "
                 >通过</el-button
               >
@@ -221,13 +310,15 @@
                   itemId = scope.row.itemId;
                   refuseVisible = true;
                 "
-                v-if="queryParams.examineStatus == '1'"
+                v-show="queryParams.examineStatus == '1'"
                 :disabled="
                   $store.getters.roles[0] != 'admin' &&
-                  $store.getters.roles[0] != 'supplyChainAdmin'
+                  $store.getters.roles[0] != 'supplyChainAdmin' &&
+                  $store.getters.roles[0] != 'associationManager'
                 "
                 >拒绝</el-button
               >
+
               <el-button
                 size="mini"
                 type="text"
@@ -235,6 +326,20 @@
                 v-if="queryParams.examineStatus == '3'"
                 >编辑</el-button
               >
+              <el-button
+                size="mini"
+                type="text"
+                @click="copyInfomation(scope.row)"
+                v-if="queryParams.examineStatus == '2'"
+                >商品复制</el-button
+              >
+              <el-button
+                size="mini"
+                type="text"
+                @click="unbindingItem(scope.row)"
+                v-if="queryParams.examineStatus == '2'"
+                >解绑</el-button
+              >
               <el-button size="mini" type="text" @click="toDetail(scope.row)"
                 >详情</el-button
               >
@@ -258,6 +363,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -270,24 +376,41 @@
           {{ $store.getters.name }}
         </el-form-item>
         <el-form-item label="活动ID" prop="activityId">
-          <el-input
+          <!-- <el-input
             placeholder="请输入活动ID"
             style="width: 240px"
+            v-model.trim="formBroadcast.activityId"
+            :disabled="edit"
+          >
+          </el-input> -->
+          <el-select
+            style="width: 240px"
             v-model="formBroadcast.activityId"
+            filterable
+            allow-create
+            default-first-option
+            placeholder="请选择或填写活动ID"
             :disabled="edit"
           >
-          </el-input>
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
         </el-form-item>
         <el-form-item label="商品ID" prop="itemId">
           <el-input
             placeholder="请输入商品ID"
             style="width: 240px"
-            v-model="formBroadcast.itemId"
+            v-model.trim="formBroadcast.itemId"
             :disabled="edit"
           >
           </el-input>
         </el-form-item>
-        <el-form-item label="发货地" prop="postArea">
+        <el-form-item label="发货地" prop="postArea" v-if="edit">
           <selectTree
             :disabled="edit"
             style="width: 240px"
@@ -301,7 +424,13 @@
           />
         </el-form-item>
         <el-form-item label="不发货地区" prop="noPostArea">
-          <selectTree
+          <el-input
+            placeholder="请输入不发货地区"
+            style="width: 240px"
+            v-model="formBroadcast.noPostArea"
+          >
+          </el-input>
+          <!-- <selectTree
             style="width: 240px"
             v-model="formBroadcast.noPostArea"
             filterable
@@ -311,17 +440,19 @@
               value: 'id',
               label: 'name',
             }"
-          />
+          /> -->
         </el-form-item>
-        <el-form-item label="佣金比例" prop="commissionRate">
-          <el-input
-            placeholder="请输入佣金比例"
+        <el-form-item label="佣金比例" prop="commissionRate" v-if="edit">
+          <el-input-number
             style="width: 240px"
             v-model="formBroadcast.commissionRate"
-          >
-          </el-input>
+            :precision="2"
+            :step="0.1"
+            :max="100"
+            :min="0"
+          ></el-input-number>
         </el-form-item>
-        <el-form-item label="服务费" prop="regimentalPromotion">
+        <el-form-item label="服务费" prop="regimentalPromotion" v-if="edit">
           <el-input
             placeholder="请输入服务费"
             style="width: 240px"
@@ -329,13 +460,15 @@
           >
           </el-input>
         </el-form-item>
-        <el-form-item label="服务费率" prop="regimentalPromotionRate">
-          <el-input
-            placeholder="请输入服务费率"
+        <el-form-item label="服务费率" prop="regimentalPromotionRate" v-if="edit">
+          <el-input-number
             style="width: 240px"
             v-model="formBroadcast.regimentalPromotionRate"
-          >
-          </el-input>
+            :precision="2"
+            :step="0.1"
+            :max="100"
+            :min="0"
+          ></el-input-number>
         </el-form-item>
 
         <el-form-item label="领样要求" prop="sampleRequirement">
@@ -354,17 +487,17 @@
           >
           </el-input>
         </el-form-item>
-        <el-form-item label="商品链接" prop="detailUrl">
+        <!-- <el-form-item label="商品链接" prop="detailUrl">
           <el-input
             placeholder="请输入商品链接"
             style="width: 240px"
             v-model="formBroadcast.detailUrl"
           >
           </el-input>
-        </el-form-item>
-        <el-form-item label="发货率" prop="deliveryRate">
+        </el-form-item> -->
+        <el-form-item label="发货时效" prop="deliveryRate" v-if="edit">
           <el-input
-            placeholder="请输入发货"
+            placeholder="请输入发货时效"
             style="width: 240px"
             v-model="formBroadcast.deliveryRate"
           >
@@ -376,21 +509,31 @@
           style="width: 100%"
           class="entire-line"
         >
-          <el-input
+          <!-- <el-input
             placeholder="请输入手卡内容"
             style="width: 100%"
             type="textarea"
             :rows="2"
             v-model="formBroadcast.partnerRecommendText"
           >
+          </el-input> -->
+          <el-input
+            type="textarea"
+            :rows="2"
+            placeholder="粘贴图片转换文字"
+            v-model="formBroadcast.partnerRecommendText"
+            @paste.native="handlePaste"
+          >
           </el-input>
+          <!-- <textEditor
+            v-model="formBroadcast.partnerRecommendText"
+            style="min-height: 100px"
+            v-if="openAllocation"
+          /> -->
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button
-          type="primary"
-          @click="submitFormBroadcast"
-          :loading="confirmLoading"
+        <el-button type="primary" @click="submitFormBroadcast" :loading="confirmLoading"
           >确 定</el-button
         >
         <el-button
@@ -410,6 +553,7 @@
       :visible.sync="refuseVisible"
       width="500px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-input
         placeholder="请输入拒绝原因"
@@ -445,12 +589,19 @@ import {
   getCity,
   checkItem,
   editItem,
+  getCategoryIds,
+  getActivityIds,
+  readImage,
+  unbindingItem,
+  batchItemProcess,
 } from "@/api/goodsManagement/goods";
 import selectTree from "./selectTree.vue";
+import textEditor from "./textEditor.vue";
 export default {
-  name: "account-list",
+  name: "List",
   components: {
     selectTree,
+    textEditor,
   },
   data() {
     const equalToPassword = (rule, value, callback) => {
@@ -508,6 +659,7 @@ export default {
         pageSize: 10,
         itemTitle: undefined,
         itemId: undefined,
+        categoryId: undefined,
         examineStatus: "2",
       },
       //页面所有的下拉数据
@@ -517,10 +669,12 @@ export default {
           { value: "1", label: "待审核" },
           { value: "3", label: "审核拒绝" },
         ],
+        categoryIdList: [],
       },
       // 表单参数
       form: {},
       formBroadcast: {},
+      options: [],
       //上传报表下拉数据
       formList: {},
       fileList: [],
@@ -539,47 +693,99 @@ export default {
             trigger: "blur",
           },
           { required: true, validator: equalToPassword, trigger: "blur" },
+          {
+            type: "number",
+            message: "商品ID只能输入数字",
+            trigger: "blur",
+            transform(value) {
+              return +value;
+            },
+          },
+        ],
+        activityId: [
+          {
+            required: true,
+            message: "活动ID必填",
+            trigger: "blur",
+          },
+          {
+            type: "number",
+            message: "活动ID只能输入数字",
+            trigger: "blur",
+            transform(value) {
+              if (!!value) {
+                return +value;
+              }
+            },
+          },
         ],
-        activityId: {
-          required: true,
-          message: "活动ID必填",
-          trigger: "blur",
-        },
         postArea: {
           required: true,
           message: "发货地必选",
           trigger: "change",
         },
         noPostArea: {
-          required: true,
+          required: false,
           message: "不发货地必选",
-          trigger: "change",
-        },
-        commissionRate: {
-          required: true,
-          message: "佣金比例必填",
-          trigger: "blur",
-        },
-        regimentalPromotion: {
-          required: true,
-          message: "服务费必填",
-          trigger: "blur",
-        },
-        regimentalPromotionRate: {
-          required: true,
-          message: "服务费率必填",
           trigger: "blur",
         },
+        commissionRate: [
+          {
+            required: true,
+            message: "佣金比例必填",
+            trigger: "blur",
+          },
+          {
+            type: "number",
+            message: "佣金比例只能输入数字",
+            trigger: "blur",
+            transform(value) {
+              return +value;
+            },
+          },
+        ],
+        regimentalPromotion: [
+          {
+            required: false,
+            message: "服务费必填",
+            trigger: "blur",
+          },
+        ],
+        regimentalPromotionRate: [
+          {
+            required: true,
+            message: "服务费率必填",
+            trigger: "blur",
+          },
+          {
+            type: "number",
+            message: "服务费率只能输入数字",
+            trigger: "change",
+            transform(value) {
+              return +value;
+            },
+          },
+        ],
         sampleRequirement: {
           required: true,
           message: "领样要求必填",
           trigger: "blur",
         },
-        sampleCount: {
-          required: true,
-          message: "样品数量必填",
-          trigger: "blur",
-        },
+        sampleCount: [
+          {
+            required: true,
+            message: "样品数量必填",
+            trigger: "blur",
+          },
+          {
+            type: "number",
+            message: "佣金比例只能输入数字",
+            trigger: "blur",
+            transform(value) {
+              return +value;
+            },
+          },
+        ],
         partnerRecommendText: [
           {
             required: true,
@@ -588,7 +794,6 @@ export default {
           },
           {
             min: 5,
-            max: 200,
             message: "手卡内容最少输入5个字符",
             trigger: "change",
           },
@@ -606,38 +811,102 @@ export default {
   created() {
     this.userId = this.$store.getters.userId;
     this.getList();
+    this.getCategoryIds();
+    this.getActivityIds();
   },
   filters: {
     activityItemStatusName(status) {
       const statusMap = {
         1: "待审核",
-        2: "审核通过",
+        2: "已上架",
         3: "审核失败(拒绝)",
+        4: "活动结束",
         5: "失效",
       };
       return statusMap[status];
     },
   },
+  watch: {
+    "formBroadcast.partnerRecommendText": function (n, o) {
+      // console.log(n.replace(/<p>|<\/?p>|&nbsp;/gim, ""));
+    },
+  },
   methods: {
+    getRowKeys(row) {
+      return row.itemId;
+    },
+    batchProcess() {
+      if (this.okIds.length > 0) {
+        batchItemProcess({
+          itemIds: this.okIds,
+          status: 2,
+          examineId: this.$store.getters.userId,
+          examineName: this.$store.getters.name,
+        }).then((res) => {
+          this.okIds = [];
+          this.handleQuery();
+          this.$message.success(res.message);
+        });
+      } else {
+        this.$message.error("请选择商品");
+      }
+    },
+    handleSelectionChange(selection) {
+      this.okIds = selection.map((item) => item.itemId);
+    },
+    handlePaste(value) {
+      let items = value.clipboardData.items[0];
+      let file;
+      console.log(value);
+      if (items.type.includes("image")) {
+        file = items.getAsFile();
+        let formData = new FormData();
+        formData.append("file", file);
+        readImage(formData).then((res) => {
+          if (res.code == 0) {
+            // this.formBroadcast.partnerRecommendText = res.data;
+            this.$set(this.formBroadcast, "partnerRecommendText", res.data);
+          }
+        });
+      }
+    },
     toDetail(item) {
-      localStorage.setItem(
-        "addItemInfo",
-        JSON.stringify({ ...item, type: "look" })
-      );
+      localStorage.setItem("addItemInfo", JSON.stringify({ ...item, type: "look" }));
       this.$router.replace({
         path: "/goodsManagement/goodsPreview",
       });
     },
+    getActivityIds() {
+      getActivityIds({ userId: this.userId }).then((res) => {
+        this.options = res.data.map((item) => {
+          return {
+            label: item,
+            value: item,
+          };
+        });
+      });
+    },
+    getCategoryIds() {
+      getCategoryIds().then((res) => {
+        this.queryParamsList.categoryIdList = res.map((item) => {
+          return {
+            label: item.categoryName,
+            value: item.categoryId,
+          };
+        });
+      });
+    },
     copyInfomation(item) {
       if (navigator.clipboard && window.isSecureContext) {
         navigator.clipboard
-          .writeText(`
-店铺: ${item.shopTitle}
-商品体验: ${item.shopScore}
-商家服务: ${item.mallServiceScore}
+          .writeText(
+            `
+店铺: ${item.shopTitle ? item.shopTitle : "-"}
+商品体验: ${item.shopScore ? item.shopScore : "-"}
+商家服务: ${item.mallServiceScore ? item.mallServiceScore : "-"}
 产品: ${item.itemTitle}
 直播价: ¥${item.zkFinalPrice / 100}
-佣金比例: ${item.commissionRate}%
+佣金比例: ${item.commissionRate / 10}%
 团长推荐: ${item.partnerRecommendText}
 链接: ${item.detailUrl}`
           )
@@ -650,24 +919,22 @@ export default {
       } else {
         // 创建text area
         const textArea = document.createElement("textarea");
-        textArea.value =`
-店铺: ${item.shopTitle}
-商品体验: ${item.shopScore}
-商家服务: ${item.mallServiceScore}
+        textArea.value = `
+店铺: ${item.shopTitle ? item.shopTitle : "-"}
+商品体验: ${item.shopScore ? item.shopScore : "-"}
+商家服务: ${item.mallServiceScore ? item.mallServiceScore : "-"}
 产品: ${item.itemTitle}
 直播价: ¥${item.zkFinalPrice / 100}
-佣金比例: ${item.commissionRate}%
+佣金比例: ${item.commissionRate / 10}%
 团长推荐: ${item.partnerRecommendText}
-链接: ${item.detailUrl}`
+链接: ${item.detailUrl}`;
         // 使text area不在viewport,同时设置不可见
         document.body.appendChild(textArea);
         textArea.focus();
         textArea.select();
         return new Promise((resolve, reject) => {
           // 执行复制命令并移除文本框
-          document.execCommand("copy")
-            ? resolve()
-            : reject(new Error("出错了"));
+          document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
           textArea.remove();
         }).then(
           () => {
@@ -701,6 +968,21 @@ export default {
         this.$message.error("请输入拒绝原因");
       }
     },
+    unbindingItem(item) {
+      this.$modal
+        .confirm(`请确认是否解绑该商品信息?`)
+        .then(() => {
+          var params = {};
+          params.itemId = item.itemId;
+          unbindingItem(params)
+            .then((res) => {
+              this.getList();
+              this.$modal.msgSuccess(res.message);
+            })
+            .catch((err) => {});
+        })
+        .catch(() => {});
+    },
     okInfomation(item) {
       this.$modal
         .confirm(`请确认是否审核通过该商品信息?`)
@@ -727,7 +1009,6 @@ export default {
           return {
             id: item,
             name: item,
-            disabled: true,
           };
         });
       });
@@ -778,13 +1059,11 @@ export default {
     getList() {
       this.loading = true;
 
-      getItemList({ userId: this.userId, ...this.queryParams }).then(
-        (response) => {
-          this.typeList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
-      );
+      getItemList({ userId: this.userId, ...this.queryParams }).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
     },
     // 取消按钮
     cancel() {
@@ -831,31 +1110,23 @@ export default {
         this.$set(this.formBroadcast, "itemId", item.itemId);
         this.$set(this.formBroadcast, "postArea", item.postArea);
         this.$set(this.formBroadcast, "noPostArea", item.noPostArea);
-        this.$set(this.formBroadcast, "commissionRate", item.commissionRate);
+        this.$set(this.formBroadcast, "commissionRate", item.commissionRate / 10);
 
         this.$set(
           this.formBroadcast,
           "regimentalPromotion",
-          item.regimentalPromotion
+          item.regimentalPromotion / 100
         );
         this.$set(
           this.formBroadcast,
           "regimentalPromotionRate",
-          item.regimentalPromotionRate
-        );
-        this.$set(
-          this.formBroadcast,
-          "sampleRequirement",
-          item.sampleRequirement
+          item.regimentalPromotionRate / 10
         );
+        this.$set(this.formBroadcast, "sampleRequirement", item.sampleRequirement);
         this.$set(this.formBroadcast, "sampleCount", item.sampleCount);
-        this.$set(this.formBroadcast, "detailUrl", item.detailUrl);
+        // this.$set(this.formBroadcast, "detailUrl", item.detailUrl);
         this.$set(this.formBroadcast, "deliveryRate", item.deliveryRate);
-        this.$set(
-          this.formBroadcast,
-          "partnerRecommendText",
-          item.partnerRecommendText
-        );
+        this.$set(this.formBroadcast, "partnerRecommendText", item.partnerRecommendText);
       });
     },
     /** 修改按钮操作 */
@@ -867,17 +1138,29 @@ export default {
       this.$refs["formBroadcast"].validate((valid) => {
         if (valid) {
           if (!this.edit) {
-            localStorage.setItem(
-              "addItemInfo",
-              JSON.stringify(this.formBroadcast)
-            );
-            this.$router.replace({
-              path: "/goodsManagement/goodsPreview",
-            });
+            if (this.formBroadcast.partnerRecommendText.indexOf("img") == -1) {
+              var params = { ...this.formBroadcast };
+              params.partnerRecommendText = params.partnerRecommendText.replace(
+                /<p>|<\/?p>|&nbsp;|<pre>|<\/?pre>/gim,
+                ""
+              );
+              params.examineStatus = 1;
+              this.confirmLoading = false;
+              this.openAllocation = false;
+              localStorage.setItem("addItemInfo", JSON.stringify(params));
+              this.$router.replace({
+                path: "/goodsManagement/goodsPreview",
+              });
+            } else {
+              this.$message.error("图片未识别,请重新截图");
+            }
           } else {
             this.confirmLoading = true;
             var params = { ...this.formBroadcast };
             params.examineStatus = 1;
+            params.regimentalPromotion = params.regimentalPromotion * 100;
+            params.regimentalPromotionRate = params.regimentalPromotionRate * 10;
+            params.commissionRate = params.commissionRate * 10;
             editItem(params)
               .then((res) => {
                 this.confirmLoading = false;
@@ -901,11 +1184,7 @@ export default {
           var fileList = this.$refs.fileUploadDialog.fileList;
           var dapanUrls = this.$refs.fileUpload.fileList;
           var portraitUrls = this.$refs.fileUploadFx.fileList;
-          if (
-            fileList.length == 0 &&
-            dapanUrls.length == 0 &&
-            portraitUrls.length == 0
-          ) {
+          if (fileList.length == 0 && dapanUrls.length == 0 && portraitUrls.length == 0) {
             this.$message.error("直播数据,数据大盘,画像分析必须最少上传一项");
             return;
           } else {

+ 23 - 12
src/views/goodsManagement/promoterSelect.vue

@@ -50,8 +50,14 @@
       :data="typeList"
       ref="multipleTable"
       @selection-change="handleSelectionChange"
+      :row-key="getRowKeys"
     >
-      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column
+        type="selection"
+        width="50"
+        :reserve-selection="true"
+        align="center"
+      />
       <el-table-column
         label="达人名称"
         align="center"
@@ -144,6 +150,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -407,12 +414,15 @@ export default {
   },
   filters: {},
   methods: {
+    getRowKeys(row) {
+      return row.id;
+    },
     handleSelectionChange(selection) {
-      this.okIds = selection.map((item) => item.promoterId);
+      this.okIds = selection.map((item) => item.id);
     },
     toIndexDetail(item) {
       var that = this;
-      if (!!this.okIds) {
+      if (!!this.okIds && this.okIds.length > 0) {
         this.$router.replace({
           path: "/goodsManagement/set",
           query: {
@@ -427,11 +437,16 @@ export default {
     /** 查询字典类型列表 */
     getList() {
       this.loading = true;
-      getPromoterList({ userId: this.userId, ...this.queryParams }).then((response) => {
-        this.typeList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
+      this.typeList = [];
+      getPromoterList({ userId: this.userId, ...this.queryParams })
+        .then((response) => {
+          this.loading = false;
+          this.typeList = response.rows;
+          this.total = response.total;
+        })
+        .catch((err) => {
+          console.log(err);
+        });
     },
     // 取消按钮
     cancel() {
@@ -643,8 +658,4 @@ export default {
 .tableBox {
   width: 100%;
 }
-
-::v-deep .el-table {
-  height: calc(100vh - 280px);
-}
 </style>

+ 23 - 8
src/views/goodsManagement/samplingDetail.vue

@@ -94,9 +94,12 @@
             <el-descriptions-item label="创建时间">{{
               itemJson.createTime
             }}</el-descriptions-item>
-            <el-descriptions-item label="备注" :span="2">
+            <el-descriptions-item label="备注" :span="1">
               {{ itemJson.collectSampleDesc }}
             </el-descriptions-item>
+            <el-descriptions-item label="快递单号" :span="1">
+              {{ itemJson.courierNumber ? itemJson.courierNumber : "-" }}
+            </el-descriptions-item>
           </el-descriptions>
           <div style="width: 150px">
             <p>状态</p>
@@ -115,9 +118,9 @@
             <el-steps :active="itemLogs.length - 1" align-center>
               <el-step title="创建领取">
                 <div slot="description">
-                  {{ itemJson.itemCreateName }}
+                  {{ itemLogs[0] ? itemLogs[0].userName : "" }}
                   <br />
-                  {{ itemJson.createTime }}
+                  {{ itemLogs[0] ? itemLogs[0].updateTime : "" }}
                 </div>
               </el-step>
               <el-step
@@ -161,7 +164,9 @@
           <el-card shadow="never" class="card-show main-top">
             <h4><span class="prefix"></span>用户信息</h4>
             <div style="width: 100%" class="item-name-calss dh-data">
-              <p>用户名称:{{ itemJson.promoterNickName }}</p>
+              <p>达人ID:{{ itemJson.promoterId }}</p>
+              <p>达人昵称:{{ itemJson.promoterNickName }}</p>
+              <p>收件人:{{ itemJson.consignee }}</p>
               <p>联系电话:{{ itemJson.promoterPhone }}</p>
               <p>联系地址:{{ itemJson.promoterAddress }}</p>
             </div>
@@ -198,6 +203,7 @@
       :visible.sync="refuseVisible"
       width="500px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-input
         placeholder="请输入拒绝原因"
@@ -228,6 +234,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -251,7 +258,7 @@
           <el-input
             placeholder="请输入快递单号"
             style="width: 240px"
-            v-model="formBroadcast.courierNumber"
+            v-model.trim="formBroadcast.courierNumber"
           >
           </el-input>
         </el-form-item>
@@ -296,12 +303,14 @@
     <el-dialog
       title="查看作业"
       :visible.sync="workLookVisible"
-      width="500px"
+      width="900px"
       append-to-body
       center
+      :close-on-click-modal="false"
     >
       <div v-if="itemJson.taskFileUrl">
-        <div v-html="itemJson.taskFileUrl"></div>
+        <!-- <div v-html="itemJson.taskFileUrl"></div> -->
+        <div v-html="itemJson.taskFileUrl" style="width: 100%; overflow: auto"></div>
       </div>
       <el-dialog
         width="30%"
@@ -309,6 +318,7 @@
         :visible.sync="innerVisible"
         append-to-body
         center
+        :close-on-click-modal="false"
       >
         <el-input
           placeholder="请输入拒绝原因"
@@ -507,7 +517,12 @@ export default {
       params.userName = this.$store.getters.name;
       editPreview(params)
         .then((res) => {
-          this.getList();
+          this.getItemPreview();
+          this.confirmLoading = false;
+          this.innerVisible = false;
+          this.refuseInfo = null;
+          this.workLookVisible = false;
+          this.showWork = null;
           this.$modal.msgSuccess("审核通过");
         })
         .catch(() => {

+ 622 - 73
src/views/goodsManagement/samplingList.vue

@@ -10,6 +10,74 @@
       v-show="showSearch"
       label-width="100px"
     >
+      <el-form-item label="领样人" prop="collectSampleId">
+        <el-select
+          filterable
+          v-model="queryParams.collectSampleId"
+          placeholder="人员名称"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.personList"
+            :key="item.userId"
+            :label="item.nickMame"
+            :value="item.userId"
+          >
+            <div style="display: flex">
+              <span
+                style="
+                  width: 10px;
+                  height: 10px;
+                  border-radius: 50%;
+                  background-color: green;
+                  position: relative;
+                  top: 12px;
+                  margin-right: 5px;
+                "
+                :style="
+                  item.status == '0' ? 'backgroundColor:green' : 'backgroundColor:red'
+                "
+                >{{ item.value }}</span
+              ><span>{{ item.nickMame }}</span>
+            </div>
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="商品创建人" prop="itemCreateId">
+        <el-select
+          filterable
+          v-model="queryParams.itemCreateId"
+          placeholder="人员名称"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.personList"
+            :key="item.userId"
+            :label="item.nickMame"
+            :value="item.userId"
+          >
+            <div style="display: flex">
+              <span
+                style="
+                  width: 10px;
+                  height: 10px;
+                  border-radius: 50%;
+                  background-color: green;
+                  position: relative;
+                  top: 12px;
+                  margin-right: 5px;
+                "
+                :style="
+                  item.status == '0' ? 'backgroundColor:green' : 'backgroundColor:red'
+                "
+                >{{ item.value }}</span
+              ><span>{{ item.nickMame }}</span>
+            </div>
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="商品名称" prop="itemTitle">
         <el-input
           placeholder="请输入商品名称"
@@ -42,6 +110,26 @@
         >
         </el-input>
       </el-form-item>
+      <el-form-item label="电话号码" prop="promoterPhone">
+        <el-input
+          placeholder="请输入电话号码"
+          style="width: 240px"
+          v-model="queryParams.promoterPhone"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item
+        label="收货人"
+        prop="consignee"
+        v-if="queryParams.collectSampleStatus == '3'"
+      >
+        <el-input
+          placeholder="请输入收货人"
+          style="width: 240px"
+          v-model="queryParams.consignee"
+        >
+        </el-input>
+      </el-form-item>
 
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
@@ -63,6 +151,14 @@
         >
       </el-col>
     </el-row> -->
+    <el-button
+      type="primary"
+      plain
+      size="mini"
+      @click="addNew"
+      style="margin-bottom: 15px"
+      >导出</el-button
+    >
     <el-tabs v-model="queryParams.collectSampleStatus" @tab-click="handleClick">
       <el-tab-pane
         :label="item.label"
@@ -70,8 +166,37 @@
         v-for="(item, index) in queryParamsList.tagList"
         :key="index"
       >
-        <el-table v-loading="loading" :data="typeList" ref="multipleTable">
-          <el-table-column label="商品名称" align="center" prop="itemTitle" width="300">
+        <el-button
+          type="primary"
+          plain
+          size="mini"
+          @click="batchProcess"
+          v-if="queryParams.collectSampleStatus == 1"
+          style="margin-bottom: 15px"
+          >批量审核</el-button
+        >
+
+        <el-table
+          v-loading="loading"
+          :data="typeList"
+          ref="multipleTable"
+          @selection-change="handleSelectionChange"
+          style="width: 100%"
+          :row-key="getRowKeys"
+        >
+          <el-table-column
+            type="selection"
+            width="50"
+            align="center"
+            v-show="queryParams.collectSampleStatus == '3'"
+          />
+          <el-table-column
+            label="商品名称"
+            align="center"
+            prop="itemTitle"
+            width="300"
+            fixed="left"
+          >
             <template slot-scope="scope">
               <div style="display: flex; width: 100%">
                 <div style="width: 40%">
@@ -178,15 +303,15 @@
                               <p>达人Id: {{ scope.row.promoterId }}</p>
                             </div>
                           </div>
-                          <div
-                            style="
-                              display: flex;
-                              width: 100%;
-                              justify-content: space-around;
-                            "
-                          >
+                          <div class="show-main">
                             <div style="width: 40%">
-                              <p class="p-main">{{ promoterInfo.orderAmount }}</p>
+                              <p class="p-main">
+                                {{
+                                  promoterInfo.orderAmount
+                                    ? allMoney(promoterInfo.orderAmount / 100)
+                                    : ""
+                                }}
+                              </p>
                               <p class="p-title">近30天睿选GMV</p>
                             </div>
                             <div style="width: 40%">
@@ -196,13 +321,7 @@
                               <p class="p-title">作业完成率</p>
                             </div>
                           </div>
-                          <div
-                            style="
-                              display: flex;
-                              width: 100%;
-                              justify-content: space-around;
-                            "
-                          >
+                          <div class="show-main">
                             <div style="width: 40%">
                               <p class="p-main">{{ promoterInfo.videoSales }}</p>
                               <p class="p-title">短视频销售额</p>
@@ -242,13 +361,35 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="领样人" align="center" prop="collectSampleName">
+          <el-table-column
+            label="领样人"
+            align="center"
+            prop="collectSampleName"
+            width="150"
+          >
           </el-table-column>
-          <el-table-column label="创建人" align="center" prop="itemCreateName">
+          <el-table-column
+            label="商品创建人"
+            align="center"
+            prop="itemCreateName"
+            width="150"
+          >
           </el-table-column>
-          <el-table-column label="预估服务费" align="center" prop="regimentalPromotion">
+          <el-table-column
+            label="收货人"
+            align="center"
+            prop="consignee"
+            width="150"
+            v-if="queryParams.collectSampleStatus == '3'"
+          >
           </el-table-column>
-          <el-table-column label="领样要求" align="center" prop="sampleRequirement">
+
+          <el-table-column
+            label="领样备注"
+            align="center"
+            prop="sampleRequirement"
+            width="150"
+          >
             <template slot-scope="scope">
               <div v-if="!!scope.row.sampleRequirement">
                 {{ scope.row.sampleRequirement }}
@@ -256,7 +397,7 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <el-table-column label="样品数量" align="center" prop="sampleCount">
+          <el-table-column label="样品数量" align="center" prop="sampleCount" width="150">
             <template slot-scope="scope">
               <div v-if="!!scope.row.sampleCount">
                 {{ scope.row.sampleCount }}
@@ -264,6 +405,61 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
+          <el-table-column
+            label="快递单号"
+            align="center"
+            prop="courierNumber"
+            width="150"
+            v-if="queryParams.collectSampleStatus == '4'"
+          >
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.courierNumber">
+                {{ scope.row.courierNumber }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            label="达人单品出单量"
+            align="center"
+            prop="promoterOrderNum"
+            width="150"
+          >
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.promoterOrderNum">
+                {{ scope.row.promoterOrderNum }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="达人出单量"
+            align="center"
+            prop="validOrderNum"
+            width="150"
+          >
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.validOrderNum">
+                {{ scope.row.validOrderNum }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="达人出单金额"
+            align="center"
+            prop="validAmount"
+            width="150"
+          >
+            <template slot-scope="scope">
+              <div v-if="!!scope.row.validAmount">
+                {{ scope.row.validAmount ? allMoney(scope.row.validAmount / 100) : "" }}
+              </div>
+              <div v-else>-</div>
+            </template>
+          </el-table-column>
+
           <!-- <el-table-column label="领样人数" align="center" prop="sampleCount">
             <template slot-scope="scope">
               <div v-if="!!scope.row.sampleCount">
@@ -280,7 +476,13 @@
               <div v-else>-</div>
             </template>
           </el-table-column> -->
-          <el-table-column label="状态" align="center" prop="collectSampleStatus">
+
+          <el-table-column
+            label="状态"
+            align="center"
+            prop="collectSampleStatus"
+            width="150"
+          >
             <template slot-scope="scope">
               <div v-if="!!scope.row.collectSampleStatus">
                 {{ scope.row.collectSampleStatus | collectSampleStatusName }}
@@ -288,7 +490,12 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <el-table-column label="拒绝原因" align="center" prop="collectSampleDesc">
+          <el-table-column
+            label="备注"
+            align="center"
+            prop="collectSampleDesc"
+            width="150"
+          >
             <template slot-scope="scope">
               <div
                 v-if="
@@ -302,18 +509,10 @@
               <div v-else>-</div>
             </template>
           </el-table-column>
-          <el-table-column label="创建时间" align="center" prop="createTime">
+          <el-table-column label="创建时间" align="center" prop="createTime" width="150">
             <template slot-scope="scope">
               <div v-if="!!scope.row.createTime">
-                {{ scope.row.createTime.split(" ")[0] }}
-              </div>
-              <div v-else>-</div>
-            </template>
-          </el-table-column>
-          <el-table-column label="手卡信息" align="center" prop="partnerRecommendText">
-            <template slot-scope="scope">
-              <div v-if="!!scope.row.partnerRecommendText">
-                {{ scope.row.partnerRecommendText }}
+                {{ scope.row.createTime }}
               </div>
               <div v-else>-</div>
             </template>
@@ -336,14 +535,21 @@
             label="操作"
             align="center"
             class-name="small-padding fixed-width"
-            width="200px"
+            width="250px"
+            fixed="right"
           >
             <template slot-scope="scope">
               <el-button
                 size="mini"
                 type="text"
                 @click="okInfomation(scope.row)"
-                v-if="queryParams.collectSampleStatus == '1'"
+                v-if="
+                  queryParams.collectSampleStatus == '1' &&
+                  ($store.getters.roles[0] == 'admin' ||
+                    $store.getters.roles[0] == 'supplyChainAdmin' ||
+                    $store.getters.roles[0] == 'courtship' ||
+                    $store.getters.roles[0] == 'courtshipManager')
+                "
                 :disabled="
                   $store.getters.roles[0] != 'admin' &&
                   $store.getters.roles[0] != 'supplyChainAdmin' &&
@@ -360,18 +566,30 @@
                   refuseInfo = '';
                   refuseVisible = true;
                 "
-                v-if="queryParams.collectSampleStatus == '1'"
-                :disabled="
-                  $store.getters.roles[0] != 'admin' &&
-                  $store.getters.roles[0] != 'supplyChainAdmin' &&
-                  $store.getters.roles[0] != 'courtship' &&
-                  $store.getters.roles[0] != 'courtshipManager'
+                v-if="
+                  (queryParams.collectSampleStatus == '1' ||
+                    queryParams.collectSampleStatus == '3') &&
+                  ($store.getters.roles[0] == 'admin' ||
+                    $store.getters.roles[0] == 'supplyChainAdmin' ||
+                    $store.getters.roles[0] == 'courtship' ||
+                    $store.getters.roles[0] == 'courtshipManager')
                 "
                 >拒绝</el-button
               >
               <el-button
                 size="mini"
                 type="text"
+                @click="deleteInfomation(scope.row)"
+                v-if="
+                  queryParams.collectSampleStatus == '1' &&
+                  scope.row.collectSampleId == $store.getters.userId
+                "
+                >作废</el-button
+              >
+
+              <el-button
+                size="mini"
+                type="text"
                 @click="handleAddbroadcast(scope.row)"
                 v-if="queryParams.collectSampleStatus == '3'"
                 :disabled="
@@ -382,6 +600,15 @@
                 "
                 >录入单号</el-button
               >
+
+              <el-button
+                size="mini"
+                type="text"
+                @click="toUpdateTask(scope.row)"
+                v-if="queryParams.collectSampleStatus == '3'"
+                >上传作业</el-button
+              >
+
               <el-button
                 size="mini"
                 type="text"
@@ -412,7 +639,101 @@
                 v-if="queryParams.collectSampleStatus == '6'"
                 >查看作业</el-button
               >
-              <el-button size="mini" type="text" @click="toDetail(scope.row)"
+
+              <el-button
+                size="mini"
+                type="text"
+                @click="copyInfomation(scope.row)"
+                v-if="queryParams.collectSampleStatus == '3'"
+                >复制</el-button
+              >
+              <el-button
+                slot="reference"
+                size="mini"
+                type="text"
+                style="margin-right: 5px"
+                @click="updateKd(scope.row)"
+                v-if="queryParams.collectSampleStatus == '4'"
+                :disabled="
+                  $store.getters.roles[0] != 'admin' &&
+                  $store.getters.roles[0] != 'supplyChainAdmin' &&
+                  $store.getters.roles[0] != 'courtship' &&
+                  $store.getters.roles[0] != 'courtshipManager'
+                "
+                >修改单号</el-button
+              >
+
+              <el-popover
+                placement="top"
+                title=""
+                trigger="hover"
+                @show="courierNumberInfo(scope.row)"
+              >
+                <el-skeleton
+                  style="width: 500px"
+                  :loading="loadingCourierNumber"
+                  animated
+                >
+                  <template slot="template">
+                    <div style="padding: 14px">
+                      <el-skeleton-item variant="h3" style="width: 50%" />
+                      <div
+                        style="
+                          display: flex;
+                          align-items: center;
+                          justify-items: space-between;
+                          margin-top: 16px;
+                          height: 16px;
+                        "
+                      >
+                        <el-skeleton-item variant="text" style="margin-right: 16px" />
+                        <el-skeleton-item variant="text" style="width: 30%" />
+                      </div>
+                    </div>
+                  </template>
+                  <template>
+                    <el-card v-if="courierInfo">
+                      <div
+                        style="width: 100%; max-height: 500px; overflow: auto"
+                        class="item-name-calss dh-data"
+                        v-if="
+                          !!courierInfo.expressData && courierInfo.expressData.length > 0
+                        "
+                      >
+                        <timeline :reverse="false">
+                          <timeline-item
+                            v-for="(activity, index) in courierInfo.expressData"
+                            :key="index"
+                            :timestamp="activity.ftime"
+                          >
+                            {{ activity.context }}
+                          </timeline-item>
+                        </timeline>
+                      </div>
+                      <div v-else>
+                        <el-empty description="暂无数据"></el-empty>
+                      </div>
+                    </el-card>
+                    <el-card v-else>
+                      <el-empty description="暂无数据"></el-empty>
+                    </el-card>
+                  </template>
+                </el-skeleton>
+                <el-button
+                  slot="reference"
+                  size="mini"
+                  type="text"
+                  style="margin-right: 5px"
+                  v-if="queryParams.collectSampleStatus == '4'"
+                  >物流详情</el-button
+                >
+              </el-popover>
+
+              <el-button
+                size="mini"
+                style="margin-left: 5px"
+                type="text"
+                @click="toDetail(scope.row)"
                 >详情</el-button
               >
             </template>
@@ -435,6 +756,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -458,7 +780,7 @@
           <el-input
             placeholder="请输入快递单号"
             style="width: 240px"
-            v-model="formBroadcast.courierNumber"
+            v-model.trim="formBroadcast.courierNumber"
           >
           </el-input>
         </el-form-item>
@@ -484,6 +806,7 @@
       :visible.sync="refuseVisible"
       width="500px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-input
         placeholder="请输入拒绝原因"
@@ -510,7 +833,13 @@
     </el-dialog>
 
     <!-- 上传作业 -->
-    <el-dialog title="上传作业" :visible.sync="workVisible" width="500px" append-to-body>
+    <el-dialog
+      title="上传作业"
+      :visible.sync="workVisible"
+      width="500px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
       <uploadEditor
         v-model="noticeContent"
         style="min-height: 100px"
@@ -536,17 +865,19 @@
     <el-dialog
       title="查看作业"
       :visible.sync="workLookVisible"
-      width="500px"
+      width="900px"
       append-to-body
       center
+      :close-on-click-modal="false"
     >
-      <div v-html="showWork"></div>
+      <div v-html="showWork" style="width: 100%; overflow: auto"></div>
       <el-dialog
         width="30%"
         title="拒绝原因"
         :visible.sync="innerVisible"
         append-to-body
         center
+        :close-on-click-modal="false"
       >
         <el-input
           placeholder="请输入拒绝原因"
@@ -606,6 +937,9 @@
 <script>
 // import { refreshCache } from "@/api/system/dict/type";
 import uploadEditor from "./uploadEditor.vue";
+import { downFilePost } from "@/api/supplyChain/supplyChain";
+import Timeline from "./timeline/index.js";
+import TimelineItem from "./timeline-item/index.js";
 import {
   getCity,
   checkItem,
@@ -613,13 +947,22 @@ import {
   getList,
   getCompany,
   getPromoterInfo,
+  copyInfo,
+  courierNumberInfo,
+  removePreview,
+  updateCourierNumber,
+  toUpdateTask,
+  batchProcess,
 } from "@/api/goodsManagement/goods";
+import { getSupplyChainUserList } from "@/api/supplyChain/supplyChain";
 import selectTree from "./selectTree.vue";
 export default {
-  name: "account-list",
+  name: "SamplingList",
   components: {
     selectTree,
     uploadEditor,
+    Timeline,
+    TimelineItem,
   },
   data() {
     const equalToPassword = (rule, value, callback) => {
@@ -685,18 +1028,24 @@ export default {
         promoterNickName: undefined,
         promoterId: undefined,
         collectSampleStatus: "",
+        promoterPhone: undefined,
+        consignee: undefined,
+        itemCreateId: undefined,
+        collectSampleId: undefined,
       },
       //页面所有的下拉数据
       queryParamsList: {
         tagList: [
           { value: "", label: "全部" },
           { value: "1", label: "待审核" },
-          { value: "3", label: "待录入单" },
+          { value: "3", label: "待录入单" },
           { value: "4", label: "已发货" },
           { value: "5", label: "待上传作业" },
           { value: "6", label: "待审核作业" },
           { value: "2", label: "审核拒绝" },
+          { value: "7", label: "审核通过" },
         ],
+        personList: [],
       },
       // 表单参数
       form: {},
@@ -735,18 +1084,42 @@ export default {
       itemId: null,
       promoterInfo: null,
       loadingPromoterInfo: true,
+      loadingCourierNumber: true,
+      courierInfo: null,
+      okIds: [],
+      updateCourierNumberType: false,
     };
   },
+  activated() {
+    this.$nextTick(() => {
+      this.getPersonList();
+      if (localStorage.getItem("samplingType")) {
+        this.queryParams.collectSampleStatus = localStorage.getItem("samplingType");
+      } else {
+        // this.queryParams.collectSampleStatus = "1";
+      }
+      this.getList();
+    });
+  },
   created() {
     this.userId = this.$store.getters.userId;
-    this.getList();
+    this.getPersonList();
+    this.$nextTick(() => {
+      if (localStorage.getItem("samplingType")) {
+        this.queryParams.collectSampleStatus = localStorage.getItem("samplingType");
+      } else {
+        // this.queryParams.collectSampleStatus = "1";
+      }
+      this.getList();
+    });
   },
   filters: {
     activityItemStatusName(status) {
       const statusMap = {
         1: "待审核",
-        2: "审核通过",
+        2: "已上架",
         3: "审核失败(拒绝)",
+        4: "活动结束",
         5: "失效",
       };
       return statusMap[status];
@@ -765,7 +1138,87 @@ export default {
     },
   },
   methods: {
+    getRowKeys(row) {
+      return row.id;
+    },
+    batchProcess() {
+      if (this.okIds.length > 0) {
+        batchProcess({
+          ids: this.okIds,
+          status: 3,
+          userId: this.$store.getters.userId,
+          userName: this.$store.getters.name,
+        }).then((res) => {
+          this.okIds = [];
+          this.handleQuery();
+          this.$message.success(res.message);
+        });
+      } else {
+        this.$message.error("请选择领样");
+      }
+    },
+    getPersonList() {
+      getSupplyChainUserList().then((response) => {
+        this.queryParamsList.personList = response.rows;
+      });
+    },
+    handleSelectionChange(selection) {
+      this.okIds = selection.map((item) => item.id);
+    },
+    copyInfomation(item) {
+      copyInfo({ promoterId: item.promoterId }).then((res) => {
+        if (navigator.clipboard && window.isSecureContext) {
+          navigator.clipboard
+            .writeText(
+              `
+快手ID: ${item.promoterId}
+快手昵称: ${item.promoterNickName}
+粉丝量: ${res.data.fansNumber}
+总销售额: ${res.data.totalSale}
+收件人: ${item.consignee}
+手机号: ${item.promoterPhone}
+地址: ${item.promoterAddress}
+`
+            )
+            .then(() => {
+              this.$message.success("复制成功");
+            })
+            .catch((err) => {
+              this.$message.error("复制失败");
+            });
+        } else {
+          // 创建text area
+          const textArea = document.createElement("textarea");
+          textArea.value = `
+快手ID: ${item.promoterId}
+快手昵称: ${item.promoterNickName}
+粉丝量: ${res.data.fansNumber}
+总销售额: ${res.data.totalSale}
+收件人: ${item.consignee}
+手机号: ${item.promoterPhone}
+地址: ${item.promoterAddress}
+`;
+          // 使text area不在viewport,同时设置不可见
+          document.body.appendChild(textArea);
+          textArea.focus();
+          textArea.select();
+          return new Promise((resolve, reject) => {
+            // 执行复制命令并移除文本框
+            document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
+            textArea.remove();
+          }).then(
+            () => {
+              this.$message.success("复制成功");
+            },
+            () => {
+              this.$message.error("复制失败");
+            }
+          );
+        }
+      });
+    },
     toDetail(item) {
+      localStorage.setItem("samplingType", this.queryParams.collectSampleStatus);
       this.$router.replace({
         path: "/goodsManagement/detail",
         query: {
@@ -782,6 +1235,30 @@ export default {
         }
       });
     },
+    updateKd(item) {
+      this.$nextTick(() => {
+        this.ids = item.id;
+        this.openAllocation = true;
+        this.updateCourierNumberType = true;
+        getCompany().then((res) => {
+          this.superiorList = res;
+        });
+      });
+    },
+    courierNumberInfo(item) {
+      this.loadingCourierNumber = true;
+      courierNumberInfo({ courierNumber: item.courierNumber }).then((res) => {
+        if (res.code == 0) {
+          this.courierInfo = res.data
+            ? {
+                ...res.data,
+                expressData: JSON.parse(res.data.expressData),
+              }
+            : null;
+          this.loadingCourierNumber = false;
+        }
+      });
+    },
     workReject() {
       if (!!this.innerInfo) {
         var params = {};
@@ -814,6 +1291,10 @@ export default {
       params.userName = this.$store.getters.name;
       editPreview(params)
         .then((res) => {
+          this.innerVisible = false;
+          this.innerInfo = null;
+          this.workLookVisible = false;
+          this.showWork = null;
           this.getList();
           this.$modal.msgSuccess("审核通过");
         })
@@ -866,6 +1347,40 @@ export default {
         this.$message.error("请填写拒绝理由");
       }
     },
+    deleteInfomation(item) {
+      this.$modal
+        .confirm(`请确认是否作废该领样?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          removePreview(params)
+            .then((res) => {
+              this.getList();
+              this.$modal.msgSuccess("作废成功");
+            })
+            .catch(() => {
+              this.$message.error("失败");
+            });
+        })
+        .catch(() => {});
+    },
+    toUpdateTask(item) {
+      this.$modal.confirm(`请确认是否提交至待上传作业?`).then(() => {
+        var params = {};
+        params.id = item.id;
+        params.collectSampleStatus = 5;
+        params.userId = this.$store.getters.userId;
+        params.userName = this.$store.getters.name;
+        editPreview(params)
+          .then((res) => {
+            this.getList();
+            this.$modal.msgSuccess("审核通过");
+          })
+          .catch(() => {
+            this.$message.error("失败");
+          });
+      });
+    },
     okInfomation(item) {
       this.$modal
         .confirm(`请确认是否审核通过该领样?`)
@@ -926,6 +1441,7 @@ export default {
     },
     handleClick() {
       this.queryParams.pageNum = 1;
+      this.queryParams.consignee = undefined;
       this.getList();
     },
     /** 查询字典类型列表 */
@@ -966,23 +1482,36 @@ export default {
     resetQuery() {
       this.dateRange = [];
       this.resetForm("queryForm");
+      this.queryParams.consignee = undefined;
       this.handleQuery();
     },
     addNew() {
-      this.openAllocation = true;
-      this.edit = false;
-      this.ids = null;
-      this.confirmLoading = false;
-      this.formBroadcast = {};
-      setTimeout(() => {
-        this.$refs.formBroadcast.clearValidate();
-      }, 0);
+      if (this.okIds.length > 0) {
+        downFilePost("/itemCollectSamples/exportCollectSamples", {
+          ids: this.okIds,
+        }).then((res) => {
+          let blob = new Blob([res], {
+            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+          });
+          let downloadElement = document.createElement("a");
+          let href = window.URL.createObjectURL(blob); //创建下载的链接
+          downloadElement.href = href;
+          downloadElement.download = "领样详情.xlsx"; //下载后文件名
+          document.body.appendChild(downloadElement);
+          downloadElement.click(); //点击下载
+          document.body.removeChild(downloadElement); //下载完成移除元素
+          window.URL.revokeObjectURL(href); //释放掉blob对象
+        });
+      } else {
+        this.$message.error("请选择领样");
+      }
     },
     /** 编辑地址 新增达人*/
     handleAddbroadcast(item) {
       this.$nextTick(() => {
         this.ids = item.id;
         this.openAllocation = true;
+        this.updateCourierNumberType = false;
         getCompany().then((res) => {
           this.superiorList = res;
         });
@@ -999,20 +1528,35 @@ export default {
           this.confirmLoading = true;
           var params = { ...this.formBroadcast };
           params.id = this.ids;
-          params.userId = this.$store.getters.userId;
-          params.userName = this.$store.getters.name;
-          editPreview(params)
-            .then((res) => {
-              this.confirmLoading = false;
-              this.openAllocation = false;
-              this.formBroadcast = {};
-              this.getList();
-              this.$modal.msgSuccess("修改成功");
-            })
-            .catch(() => {
-              this.confirmLoading = false;
-              this.$message.error("失败");
-            });
+          // params.userId = this.$store.getters.userId;
+          // params.userName = this.$store.getters.name;
+          if (this.updateCourierNumberType) {
+            updateCourierNumber(params)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.openAllocation = false;
+                this.formBroadcast = {};
+                this.getList();
+                this.$modal.msgSuccess("修改成功");
+              })
+              .catch(() => {
+                this.confirmLoading = false;
+                this.$message.error("失败");
+              });
+          } else {
+            editPreview(params)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.openAllocation = false;
+                this.formBroadcast = {};
+                this.getList();
+                this.$modal.msgSuccess("修改成功");
+              })
+              .catch(() => {
+                this.confirmLoading = false;
+                this.$message.error("失败");
+              });
+          }
         }
       });
     },
@@ -1113,4 +1657,9 @@ export default {
 ::v-deep .el-tabs__content {
   overflow: initial;
 }
+.show-main {
+  display: flex;
+  width: 100%;
+  justify-content: space-around;
+}
 </style>

+ 64 - 29
src/views/goodsManagement/selectTree.vue

@@ -33,7 +33,7 @@
         @node-click="handleNodeClick"
         @check-change="handleCheckChange"
         :load="loadNode"
-        lazy
+        :lazy="lazy"
       ></el-tree>
     </el-option>
   </el-select>
@@ -83,6 +83,10 @@ export default {
         };
       },
     },
+    lazy: {
+      type: Boolean,
+      default: true,
+    },
   },
   data() {
     return {
@@ -116,29 +120,27 @@ export default {
       }
       if (node.level > 1) return resolve([]);
 
-      console.log(node);
-      getCity({ province: node.data.id }).then((res) => {
-        const data = res.map((item) => {
+      console.log(node, node.data.hasOwnProperty(this.props.children));
+      if (node.data.hasOwnProperty(this.props.children)) {
+        let data = node.data[this.props.children].map((item) => {
           return {
-            id: item,
-            name: item,
+            ...item,
+            projectName: item.accountName,
+            projectId: item.accountId,
           };
         });
         resolve(data);
-      });
-      //   setTimeout(() => {
-      //     const data = [
-      //       {
-      //         name: "leaf",
-      //         leaf: true,
-      //       },
-      //       {
-      //         name: "zone",
-      //       },
-      //     ];
-
-      //     resolve(data);
-      //   }, 500);
+      } else {
+        getCity({ province: node.data.id }).then((res) => {
+          const data = res.map((item) => {
+            return {
+              id: item,
+              name: item,
+            };
+          });
+          resolve(data);
+        });
+      }
     },
     // 是否为空
     isEmpty(val) {
@@ -148,7 +150,7 @@ export default {
       return true;
     },
     handleNodeClick(data, node, leaf) {
-      console.log(data, node, leaf);
+      // console.log(data, node, leaf);
       if (this.multiple) {
         return;
       }
@@ -161,22 +163,55 @@ export default {
 
       this.$refs.select.visible = false;
     },
-    handleCheckChange() {
-      const nodes = this.$refs.tree.getCheckedNodes();
-      const value = nodes.map((item) => item[this.nodeKey]).join(",");
-      this.$emit("input", value);
+    handleCheckChange(data, node, leaf) {
+      console.log(data, node, leaf);
+      // const nodes = this.$refs.tree.getCheckedNodes();
+      // const value = nodes.map((item) => item[this.nodeKey]).join(",");
+      // this.$emit("input", value);
+
+      this.$nextTick(() => {
+        const nodes = this.$refs.tree.getCheckedNodes();
+        // this.getSimpleCheckedNodes(this.$refs.tree.store);
+        console.log(nodes);
+        const value = nodes.map((item) => item[this.nodeKey]).join(",");
+        console.log(value);
+        this.$emit("input", value);
+      });
+    },
+    getSimpleCheckedNodes(store) {
+      console.log(store);
+      // 定义数组
+      const checkedNodes = [];
+      // 判断是否为全选,若为全选状态返回被全选的节点,不为全选状态正常返回被选中的节点
+      const traverse = function (node) {
+        const childNodes = node.root ? node.root.childNodes : node.childNodes;
+        childNodes.forEach((child) => {
+          if (child.checked) {
+            checkedNodes.push(child.data);
+          }
+          if (child.indeterminate) {
+            traverse(child);
+          }
+        });
+      };
+      traverse(store);
+      return checkedNodes;
     },
+
     init(val) {
+      console.log(val);
       // 多选
       if (this.multiple) {
+        const label = this.props.label || "name";
         const arr = val.toString().split(",");
         this.$nextTick(() => {
           this.$refs.tree.setCheckedKeys(arr);
-          const nodes = this.$refs.tree.getCheckedNodes();
+          const nodes = this.getSimpleCheckedNodes(this.$refs.tree.store);
+          const nodesTwo = this.$refs.tree.getCheckedNodes();
+          // this.$refs.tree.getCheckedNodes();
+          console.log(nodes, nodesTwo);
           this.optionData.id = val;
-          this.optionData.name = nodes
-            .map((item) => item[this.props.label])
-            .join(",");
+          this.optionData.name = nodes.map((item) => item[label]).join();
         });
       }
       // 单选

+ 136 - 14
src/views/goodsManagement/setSampleCollection.vue

@@ -8,6 +8,7 @@
           icon="el-icon-document-add"
           size="mini"
           @click="addNew"
+          :loading="loadingAdd"
           >提交领样</el-button
         >
       </el-col>
@@ -18,7 +19,6 @@
       :data="typeList"
       ref="multipleTable"
       @selection-change="handleSelectionChange"
-      row-key="itemId"
     >
       <el-table-column type="selection" width="50" align="center" />
       <el-table-column label="商品名称" align="center" prop="itemId" width="300">
@@ -82,31 +82,133 @@
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="领样数量" align="center" prop="sampleCount">
+      <el-table-column label="达人信息" align="center" prop="consignee" width="350px">
+        <template slot-scope="scope">
+          <div style="width: 100%" class="item-name-calss">
+            <p style="margin-bottom:5px">
+              收货人:
+
+              <span v-if="!scope.row.consigneeEdit">{{ scope.row.consignee }}</span>
+              <el-input
+                v-else
+                v-model="scope.row.consignee"
+                placeholder="请输入内容"
+                style="width: 200px"
+              ></el-input>
+              <a
+                :class="!scope.row.consigneeEdit ? 'el-icon-edit' : 'el-icon-check'"
+                @click="scope.row.consigneeEdit = !scope.row.consigneeEdit"
+                style="color: deepskyblue; margin-left: 10px; display: inline"
+              ></a>
+            </p>
+
+            <p style="margin-bottom:5px">
+              手机号:
+
+              <span v-if="!scope.row.promoterPhoneEdit">{{
+                scope.row.promoterPhone
+              }}</span>
+              <el-input
+                v-else
+                v-model.number="scope.row.promoterPhone"
+                placeholder="请输入内容"
+                style="width: 200px"
+              ></el-input>
+              <a
+                :class="!scope.row.promoterPhoneEdit ? 'el-icon-edit' : 'el-icon-check'"
+                @click="scope.row.promoterPhoneEdit = !scope.row.promoterPhoneEdit"
+                style="color: deepskyblue; margin-left: 10px; display: inline"
+              ></a>
+            </p>
+            <p style="margin-bottom:5px">
+              地址:
+
+              <span v-if="!scope.row.promoterAddressEdit">{{
+                scope.row.promoterAddress
+              }}</span>
+              <el-input
+                v-else
+                v-model="scope.row.promoterAddress"
+                placeholder="请输入内容"
+                style="width: 200px"
+              ></el-input>
+              <a
+                :class="!scope.row.promoterAddressEdit ? 'el-icon-edit' : 'el-icon-check'"
+                @click="scope.row.promoterAddressEdit = !scope.row.promoterAddressEdit"
+                style="color: deepskyblue; margin-left: 10px; display: inline"
+              ></a>
+            </p>
+          </div>
+        </template>
+      </el-table-column>
+
+      <!-- <el-table-column label="收货人" align="center" prop="consignee" width="150px">
+        <template slot-scope="scope">
+          <div>
+            <el-input v-model="scope.row.consignee" placeholder="请输入收货人"></el-input>
+          </div>
+        </template>
+      </el-table-column>
+
+      <el-table-column
+        label="达人手机号"
+        align="center"
+        prop="promoterPhone"
+        width="150px"
+      >
         <template slot-scope="scope">
           <div>
             <el-input
-              v-model="scope.row.sampleCount"
-              placeholder="请输入领样数量"
+              v-model="scope.row.promoterPhone"
+              placeholder="请输入达人手机号"
             ></el-input>
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="领样规则" align="center" prop="sampleRequirement">
+      <el-table-column
+        label="达人地址"
+        align="center"
+        prop="promoterAddress"
+        width="200px"
+      >
+        <template slot-scope="scope">
+          <div>
+            <el-input
+              v-model="scope.row.promoterAddress"
+              placeholder="请输入达人地址"
+            ></el-input>
+          </div>
+        </template>
+      </el-table-column> -->
+      <el-table-column label="领样数量" align="center" prop="sampleCount" width="250px">
+        <template slot-scope="scope">
+          <div>
+            <el-input v-model.number="scope.row.sampleCount"></el-input>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="领样备注"
+        align="center"
+        prop="sampleRequirement"
+        width="250px"
+      >
         <template slot-scope="scope">
           <div>
             <el-input
               v-model="scope.row.sampleRequirement"
-              placeholder="请输入领样规则"
+              placeholder="请输入领样备注"
             ></el-input>
           </div>
         </template>
       </el-table-column>
+
       <el-table-column
         label="操作"
         align="center"
         class-name="small-padding fixed-width"
-        width="200px"
+        width="150px"
+        fixed="right"
       >
         <template slot-scope="scope">
           <el-button size="mini" type="text" @click="copyInfomation(scope.row)"
@@ -130,6 +232,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -278,6 +381,7 @@
       title="拒绝原因"
       :visible.sync="refuseVisible"
       width="500px"
+      :close-on-click-modal="false"
       append-to-body
     >
       <el-input
@@ -340,6 +444,7 @@ export default {
     return {
       // 遮罩层
       loading: true,
+      loadingAdd: false,
       // 选中数组
       ids: null,
       okIds: null,
@@ -461,7 +566,6 @@ export default {
           },
           {
             min: 5,
-            max: 200,
             message: "手卡内容最少输入5个字符",
             trigger: "change",
           },
@@ -484,8 +588,9 @@ export default {
     activityItemStatusName(status) {
       const statusMap = {
         1: "待审核",
-        2: "审核通过",
+        2: "已上架",
         3: "审核失败(拒绝)",
+        4: "活动结束",
         5: "失效",
       };
       return statusMap[status];
@@ -493,7 +598,7 @@ export default {
   },
   methods: {
     handleSelectionChange(selection) {
-      this.okIds = selection.map((item) => item.itemId);
+      this.okIds = selection.map((item) => item.itemId + "-" + item.promoterId);
     },
     okInfomation(item) {
       this.$router.replace({
@@ -601,12 +706,12 @@ export default {
 
       preview({
         itemIds: this.$route.query.itemIds,
-        promoterIds: this.$route.query.promoterIds,
+        ids: this.$route.query.promoterIds,
         userId: this.$store.getters.userId,
       }).then((response) => {
         this.$nextTick(() => {
           this.okIds = response.preview.samples.map((item) => {
-            return item.itemId;
+            return item.itemId + "-" + item.promoterId;
           });
 
           this.typeList = response.preview.samples.map((item) => {
@@ -614,6 +719,9 @@ export default {
               ...item,
               sampleCount: null,
               sampleRequirement: null,
+              consigneeEdit: false,
+              promoterPhoneEdit: false,
+              promoterAddressEdit: false,
             };
           });
           this.sampleReceivedCount = response.preview.sampleReceivedCount;
@@ -649,11 +757,15 @@ export default {
       this.handleQuery();
     },
     addNew() {
+      console.log(this.okIds);
       if (this.okIds.length > 0) {
         var dataArr = [];
         for (let i = 0; i < this.okIds.length; i++) {
           for (let c = 0; c < this.typeList.length; c++) {
-            if (this.okIds[i] == this.typeList[c].itemId) {
+            if (
+              this.okIds[i] ==
+              this.typeList[c].itemId + "-" + this.typeList[c].promoterId
+            ) {
               dataArr.push(this.typeList[c]);
             }
           }
@@ -665,7 +777,17 @@ export default {
         if (dataFind > -1) {
           this.$message.error("请填写提交的领样");
         } else {
-          addPreview({ temCollectSamples: JSON.stringify(dataArr) }).then((res) => {});
+          this.loadingAdd = true;
+          // console.log(dataArr);
+          addPreview({ temCollectSamples: JSON.stringify(dataArr) }).then((res) => {
+            this.loadingAdd = false;
+            const obj = {
+              path: "/goodsManagement/samplingList",
+            };
+            this.$tab.closeOpenPage(obj);
+            this.$message.success("提交成功");
+            localStorage.setItem("clearData", 1);
+          });
         }
       } else {
         this.$message.error("请选择提交的领样");

+ 155 - 0
src/views/goodsManagement/textEditor.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="tinymce-editor">
+    <editors
+      v-model="myValue"
+      :init="init"
+      :disabled="disabled"
+      @onClick="onClick"
+      @onChange="onChange"
+    >
+    </editors>
+  </div>
+</template>
+
+<script>
+import Editors from "@tinymce/tinymce-vue";
+import tinymce from "tinymce/tinymce";
+import "tinymce/themes/silver/theme";
+import "tinymce/plugins/image";
+import "tinymce/plugins/link";
+import "tinymce/plugins/media";
+import "tinymce/plugins/table";
+import "tinymce/plugins/lists";
+import "tinymce/plugins/contextmenu";
+import "tinymce/plugins/wordcount";
+import "tinymce/plugins/colorpicker";
+import "tinymce/plugins/textcolor";
+import "tinymce/plugins/fullscreen";
+var COS = require("cos-js-sdk-v5");
+var cos = new COS({
+  SecretId: "AKIDE6IpMi8fJQRCg1iuWzFajjRs43kbbets",
+  SecretKey: "tXzuwMfplTTK3c9GFUyETilasvQfePu9",
+});
+import { readImage } from "@/api/goodsManagement/goods";
+
+export default {
+  components: {
+    Editors,
+  },
+  props: {
+    value: {
+      type: String,
+      required: false,
+    },
+    triggerChange: {
+      type: Boolean,
+      default: false,
+      required: false,
+    },
+    disabled: {
+      type: Boolean,
+      default: false,
+    },
+    plugins: {
+      type: [String, Array],
+      default:
+        "paste lists image link media table textcolor wordcount contextmenu fullscreen",
+    },
+    toolbar: {
+      type: [String, Array],
+      default: "",
+      branding: false,
+    },
+  },
+  data() {
+    return {
+      //初始化配置
+      init: {
+        selector: "#tinydemo",
+        language_url: "/tinymce/langs/zh_CN.js",
+        language: "zh_CN",
+        skin_url: "/tinymce/skins/lightgray",
+        height: 300,
+        plugins: ["paste"],
+        toolbar: this.toolbar,
+        branding: true,
+        menubar: false,
+        toolbar_drawer: true,
+        paste_data_images: true,
+        images_upload_credentials: true,
+        //  解决截图,不走图片上传问题
+        urlconverter_callback: (url, node, onSave, name) => {
+          if (node === "img" && url.startsWith("blob:")) {
+            // Do some custom URL conversion
+            // console.log('urlConverter:', url, node, onSave, name)
+            tinymce.activeEditor && tinymce.activeEditor.uploadImages();
+          }
+          // Return new URL
+          return url;
+        },
+        images_upload_handler: (blobInfo, success) => {
+          this.cosUpload(blobInfo, success);
+          // let formData = new FormData()
+          // formData.append('file', blobInfo.blob(), blobInfo.filename())
+          // formData.append('biz', 'jeditor')
+          // formData.append('jeditor', '1')
+
+          // uploadAction(window._CONFIG['domianURL'] + '/sys/common/upload', formData).then((res) => {
+          //     console.log(res)
+          //     if (res.success) {
+          //         if (res.message == 'local') {
+          //             const img = 'data:image/jpeg;base64,' + blobInfo.base64()
+          //             success(img)
+          //         } else {
+          //             let img = getFileAccessHttpUrl(res.message)
+          //             success(img)
+          //         }
+          //     }
+          // })
+        },
+      },
+      myValue: this.value,
+    };
+  },
+  mounted() {
+    tinymce.init(this.init);
+  },
+  methods: {
+    onClick(e) {
+      this.$emit("onClick", e, tinymce);
+    },
+    //可以添加一些自己的自定义事件,如清空内容
+    clear() {
+      this.myValue = "";
+    },
+    onChange(e) {},
+
+    cosUpload(blobInfo, success) {
+      console.log(blobInfo, success);
+      let formData = new FormData();
+      formData.append("file", blobInfo.blob());
+      readImage(formData).then((res) => {
+        if (res.code == 0) {
+          this.myValue = res.data;
+        }
+      });
+    },
+  },
+  watch: {
+    value(newValue) {
+      this.myValue = newValue == null ? "" : newValue;
+    },
+    myValue(newValue) {
+      console.log(newValue);
+      console.log(tinymce.editors["tinydemo"]);
+      // tinymce.editors['tinydemo'].getContent()
+      if (this.triggerChange) {
+        this.$emit("change", newValue);
+      } else {
+        this.$emit("input", newValue);
+      }
+    },
+  },
+};
+</script>
+<style scoped></style>

BIN
src/views/goodsManagement/zg.png


+ 371 - 390
src/views/index.vue

@@ -1,208 +1,197 @@
 <template>
   <div class="app-container">
-    <div style="margin-bottom: 15px">
-      <el-date-picker
-        v-model="uploadDate"
-        style="width: 240px"
-        value-format="yyyy-MM-dd"
-        format="yyyy-MM-dd"
-        type="daterange"
-        range-separator="-"
-        start-placeholder="开始日期"
-        end-placeholder="结束日期"
-        :picker-options="pickerOptions"
-      ></el-date-picker>
+    <div v-if="showOld">
+      <div style="margin-bottom: 15px">
+        <el-date-picker
+          v-model="uploadDate"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions"
+        ></el-date-picker>
 
-      <el-button
-        type="primary"
-        icon="el-icon-search"
-        size="mini"
-        @click="handleQuery"
-        style="margin-left: 15px"
-        >搜索</el-button
-      >
-    </div>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          style="margin-left: 15px"
+          >搜索</el-button
+        >
+      </div>
 
-    <el-row class="top-sum" :gutter="24">
-      <el-col :span="12">
-        <el-card shadow="never" class="card-show" v-loading="totalOneLoading">
-          <div style="display: flex; width: 100%; margin-bottom: 15px">
-            <div style="flex: 1">
-              <p class="p-title">订单总数</p>
-              <p class="p-main">{{ order.orderNum }}</p>
-            </div>
-            <div style="flex: 1">
-              <p class="p-title">有效订单数</p>
-              <p class="p-main">{{ order.validOrderNUm }}</p>
-            </div>
-            <div style="flex: 1">
-              <p class="p-title">失效订单数</p>
-              <p class="p-main">{{ order.invalidOrderNUm }}</p>
+      <el-row class="top-sum" :gutter="24">
+        <el-col :span="12">
+          <el-card shadow="never" class="card-show" v-loading="totalOneLoading">
+            <div style="display: flex; width: 100%; margin-bottom: 15px">
+              <div style="flex: 1">
+                <p class="p-title">订单总数</p>
+                <p class="p-main">{{ order.orderNum }}</p>
+              </div>
+              <div style="flex: 1">
+                <p class="p-title">有效订单数</p>
+                <p class="p-main">{{ order.validOrderNUm }}</p>
+              </div>
+              <div style="flex: 1">
+                <p class="p-title">失效订单数</p>
+                <p class="p-main">{{ order.invalidOrderNUm }}</p>
+              </div>
             </div>
-          </div>
 
-          <div style="display: flex; width: 100%">
-            <div style="margin-right: 20px">
-              <p class="p-main-data">
-                数据对比:<i
-                  :style="
-                    ratioData.orderTotalRatio > 0 ? 'color:red' : 'color:green'
-                  "
-                  >{{ (ratioData.orderTotalRatio * 100).toFixed(2) + "%" }}</i
-                >
-              </p>
-            </div>
-            <div
-              style="margin-right: 20px"
-              :style="dateType == 0 ? '' : 'visibility: hidden'"
-            >
-              <p class="p-main-data">
-                周同比:<i
-                  :style="order.yearRatio > 0 ? 'color:red' : 'color:green'"
-                  >{{ (order.yearRatio * 100).toFixed(2) + "%" }}</i
-                >
-              </p>
-            </div>
-            <div :style="dateType == 0 ? '' : 'visibility: hidden'">
-              <p class="p-main-data">
-                日环比:<i
-                  :style="order.ringRatio > 0 ? 'color:red' : 'color:green'"
-                  >{{ (order.ringRatio * 100).toFixed(2) + "%" }}
-                </i>
-              </p>
-            </div>
-          </div>
-          <!-- ringRatio: 0, -->
-        </el-card>
-      </el-col>
-      <el-col :span="12">
-        <el-card shadow="never" class="card-show" v-loading="totalTwoLoading">
-          <div style="display: flex; width: 100%; margin-bottom: 15px">
-            <div style="flex: 1">
-              <p class="p-title">订单金额</p>
-              <p class="p-main">
-                {{ priceFormat(regimentalPromotion.regimentalPromotionAmount) }}
-              </p>
-            </div>
-            <div style="flex: 1">
-              <p class="p-title">累计货款基数</p>
-              <p class="p-main">
-                {{ priceFormat(regimentalPromotion.personData) }}
-              </p>
-            </div>
-            <div style="flex: 1">
-              <p class="p-title">预估服务费</p>
-              <p class="p-main">
-                {{ priceFormat(regimentalPromotion.complete) }}
-              </p>
-            </div>
-          </div>
-          <div style="display: flex; width: 100%">
-            <div style="margin-right: 20px">
-              <p class="p-main-data">
-                数据对比:<i
-                  :style="
-                    ratioData.orderAmountRatio > 0 ? 'color:red' : 'color:green'
-                  "
-                  >{{ (ratioData.orderAmountRatio * 100).toFixed(2) + "%" }}</i
-                >
-              </p>
-            </div>
-            <div
-              style="margin-right: 20px"
-              :style="dateType == 0 ? '' : 'visibility: hidden'"
-            >
-              <p class="p-main-data">
-                周同比:
-                <i
-                  :style="
-                    regimentalPromotion.yearRatio > 0
-                      ? 'color:red'
-                      : 'color:green'
-                  "
-                  >{{ (regimentalPromotion.yearRatio * 100).toFixed(2) + "%" }}
-                </i>
-              </p>
-            </div>
-            <div :style="dateType == 0 ? '' : 'visibility: hidden'">
-              <p class="p-main-data">
-                日环比:<i
-                  :style="
-                    regimentalPromotion.ringRatio > 0
-                      ? 'color:red'
-                      : 'color:green'
-                  "
-                  >{{
-                    (regimentalPromotion.ringRatio * 100).toFixed(2) + "%"
-                  }}</i
-                >
-              </p>
+            <div style="display: flex; width: 100%">
+              <div style="margin-right: 20px">
+                <p class="p-main-data">
+                  数据对比:<i
+                    :style="ratioData.orderTotalRatio > 0 ? 'color:red' : 'color:green'"
+                    >{{ (ratioData.orderTotalRatio * 100).toFixed(2) + "%" }}</i
+                  >
+                </p>
+              </div>
+              <div
+                style="margin-right: 20px"
+                :style="dateType == 0 ? '' : 'visibility: hidden'"
+              >
+                <p class="p-main-data">
+                  周同比:<i :style="order.yearRatio > 0 ? 'color:red' : 'color:green'">{{
+                    (order.yearRatio * 100).toFixed(2) + "%"
+                  }}</i>
+                </p>
+              </div>
+              <div :style="dateType == 0 ? '' : 'visibility: hidden'">
+                <p class="p-main-data">
+                  日环比:<i :style="order.ringRatio > 0 ? 'color:red' : 'color:green'"
+                    >{{ (order.ringRatio * 100).toFixed(2) + "%" }}
+                  </i>
+                </p>
+              </div>
             </div>
-          </div>
-          <!-- ringRatio: 0, -->
-        </el-card>
-      </el-col>
-      <el-col :span="12" style="margin-top: 24px">
-        <el-card shadow="never" class="card-show" v-loading="totalThreeLoading">
-          <div style="display: flex; width: 100%; margin-bottom: 15px">
-            <div style="flex: 1">
-              <p class="p-title">达人总数</p>
-              <p class="p-main">{{ taskNumber.noStarted }}</p>
+            <!-- ringRatio: 0, -->
+          </el-card>
+        </el-col>
+        <el-col :span="12">
+          <el-card shadow="never" class="card-show" v-loading="totalTwoLoading">
+            <div style="display: flex; width: 100%; margin-bottom: 15px">
+              <div style="flex: 1">
+                <p class="p-title">订单金额</p>
+                <p class="p-main">
+                  {{ priceFormat(regimentalPromotion.regimentalPromotionAmount) }}
+                </p>
+              </div>
+              <div style="flex: 1">
+                <p class="p-title">累计货款基数</p>
+                <p class="p-main">
+                  {{ priceFormat(regimentalPromotion.personData) }}
+                </p>
+              </div>
+              <div style="flex: 1">
+                <p class="p-title">预估服务费</p>
+                <p class="p-main">
+                  {{ priceFormat(regimentalPromotion.complete) }}
+                </p>
+              </div>
             </div>
-            <div style="flex: 1">
-              <p class="p-title">发货数</p>
-              <p class="p-main">{{ taskNumber.complete }}</p>
+            <div style="display: flex; width: 100%">
+              <div style="margin-right: 20px">
+                <p class="p-main-data">
+                  数据对比:<i
+                    :style="ratioData.orderAmountRatio > 0 ? 'color:red' : 'color:green'"
+                    >{{ (ratioData.orderAmountRatio * 100).toFixed(2) + "%" }}</i
+                  >
+                </p>
+              </div>
+              <div
+                style="margin-right: 20px"
+                :style="dateType == 0 ? '' : 'visibility: hidden'"
+              >
+                <p class="p-main-data">
+                  周同比:
+                  <i
+                    :style="
+                      regimentalPromotion.yearRatio > 0 ? 'color:red' : 'color:green'
+                    "
+                    >{{ (regimentalPromotion.yearRatio * 100).toFixed(2) + "%" }}
+                  </i>
+                </p>
+              </div>
+              <div :style="dateType == 0 ? '' : 'visibility: hidden'">
+                <p class="p-main-data">
+                  日环比:<i
+                    :style="
+                      regimentalPromotion.ringRatio > 0 ? 'color:red' : 'color:green'
+                    "
+                    >{{ (regimentalPromotion.ringRatio * 100).toFixed(2) + "%" }}</i
+                  >
+                </p>
+              </div>
             </div>
-            <div style="flex: 1">
-              <p class="p-title">发货率</p>
-              <p class="p-main">
-                {{
-                  !!taskNumber.deliveryRadio
-                    ? (taskNumber.deliveryRadio * 100).toFixed(2) + "%"
-                    : "-"
-                }}
-              </p>
+            <!-- ringRatio: 0, -->
+          </el-card>
+        </el-col>
+        <el-col :span="12" style="margin-top: 24px">
+          <el-card shadow="never" class="card-show" v-loading="totalThreeLoading">
+            <div style="display: flex; width: 100%; margin-bottom: 15px">
+              <div style="flex: 1">
+                <p class="p-title">达人总数</p>
+                <p class="p-main">{{ taskNumber.noStarted }}</p>
+              </div>
+              <div style="flex: 1">
+                <p class="p-title">发货数</p>
+                <p class="p-main">{{ taskNumber.complete }}</p>
+              </div>
+              <div style="flex: 1">
+                <p class="p-title">发货率</p>
+                <p class="p-main">
+                  {{
+                    !!taskNumber.deliveryRadio
+                      ? (taskNumber.deliveryRadio * 100).toFixed(2) + "%"
+                      : "-"
+                  }}
+                </p>
+              </div>
             </div>
-          </div>
-          <div style="display: flex; width: 100%; visibility: hidden">
-            <div style="margin-right: 20px">
-              <p class="p-main-data">周同比:{{ order.yearRatio }}</p>
+            <div style="display: flex; width: 100%; visibility: hidden">
+              <div style="margin-right: 20px">
+                <p class="p-main-data">周同比:{{ order.yearRatio }}</p>
+              </div>
+              <div>
+                <p class="p-main-data">日环比:{{ order.ringRatio }}</p>
+              </div>
             </div>
-            <div>
-              <p class="p-main-data">日环比:{{ order.ringRatio }}</p>
+            <!-- ringRatio: 0, -->
+          </el-card>
+        </el-col>
+      </el-row>
+      <el-row class="top-sum" :gutter="24" style="margin-top: 24px">
+        <el-col :span="24">
+          <el-card
+            shadow="never"
+            class="card-show"
+            style="width: 100%; min-height: 700px"
+            v-loading="echartsLoading"
+          >
+            <div slot="header" class="clearfix">
+              <span style="font-size: 16px; font-weight: bold; float: left"
+                >订单统计</span
+              >
+              <el-select
+                v-model="echartsType"
+                placeholder="请选择类型"
+                clearable
+                style="width: 240px; float: right; padding: 3px 0"
+                @change="changeEchartsType"
+              >
+                <el-option label="订单数" value="orderNum" />
+                <el-option label="有效订单数" value="validOrderNum" />
+                <el-option label="订单金额" value="orderAmount" />
+                <el-option label="货款基数" value="baseAmount" />
+                <el-option label="发货数" value="deliveryNum" />
+              </el-select>
             </div>
-          </div>
-          <!-- ringRatio: 0, -->
-        </el-card>
-      </el-col>
-    </el-row>
-    <el-row class="top-sum" :gutter="24" style="margin-top: 24px">
-      <el-col :span="24">
-        <el-card
-          shadow="never"
-          class="card-show"
-          style="width: 100%; min-height: 700px"
-          v-loading="echartsLoading"
-        >
-          <div slot="header" class="clearfix">
-            <span style="font-size: 16px; font-weight: bold; float: left"
-              >订单统计</span
-            >
-            <el-select
-              v-model="echartsType"
-              placeholder="请选择类型"
-              clearable
-              style="width: 240px; float: right; padding: 3px 0"
-              @change="changeEchartsType"
-            >
-              <el-option label="订单数" value="orderNum" />
-              <el-option label="有效订单数" value="validOrderNum" />
-              <el-option label="订单金额" value="orderAmount" />
-              <el-option label="货款基数" value="baseAmount" />
-              <el-option label="发货数" value="deliveryNum" />
-            </el-select>
-          </div>
-          <!-- <el-date-picker
+            <!-- <el-date-picker
             v-model="uploadDateEcharts"
             style="width: 240px; float: left"
             value-format="yyyy-MM-dd"
@@ -214,184 +203,166 @@
             :picker-options="pickerOptions"
             @change="getAllEchartsData"
           ></el-date-picker> -->
-          <div
-            id="echart"
-            ref="echart"
-            style="height: 500px; width: 100%; margin-top: 50px"
-          ></div>
-        </el-card>
-      </el-col>
-    </el-row>
+            <div
+              id="echart"
+              ref="echart"
+              style="height: 500px; width: 100%; margin-top: 50px"
+            ></div>
+          </el-card>
+        </el-col>
+      </el-row>
 
-    <el-row class="top-sum" :gutter="24" style="margin-top: 24px">
-      <el-col :span="12">
-        <el-card
-          shadow="never"
-          class="card-show"
-          style="width: 100%; min-height: 700px"
-        >
-          <div slot="header" class="clearfix">
-            <span style="font-size: 16px; font-weight: bold; float: left"
-              >商品排行榜</span
-            >
-            <el-button
-              style="float: right; padding: 3px 0"
-              type="text"
-              @click="toOrderList"
-              >更多>></el-button
-            >
-          </div>
-          <el-table v-loading="orderRankLoading" :data="orderRankList">
-            <!-- <el-table-column type="selection" width="55" align="center" /> -->
-            <el-table-column type="index" :index="indexMethod">
-            </el-table-column>
-            <el-table-column label="商品名称" align="center" prop="itemTitle">
-              <template slot-scope="scope">
-                <a
-                  :title="scope.row.itemTitle"
-                  @click="toOrderDetail(scope.row)"
-                  style="
-                    text-overflow: ellipsis;
-                    white-space: nowrap;
-                    overflow: hidden;
-                  "
-                >
-                  {{ scope.row.itemTitle }}
-                </a>
-              </template>
-            </el-table-column>
-            <el-table-column label="订单数" align="center" prop="orderNum">
-            </el-table-column>
-            <el-table-column
-              label="有效订单"
-              align="center"
-              prop="validOrderNUm"
-            >
-            </el-table-column>
-            <el-table-column label="有效率" align="center" prop="validRadio">
-              <template slot-scope="scope">
-                {{
-                  scope.row.validRadio
-                    ? (scope.row.validRadio * 100).toFixed(2) + "%"
-                    : "-"
-                }}
-              </template>
-            </el-table-column>
-            <el-table-column label="发货数" align="center" prop="deliveryNum">
-            </el-table-column>
-            <el-table-column label="发货率" align="center" prop="deliveryRadio">
-              <template slot-scope="scope">
-                {{
-                  scope.row.deliveryRadio
-                    ? (scope.row.deliveryRadio * 100).toFixed(2) + "%"
-                    : "-"
-                }}
-              </template>
-            </el-table-column>
+      <el-row class="top-sum" :gutter="24" style="margin-top: 24px">
+        <el-col :span="12">
+          <el-card
+            shadow="never"
+            class="card-show"
+            style="width: 100%; min-height: 700px"
+          >
+            <div slot="header" class="clearfix">
+              <span style="font-size: 16px; font-weight: bold; float: left"
+                >商品排行榜</span
+              >
+              <el-button
+                style="float: right; padding: 3px 0"
+                type="text"
+                @click="toOrderList"
+                >更多>></el-button
+              >
+            </div>
+            <el-table v-loading="orderRankLoading" :data="orderRankList">
+              <!-- <el-table-column type="selection" width="55" align="center" /> -->
+              <el-table-column type="index" :index="indexMethod"> </el-table-column>
+              <el-table-column label="商品名称" align="center" prop="itemTitle">
+                <template slot-scope="scope">
+                  <a
+                    :title="scope.row.itemTitle"
+                    @click="toOrderDetail(scope.row)"
+                    style="text-overflow: ellipsis; white-space: nowrap; overflow: hidden"
+                  >
+                    {{ scope.row.itemTitle }}
+                  </a>
+                </template>
+              </el-table-column>
+              <el-table-column label="订单数" align="center" prop="orderNum">
+              </el-table-column>
+              <el-table-column label="有效订单" align="center" prop="validOrderNUm">
+              </el-table-column>
+              <el-table-column label="有效率" align="center" prop="validRadio">
+                <template slot-scope="scope">
+                  {{
+                    scope.row.validRadio
+                      ? (scope.row.validRadio * 100).toFixed(2) + "%"
+                      : "-"
+                  }}
+                </template>
+              </el-table-column>
+              <el-table-column label="发货数" align="center" prop="deliveryNum">
+              </el-table-column>
+              <el-table-column label="发货率" align="center" prop="deliveryRadio">
+                <template slot-scope="scope">
+                  {{
+                    scope.row.deliveryRadio
+                      ? (scope.row.deliveryRadio * 100).toFixed(2) + "%"
+                      : "-"
+                  }}
+                </template>
+              </el-table-column>
 
-            <el-table-column label="日涨幅" align="center" prop="radio">
-              <template slot-scope="scope">
-                <i :style="scope.row.radio > 0 ? 'color:red' : 'color:green'">{{
-                  scope.row.radio
-                    ? (scope.row.radio * 100).toFixed(2) + "%"
-                    : "-"
-                }}</i>
-              </template>
-            </el-table-column>
-          </el-table>
-          <pagination
-            v-show="orderTotal > 0"
-            :total="orderTotal"
-            :page.sync="queryParams.pageNum"
-            :limit.sync="queryParams.pageSize"
-            @pagination="getIndexOrderRank"
-            layout="total, prev, pager, next, jumper"
-            :small="true"
-          />
-        </el-card>
-      </el-col>
-      <el-col :span="12">
-        <el-card
-          shadow="never"
-          class="card-show"
-          style="width: 100%; min-height: 700px"
-        >
-          <div slot="header" class="clearfix">
-            <span style="font-size: 16px; font-weight: bold; float: left"
-              >达人排行榜</span
-            >
-            <el-button
-              style="float: right; padding: 3px 0"
-              type="text"
-              @click="toPersonList"
-              >更多>></el-button
-            >
-          </div>
-          <el-table v-loading="promoterLoading" :data="promoterRankList">
-            <!-- <el-table-column type="selection" width="55" align="center" /> -->
-            <el-table-column type="index" :index="indexMethodTwo" width="70">
-            </el-table-column>
-            <el-table-column
-              label="达人名称"
-              align="center"
-              prop="promoterNickName"
-            >
-              <template slot-scope="scope">
-                <a
-                  :title="scope.row.promoterNickName"
-                  @click="toPersonDetail(scope.row)"
-                  style="
-                    width: 200px;
-                    text-overflow: ellipsis;
-                    white-space: nowrap;
-                    overflow: hidden;
-                    text-align: left;
-                  "
-                >
-                  {{ scope.row.promoterNickName }}
-                </a>
-              </template>
-            </el-table-column>
-            <el-table-column label="订单数" align="center" prop="orderNum">
-            </el-table-column>
-            <el-table-column
-              label="有效订单"
-              align="center"
-              prop="validOrderNUm"
-            >
-            </el-table-column>
-            <el-table-column label="有效率" align="center" prop="validRadio">
-              <template slot-scope="scope">
-                {{
-                  scope.row.validRadio
-                    ? (scope.row.validRadio * 100).toFixed(2) + "%"
-                    : "-"
-                }}
-              </template>
-            </el-table-column>
+              <el-table-column label="日涨幅" align="center" prop="radio">
+                <template slot-scope="scope">
+                  <i :style="scope.row.radio > 0 ? 'color:red' : 'color:green'">{{
+                    scope.row.radio ? (scope.row.radio * 100).toFixed(2) + "%" : "-"
+                  }}</i>
+                </template>
+              </el-table-column>
+            </el-table>
+            <pagination
+              v-show="orderTotal > 0"
+              :total="orderTotal"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getIndexOrderRank"
+              layout="total, prev, pager, next, jumper"
+              :small="true"
+            />
+          </el-card>
+        </el-col>
+        <el-col :span="12">
+          <el-card
+            shadow="never"
+            class="card-show"
+            style="width: 100%; min-height: 700px"
+          >
+            <div slot="header" class="clearfix">
+              <span style="font-size: 16px; font-weight: bold; float: left"
+                >达人排行榜</span
+              >
+              <el-button
+                style="float: right; padding: 3px 0"
+                type="text"
+                @click="toPersonList"
+                >更多>></el-button
+              >
+            </div>
+            <el-table v-loading="promoterLoading" :data="promoterRankList">
+              <!-- <el-table-column type="selection" width="55" align="center" /> -->
+              <el-table-column type="index" :index="indexMethodTwo" width="70">
+              </el-table-column>
+              <el-table-column label="达人名称" align="center" prop="promoterNickName">
+                <template slot-scope="scope">
+                  <a
+                    :title="scope.row.promoterNickName"
+                    @click="toPersonDetail(scope.row)"
+                    style="
+                      width: 200px;
+                      text-overflow: ellipsis;
+                      white-space: nowrap;
+                      overflow: hidden;
+                      text-align: left;
+                    "
+                  >
+                    {{ scope.row.promoterNickName }}
+                  </a>
+                </template>
+              </el-table-column>
+              <el-table-column label="订单数" align="center" prop="orderNum">
+              </el-table-column>
+              <el-table-column label="有效订单" align="center" prop="validOrderNUm">
+              </el-table-column>
+              <el-table-column label="有效率" align="center" prop="validRadio">
+                <template slot-scope="scope">
+                  {{
+                    scope.row.validRadio
+                      ? (scope.row.validRadio * 100).toFixed(2) + "%"
+                      : "-"
+                  }}
+                </template>
+              </el-table-column>
 
-            <el-table-column label="日涨幅" align="center" prop="radio">
-              <template slot-scope="scope">
-                <i :style="scope.row.radio > 0 ? 'color:red' : 'color:green'">{{
-                  scope.row.radio
-                    ? (scope.row.radio * 100).toFixed(2) + "%"
-                    : "-"
-                }}</i>
-              </template>
-            </el-table-column>
-          </el-table>
-          <pagination
-            v-show="promoterTotal > 0"
-            :total="promoterTotal"
-            :page.sync="queryParams.promoterPageNum"
-            :limit.sync="queryParams.pageSize"
-            layout="total, prev, pager, next, jumper"
-            @pagination="getIndexPromoterRank"
-            :small="true"
-          />
-        </el-card>
-      </el-col>
-    </el-row>
+              <el-table-column label="日涨幅" align="center" prop="radio">
+                <template slot-scope="scope">
+                  <i :style="scope.row.radio > 0 ? 'color:red' : 'color:green'">{{
+                    scope.row.radio ? (scope.row.radio * 100).toFixed(2) + "%" : "-"
+                  }}</i>
+                </template>
+              </el-table-column>
+            </el-table>
+            <pagination
+              v-show="promoterTotal > 0"
+              :total="promoterTotal"
+              :page.sync="queryParams.promoterPageNum"
+              :limit.sync="queryParams.pageSize"
+              layout="total, prev, pager, next, jumper"
+              @pagination="getIndexPromoterRank"
+              :small="true"
+            />
+          </el-card>
+        </el-col>
+      </el-row>
+    </div>
+
+    <staging v-else />
   </div>
 </template>
 
@@ -405,11 +376,16 @@ import {
   getIndexStatistics, //echarts图表
   getTimeRatio, //时间段对比
 } from "@/api/index";
+import staging from "./staging.vue";
 var echarts = require("echarts");
 export default {
   name: "Index",
+  components: {
+    staging,
+  },
   data() {
     return {
+      showOld: false,
       // 遮罩层
       loading: true,
       // 选中数组
@@ -563,15 +539,28 @@ export default {
     let sdd = start.getDate();
     sdd = sdd < 10 ? "0" + sdd : sdd;
     this.uploadDateEcharts = [`${sy}-${sMM}-${sdd}`, `${ey}-${eMM}-${edd}`];
+
+    this.showOld =
+      this.$store.getters.roles[0] == "courtshipManager" ||
+      this.$store.getters.roles[0] == "courtship" ||
+      this.$store.getters.roles[0] == "bdManager" ||
+      this.$store.getters.roles[0] == "bd" ||
+      this.$store.getters.roles[0] == "association" ||
+      this.$store.getters.roles[0] == "associationManager" ||
+      this.$store.getters.roles[0] == "supplyChainAdmin"
+        ? false
+        : true;
   },
   mounted() {
-    this.getIndexOrderInfo();
-    this.getIndexServiceAmountInfo();
-    this.getIndexAmountInfo();
-    this.getIndexPromoterRank();
-    this.getIndexOrderRank();
-    this.getIndexStatistics();
-    this.getTimeRatio();
+    if (this.showOld) {
+      this.getIndexOrderInfo();
+      this.getIndexServiceAmountInfo();
+      this.getIndexAmountInfo();
+      this.getIndexPromoterRank();
+      this.getIndexOrderRank();
+      this.getIndexStatistics();
+      this.getTimeRatio();
+    }
   },
   methods: {
     getAllEchartsData(e) {
@@ -603,10 +592,7 @@ export default {
         orderEndDate: this.uploadDate[1],
       }).then((response) => {
         this.echartsLoading = false;
-        this.initEchart(
-          "echart",
-          this.handlerEchartOption(response, this.echartsType)
-        );
+        this.initEchart("echart", this.handlerEchartOption(response, this.echartsType));
       });
     },
     /** 获取echart的值 */
@@ -807,10 +793,8 @@ export default {
           regimentalPromotionAmount: response.amountTotal.orderAmount / 100,
           personData: response.amountTotal.baseAmount / 100,
           complete: response.amountTotal.regimentalPromotionAmount / 100,
-          ringRatio:
-            this.dateType == 0 ? response.amountRatio.amountRingRatio : 0,
-          yearRatio:
-            this.dateType == 0 ? response.amountRatio.amountYearRatio : 0,
+          ringRatio: this.dateType == 0 ? response.amountRatio.amountRingRatio : 0,
+          yearRatio: this.dateType == 0 ? response.amountRatio.amountYearRatio : 0,
         };
       });
     },
@@ -928,8 +912,7 @@ export default {
       n = n || 2;
       let symbol = ",";
       if (num === null) return num;
-      if (typeof num !== "number")
-        throw new TypeError("num参数应该是一个number类型");
+      if (typeof num !== "number") throw new TypeError("num参数应该是一个number类型");
       if (n < 0) throw new Error("参数n不应该小于0");
       let hasDot = parseInt(num) != num; //这里检测num是否为小数,true表示小数
       let m = n != undefined && n != null ? n : 1;
@@ -942,11 +925,9 @@ export default {
             : num
           : num.toFixed(m);
       symbol = symbol || ",";
-      num = num
-        .toString()
-        .replace(/(\d)(?=(\d{3})+\.)/g, function (match, p1, p2) {
-          return p1 + symbol;
-        });
+      num = num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function (match, p1, p2) {
+        return p1 + symbol;
+      });
       if (n == 0 || (!hasDot && !n)) {
         //如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
         num = num.substring(0, num.indexOf("."));

+ 153 - 47
src/views/promoter/promoterList.vue

@@ -8,34 +8,28 @@
       v-show="showSearch"
       label-width="100px"
     >
-      <el-form-item label="达人名称" prop="promoterNickName">
+      <el-form-item label="达人ID" prop="promoterId">
         <el-input
-          placeholder="请输入达人名称"
+          placeholder="请输入达人ID"
           style="width: 240px"
-          v-model="queryParams.promoterNickName"
+          v-model.number="queryParams.promoterId"
         >
         </el-input>
       </el-form-item>
-      <el-form-item label="达人ID" prop="promoterId">
+      <el-form-item label="达人名称" prop="promoterNickName">
         <el-input
-          placeholder="请输入达人ID"
+          placeholder="请输入达人名称"
           style="width: 240px"
-          v-model="queryParams.promoterId"
+          v-model="queryParams.promoterNickName"
         >
         </el-input>
       </el-form-item>
 
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
@@ -47,11 +41,20 @@
           icon="el-icon-document-add"
           size="mini"
           @click="addNew"
+          :disabled="
+            $store.getters.roles[0] == 'courtship' ||
+            $store.getters.roles[0] == 'courtshipManager'
+          "
           >新增达人</el-button
         >
       </el-col>
     </el-row>
-    <el-table v-loading="loading" :data="typeList" ref="multipleTable">
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      ref="multipleTable"
+      @sort-change="sortChange"
+    >
       <el-table-column
         label="达人名称"
         align="center"
@@ -85,8 +88,61 @@
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="粉丝数" align="center" prop="fansNumber">
+      <el-table-column label="粉丝数" align="center" prop="fansNumber"> </el-table-column>
+
+      <el-table-column
+        label="单视频销售额"
+        align="center"
+        prop="avgVideoSales"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.avgVideoSales">
+            {{ scope.row.avgVideoSales }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="短视频销售额"
+        align="center"
+        prop="videoSales"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.videoSales">
+            {{ scope.row.videoSales }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="睿选近30日gmv"
+        align="center"
+        prop="monthDayGmv"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.monthDayGmv">
+            {{ allMoney(scope.row.monthDayGmv / 100) }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="睿选近30日出单量"
+        align="center"
+        prop="monthDayOrderNum"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.monthDayOrderNum">
+            {{ scope.row.monthDayOrderNum }}
+          </div>
+          <div v-else>-</div>
+        </template>
       </el-table-column>
+
       <el-table-column label="总销售额" align="center" prop="totalSale">
         <template slot-scope="scope">
           <div v-if="!!scope.row.totalSale">
@@ -103,11 +159,7 @@
           <div v-else>-</div>
         </template>
       </el-table-column>
-      <el-table-column
-        label="佣金要求"
-        align="center"
-        prop="commissionRequirement"
-      >
+      <el-table-column label="佣金要求" align="center" prop="commissionRequirement">
         <template slot-scope="scope">
           <div v-if="!!scope.row.commissionRequirement">
             {{ scope.row.commissionRequirement }}
@@ -127,8 +179,22 @@
             type="text"
             icon="el-icon-edit"
             @click="handleAddbroadcast(scope.row)"
+            :disabled="
+              $store.getters.roles[0] == 'courtship' ||
+              $store.getters.roles[0] == 'courtshipManager'
+            "
             >修改地址</el-button
           >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            :disabled="
+              $store.getters.roles[0] == 'bdManager' ? false : userId != scope.row.userId
+            "
+            >删除</el-button
+          >
           <el-button size="mini" type="text" @click="copyInfomation(scope.row)"
             >复制</el-button
           >
@@ -150,6 +216,7 @@
       :visible.sync="openAllocation"
       width="800px"
       append-to-body
+      :close-on-click-modal="false"
     >
       <el-form
         ref="formBroadcast"
@@ -244,11 +311,7 @@
           </el-form-item>
         </div>
         <div v-else>
-          <el-form-item
-            label="达人名称"
-            prop="promoterNickName"
-            style="width: 100%"
-          >
+          <el-form-item label="达人名称" prop="promoterNickName" style="width: 100%">
             {{ formBroadcast.promoterNickName }}({{ formBroadcast.promoterId }})
           </el-form-item>
           <el-form-item
@@ -295,10 +358,7 @@
         </div>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button
-          type="primary"
-          @click="submitFormBroadcast"
-          :loading="confirmLoading"
+        <el-button type="primary" @click="submitFormBroadcast" :loading="confirmLoading"
           >确 定</el-button
         >
         <el-button
@@ -320,11 +380,25 @@ import {
   getPromoterList,
   addPromoter,
   editPromoter,
+  deleteById,
 } from "@/api/promoter/promoter";
 export default {
   name: "account-list",
   components: {},
   data() {
+    let validatePhone = (rule, value, callback) => {
+      /*console.log(rule);
+      console.log(value);
+      console.log(callback);*/
+      if (!value) {
+        callback(new Error("联系方式不能为空!"));
+      }
+      //使用正则表达式进行验证手机号码
+      if (!/^1[3456789]\d{9}$/.test(value)) {
+        callback(new Error("手机号不正确!"));
+      }
+      callback();
+    };
     return {
       // 遮罩层
       loading: true,
@@ -395,7 +469,8 @@ export default {
         },
         phone: {
           required: true,
-          message: "联系方式必填",
+          // message: "联系方式必填",
+          validator: validatePhone,
           trigger: "blur",
         },
         promoterAddress: [
@@ -415,6 +490,8 @@ export default {
       // 分配销售展示列表
       ksInfo: null,
       userId: null,
+      prop: "",
+      sort: "DESC",
     };
   },
   created() {
@@ -431,17 +508,34 @@ export default {
         },
       });
     },
+    sortChange(col, prop, order) {
+      this.prop =
+        col.prop == "avgVideoSales"
+          ? "avg_video_sales"
+          : col.prop == "videoSales"
+          ? "video_sales"
+          : col.prop == "monthDayGmv"
+          ? "30day_gmv"
+          : col.prop == "monthDayOrderNum"
+          ? "30day_order_num"
+          : "";
+      this.sort = !!col.order ? (col.order == "descending" ? "DESC" : "ASC") : "DESC";
+      this.handleQuery();
+    },
     /** 查询字典类型列表 */
     getList() {
       this.loading = true;
 
-      getPromoterList({ userId: this.userId, ...this.queryParams }).then(
-        (response) => {
-          this.typeList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
-      );
+      getPromoterList({
+        userId: this.userId,
+        ...this.queryParams,
+        parameter: this.prop,
+        orderBy: this.sort,
+      }).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
     },
     // 取消按钮
     cancel() {
@@ -476,6 +570,25 @@ export default {
         this.$refs.formBroadcast.clearValidate();
       }, 0);
     },
+    handleDelete(item) {
+      this.$modal
+        .confirm(`请确认是否解绑此达人?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          params.userId = this.$store.getters.userId;
+          deleteById(params)
+            .then((res) => {
+              this.$modal.msgSuccess("解绑成功");
+              this.handleQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
     /** 编辑地址 新增达人*/
     handleAddbroadcast(item) {
       this.ids = item.id;
@@ -515,9 +628,7 @@ export default {
         textArea.select();
         return new Promise((resolve, reject) => {
           // 执行复制命令并移除文本框
-          document.execCommand("copy")
-            ? resolve()
-            : reject(new Error("出错了"));
+          document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
           textArea.remove();
         }).then(
           () => {
@@ -582,11 +693,7 @@ export default {
           var fileList = this.$refs.fileUploadDialog.fileList;
           var dapanUrls = this.$refs.fileUpload.fileList;
           var portraitUrls = this.$refs.fileUploadFx.fileList;
-          if (
-            fileList.length == 0 &&
-            dapanUrls.length == 0 &&
-            portraitUrls.length == 0
-          ) {
+          if (fileList.length == 0 && dapanUrls.length == 0 && portraitUrls.length == 0) {
             this.$message.error("直播数据,数据大盘,画像分析必须最少上传一项");
             return;
           } else {
@@ -656,5 +763,4 @@ export default {
 .tableBox {
   width: 100%;
 }
-
 </style>

+ 554 - 0
src/views/promoter/promoterSeas.vue

@@ -0,0 +1,554 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="达人ID" prop="promoterId">
+        <el-input
+          placeholder="请输入达人ID"
+          style="width: 240px"
+          v-model="queryParams.promoterId"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="达人名称" prop="promoterNickName">
+        <el-input
+          placeholder="请输入达人名称"
+          style="width: 240px"
+          v-model="queryParams.promoterNickName"
+        >
+        </el-input>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      ref="multipleTable"
+      @sort-change="sortChange"
+    >
+      <el-table-column
+        label="达人名称"
+        align="center"
+        prop="promoterNickName"
+        width="300"
+      >
+        <template slot-scope="scope">
+          <div style="display: flex; width: 100%">
+            <div style="width: 40%">
+              <img
+                :src="scope.row.promoterUrl"
+                alt=""
+                style="width: 70px; height: auto"
+              />
+            </div>
+            <div style="width: 60%" class="item-name-calss">
+              <a
+                @click="toIndexDetail(scope.row)"
+                style="
+                  text-overflow: ellipsis;
+                  white-space: nowrap;
+                  overflow: hidden;
+                  width: 100%;
+                "
+                :title="scope.row.promoterNickName"
+              >
+                {{ scope.row.promoterNickName }}
+              </a>
+              <p>达人Id: {{ scope.row.promoterId }}</p>
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="粉丝数" align="center" prop="fansNumber"> </el-table-column>
+
+      <el-table-column
+        label="单视频销售额"
+        align="center"
+        prop="avgVideoSales"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.avgVideoSales">
+            {{ scope.row.avgVideoSales }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="短视频销售额"
+        align="center"
+        prop="videoSales"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.videoSales">
+            {{ scope.row.videoSales }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="睿选gmv"
+        align="center"
+        prop="monthDayGmv"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.monthDayGmv">
+            {{ allMoney(scope.row.monthDayGmv / 100) }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="睿选出单量"
+        align="center"
+        prop="monthDayOrderNum"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.monthDayOrderNum">
+            {{ scope.row.monthDayOrderNum }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="总销售额" align="center" prop="totalSale">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.totalSale">
+            {{ scope.row.totalSale }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="所属渠道" align="center" prop="userName">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.userName">
+            {{ scope.row.userName }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="佣金要求" align="center" prop="commissionRequirement">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.commissionRequirement">
+            {{ scope.row.commissionRequirement }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { refreshCache } from "@/api/system/dict/type";
+import {
+  getPromoterList2,
+  addPromoter,
+  editPromoter,
+  deleteById,
+} from "@/api/promoter/promoter";
+export default {
+  name: "account-list",
+  components: {},
+  data() {
+    let validatePhone = (rule, value, callback) => {
+      /*console.log(rule);
+        console.log(value);
+        console.log(callback);*/
+      if (!value) {
+        callback(new Error("联系方式不能为空!"));
+      }
+      //使用正则表达式进行验证手机号码
+      if (!/^1[3456789]\d{9}$/.test(value)) {
+        callback(new Error("手机号不正确!"));
+      }
+      callback();
+    };
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      //上传文件类型
+      fileType: [".doc", ".xls", ".xlsx", ".ppt", ".pdf", ".csv"],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openFp: false,
+      formFp: {},
+      // 是否可编辑
+      edit: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        promoterNickName: undefined,
+        promoterId: undefined,
+      },
+      //页面所有的下拉数据
+      queryParamsList: {},
+      // 表单参数
+      form: {},
+      formBroadcast: {},
+      //上传报表下拉数据
+      formList: {},
+      fileList: [],
+      accept: "",
+      //获取销售线索文件流
+      dateFile: new FormData(),
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {},
+      rulesBroadcast: {
+        promoterId: {
+          required: true,
+          message: "快手ID必填",
+          trigger: "blur",
+        },
+        consignee: {
+          required: true,
+          message: "收货人必填",
+          trigger: "blur",
+        },
+        phone: {
+          required: true,
+          // message: "联系方式必填",
+          validator: validatePhone,
+          trigger: "blur",
+        },
+        promoterAddress: [
+          {
+            required: true,
+            message: "发货地址必填",
+            trigger: "blur",
+          },
+          {
+            min: 5,
+            max: 200,
+            message: "发货地址最少输入5个字符",
+            trigger: "change",
+          },
+        ],
+      },
+      // 分配销售展示列表
+      ksInfo: null,
+      userId: null,
+      prop: "",
+      sort: "DESC",
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+    this.getList();
+  },
+  filters: {},
+  methods: {
+    toIndexDetail(item) {
+      this.$router.replace({
+        path: "/promoter/detail",
+        query: {
+          id: item.id,
+        },
+      });
+    },
+    sortChange(col, prop, order) {
+      this.prop =
+        col.prop == "avgVideoSales"
+          ? "avg_video_sales"
+          : col.prop == "videoSales"
+          ? "video_sales"
+          : col.prop == "monthDayGmv"
+          ? "30day_gmv"
+          : col.prop == "monthDayOrderNum"
+          ? "30day_order_num"
+          : "";
+      this.sort = !!col.order ? (col.order == "descending" ? "DESC" : "ASC") : "DESC";
+      this.handleQuery();
+    },
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+
+      getPromoterList2({
+        userId: this.userId,
+        ...this.queryParams,
+        parameter: this.prop,
+        orderBy: this.sort,
+      }).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("formBroadcast");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    addNew() {
+      this.openAllocation = true;
+      this.edit = false;
+      this.ids = null;
+      this.confirmLoading = false;
+      this.formBroadcast = {};
+      setTimeout(() => {
+        this.$refs.formBroadcast.clearValidate();
+      }, 0);
+    },
+    handleDelete(item) {
+      this.$modal
+        .confirm(`请确认是否解绑此达人?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          params.userId = this.$store.getters.userId;
+          deleteById(params)
+            .then((res) => {
+              this.$modal.msgSuccess("解绑成功");
+              this.handleQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+    /** 编辑地址 新增达人*/
+    handleAddbroadcast(item) {
+      this.ids = item.id;
+      this.edit = true;
+      this.openAllocation = true;
+      this.$set(this.formBroadcast, "consignee", item.consignee);
+      this.$set(this.formBroadcast, "phone", item.phone);
+      this.$set(this.formBroadcast, "promoterAddress", item.promoterAddress);
+      this.$set(this.formBroadcast, "promoterNickName", item.promoterNickName);
+      this.$set(this.formBroadcast, "promoterId", item.promoterId);
+    },
+    copyInfomation(item) {
+      if (navigator.clipboard && window.isSecureContext) {
+        navigator.clipboard
+          .writeText(
+            `
+  收货人: ${item.consignee}
+  手机号: ${item.phone}
+  收货地址: ${item.promoterAddress}`
+          )
+          .then(() => {
+            this.$message.success("复制成功");
+          })
+          .catch((err) => {
+            this.$message.error("复制失败");
+          });
+      } else {
+        // 创建text area
+        const textArea = document.createElement("textarea");
+        textArea.value = `
+  收货人: ${item.consignee}
+  手机号: ${item.phone}
+  收货地址: ${item.promoterAddress}`;
+        // 使text area不在viewport,同时设置不可见
+        document.body.appendChild(textArea);
+        textArea.focus();
+        textArea.select();
+        return new Promise((resolve, reject) => {
+          // 执行复制命令并移除文本框
+          document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
+          textArea.remove();
+        }).then(
+          () => {
+            this.$message.success("复制成功");
+          },
+          () => {
+            this.$message.error("复制失败");
+          }
+        );
+      }
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+    },
+    /** 新增直播确定按钮 */
+    submitFormBroadcast: function () {
+      this.$refs["formBroadcast"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          let formData = {
+            userId: this.userId,
+            userName: this.$store.getters.name,
+            ...this.formBroadcast,
+          };
+
+          if (!this.ids) {
+            addPromoter(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("新增成功");
+                this.openAllocation = false;
+                this.ids = null;
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          } else {
+            formData.id = this.ids;
+            editPromoter(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("修改成功");
+                this.openAllocation = false;
+                this.ids = null;
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          }
+        }
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          var fileList = this.$refs.fileUploadDialog.fileList;
+          var dapanUrls = this.$refs.fileUpload.fileList;
+          var portraitUrls = this.$refs.fileUploadFx.fileList;
+          if (fileList.length == 0 && dapanUrls.length == 0 && portraitUrls.length == 0) {
+            this.$message.error("直播数据,数据大盘,画像分析必须最少上传一项");
+            return;
+          } else {
+            this.confirmLoading = true;
+            let formData = new FormData();
+            this.ids;
+            formData.append("id", this.ids);
+            formData.append("actualGmv", this.delcommafy(this.form.actualGmv));
+            formData.append(
+              "dapanUrls",
+              JSON.stringify(
+                dapanUrls.map((item) => {
+                  return item.url;
+                })
+              )
+            );
+            formData.append(
+              "portraitUrls",
+              JSON.stringify(
+                portraitUrls.map((item) => {
+                  return item.url;
+                })
+              )
+            );
+            fileList.forEach((file) => formData.append("files", file.raw));
+            dataUpload(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("上传成功");
+                this.open = false;
+                this.ids = null;
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          }
+          console.log(fileList, dapanUrls, portraitUrls);
+        }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.entire-line {
+  width: 100%;
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+}
+::v-deep .el-form-item__label {
+  white-space: nowrap;
+}
+</style>
+<style scoped lang="scss">
+::v-deep a {
+  color: #409eff;
+  display: block;
+  text-align: left;
+}
+.item-name-calss p {
+  margin: 0;
+  text-align: left;
+}
+.tableBox {
+  width: 100%;
+}
+</style>

+ 838 - 0
src/views/report/operationHome.vue

@@ -0,0 +1,838 @@
+<template>
+  <div :class="{ 'app-container': $store.getters.roles[0] == 'admin' }">
+    <el-row class="top-sum" v-loading="topInfo == null" v-if="topInfo">
+      <el-col :span="6">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">今日消耗</p>
+          <p class="p-main">{{ allMoney(topInfo.costTotal) }}</p>
+          <p class="p-main-data">
+            日环比:<i :style="topInfo.costTotalRoi > 0 ? 'color:red' : 'color:green'"
+              >{{ topInfo.costTotalRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="6">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">在投账户数</p>
+          <p class="p-main">{{ topInfo.accountNum }}</p>
+          <p class="p-main-data" style="visibility: hidden">
+            在投账户数:{{ topInfo.accountNum }}
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="6">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">客户数</p>
+          <p class="p-main">{{ topInfo.customersNum }}</p>
+          <p class="p-main-data" style="visibility: hidden">
+            客户数:{{ topInfo.customersNum }}
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="6">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">自运营消耗</p>
+          <p class="p-main">{{ allMoney(topInfo.selfOperationCostTotal) }}</p>
+          <p class="p-main-data">
+            日环比:<i
+              :style="topInfo.selfOperationCostTotalRoi > 0 ? 'color:red' : 'color:green'"
+              style="margin-right: 10px"
+              >{{ topInfo.selfOperationCostTotalRoi + "%" }}
+            </i>
+            占比:<i :style="topInfo.roi > 0 ? 'color:red' : 'color:green'"
+              >{{ topInfo.roi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+    </el-row>
+
+    <el-card shadow="never" class="top-sum" v-loading="loading">
+      <div slot="header" class="clearfix">
+        <span>项目维度数据</span>
+        <el-date-picker
+          v-model="uploadProjectDate"
+          style="width: 240px; float: right; padding: 3px 0"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions"
+          @change="getProjectData"
+        ></el-date-picker>
+      </div>
+      <el-table v-loading="loading" :data="projectList" max-height="300">
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="项目名称" align="center" prop="projectName">
+        </el-table-column>
+        <el-table-column label="运营" align="center" prop="operatorName">
+        </el-table-column>
+        <el-table-column label="消耗" align="center" prop="costTotal">
+          <template slot-scope="scope">
+            {{ scope.row.costTotal ? allMoney(scope.row.costTotal) : "-" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="ROI" align="center" prop="roi">
+          <template slot-scope="scope">
+            {{ scope.row.roi ? scope.row.roi + "%" : "-" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="ROI昨日对比" align="center" prop="rRoi">
+          <template slot-scope="scope">
+            {{ scope.row.rRoi ? scope.row.rRoi + "%" : "-" }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="与昨日消耗对比" align="center" prop="costTotalRoi">
+          <template slot-scope="scope">
+            {{ scope.row.costTotalRoi ? scope.row.costTotalRoi + "%" : "-" }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+    <el-card shadow="never" class="top-sum" v-loading="groupLoading">
+      <div slot="header" class="clearfix">
+        <span>运营组维度数据</span>
+        <el-date-picker
+          v-model="uploadDate"
+          style="width: 240px; float: right; padding: 3px 0"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions"
+          @change="getGroupData"
+        ></el-date-picker>
+      </div>
+      <el-table :data="groupList" max-height="300">
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="运营经理" align="center" prop="userName">
+        </el-table-column>
+        <el-table-column label="项目数" align="center" prop="projectNum">
+        </el-table-column>
+        <el-table-column label="运营数量" align="center" prop="operateNum">
+        </el-table-column>
+        <el-table-column label="消耗" align="center" prop="costTotal">
+          <template slot-scope="scope">
+            {{ scope.row.costTotal ? allMoney(scope.row.costTotal) : "-" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="人均消耗" align="center" prop="perCost">
+          <template slot-scope="scope">
+            {{ scope.row.perCost ? allMoney(scope.row.perCost) : "-" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="昨日消耗" align="center" prop="yesCostTotal">
+          <template slot-scope="scope">
+            {{ scope.row.yesCostTotal ? allMoney(scope.row.yesCostTotal) : "-" }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="与昨日消耗对比" align="center" prop="roi">
+          <template slot-scope="scope">
+            {{ scope.row.roi ? scope.row.roi + "%" : "-" }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+    <el-card shadow="never" class="top-sum" v-loading="operationLoading">
+      <div slot="header" class="clearfix">
+        <span>运营数据</span>
+        <el-date-picker
+          v-model="uploadOperationDate"
+          style="width: 240px; float: right; padding: 3px 0"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions"
+          @change="getOperateCostList"
+        ></el-date-picker>
+      </div>
+      <el-table :data="analysis" max-height="300" @row-click="changeEchart">
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="运营名称" align="center" prop="userName">
+        </el-table-column>
+        <el-table-column label="项目数" align="center" prop="projectNum">
+        </el-table-column>
+        <el-table-column label="账户数" align="center" prop="accountNum">
+        </el-table-column>
+        <el-table-column label="消耗" align="center" prop="costTotal">
+          <template slot-scope="scope">
+            {{ scope.row.costTotal ? allMoney(scope.row.costTotal) : "-" }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="平均账户消耗" align="center" prop="accountCost">
+          <template slot-scope="scope">
+            {{ scope.row.accountCost ? allMoney(scope.row.accountCost) : "-" }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="与昨日消耗对比" align="center" prop="costTotalRoi">
+          <template slot-scope="scope">
+            {{ scope.row.costTotalRoi ? scope.row.costTotalRoi + "%" : "-" }}
+          </template>
+        </el-table-column>
+      </el-table>
+      <div
+        id="echart"
+        ref="echart"
+        style="height: 400px; width: 100%; margin-top: 50px"
+        v-loading="echartsLoading"
+      ></div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import {
+  // getIndexPromoterRank, //获取达人排行
+  // getIndexOrderRank, //获取商品排行
+  // getPersonalInfo,
+  getOperateHomePageHead,
+  getProjectCostList,
+  getOperationsGroupCostList,
+  getOperateCostList,
+  getOperateCostTrendChartList,
+} from "@/api/operation/operation.js";
+var echarts = require("echarts");
+export default {
+  name: "sale-html",
+  data() {
+    return {
+      echartsType: "orderAmount",
+      // 遮罩层
+      loading: false,
+      groupLoading: false,
+      operationLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 汇总数据获取
+      taskNumber: {
+        complete: 0,
+        noStarted: 0,
+      },
+      userId: undefined,
+      // 日期范围
+      dateRange: [],
+      uploadDate: [new Date(), new Date()],
+      uploadProjectDate: [new Date(), new Date()],
+      uploadOperationDate: [new Date(), new Date()],
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "今天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "昨天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 1);
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 3);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+      // 销售线索回显
+      formDataShow: null,
+      // 表单参数
+      form: {},
+      //上传报表下拉数据
+      formList: {},
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {},
+      // 分配销售展示列表
+      saleAllocationList: [],
+      topInfo: null,
+      projectList: [],
+      groupList: [],
+      analysis: [],
+      type: 1,
+      echartsLoading: false,
+      orderRankList: [],
+      orderRankLoading: false,
+      orderTotal: 0,
+      queryParams: { pageNum: 1, pageSize: 10, promoterPageNum: 1 },
+      promoterRankList: [],
+      promoterLoading: false,
+      promoterTotal: 0,
+      dateType: 0,
+    };
+  },
+  filters: {},
+  created() {
+    this.userId = this.$store.getters.userId;
+    // 450127;
+    // this.$store.getters.userId;
+    let date = new Date();
+    let y = date.getFullYear();
+    let MM = date.getMonth() + 1;
+    MM = MM < 10 ? "0" + MM : MM;
+    let dd = date.getDate();
+    dd = dd < 10 ? "0" + dd : dd;
+    this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.uploadProjectDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.uploadOperationDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.getInfomation();
+    this.getProjectData();
+    this.getGroupData();
+    this.getOperateCostList();
+    // this.getIndexPromoterRank();
+    // this.getIndexOrderRank();
+  },
+  methods: {
+    getTimeState() {
+      // 获取当前时间
+      let timeNow = new Date();
+      // 获取当前小时
+      let hours = timeNow.getHours();
+      // 设置默认文字
+      let text = ``;
+      // 判断当前时间段
+      if (hours >= 0 && hours <= 5) {
+        text = `凌晨好`;
+      } else if (hours >= 6 && hours <= 9) {
+        text = `早上好`;
+      } else if (hours > 9 && hours <= 12) {
+        text = `上午好`;
+      } else if (hours > 12 && hours <= 14) {
+        text = `中午好`;
+      } else if (hours > 14 && hours <= 18) {
+        text = `下午好`;
+      } else if (hours > 18 && hours <= 24) {
+        text = `晚上好`;
+      }
+      // 返回当前时间段对应的状态
+      return text;
+    },
+    getInfomation() {
+      getOperateHomePageHead({ userId: this.userId }).then((res) => {
+        this.topInfo = res.result;
+      });
+    },
+    getProjectData() {
+      if (this.uploadProjectDate && this.uploadProjectDate.length == 2) {
+        this.loading = true;
+        getProjectCostList(
+          this.addDateRange(
+            { userId: this.userId },
+            this.uploadProjectDate,
+            "startDate",
+            "endDate"
+          )
+        ).then((res) => {
+          this.projectList = res.result;
+          this.loading = false;
+        });
+      } else {
+        this.$message.error("请选择时间");
+      }
+    },
+    getGroupData() {
+      if (this.uploadDate && this.uploadDate.length == 2) {
+        this.groupLoading = true;
+        getOperationsGroupCostList(
+          this.addDateRange(
+            { userId: this.userId },
+            this.uploadDate,
+            "startDate",
+            "endDate"
+          )
+        ).then((res) => {
+          this.groupList = res.result;
+          this.groupLoading = false;
+        });
+      } else {
+        this.$message.error("请选择时间");
+      }
+    },
+
+    getOperateCostList() {
+      if (this.uploadOperationDate && this.uploadOperationDate.length == 2) {
+        this.operationLoading = true;
+        getOperateCostList(
+          this.addDateRange(
+            { userId: this.userId },
+            this.uploadOperationDate,
+            "startDate",
+            "endDate"
+          )
+        ).then((res) => {
+          this.operationLoading = false;
+          this.analysis = res.result;
+        });
+        this.getEchartList(this.userId, 0);
+      } else {
+        this.$message.error("请选择时间");
+      }
+
+      // this.initEchart("echart", this.handlerEchartOption(response.data.list));
+    },
+    getEchartList(userId, type) {
+      this.echartsLoading = true;
+      getOperateCostTrendChartList(
+        this.addDateRange(
+          { userId: userId, type: type },
+          this.uploadOperationDate,
+          "startDate",
+          "endDate"
+        )
+      ).then((res) => {
+        this.echartsLoading = false;
+        this.initEchart("echart", this.handlerEchartOption(res.result));
+      });
+    },
+    changeEchart(item) {
+      if (item.userName == "汇总") {
+        this.getEchartList(this.userId, 0);
+      } else {
+        this.getEchartList(item.userId, 1);
+      }
+    },
+    /** 更多操作 */
+    handleEdit(item, id) {},
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getSaleClueTaskList({ ...this.queryParams, userId: this.userId }).then(
+        (response) => {
+          console.log(response.data.rows);
+          this.typeList = response.data.rows;
+          this.total = response.data.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.queryParams.uploadDate = undefined;
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "上传报表";
+    },
+
+    changeEchartsType(e) {
+      // if (!!e) {
+      //   // this.getDataAnalysis();
+      //   this.initEchart("echart", this.handlerEchartOption(this.analysis.list));
+      // } else {
+      //   this.$message({
+      //     message: "请选择类型",
+      //     type: "error",
+      //   });
+      // }
+    },
+    /** 获取echart的值 */
+    initEchart(idName, optionName) {
+      let that = this;
+      const chart = this.$refs[idName];
+      if (chart) {
+        const myChart = echarts.init(document.getElementById(idName));
+        myChart.setOption(optionName);
+        window.addEventListener("resize", function () {
+          that.clientWidth = document.documentElement.clientWidth - 224;
+          myChart.resize();
+        });
+      }
+    } /** echarts数据展示 订单统计*/,
+    handlerEchartOption(data) {
+      const start = new Date(this.uploadOperationDate[0]);
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 1);
+      let y = start.getFullYear();
+      let MM = start.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = start.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      let option = {
+        tooltip: {
+          trigger: "axis",
+        },
+        title: {
+          x: "center",
+          y: "center",
+
+          show: true,
+          textStyle: {
+            rich: {
+              a: {
+                height: 200,
+                width: 280,
+              },
+            },
+          },
+        },
+        legend: {
+          // data: data.yesterdayInfo ? ["今天", "昨天"] : "",
+        },
+        grid: {
+          left: "3%",
+          right: "4%",
+          bottom: "3%",
+          containLabel: true,
+        },
+        // toolbox: {
+        //     feature: {
+        //         saveAsImage: {}
+        //     }
+        // },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: data.yesterdayInfo
+            ? data.yesterdayInfo.map((item) => {
+                return item.time;
+              })
+            : data.info.map((item) => {
+                return item.time;
+              }),
+        },
+        yAxis: {
+          type: "value",
+        },
+        series: [
+          {
+            name: data.todayInfo ? this.uploadOperationDate[0] : "",
+            type: "line",
+            smooth: true,
+            symbol: "circle",
+            data: data.todayInfo
+              ? data.todayInfo.map((item) => {
+                  return item.costTotal;
+                })
+              : data.info.map((item) => {
+                  return item.costTotal;
+                }),
+            lineStyle: {
+              color: "#00BFFF",
+              width: 2,
+            },
+            itemStyle: {
+              color: "#00BFFF",
+              borderWidth: 2,
+              borderColor: "#00BFFF",
+            },
+          },
+          {
+            name: data.yesterdayInfo ? `${y}-${MM}-${dd}` : "",
+            type: "line",
+            smooth: true,
+            symbol: "circle",
+            data: data.yesterdayInfo
+              ? data.yesterdayInfo.map((item) => {
+                  return item.costTotal;
+                })
+              : [],
+            lineStyle: {
+              color: "#00FF7F",
+              width: 2,
+            },
+            itemStyle: {
+              color: "#00FF7F",
+              borderWidth: 2,
+              borderColor: "#00FF00",
+            },
+          },
+        ],
+      };
+      return option;
+    },
+    toSamplingList(item) {
+      localStorage.setItem("samplingType", item);
+      this.$router.replace({
+        path: "/goodsManagement/samplingList",
+      });
+    },
+    toOrderDetail(item) {
+      this.$router.replace({
+        path: "/supplyChain/goodsDetails",
+        query: {
+          id: item.itemId,
+          name: item.itemTitle,
+          orderStartDate: this.uploadDate[0],
+          orderEndDate: this.uploadDate[1],
+        },
+      });
+    },
+    toOrderList() {
+      this.$router.replace({
+        path: "/supplyChain/goods",
+      });
+    },
+    toPersonDetail(item) {
+      this.$router.replace({
+        path: "/supplyChain/indexDetails",
+        query: {
+          id: item.promoterId,
+          name: item.promoterNickName,
+          orderStartDate: this.uploadDate[0],
+          orderEndDate: this.uploadDate[1],
+        },
+      });
+    },
+    toPersonList() {
+      this.$router.replace({
+        path: "/supplyChain/index",
+      });
+    },
+    indexMethod(index) {
+      return index + 1 + (this.queryParams.pageNum - 1) * 10;
+    },
+    indexMethodTwo(index) {
+      return index + 1 + (this.queryParams.promoterPageNum - 1) * 10;
+    },
+    getIndexPromoterRank() {
+      this.promoterLoading = true;
+      var dateType;
+      let date = new Date();
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = date.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      if (
+        this.uploadDate[0] == `${y}-${MM}-${dd}` &&
+        this.uploadDate[1] == `${y}-${MM}-${dd}`
+      ) {
+        dateType = 0;
+        this.dateType = 0;
+      } else {
+        dateType = 1;
+        this.dateType = 1;
+      }
+      getIndexPromoterRank(
+        this.addDateRange(
+          {
+            dateType: dateType,
+            pageNum: this.queryParams.promoterPageNum,
+            pageSize: 10,
+          },
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((response) => {
+        this.promoterRankList = response.rows;
+        this.promoterTotal = response.total;
+        this.promoterLoading = false;
+      });
+    },
+    getIndexOrderRank() {
+      this.orderRankLoading = true;
+      var dateType;
+      let date = new Date();
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = date.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      if (
+        this.uploadDate[0] == `${y}-${MM}-${dd}` &&
+        this.uploadDate[1] == `${y}-${MM}-${dd}`
+      ) {
+        dateType = 0;
+        this.dateType = 0;
+      } else {
+        dateType = 1;
+        this.dateType = 1;
+      }
+      getIndexOrderRank(
+        this.addDateRange(
+          {
+            dateType: dateType,
+            pageNum: this.queryParams.pageNum,
+            pageSize: 10,
+          },
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((response) => {
+        this.orderRankList = response.rows;
+        this.orderTotal = response.total;
+        this.orderRankLoading = false;
+      });
+    },
+    priceFormat(num, n) {
+      n = n || 2;
+      let symbol = ",";
+      if (num === null) return num;
+      if (typeof num !== "number") throw new TypeError("num参数应该是一个number类型");
+      if (n < 0) throw new Error("参数n不应该小于0");
+      let hasDot = parseInt(num) != num; //这里检测num是否为小数,true表示小数
+      let m = n != undefined && n != null ? n : 1;
+      num =
+        m == 0
+          ? num.toFixed(m) + "."
+          : hasDot
+          ? n
+            ? num.toFixed(n)
+            : num
+          : num.toFixed(m);
+      symbol = symbol || ",";
+      num = num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function (match, p1, p2) {
+        return p1 + symbol;
+      });
+      if (n == 0 || (!hasDot && !n)) {
+        //如果n为0或者传入的num是整数并且没有指定整数的保留位数,则去掉前面操作中的小数位
+        num = num.substring(0, num.indexOf("."));
+      }
+      return num;
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.top-class {
+  text-align: left;
+  font-family: cursive;
+  font-size: 28px;
+  font-weight: bold;
+  display: flex;
+  justify-content: space-between;
+  .top-left {
+    flex: 1;
+  }
+  .top-right {
+    flex: 1;
+    display: flex;
+    justify-content: end;
+    font-size: 16px;
+    font-family: none;
+  }
+}
+.p-main-data {
+  margin: 0;
+  font-size: 14px;
+}
+.flex-class {
+  display: flex;
+  justify-content: space-between;
+}
+.top-sum {
+  margin-bottom: 15px;
+  ::v-deep .card-show {
+    text-align: center;
+    .p-title {
+      width: 100%;
+      font-size: 10px;
+      color: darkgray;
+      font-weight: bold;
+    }
+    .p-main {
+      width: 100%;
+      font-size: 20px;
+      font-weight: bold;
+    }
+    .like-a {
+      color: cornflowerblue;
+      cursor: pointer;
+    }
+  }
+}
+::v-deep .el-form-item__label {
+  white-space: nowrap;
+}
+</style>

+ 835 - 0
src/views/report/statistics.vue

@@ -0,0 +1,835 @@
+<template>
+  <div :class="{ 'app-container': $store.getters.roles[0] == 'admin' }">
+    <el-row class="top-sum-search">
+      <el-card shadow="never" class="card-show">
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          label-width="100px"
+        >
+          <el-form-item label="项目名称" prop="accountId">
+            <selectTree
+              style="width: 240px"
+              v-model="queryParams.accountId"
+              filterable
+              :multiple="true"
+              :data="projectList"
+              :props="{
+                value: 'projectId',
+                label: 'projectName',
+                children: 'accountList',
+              }"
+              nodeKey="projectId"
+              :lazy="false"
+            />
+          </el-form-item>
+          <el-form-item label="时间" prop="userId">
+            <el-date-picker
+              v-model="uploadDate"
+              style="width: 240px; float: right; padding: 3px 0"
+              value-format="yyyy-MM-dd"
+              format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :picker-options="pickerOptions"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >搜索</el-button
+            >
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+              >重置</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-card>
+    </el-row>
+    <el-row class="top-sum" v-loading="topInfo == null" v-if="topInfo">
+      <el-col :span="4">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">总消耗</p>
+          <p class="p-main">{{ allMoney(topInfo.costTotal) }}</p>
+          <p class="p-main-data">
+            环比:<i :style="topInfo.costTotalRoi > 0 ? 'color:red' : 'color:green'"
+              >{{ topInfo.costTotalRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="4">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">当日累计GMV</p>
+          <p class="p-main">{{ topInfo.t0Gmv }}</p>
+          <p class="p-main-data">
+            环比:<i :style="topInfo.t0GmvRoi > 0 ? 'color:red' : 'color:green'"
+              >{{ topInfo.t0GmvRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="4">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">当日累计ROI</p>
+          <p class="p-main">{{ topInfo.t0Roi }}</p>
+          <p class="p-main-data">
+            环比:<i :style="topInfo.t0RoiRoi > 0 ? 'color:red' : 'color:green'"
+              >{{ topInfo.t0RoiRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="4">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">场观成本</p>
+          <p class="p-main">{{ allMoney(topInfo.viewCost) }}</p>
+          <p class="p-main-data">
+            环比:<i
+              :style="topInfo.viewCostRoi > 0 ? 'color:red' : 'color:green'"
+              style="margin-right: 10px"
+              >{{ topInfo.viewCostRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="4">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">涨粉数</p>
+          <p class="p-main">{{ topInfo.upFans }}</p>
+          <p class="p-main-data">
+            环比:<i
+              :style="topInfo.upFansRoi > 0 ? 'color:red' : 'color:green'"
+              style="margin-right: 10px"
+              >{{ topInfo.upFansRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+      <el-col :span="4">
+        <el-card shadow="never" class="card-show">
+          <p class="p-title">当日累计订单成本</p>
+          <p class="p-main">{{ allMoney(topInfo.orderCost) }}</p>
+          <p class="p-main-data">
+            环比:<i
+              :style="topInfo.orderCostRoi > 0 ? 'color:red' : 'color:green'"
+              style="margin-right: 10px"
+              >{{ topInfo.orderCostRoi + "%" }}
+            </i>
+          </p>
+        </el-card>
+      </el-col>
+    </el-row>
+    <el-card shadow="never" class="top-sum">
+      <div slot="header" class="clearfix">
+        <span>访问量统计</span>
+      </div>
+
+      <div
+        id="echart"
+        ref="echart"
+        style="height: 400px; width: 100%; margin-top: 50px"
+        v-loading="echartsLoading"
+      ></div>
+    </el-card>
+    <el-card shadow="never" class="top-sum" v-loading="groupLoading">
+      <div slot="header" class="clearfix">
+        <span>数据报表</span>
+        <div style="float: right; padding: 3px 0">
+          <el-button type="primary" size="mini" @click="showAllCounms"
+            >自定义列</el-button
+          >
+          <el-button :loading="exportLoading" size="mini" @click="exportExcel"
+            >导出</el-button
+          >
+        </div>
+      </div>
+      <el-table :data="groupList">
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="时间" align="center" prop="time" width="150px">
+        </el-table-column>
+
+        <el-table-column
+          :label="item.name"
+          align="center"
+          :prop="item.code"
+          v-for="(item, index) in showAllFields"
+          :key="index"
+          :width="showAllFields.length > 9 ? '150px' : 'auto'"
+        >
+          <template slot-scope="scope">
+            <span
+              v-if="
+                item.name.indexOf('花费') != -1 ||
+                item.name.indexOf('成本') != -1 ||
+                item.name.indexOf('GMV') != -1
+              "
+            >
+              {{ scope.row[item.code] ? allMoney(scope.row[item.code]) : "-" }}
+            </span>
+            <span v-else> {{ scope.row[item.code] ? scope.row[item.code] : "-" }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getGroupData"
+      />
+    </el-card>
+    <!-- 自定义列 -->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
+      <el-checkbox-group v-model="ids">
+        <el-checkbox
+          v-for="city in reportFieldsList"
+          :label="city.code + '@' + city.name"
+          :key="city.code"
+          style="width: 30%"
+          >{{ city.name }}</el-checkbox
+        >
+      </el-checkbox-group>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getProjectAndAccountByUserId,
+  getStatisticalReportHead,
+  getvisitorStatisticsTrendChartList,
+  nodeAccountCost,
+  getAccountDataReport,
+  getReportFields,
+  addKuaishouFields,
+  getKuaishouFieldsByUserId,
+} from "@/api/operation/operation.js";
+import { downFilePost } from "@/api/supplyChain/supplyChain";
+import selectTree from "../goodsManagement/selectTree";
+var echarts = require("echarts");
+export default {
+  name: "Statistics",
+  data() {
+    return {
+      echartsType: "orderAmount",
+      // 遮罩层
+      loading: false,
+      groupLoading: false,
+      operationLoading: false,
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 汇总数据获取
+      taskNumber: {
+        complete: 0,
+        noStarted: 0,
+      },
+      userId: undefined,
+      // 日期范围
+      dateRange: [],
+      uploadDate: [new Date(), new Date()],
+      uploadProjectDate: [new Date(), new Date()],
+      uploadOperationDate: [new Date(), new Date()],
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "今天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "昨天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 1);
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 3);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+      // 销售线索回显
+      formDataShow: null,
+      // 表单参数
+      form: {},
+      //上传报表下拉数据
+      formList: {},
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {},
+      // 分配销售展示列表
+      saleAllocationList: [],
+      topInfo: null,
+      projectList: [],
+      groupList: [],
+      analysis: [],
+      type: 1,
+      echartsLoading: false,
+      orderRankList: [],
+      orderRankLoading: false,
+      orderTotal: 0,
+      queryParams: { pageNum: 1, pageSize: 10, promoterPageNum: 1, accountId: undefined },
+      promoterRankList: [],
+      promoterLoading: false,
+      promoterTotal: 0,
+      dateType: 0,
+      reportFieldsList: [],
+      fiexEdFields: [
+        {
+          code: "time",
+          name: "时间",
+        },
+      ],
+
+      showAllFields: [
+        {
+          code: "costTotal",
+          name: "花费",
+        },
+        {
+          code: "adShow",
+          name: "曝光数",
+        },
+        {
+          code: "actionbarClick",
+          name: "行为数",
+        },
+        {
+          code: "conversionNum",
+          name: "转化数",
+        },
+        {
+          code: "click",
+          name: "素材曝光数",
+        },
+      ],
+    };
+  },
+  components: {
+    selectTree,
+  },
+  filters: {},
+  created() {
+    this.userId = this.$store.getters.userId;
+    // 450127;
+    // this.$store.getters.userId;
+    this.getColumn();
+    let date = new Date();
+    let y = date.getFullYear();
+    let MM = date.getMonth() + 1;
+    MM = MM < 10 ? "0" + MM : MM;
+    let dd = date.getDate();
+    dd = dd < 10 ? "0" + dd : dd;
+    this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.uploadProjectDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.uploadOperationDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.getProjectAndAccountByUserId();
+    this.handleQuery();
+  },
+  methods: {
+    getProjectAndAccountByUserId() {
+      getProjectAndAccountByUserId({ userId: this.userId }).then((res) => {
+        this.projectList = res.result.map((item) => {
+          return {
+            ...item,
+            accountList: item.accountList.map((v) => {
+              return {
+                ...v,
+                projectId: v.accountId,
+                projectName: v.accountName,
+              };
+            }),
+          };
+        });
+      });
+    },
+    getTimeState() {
+      // 获取当前时间
+      let timeNow = new Date();
+      // 获取当前小时
+      let hours = timeNow.getHours();
+      // 设置默认文字
+      let text = ``;
+      // 判断当前时间段
+      if (hours >= 0 && hours <= 5) {
+        text = `凌晨好`;
+      } else if (hours >= 6 && hours <= 9) {
+        text = `早上好`;
+      } else if (hours > 9 && hours <= 12) {
+        text = `上午好`;
+      } else if (hours > 12 && hours <= 14) {
+        text = `中午好`;
+      } else if (hours > 14 && hours <= 18) {
+        text = `下午好`;
+      } else if (hours > 18 && hours <= 24) {
+        text = `晚上好`;
+      }
+      // 返回当前时间段对应的状态
+      return text;
+    },
+    getInfomation() {
+      getStatisticalReportHead(
+        this.addDateRange(
+          {
+            userId: this.userId,
+            accountList: this.queryParams.accountId
+              ? this.queryParams.accountId.split(",")
+              : [],
+          },
+          this.uploadDate,
+          "startDate",
+          "endDate"
+        )
+      ).then((res) => {
+        this.topInfo = res.result;
+      });
+    },
+    getGroupData() {
+      if (this.uploadDate && this.uploadDate.length == 2) {
+        this.groupLoading = true;
+        getAccountDataReport(
+          this.addDateRange(
+            {
+              pageNum: this.queryParams.pageNum,
+              pageSize: this.queryParams.pageSize,
+              userId: this.userId,
+              accountList: this.queryParams.accountId
+                ? this.queryParams.accountId.split(",")
+                : [],
+            },
+            this.uploadDate,
+            "startDate",
+            "endDate"
+          )
+        ).then((res) => {
+          this.groupList = res.rows;
+          this.total = res.total;
+          this.groupLoading = false;
+        });
+      } else {
+        this.$message.error("请选择时间");
+      }
+    },
+    getEchartList(userId, type) {
+      this.echartsLoading = true;
+      getvisitorStatisticsTrendChartList(
+        this.addDateRange(
+          {
+            userId: this.userId,
+            accountList: this.queryParams.accountId
+              ? this.queryParams.accountId.split(",")
+              : [],
+          },
+          this.uploadDate,
+          "startDate",
+          "endDate"
+        )
+      ).then((res) => {
+        this.echartsLoading = false;
+        this.initEchart("echart", this.handlerEchartOption(res.result));
+      });
+    },
+    changeEchart(item) {
+      if (item.userName == "汇总") {
+        this.getEchartList(this.userId, 0);
+      } else {
+        this.getEchartList(item.userId, 1);
+      }
+    },
+    /** 更多操作 */
+    handleEdit(item, id) {},
+
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getSaleClueTaskList({ ...this.queryParams, userId: this.userId }).then(
+        (response) => {
+          console.log(response.data.rows);
+          this.typeList = response.data.rows;
+          this.total = response.data.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getInfomation();
+      this.getEchartList();
+      this.getGroupData();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      let date = new Date();
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = date.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "上传报表";
+    },
+
+    changeEchartsType(e) {
+      // if (!!e) {
+      //   // this.getDataAnalysis();
+      //   this.initEchart("echart", this.handlerEchartOption(this.analysis.list));
+      // } else {
+      //   this.$message({
+      //     message: "请选择类型",
+      //     type: "error",
+      //   });
+      // }
+    },
+    /** 获取echart的值 */
+    initEchart(idName, optionName) {
+      let that = this;
+      const chart = this.$refs[idName];
+      if (chart) {
+        const myChart = echarts.init(document.getElementById(idName));
+        myChart.setOption(optionName);
+        window.addEventListener("resize", function () {
+          that.clientWidth = document.documentElement.clientWidth - 224;
+          myChart.resize();
+        });
+      }
+    } /** echarts数据展示 订单统计*/,
+    handlerEchartOption(data) {
+      var that = this;
+      let option = {
+        tooltip: {
+          trigger: "axis",
+          triggerOn: "click",
+          formatter: function (params, ticket, callback) {
+            console.log(params);
+            var data = params[0].name.split("-").length > 1 ? true : false;
+            var paramsData = {
+              //   userId: that.userId,
+              accountList: that.queryParams.accountId
+                ? that.queryParams.accountId.split(",")
+                : [],
+            };
+            if (data) {
+              paramsData.date = params[0].name;
+            } else {
+              paramsData.date = that.uploadDate[0];
+              paramsData.hour = params[0].name;
+            }
+
+            nodeAccountCost(paramsData).then((res) => {
+              var dataShowAll = "";
+              if (res.result.length > 0) {
+                for (let i = 0; i < res.result.length; i++) {
+                  dataShowAll +=
+                    res.result[i].accountName +
+                    " : " +
+                    that.allMoney(res.result[i].costTotal) +
+                    "<br/>";
+                }
+
+                // return dataShow;
+                callback(ticket, dataShowAll);
+              } else {
+                dataShowAll = "无账户数据";
+                callback(ticket, dataShowAll);
+              }
+            });
+            return `正在请求数据`;
+          },
+        },
+        title: {
+          x: "center",
+          y: "center",
+
+          show: true,
+          textStyle: {
+            rich: {
+              a: {
+                height: 200,
+                width: 280,
+              },
+            },
+          },
+        },
+        legend: {
+          // data: data.yesterdayInfo ? ["今天", "昨天"] : "",
+        },
+        grid: {
+          left: "3%",
+          right: "4%",
+          bottom: "3%",
+          containLabel: true,
+        },
+        // toolbox: {
+        //     feature: {
+        //         saveAsImage: {}
+        //     }
+        // },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: data.map((item) => {
+            return item.time;
+          }),
+        },
+        yAxis: {
+          type: "value",
+        },
+        series: [
+          {
+            name: this.uploadDate[0] + "~" + this.uploadDate[1],
+            type: "line",
+            smooth: true,
+            symbol: "circle",
+            data: data.map((item) => {
+              return item.costTotal;
+            }),
+            lineStyle: {
+              color: "#00BFFF",
+              width: 2,
+            },
+            itemStyle: {
+              color: "#00BFFF",
+              borderWidth: 2,
+              borderColor: "#00BFFF",
+            },
+          },
+        ],
+      };
+      return option;
+    },
+    showAllCounms() {
+      this.open = true;
+      this.title = "自定义列";
+      getReportFields().then((res) => {
+        this.reportFieldsList = res.result;
+        this.$nextTick(() => {
+          this.ids = this.showAllFields.map((item) => {
+            return item.code + "@" + item.name;
+          });
+        });
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.showAllFields = this.ids.map((item) => {
+        return {
+          code: item.split("@")[0],
+          name: item.split("@")[1],
+        };
+      });
+      addKuaishouFields({
+        userId: this.userId,
+        json: JSON.stringify(this.showAllFields),
+        columnType: 1,
+      }).then((res) => {
+        this.open = false;
+      });
+    },
+    getColumn() {
+      getKuaishouFieldsByUserId({
+        userId: this.userId,
+        columnType: 1,
+      }).then((res) => {
+        if (res.result) {
+          this.showAllFields = JSON.parse(res.result.json);
+        }
+      });
+    },
+    cancel() {
+      this.open = false;
+      this.ids = [];
+    },
+    exportExcel() {
+      this.exportLoading = true;
+      downFilePost(
+        "/report/account/exportAccountDataReport",
+        this.addDateRange(
+          {
+            userId: this.userId,
+            accountList: this.queryParams.accountId
+              ? this.queryParams.accountId.split(",")
+              : [],
+            columns: this.showAllFields.map((item) => {
+              return item.code;
+            }),
+          },
+          this.uploadDate,
+          "startDate",
+          "endDate"
+        )
+      ).then((res) => {
+        let blob = new Blob([res], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        let downloadElement = document.createElement("a");
+        let href = window.URL.createObjectURL(blob); //创建下载的链接
+        downloadElement.href = href;
+        downloadElement.download = "数据报表.xlsx"; //下载后文件名
+        document.body.appendChild(downloadElement);
+        downloadElement.click(); //点击下载
+        document.body.removeChild(downloadElement); //下载完成移除元素
+        window.URL.revokeObjectURL(href); //释放掉blob对象
+        this.exportLoading = false;
+      });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.top-class {
+  text-align: left;
+  font-family: cursive;
+  font-size: 28px;
+  font-weight: bold;
+  display: flex;
+  justify-content: space-between;
+  .top-left {
+    flex: 1;
+  }
+  .top-right {
+    flex: 1;
+    display: flex;
+    justify-content: end;
+    font-size: 16px;
+    font-family: none;
+  }
+}
+.p-main-data {
+  margin: 0;
+  font-size: 14px;
+}
+.flex-class {
+  display: flex;
+  justify-content: space-between;
+}
+.top-sum-search {
+  margin-bottom: 15px;
+  ::v-deep .el-card__body {
+    padding: 10px 0;
+  }
+}
+.top-sum {
+  margin-bottom: 15px;
+  ::v-deep .card-show {
+    text-align: center;
+    .p-title {
+      width: 100%;
+      font-size: 10px;
+      color: darkgray;
+      font-weight: bold;
+    }
+    .p-main {
+      width: 100%;
+      font-size: 20px;
+      font-weight: bold;
+    }
+    .like-a {
+      color: cornflowerblue;
+      cursor: pointer;
+    }
+  }
+}
+::v-deep .el-form-item__label {
+  white-space: nowrap;
+}
+</style>

File diff suppressed because it is too large
+ 1067 - 0
src/views/staging.vue


+ 530 - 0
src/views/supplyChain/channelDetails.vue

@@ -0,0 +1,530 @@
+<style scoped lang="scss">
+::v-deep a {
+  color: #409eff;
+  display: block;
+}
+p {
+  text-align: left;
+  margin: 0;
+}
+</style>
+<template>
+  <div class="app-container">
+    <div></div>
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <!-- <el-form-item label="商品名称" prop="itemTitle">
+        <el-input
+          v-model="queryParams.itemTitle"
+          placeholder="请输入商品名称"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商品Id" prop="itemId">
+        <el-input
+          v-model.number="queryParams.itemId"
+          placeholder="请输入商品Id"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item> -->
+      <el-form-item label="选择日期">
+        <el-date-picker
+          v-model="uploadDate"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          :loading="downLoadLoading"
+          >导出</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      @sort-change="sortChange"
+      ref="multipleTable"
+      :span-method="arraySpanMethod"
+      border
+    >
+      <!-- :summary-method="getSummaries" -->
+      <!-- show-summary -->
+      <el-table-column label="达人名称" align="center" prop="itemTitle" width="300">
+        <template slot-scope="scope">
+          <div style="display: flex; width: 100%" v-if="scope.row.promoterName != '总计'">
+            <div style="width: 40%">
+              <img
+                :src="scope.row.promoterUrl"
+                alt=""
+                style="width: 70px; height: auto"
+              />
+            </div>
+            <div style="width: 60%">
+              <a
+                style="
+                  text-overflow: ellipsis;
+                  white-space: nowrap;
+                  overflow: hidden;
+                  width: 100%;
+                  text-align: left;
+                "
+                :title="scope.row.promoterName"
+              >
+                {{ scope.row.promoterName }}
+              </a>
+              <p>达人Id: {{ scope.row.promoterId }}</p>
+            </div>
+          </div>
+          <div v-else style="font-size: 20px">
+            {{ scope.row.promoterName }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="领样数" align="center" prop="sampleCount" sortable="custom">
+      </el-table-column>
+      <el-table-column label="订单数" align="center" prop="orderNum" sortable="custom">
+      </el-table-column>
+      <el-table-column
+        label="有效订单数"
+        align="center"
+        prop="validOrderNum"
+        sortable="custom"
+      >
+      </el-table-column>
+
+      <el-table-column
+        label="有效订单率"
+        align="center"
+        prop="validOrderRate"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.validOrderRate ? scope.row.validOrderRate + "%" : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="订单金额"
+        align="center"
+        prop="orderAmount"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.orderAmount ? allMoney(scope.row.orderAmount / 100) : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="预估服务费收入"
+        align="center"
+        prop="regimentalPromotionAmount"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          {{
+            scope.row.regimentalPromotionAmount
+              ? allMoney(scope.row.regimentalPromotionAmount / 100)
+              : "-"
+          }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="结算服务费收入"
+        align="center"
+        prop="totalRegimentalSettleAmount"
+        sortable="custom"
+      >
+        <template slot-scope="scope">
+          {{
+            scope.row.totalRegimentalSettleAmount
+              ? allMoney(scope.row.totalRegimentalSettleAmount / 100)
+              : "-"
+          }}
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getUserItemDetail"
+    />
+  </div>
+</template>
+
+<script>
+import {
+  listType,
+  getType,
+  delType,
+  addType,
+  updateType,
+  refreshCache,
+} from "@/api/system/dict/type";
+import {
+  getBdDetailList,
+  getOrderList,
+  getItemDetail,
+  downFilePost,
+  getUserItemDetail,
+  getBdTotal,
+} from "@/api/supplyChain/supplyChain";
+var echarts = require("echarts");
+export default {
+  name: "ClaimOk",
+  dicts: ["sys_normal_disable"],
+  data() {
+    return {
+      downLoadLoading: false,
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        itemId: undefined,
+        itemTitle: undefined,
+        orderStartDate: undefined,
+        orderEndDate: undefined,
+      },
+      uploadDate: [new Date(), new Date()],
+      //查询参数所用下拉数据
+      queryParamsList: {},
+      prop: "orderNum",
+      sort: "desc",
+      itemSummary: [],
+      loadingTotal: false,
+    };
+  },
+  created() {
+    if (
+      this.$route &&
+      this.$route.query.id &&
+      this.$route.query.orderStartDate &&
+      this.$route.query.orderEndDate
+    ) {
+      this.uploadDate = [
+        this.$route.query.orderStartDate,
+        this.$route.query.orderEndDate,
+      ];
+      this.getUserItemTotal();
+      this.getUserItemDetail();
+    } else {
+      let date = new Date();
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = date.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+      this.getUserItemTotal();
+      this.getUserItemDetail();
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {});
+  },
+  methods: {
+    /** 导出按钮操作 */
+    handleExport() {
+      this.downLoadLoading = true;
+      downFilePost(
+        "/isv/supply_chain/exportBdDetail",
+        this.addDateRange(
+          {
+            ...this.queryParams,
+            collectSampleId: !!this.$route.query.id
+              ? this.$route.query.id
+              : this.$store.getters.remark == "管理员"
+              ? null
+              : this.$store.getters.userId,
+          },
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((res) => {
+        let blob = new Blob([res], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        let downloadElement = document.createElement("a");
+        let href = window.URL.createObjectURL(blob); //创建下载的链接
+        downloadElement.href = href;
+        downloadElement.download = `渠道详情_${this.uploadDate[0]}-${this.uploadDate[1]}.xlsx`; //下载后文件名
+        document.body.appendChild(downloadElement);
+        downloadElement.click(); //点击下载
+        document.body.removeChild(downloadElement); //下载完成移除元素
+        window.URL.revokeObjectURL(href); //释放掉blob对象
+        this.downLoadLoading = false;
+      });
+    },
+    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (rowIndex === 0) {
+        if (columnIndex === 0) {
+          return [1, 1];
+        }
+      }
+    },
+    getUserItemTotal() {
+      this.loadingTotal = true;
+      getBdTotal(
+        this.addDateRange(
+          {
+            collectSampleId: !!this.$route.query.id
+              ? this.$route.query.id
+              : this.$store.getters.remark == "管理员"
+              ? null
+              : this.$store.getters.userId,
+          },
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((res) => {
+        this.loadingTotal = false;
+        this.itemSummary = res.rows.map((item) => {
+          return {
+            ...item,
+            promoterName: "总计",
+          };
+        });
+      });
+    },
+    sortChange(col, prop, order) {
+      this.prop = col.prop;
+      this.sort = !!col.order ? (col.order == "descending" ? "desc" : "asc") : "desc";
+      this.handleQuery();
+    },
+    toDetail(id) {},
+    toIndexDetail(item) {
+      this.$router.replace({
+        path: "/supplyChain/indexDetails",
+        query: {
+          id: item.promoterId,
+          name: item.promoterNickName,
+          orderStartDate: this.$route.query.orderStartDate,
+          orderEndDate: this.$route.query.orderEndDate,
+        },
+      });
+    },
+    getUserItemDetail() {
+      this.loading = true;
+      getBdDetailList(
+        this.addDateRange(
+          {
+            ...this.queryParams,
+            fieId: this.prop,
+            sort: this.sort,
+            collectSampleId: !!this.$route.query.id
+              ? this.$route.query.id
+              : this.$store.getters.remark == "管理员"
+              ? null
+              : this.$store.getters.userId,
+          },
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((response) => {
+        this.typeList = this.itemSummary.concat(response.rows);
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    getSummaries(param) {
+      console.log(param);
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "总计";
+          return;
+        } else if (index == 1) {
+          sums[index] = "N/A";
+          return;
+        } else if (index == 9) {
+          sums[index] = "-";
+          return;
+        } else if (index == 2) {
+          sums[index] = "-";
+          return;
+        }
+
+        for (const key in this.itemSummary[0]) {
+          if (key == column.property) {
+            if (key == "validRadio" || key == "deliveryRadio") {
+              sums[index] = this.itemSummary[0][key]
+                ? (this.itemSummary[0][key] * 100).toFixed(2) + "%"
+                : "-";
+            } else if (
+              key == "payAmount" ||
+              key == "regimentalPromotionAmount" ||
+              key == "totalRegimentalSettleAmount"
+            ) {
+              sums[index] = this.itemSummary[0][key]
+                ? this.itemSummary[0][key] / 100
+                : "-";
+            } else {
+              sums[index] = this.itemSummary[0][key];
+            }
+          }
+        }
+
+        // const values = data.map((item) => Number(item[column.property]));
+        // console.log(values)
+        // if (!values.every((value) => isNaN(value))) {
+        //   sums[index] = values.reduce((prev, curr) => {
+        //     const value = Number(curr);
+        //     if (!isNaN(value)) {
+        //       return prev + curr;
+        //     } else {
+        //       return prev;
+        //     }
+        //   }, 0);
+        //   // sums[index] += " 元";
+        // } else {
+        //   sums[index] = "N/A";
+        // }
+      });
+
+      return sums;
+    },
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getOrderList(
+        this.addDateRange(
+          this.queryParams,
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getUserItemTotal();
+      this.getUserItemDetail();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      //   let date = new Date();
+      //   let y = date.getFullYear();
+      //   let MM = date.getMonth() + 1;
+      //   MM = MM < 10 ? "0" + MM : MM;
+      //   let dd = date.getDate();
+      //   dd = dd < 10 ? "0" + dd : dd;
+      if (
+        this.$route &&
+        this.$route.query.id &&
+        this.$route.query.orderStartDate &&
+        this.$route.query.orderEndDate
+      ) {
+        this.uploadDate = [
+          this.$route.query.orderStartDate,
+          this.$route.query.orderEndDate,
+        ];
+        this.getUserItemDetail();
+      } else {
+        let date = new Date();
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? "0" + MM : MM;
+        let dd = date.getDate();
+        dd = dd < 10 ? "0" + dd : dd;
+        this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+        this.getUserItemDetail();
+      }
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+  },
+};
+</script>

+ 352 - 0
src/views/supplyChain/channelList.vue

@@ -0,0 +1,352 @@
+<style scoped lang="scss">
+::v-deep a {
+  color: #409eff;
+  display: block;
+}
+</style>
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="渠道" prop="collectSampleId">
+        <el-select
+          filterable
+          v-model="queryParams.collectSampleId"
+          placeholder="渠道名称"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.personList"
+            :key="item.userId"
+            :label="item.nickMame"
+            :value="item.userId"
+          >
+            <div style="display: flex">
+              <span
+                style="
+                  width: 10px;
+                  height: 10px;
+                  border-radius: 50%;
+                  background-color: green;
+                  position: relative;
+                  top: 12px;
+                  margin-right: 5px;
+                "
+                :style="
+                  item.status == '0' ? 'backgroundColor:green' : 'backgroundColor:red'
+                "
+                >{{ item.value }}</span
+              ><span>{{ item.nickMame }}</span>
+            </div>
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="选择日期">
+        <el-date-picker
+          v-model="uploadDate"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="typeList"
+      @selection-change="handleSelectionChange"
+      ref="multipleTable"
+    >
+      <!-- <el-table-column type="selection" width="55" align="center" /> -->
+      <el-table-column label="渠道" align="center" prop="collectSampleName" width="150px">
+        <template slot-scope="scope">
+          <a @click="toIndexDetail(scope.row)">
+            {{ scope.row.collectSampleName }}({{ scope.row.collectSampleId }})
+          </a>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="(总)达人数"
+        align="center"
+        prop="promoterCount"
+        width="100px"
+      />
+      <el-table-column
+        label="(总)领样达人数"
+        align="center"
+        prop="sampleCount"
+        width="200px"
+      />
+      <el-table-column label="(总)领样率" align="center" prop="sampleRate" width="100px">
+        <template slot-scope="scope">
+          {{ scope.row.sampleRate ? scope.row.sampleRate + "%" : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="(总)未领样数"
+        align="center"
+        prop="notSampleCount"
+        width="100px"
+      >
+      </el-table-column>
+      <el-table-column label="发样数" align="center" prop="sendTotalCount" width="100px">
+      </el-table-column>
+      <el-table-column
+        label="发样达人数"
+        align="center"
+        prop="sendPromoterCount"
+        width="100px"
+      >
+      </el-table-column>
+      <el-table-column label="发样商品数" align="center" prop="sendItemCount" width="100px">
+      </el-table-column>
+
+      <el-table-column label="订单数" align="center" prop="orderNum" width="100px"> </el-table-column>
+      <el-table-column label="有效订单数" align="center" prop="validOrderNum" width="100px">
+      </el-table-column>
+      <el-table-column label="有效订单率" align="center" prop="validOrderRate" width="100px">
+        <template slot-scope="scope">
+          {{ scope.row.validOrderRate ? scope.row.validOrderRate + "%" : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column label="实付金额" align="center" prop="orderAmount" width="100px">
+        <template slot-scope="scope">
+          {{ scope.row.orderAmount ? allMoney(scope.row.orderAmount / 100) : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="预估服务费收入"
+        align="center"
+        prop="regimentalPromotionAmount"
+        width="150px"
+      >
+        <template slot-scope="scope">
+          {{
+            scope.row.regimentalPromotionAmount
+              ? allMoney(scope.row.regimentalPromotionAmount / 100)
+              : "-"
+          }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="结算服务费收入"
+        align="center"
+        prop="totalRegimentalSettleAmount"
+        width="150px"
+      >
+        <template slot-scope="scope">
+          {{
+            scope.row.totalRegimentalSettleAmount
+              ? allMoney(scope.row.totalRegimentalSettleAmount / 100)
+              : "-"
+          }}
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+
+import {
+  getSupplyChainUserList,
+  getBdReportList,
+  downFilePost,
+} from "@/api/supplyChain/supplyChain";
+export default {
+  name: "Investment",
+  dicts: ["sys_normal_disable"],
+  data() {
+    return {
+      downLoadLoading: false,
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 获取用户id
+      userId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        collectSampleId: undefined,
+        orderStartDate: undefined,
+        orderEndDate: undefined,
+      },
+      uploadDate: [new Date(), new Date()],
+      //查询参数所用下拉数据
+      queryParamsList: {
+        personList: [],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+    let date = new Date();
+    let y = date.getFullYear();
+    let MM = date.getMonth() + 1;
+    MM = MM < 10 ? "0" + MM : MM;
+    let dd = date.getDate();
+    dd = dd < 10 ? "0" + dd : dd;
+    this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.getPersonList();
+      this.getList();
+    });
+  },
+  methods: {
+    /** 导出按钮操作 */
+    handleExport() {
+      this.downLoadLoading = true;
+      downFilePost(
+        "/isv/supply_chain/exportPromoterTotal",
+        this.addDateRange(
+          this.queryParams,
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((res) => {
+        let blob = new Blob([res], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        let downloadElement = document.createElement("a");
+        let href = window.URL.createObjectURL(blob); //创建下载的链接
+        downloadElement.href = href;
+        downloadElement.download = `达人订单列表_${this.uploadDate[0]}-${this.uploadDate[1]}.xlsx`; //下载后文件名
+        document.body.appendChild(downloadElement);
+        downloadElement.click(); //点击下载
+        document.body.removeChild(downloadElement); //下载完成移除元素
+        window.URL.revokeObjectURL(href); //释放掉blob对象
+        this.downLoadLoading = false;
+      });
+    },
+    toIndexDetail(item) {
+      this.$router.replace({
+        path: "/supplyChain/channelDetails",
+        query: {
+          id: item.collectSampleId,
+          orderStartDate: this.uploadDate[0],
+          orderEndDate: this.uploadDate[1],
+        },
+      });
+    },
+    getPersonList() {
+      getSupplyChainUserList().then((response) => {
+        this.queryParamsList.personList = response.rows;
+      });
+    },
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getBdReportList(
+        this.addDateRange(
+          this.queryParams,
+          this.uploadDate,
+          "orderStartDate",
+          "orderEndDate"
+        )
+      ).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      let date = new Date();
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = date.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+      this.resetForm("queryForm");
+      this.queryParams.pageNum = 1;
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+    },
+  },
+};
+</script>

+ 7 - 26
src/views/supplyChain/goodsDetails.vue

@@ -42,16 +42,10 @@
       </el-form-item>
 
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
         <el-button
           type="warning"
           plain
@@ -80,16 +74,11 @@
         </template>
       </el-table-column>
       <el-table-column label="达人Id" align="center" prop="promoterId" />
-      <el-table-column label="订单数" align="center" prop="orderNum">
-      </el-table-column>
+      <el-table-column label="订单数" align="center" prop="orderNum"> </el-table-column>
       <el-table-column label="有效订单数" align="center" prop="validOrderNUm" />
       <el-table-column label="有效率" align="center" prop="validRadio">
         <template slot-scope="scope">
-          {{
-            scope.row.validRadio
-              ? (scope.row.validRadio * 100).toFixed(2) + "%"
-              : "-"
-          }}
+          {{ scope.row.validRadio ? (scope.row.validRadio * 100).toFixed(2) + "%" : "-" }}
         </template>
       </el-table-column>
       <el-table-column label="发货数" align="center" prop="deliveryNum">
@@ -107,14 +96,10 @@
       </el-table-column>
       <el-table-column label="付款金额" align="center" prop="payAmount">
         <template slot-scope="scope">
-          {{ (scope.row.payAmount / 100).toFixed(2) }}
+          {{ allMoney(scope.row.payAmount / 100) }}
         </template>
       </el-table-column>
-      <el-table-column
-        label="服务费率"
-        align="center"
-        prop="regimentalPromotionRate"
-      >
+      <el-table-column label="服务费率" align="center" prop="regimentalPromotionRate">
         <template slot-scope="scope">
           {{ scope.row.regimentalPromotionRate / 10 + "%" }}
         </template>
@@ -140,11 +125,7 @@ import {
   updateType,
   refreshCache,
 } from "@/api/system/dict/type";
-import {
-  getOrderList,
-  getItemDetail,
-  downFilePost,
-} from "@/api/supplyChain/supplyChain";
+import { getOrderList, getItemDetail, downFilePost } from "@/api/supplyChain/supplyChain";
 var echarts = require("echarts");
 export default {
   name: "sale",

+ 11 - 47
src/views/supplyChain/indexDetails.vue

@@ -42,16 +42,10 @@
       </el-form-item>
 
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
         <el-button
           type="warning"
           plain
@@ -74,11 +68,7 @@
 
       <el-table-column label="商品图片" align="center" prop="imageUrl">
         <template slot-scope="scope">
-          <img
-            :src="scope.row.imageUrl"
-            alt=""
-            style="width: 100px; height: auto"
-          />
+          <img :src="scope.row.imageUrl" alt="" style="width: 100px; height: auto" />
         </template>
       </el-table-column>
       <el-table-column label="商品名称" align="center" prop="itemTitle">
@@ -90,41 +80,19 @@
       </el-table-column>
       <el-table-column label="商品Id" align="center" prop="itemId" />
       <el-table-column label="商品单价" align="center" prop="reservePrice">
-        <template slot-scope="scope">
-          {{ scope.row.reservePrice / 100 }}元
-        </template>
+        <template slot-scope="scope"> {{ scope.row.reservePrice / 100 }}元 </template>
       </el-table-column>
 
-      <el-table-column label="订单数" align="center" prop="orderNum">
-      </el-table-column>
+      <el-table-column label="订单数" align="center" prop="orderNum"> </el-table-column>
       <el-table-column label="有效订单数" align="center" prop="validOrderNUm" />
-      <el-table-column
-        label="有效率"
-        align="center"
-        prop="validRadio"
-        width="100"
-      >
+      <el-table-column label="有效率" align="center" prop="validRadio" width="100">
         <template slot-scope="scope">
-          {{
-            scope.row.validRadio
-              ? (scope.row.validRadio * 100).toFixed(2) + "%"
-              : "-"
-          }}
+          {{ scope.row.validRadio ? (scope.row.validRadio * 100).toFixed(2) + "%" : "-" }}
         </template>
       </el-table-column>
-      <el-table-column
-        label="发货数"
-        align="center"
-        prop="deliveryNum"
-        width="100"
-      >
+      <el-table-column label="发货数" align="center" prop="deliveryNum" width="100">
       </el-table-column>
-      <el-table-column
-        label="发货率"
-        align="center"
-        prop="deliveryRadio"
-        width="100"
-      >
+      <el-table-column label="发货率" align="center" prop="deliveryRadio" width="100">
         <template slot-scope="scope">
           {{
             scope.row.deliveryRadio
@@ -137,14 +105,10 @@
       </el-table-column>
       <el-table-column label="付款金额" align="center" prop="payAmount">
         <template slot-scope="scope">
-          {{ (scope.row.payAmount / 100).toFixed(2) }}
+          {{ allMoney(scope.row.payAmount / 100) }}
         </template>
       </el-table-column>
-      <el-table-column
-        label="服务费率"
-        align="center"
-        prop="regimentalPromotionRate"
-      >
+      <el-table-column label="服务费率" align="center" prop="regimentalPromotionRate">
         <template slot-scope="scope">
           {{ scope.row.regimentalPromotionRate / 10 + "%" }}
         </template>

+ 9 - 24
src/views/supplyChain/investment.vue

@@ -40,9 +40,7 @@
                   margin-right: 5px;
                 "
                 :style="
-                  item.status == '0'
-                    ? 'backgroundColor:green'
-                    : 'backgroundColor:red'
+                  item.status == '0' ? 'backgroundColor:green' : 'backgroundColor:red'
                 "
                 >{{ item.value }}</span
               ><span>{{ item.nickMame }}</span>
@@ -64,16 +62,10 @@
       </el-form-item>
 
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
@@ -92,16 +84,11 @@
         </template>
       </el-table-column>
       <el-table-column label="商品数" align="center" prop="itemCount" />
-      <el-table-column label="订单数" align="center" prop="orderNum">
-      </el-table-column>
+      <el-table-column label="订单数" align="center" prop="orderNum"> </el-table-column>
       <el-table-column label="有效订单数" align="center" prop="validOrderNUm" />
       <el-table-column label="有效率" align="center" prop="validRadio">
         <template slot-scope="scope">
-          {{
-            scope.row.validRadio
-              ? (scope.row.validRadio * 100).toFixed(2) + "%"
-              : "-"
-          }}
+          {{ scope.row.validRadio ? (scope.row.validRadio * 100).toFixed(2) + "%" : "-" }}
         </template>
       </el-table-column>
       <el-table-column label="发货数" align="center" prop="deliveryNum">
@@ -115,13 +102,11 @@
           }}
         </template>
       </el-table-column>
-            <el-table-column label="未发货数" align="center" prop="notDeliveryNum">
+      <el-table-column label="未发货数" align="center" prop="notDeliveryNum">
       </el-table-column>
       <el-table-column label="实付金额" align="center" prop="payAmount">
         <template slot-scope="scope">
-          {{
-            scope.row.payAmount ? (scope.row.payAmount / 100).toFixed(2) : "-"
-          }}
+          {{ scope.row.payAmount ? allMoney(scope.row.payAmount / 100) : "-" }}
         </template>
       </el-table-column>
       <el-table-column
@@ -132,7 +117,7 @@
         <template slot-scope="scope">
           {{
             scope.row.regimentalPromotionAmount
-              ? (scope.row.regimentalPromotionAmount / 100).toFixed(2)
+              ? allMoney(scope.row.regimentalPromotionAmount / 100)
               : "-"
           }}
         </template>
@@ -145,7 +130,7 @@
         <template slot-scope="scope">
           {{
             scope.row.totalRegimentalSettleAmount
-              ? (scope.row.totalRegimentalSettleAmount / 100).toFixed(2)
+              ? allMoney(scope.row.totalRegimentalSettleAmount / 100)
               : "-"
           }}
         </template>

+ 18 - 48
src/views/supplyChain/investmentDetails.vue

@@ -51,16 +51,10 @@ p {
       </el-form-item>
 
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
         <el-button
           type="warning"
           plain
@@ -151,20 +145,11 @@ p {
     >
       <!-- :summary-method="getSummaries" -->
       <!-- show-summary -->
-      <el-table-column
-        label="商品名称"
-        align="center"
-        prop="itemTitle"
-        width="300"
-      >
+      <el-table-column label="商品名称" align="center" prop="itemTitle" width="300">
         <template slot-scope="scope">
           <div style="display: flex; width: 100%">
             <div style="width: 40%">
-              <img
-                :src="scope.row.imageUrl"
-                alt=""
-                style="width: 70px; height: auto"
-              />
+              <img :src="scope.row.imageUrl" alt="" style="width: 70px; height: auto" />
             </div>
             <div style="width: 60%">
               <a
@@ -191,8 +176,7 @@ p {
           </div>
         </template>
       </el-table-column>
-      <el-table-column label="认领人" align="center" prop="userName">
-      </el-table-column>
+      <el-table-column label="认领人" align="center" prop="userName"> </el-table-column>
       <el-table-column label="商品单价" align="center" prop="reservePrice">
         <template slot-scope="scope">
           <p
@@ -205,12 +189,7 @@ p {
         </template>
       </el-table-column>
 
-      <el-table-column
-        label="订单数"
-        align="center"
-        prop="orderNum"
-        sortable="custom"
-      >
+      <el-table-column label="订单数" align="center" prop="orderNum" sortable="custom">
       </el-table-column>
       <el-table-column
         label="有效订单数"
@@ -226,11 +205,7 @@ p {
         sortable="custom"
       >
         <template slot-scope="scope">
-          {{
-            scope.row.validRadio
-              ? (scope.row.validRadio * 100).toFixed(2) + "%"
-              : "-"
-          }}
+          {{ scope.row.validRadio ? (scope.row.validRadio * 100).toFixed(2) + "%" : "-" }}
         </template>
       </el-table-column>
       <el-table-column
@@ -264,11 +239,7 @@ p {
         sortable="custom"
       >
       </el-table-column>
-      <el-table-column
-        label="服务费率"
-        align="center"
-        prop="regimentalPromotionRate"
-      >
+      <el-table-column label="服务费率" align="center" prop="regimentalPromotionRate">
         <template slot-scope="scope">
           {{
             !!scope.row.regimentalPromotionRate
@@ -279,7 +250,7 @@ p {
       </el-table-column>
       <el-table-column label="实付金额" align="center" prop="payAmount">
         <template slot-scope="scope">
-          {{ (scope.row.payAmount / 100).toFixed(2) }}
+          {{ allMoney(scope.row.payAmount / 100) }}
         </template>
       </el-table-column>
       <el-table-column
@@ -290,7 +261,7 @@ p {
         <template slot-scope="scope">
           {{
             scope.row.regimentalPromotionAmount
-              ? (scope.row.regimentalPromotionAmount / 100).toFixed(2)
+              ? allMoney(scope.row.regimentalPromotionAmount / 100)
               : "-"
           }}
         </template>
@@ -303,7 +274,7 @@ p {
         <template slot-scope="scope">
           {{
             scope.row.totalRegimentalSettleAmount
-              ? (scope.row.totalRegimentalSettleAmount / 100).toFixed(2)
+              ? allMoney(scope.row.totalRegimentalSettleAmount / 100)
               : "-"
           }}
         </template>
@@ -438,7 +409,8 @@ export default {
             ...this.queryParams,
             userId: !!this.$route.query.id
               ? this.$route.query.id
-              : this.$store.getters.remark == "管理员"
+              : this.$store.getters.roles[0] == "admin" ||
+                this.$store.getters.roles[0] == "supplyChainAdmin"
               ? null
               : this.$store.getters.userId,
           },
@@ -479,7 +451,8 @@ export default {
           {
             userId: !!this.$route.query.id
               ? this.$route.query.id
-              : this.$store.getters.remark == "管理员"
+              : this.$store.getters.roles[0] == "admin" ||
+                this.$store.getters.roles[0] == "supplyChainAdmin"
               ? null
               : this.$store.getters.userId,
           },
@@ -501,11 +474,7 @@ export default {
     },
     sortChange(col, prop, order) {
       this.prop = col.prop;
-      this.sort = !!col.order
-        ? col.order == "descending"
-          ? "desc"
-          : "asc"
-        : "desc";
+      this.sort = !!col.order ? (col.order == "descending" ? "desc" : "asc") : "desc";
       this.handleQuery();
     },
     toDetail(id) {},
@@ -530,7 +499,8 @@ export default {
             sort: this.sort,
             userId: !!this.$route.query.id
               ? this.$route.query.id
-              : this.$store.getters.remark == "管理员"
+              : this.$store.getters.roles[0] == "admin" ||
+                this.$store.getters.roles[0] == "supplyChainAdmin"
               ? null
               : this.$store.getters.userId,
           },

+ 654 - 0
src/views/supplyChain/queryProduct.vue

@@ -0,0 +1,654 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+      :rules="rules"
+    >
+      <el-form-item label="商品名称" prop="itemTitle">
+        <el-input
+          placeholder="请输入商品名称"
+          style="width: 240px"
+          v-model="queryParams.itemTitle"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="商品ID" prop="itemId">
+        <el-input
+          placeholder="请输入商品ID"
+          style="width: 240px"
+          v-model="queryParams.itemId"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="达人名称" prop="promoterNickName">
+        <el-input
+          placeholder="请输入达人名称"
+          style="width: 240px"
+          v-model="queryParams.promoterNickName"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="达人ID" prop="promoterId">
+        <el-input
+          placeholder="请输入达人ID"
+          style="width: 240px"
+          v-model="queryParams.promoterId"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="单价起始价" prop="reservePriceStart">
+        <el-input
+          placeholder="请输入单价起始价"
+          style="width: 240px"
+          v-model="queryParams.reservePriceStart"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="单价结束价" prop="reservePriceEnd">
+        <el-input
+          placeholder="请输入单价结束价"
+          style="width: 240px"
+          v-model="queryParams.reservePriceEnd"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="有效订单起始数" prop="validorderStart">
+        <el-input
+          placeholder="请输入有效订单起始数"
+          style="width: 240px"
+          v-model.number="queryParams.validorderStart"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="有效订单结束数" prop="validorderEnd">
+        <el-input
+          placeholder="请输入有效订单结束数"
+          style="width: 240px"
+          v-model.number="queryParams.validorderEnd"
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="时间筛选" prop="uploadDate">
+        <el-date-picker
+          v-model="uploadDate"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions"
+        ></el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          size="mini"
+          @click="addNew"
+          style="margin-bottom: 15px"
+          :loading="downLoading"
+          >导出</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <el-table v-loading="loading" :data="typeList" ref="multipleTable">
+      <el-table-column
+        label="达人名称"
+        align="center"
+        prop="promoterNickName"
+        width="300"
+      >
+        <template slot-scope="scope">
+          <div
+            class="item-name-calss"
+            style="display: flex; width: 100%; justify-content: center"
+          >
+            <a :title="scope.row.promoterNickName">
+              {{ scope.row.promoterNickName }}
+            </a>
+            <p>({{ scope.row.promoterId }})</p>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品名称" align="center" prop="fansNumber" width="300">
+        <template slot-scope="scope">
+          <div class="item-name-calss">
+            <a
+              :title="scope.row.itemTitle"
+              style="
+                text-overflow: ellipsis;
+                white-space: nowrap;
+                overflow: hidden;
+                width: 100%;
+              "
+            >
+              {{ scope.row.itemTitle }}
+            </a>
+            <p>({{ scope.row.itemId }})</p>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品单价" align="center" prop="reservePrice">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.reservePrice">
+            {{ allMoney(scope.row.reservePrice / 100) }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="销售额" align="center" prop="orderAmount">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.orderAmount">
+            {{ allMoney(scope.row.orderAmount / 100) }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="有效订单" align="center" prop="validorder">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.validorder">
+            {{ scope.row.validorder }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="预估服务费" align="center" prop="regimentalPromotionAmount">
+        <template slot-scope="scope">
+          <div v-if="!!scope.row.regimentalPromotionAmount">
+            {{ allMoney(scope.row.regimentalPromotionAmount / 100) }}
+          </div>
+          <div v-else>-</div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { refreshCache } from "@/api/system/dict/type";
+import {
+  getPromoterList,
+  addPromoter,
+  editPromoter,
+  deleteById,
+} from "@/api/promoter/promoter";
+import { getQueryProductListl, downFilePost } from "@/api/supplyChain/supplyChain";
+export default {
+  name: "account-list",
+  components: {},
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: null,
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      typeList: [],
+      //上传文件类型
+      fileType: [".doc", ".xls", ".xlsx", ".ppt", ".pdf", ".csv"],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openFp: false,
+      formFp: {},
+      // 是否可编辑
+      edit: false,
+      // 分配销售
+      openAllocation: false,
+      // 选择的销售id
+      saleId: undefined,
+      // 销售列表
+      saleList: [],
+      // 分配销售确定loading
+      confirmLoadingSale: false,
+      // 日期范围
+      dateRange: [],
+      downLoading: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        promoterNickName: undefined,
+        promoterId: undefined,
+        itemTitle: undefined,
+        itemId: undefined,
+        reservePriceEnd: undefined,
+        reservePriceStart: undefined,
+        validorderStart: undefined,
+        validorderEnd: undefined,
+      },
+      uploadDate: [new Date(), new Date()],
+      //页面所有的下拉数据
+      queryParamsList: {},
+      // 表单参数
+      form: {},
+      formBroadcast: {},
+      //上传报表下拉数据
+      formList: {},
+      fileList: [],
+      accept: "",
+      //获取销售线索文件流
+      dateFile: new FormData(),
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        reservePriceEnd: {
+          type: "number",
+          message: "商品单价结束价只能输入数字",
+          trigger: "change",
+          transform(value) {
+            return +value;
+          },
+        },
+        reservePriceStart: {
+          type: "number",
+          message: "商品单价起始价只能输入数字",
+          trigger: "change",
+          transform(value) {
+            return +value;
+          },
+        },
+      },
+      rulesBroadcast: {},
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "今天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "昨天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 1);
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三天",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 3);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+      // 分配销售展示列表
+      ksInfo: null,
+      userId: null,
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+    let date = new Date();
+    let y = date.getFullYear();
+    let MM = date.getMonth() + 1;
+    MM = MM < 10 ? "0" + MM : MM;
+    let dd = date.getDate();
+    dd = dd < 10 ? "0" + dd : dd;
+    this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+    this.getList();
+  },
+  filters: {},
+  methods: {
+    toIndexDetail(item) {
+      this.$router.replace({
+        path: "/promoter/detail",
+        query: {
+          id: item.id,
+        },
+      });
+    },
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+
+      getQueryProductListl(
+        this.addDateRange(
+          {
+            userId: this.userId,
+            ...this.queryParams,
+            reservePriceStart: this.queryParams.reservePriceStart
+              ? this.queryParams.reservePriceStart * 100
+              : null,
+            reservePriceEnd: this.queryParams.reservePriceEnd
+              ? this.queryParams.reservePriceEnd * 100
+              : null,
+          },
+          this.uploadDate,
+          "startDate",
+          "endDate"
+        )
+      ).then((response) => {
+        this.typeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.confirmLoading = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {};
+      this.dateFile = null;
+      this.resetForm("formBroadcast");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      let date = new Date();
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let dd = date.getDate();
+      dd = dd < 10 ? "0" + dd : dd;
+      this.uploadDate = [`${y}-${MM}-${dd}`, `${y}-${MM}-${dd}`];
+      this.handleQuery();
+    },
+    addNew() {
+      this.downLoading = true;
+      downFilePost(
+        "/itemCollectSamples/exportProductList",
+        this.addDateRange(
+          {
+            userId: this.userId,
+            reservePriceStart: this.queryParams.reservePriceStart
+              ? this.queryParams.reservePriceStart * 100
+              : null,
+            reservePriceEnd: this.queryParams.reservePriceEnd
+              ? this.queryParams.reservePriceEnd * 100
+              : null,
+            promoterNickName: this.queryParams.promoterNickName,
+            promoterId: this.queryParams.promoterId,
+            itemTitle: this.queryParams.itemTitle,
+            itemId: this.queryParams.itemId,
+            validorderStart: this.queryParams.validorderStart,
+            validorderEnd: this.queryParams.validorderEnd,
+          },
+          this.uploadDate,
+          "startDate",
+          "endDate"
+        )
+      ).then((res) => {
+        let blob = new Blob([res], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        let downloadElement = document.createElement("a");
+        let href = window.URL.createObjectURL(blob); //创建下载的链接
+        downloadElement.href = href;
+        downloadElement.download = "激励列表.xlsx"; //下载后文件名
+        document.body.appendChild(downloadElement);
+        downloadElement.click(); //点击下载
+        document.body.removeChild(downloadElement); //下载完成移除元素
+        window.URL.revokeObjectURL(href); //释放掉blob对象
+        this.downLoading = false;
+      });
+    },
+    handleDelete(item) {
+      this.$modal
+        .confirm(`请确认是否解绑此达人?`)
+        .then(() => {
+          var params = {};
+          params.id = item.id;
+          params.userId = this.$store.getters.userId;
+          deleteById(params)
+            .then((res) => {
+              this.$modal.msgSuccess("解绑成功");
+              this.handleQuery();
+            })
+            .catch(() => {
+              this.$message.error("失败");
+              this.loading = false;
+            });
+        })
+        .catch(() => {});
+    },
+    /** 编辑地址 新增达人*/
+    handleAddbroadcast(item) {
+      this.ids = item.id;
+      this.edit = true;
+      this.openAllocation = true;
+      this.$set(this.formBroadcast, "consignee", item.consignee);
+      this.$set(this.formBroadcast, "phone", item.phone);
+      this.$set(this.formBroadcast, "promoterAddress", item.promoterAddress);
+      this.$set(this.formBroadcast, "promoterNickName", item.promoterNickName);
+      this.$set(this.formBroadcast, "promoterId", item.promoterId);
+    },
+    copyInfomation(item) {
+      if (navigator.clipboard && window.isSecureContext) {
+        navigator.clipboard
+          .writeText(
+            `
+  收货人: ${item.consignee}
+  手机号: ${item.phone}
+  收货地址: ${item.promoterAddress}`
+          )
+          .then(() => {
+            this.$message.success("复制成功");
+          })
+          .catch((err) => {
+            this.$message.error("复制失败");
+          });
+      } else {
+        // 创建text area
+        const textArea = document.createElement("textarea");
+        textArea.value = `
+  收货人: ${item.consignee}
+  手机号: ${item.phone}
+  收货地址: ${item.promoterAddress}`;
+        // 使text area不在viewport,同时设置不可见
+        document.body.appendChild(textArea);
+        textArea.focus();
+        textArea.select();
+        return new Promise((resolve, reject) => {
+          // 执行复制命令并移除文本框
+          document.execCommand("copy") ? resolve() : reject(new Error("出错了"));
+          textArea.remove();
+        }).then(
+          () => {
+            this.$message.success("复制成功");
+          },
+          () => {
+            this.$message.error("复制失败");
+          }
+        );
+      }
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+    },
+    /** 新增直播确定按钮 */
+    submitFormBroadcast: function () {
+      this.$refs["formBroadcast"].validate((valid) => {
+        if (valid) {
+          this.confirmLoading = true;
+          let formData = {
+            userId: this.userId,
+            userName: this.$store.getters.name,
+            ...this.formBroadcast,
+          };
+
+          if (!this.ids) {
+            addPromoter(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("新增成功");
+                this.openAllocation = false;
+                this.ids = null;
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          } else {
+            formData.id = this.ids;
+            editPromoter(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("修改成功");
+                this.openAllocation = false;
+                this.ids = null;
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          }
+        }
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          var fileList = this.$refs.fileUploadDialog.fileList;
+          var dapanUrls = this.$refs.fileUpload.fileList;
+          var portraitUrls = this.$refs.fileUploadFx.fileList;
+          if (fileList.length == 0 && dapanUrls.length == 0 && portraitUrls.length == 0) {
+            this.$message.error("直播数据,数据大盘,画像分析必须最少上传一项");
+            return;
+          } else {
+            this.confirmLoading = true;
+            let formData = new FormData();
+            this.ids;
+            formData.append("id", this.ids);
+            formData.append("actualGmv", this.delcommafy(this.form.actualGmv));
+            formData.append(
+              "dapanUrls",
+              JSON.stringify(
+                dapanUrls.map((item) => {
+                  return item.url;
+                })
+              )
+            );
+            formData.append(
+              "portraitUrls",
+              JSON.stringify(
+                portraitUrls.map((item) => {
+                  return item.url;
+                })
+              )
+            );
+            fileList.forEach((file) => formData.append("files", file.raw));
+            dataUpload(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("上传成功");
+                this.open = false;
+                this.ids = null;
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          }
+          console.log(fileList, dapanUrls, portraitUrls);
+        }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.entire-line {
+  width: 100%;
+  ::v-deep .el-form-item__content {
+    width: 60%;
+  }
+}
+::v-deep .el-form-item__label {
+  white-space: nowrap;
+}
+</style>
+<style scoped lang="scss">
+::v-deep a {
+  color: #409eff;
+  display: block;
+}
+.item-name-calss p {
+  margin: 0;
+  text-align: center;
+}
+.tableBox {
+  width: 100%;
+}
+</style>

+ 11 - 39
src/views/supplyChain/service.vue

@@ -50,16 +50,10 @@ p {
       </el-form-item>
 
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
           >搜索</el-button
         >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
@@ -86,20 +80,11 @@ p {
       </el-table-column>
       <el-table-column label="商品名称" align="center" prop="itemTitle">
       </el-table-column> -->
-      <el-table-column
-        label="商品名称"
-        align="center"
-        prop="itemTitle"
-        width="300"
-      >
+      <el-table-column label="商品名称" align="center" prop="itemTitle" width="300">
         <template slot-scope="scope">
           <div style="display: flex; width: 100%">
             <div style="width: 40%">
-              <img
-                :src="scope.row.imageUrl"
-                alt=""
-                style="width: 70px; height: auto"
-              />
+              <img :src="scope.row.imageUrl" alt="" style="width: 70px; height: auto" />
             </div>
             <div style="width: 60%">
               <a
@@ -127,21 +112,12 @@ p {
         </template>
       </el-table-column>
       <!-- <el-table-column label="商品Id" align="center" prop="itemId" /> -->
-      <el-table-column label="订单数" align="center" prop="orderNum">
-      </el-table-column>
+      <el-table-column label="订单数" align="center" prop="orderNum"> </el-table-column>
       <el-table-column label="有效订单数" align="center" prop="validOrderNUm" />
-      <el-table-column
-        label="失效订单数"
-        align="center"
-        prop="invalidOrderNUm"
-      />
+      <el-table-column label="失效订单数" align="center" prop="invalidOrderNUm" />
       <el-table-column label="有效率" align="center" prop="validRadio">
         <template slot-scope="scope">
-          {{
-            scope.row.validRadio
-              ? (scope.row.validRadio * 100).toFixed(2) + "%"
-              : "-"
-          }}
+          {{ scope.row.validRadio ? (scope.row.validRadio * 100).toFixed(2) + "%" : "-" }}
         </template>
       </el-table-column>
       <el-table-column label="发货数" align="center" prop="deliveryNum">
@@ -157,18 +133,14 @@ p {
       </el-table-column>
       <el-table-column label="未发货数" align="center" prop="notDeliveryNum">
       </el-table-column>
-      <el-table-column
-        label="服务费率"
-        align="center"
-        prop="regimentalPromotionRate"
-      >
+      <el-table-column label="服务费率" align="center" prop="regimentalPromotionRate">
         <template slot-scope="scope">
           {{ scope.row.regimentalPromotionRate / 10 + "%" }}
         </template>
       </el-table-column>
       <el-table-column label="实付金额" align="center" prop="payAmount">
         <template slot-scope="scope">
-          {{ (scope.row.payAmount / 100).toFixed(2) }}
+          {{ allMoney(scope.row.payAmount / 100) }}
         </template>
       </el-table-column>
       <el-table-column
@@ -179,7 +151,7 @@ p {
         <template slot-scope="scope">
           {{
             scope.row.regimentalPromotionAmount
-              ? (scope.row.regimentalPromotionAmount / 100).toFixed(2)
+              ? allMoney(scope.row.regimentalPromotionAmount / 100)
               : "-"
           }}
         </template>
@@ -192,7 +164,7 @@ p {
         <template slot-scope="scope">
           {{
             scope.row.totalRegimentalSettleAmount
-              ? (scope.row.totalRegimentalSettleAmount / 100).toFixed(2)
+              ? allMoney(scope.row.totalRegimentalSettleAmount / 100)
               : "-"
           }}
         </template>