Explorar o código

政策管理之前所有

朱鑫波 %!s(int64=2) %!d(string=hai) anos
pai
achega
b962e35856

+ 130 - 0
src/api/live/live.js

@@ -0,0 +1,130 @@
+import request from '@/utils/request'
+
+// 获取直播账户列表
+export function getList(query) {
+	return request({
+		url: '/live/account/list',
+		method: 'get',
+		params: query
+	})
+}
+
+// 新增快手直播账户
+export function addAccount(query) {
+	return request({
+		url: '/live/account/add',
+		method: 'post',
+		data: query
+	})
+}
+
+
+// 获取直播投流投放配置列表
+export function getLaunchList(query) {
+	return request({
+		url: '/launch/strategy/list',
+		method: 'get',
+		params: query
+	})
+}
+
+// 新增直播投流投放
+export function addLaunchList(query) {
+	return request({
+		url: '/launch/strategy/add',
+		method: 'post',
+		data: query
+	})
+}
+
+// 删除/编辑直播投流投放
+export function editLaunch(query) {
+	return request({
+		url: '/launch/strategy/edit',
+		method: 'post',
+		data: query
+	})
+}
+
+
+// 获取直播投流投放详情
+export function getById(query) {
+	return request({
+		url: '/launch/strategy/getById',
+		method: 'get',
+		params: query
+	})
+}
+
+
+// 获取地域
+export function getRegion(query) {
+	return request({
+		url: '/launch/target/getRegion',
+		method: 'post',
+		params: query
+	})
+}
+
+
+// 获取人群
+export function getPopulation(query) {
+	return request({
+		url: '/launch/target/getPopulation',
+		method: 'post',
+		params: query
+	})
+}
+
+
+// 获取购物意图
+export function getPurchaseIntention(query) {
+	return request({
+		url: '/launch/target/getPurchaseIntention',
+		method: 'post',
+		params: query
+	})
+}
+
+
+// 批量创建模板
+export function adds(query) {
+	return request({
+		url: '/launch/template/adds',
+		method: 'post',
+		data: query
+	})
+}
+
+
+// 批量获取模板信息
+export function getTemplateByIds(query) {
+	return request({
+		url: '/launch/template/getByIds',
+		method: 'get',
+		params: query
+	})
+}
+
+
+
+// 查询创建记录
+export function queryGroupRecord(query) {
+	return request({
+		url: '/launch/group/queryGroupRecord',
+		method: 'get',
+		params: query
+	})
+}
+
+// 执行创建
+export function createByStrategy(query) {
+	return request({
+		url: '/launch/strategy/createByStrategy',
+		method: 'post',
+		params: query
+	})
+}
+
+
+

+ 29 - 0
src/api/sales/sale.js

@@ -114,4 +114,33 @@ export function getUserRoleByUserId(query) {
     method: 'get',
     params: query
   })
+}
+
+// 导入外呼
+export function importRobotTelephone(query) {
+  return request({
+    url: '/sale/saleClueInfoController/importRobotTelephone',
+    method: 'post',
+    params: query
+  })
+}
+
+
+// 导入外呼记录
+export function getRobotTelephoneRecordList(query) {
+  return request({
+    url: '/sale/saleClueInfoController/getRobotTelephoneRecordList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 通话记录查询
+export function getRobotTelephoneResultList(query) {
+  return request({
+    url: '/sale/saleClueInfoController/getRobotTelephoneResultList',
+    method: 'get',
+    params: query
+  })
 }

+ 43 - 0
src/api/trader/trader.js

@@ -159,3 +159,46 @@ export function getForEdit(query) {
 }
 
 
+// 获取客户管理列表
+export function getCustomerList(query) {
+	return request({
+		url: '/live/customer/list',
+		method: 'get',
+		params: query
+	})
+}
+
+// 新增客户
+export function customerAdd(query) {
+	return request({
+		url: '/live/customer/add',
+		method: 'post',
+		data: query
+	})
+}
+// 修改客户
+export function customerEdit(query) {
+	return request({
+		url: '/live/customer/edit',
+		method: 'post',
+		data: query
+	})
+}
+// 获取客户详情
+export function customerInfo(query) {
+	return request({
+		url: '/live/customer/queryByKsId',
+		method: 'get',
+		params: query
+	})
+}
+//上传发票信息
+export function customerUpload(query) {
+	return request({
+		url: '/live/customer/addInvoice',
+		method: 'post',
+		data: query
+	})
+}
+
+

+ 452 - 0
src/components/ScheduleTime/index.vue

@@ -0,0 +1,452 @@
+<template>
+  <div class="calendar">
+    <table class="time_table table" v-on:mouseleave="mouseleave">
+      <thead>
+        <tr>
+          <th rowspan="2" style="width: 120px">日期/时间</th>
+        </tr>
+        <tr>
+          <th
+            class="unselectable"
+            v-for="(num, index) in numData"
+            :key="index"
+            style="width: 30px"
+          >
+            {{ num }}
+          </th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(options, index) in timeData" :key="index">
+          <th scope="row">{{ options.date }}</th>
+          <td
+            v-for="(timeItem, key) in options.time"
+            :key="key"
+            :class="[
+              {
+                active_select: timeItem.isSelected,
+                active_select_move: timeItem.show,
+              },
+            ]"
+            v-on:mousedown="mousedown(index, key)"
+            v-on:mouseover="mouseover(index, key)"
+            v-on:mouseup="mouseup(index, key)"
+            @click="showOne(index, key)"
+          ></td>
+        </tr>
+      </tbody>
+    </table>
+    <!-- <div style="overflow: auto; margin-top: 15px">
+      {{ !!dataString ? setItemDate(dataString.join("")) : "" }}
+    </div> -->
+  </div>
+</template>
+<script>
+var num = ["一", "二", "三", "四", "五", "六", "日"];
+var arr_hour = get_hour_arr();
+//生成时间值数组
+function get_hour_arr() {
+  var arr_hour = [];
+  var oDate = new Date("2016/07/01 00:00:00"); //实例一个时间对象;
+  var oDate_hour = oDate.getHours();
+  var oDate_minute = oDate.getMinutes();
+  for (var i = 0; i < 24; i++) {
+    if (oDate_minute < 10) {
+      var oDate_minute = "0" + oDate_minute;
+    }
+    if (i >= 1) {
+      oDate.setMinutes(oDate.getMinutes() + 60);
+      oDate_hour = oDate.getHours();
+      oDate_minute = oDate.getMinutes();
+      if (oDate_minute < 10) {
+        var oDate_minute = "0" + oDate_minute;
+      }
+    }
+    arr_hour[i] = oDate_hour + ":" + oDate_minute;
+    // alert(oDate_hour + ':' + oDate.getMinutes());
+  }
+  return arr_hour;
+}
+export default {
+  name: "calendar-table",
+  props: {
+    scheduleTime: {
+      type: String,
+      default() {
+        return "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
+      },
+    },
+  },
+  data() {
+    return {
+      show: false,
+      numData: [
+        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+        20, 21, 22, 23,
+      ],
+      dateTime: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+      timeData: [
+        {
+          date: "周一",
+          time: [],
+        },
+        {
+          date: "周二",
+          time: [],
+        },
+        {
+          date: "周三",
+          time: [],
+        },
+        {
+          date: "周四",
+          time: [],
+        },
+        {
+          date: "周五",
+          time: [],
+        },
+        {
+          date: "周六",
+          time: [],
+        },
+        {
+          date: "周日",
+          time: [],
+        },
+      ],
+      selectFlag: false,
+      max: {
+        x: 0,
+        y: 0,
+      },
+      dataString: "",
+    };
+  },
+  methods: {
+    // handleClose(item) {
+    //   var index = Math.floor(item / 24)
+    //   var key = item % 7
+    //   if (this.timeData[index].time[key].value == false) {
+    //     if (this.timeData[index].time[key].isSelected) {
+    //       this.timeData[index].time[key].isSelected = false
+    //     } else {
+    //       this.$set(this.timeData[index].time[key], 'isSelected', true)
+    //     }
+    //   }
+    // },
+    showOne(index, key) {
+      //   this.timeData[index].time[key].isSelected = !this.timeData[index].time[key].isSelected
+    },
+    mousedown: function (index, key) {
+      this.selectStart = [];
+      this.selectFlag = true;
+      if (this.timeData[index].time[key].value == false) {
+        if (this.timeData[index].time[key].isSelected) {
+          this.timeData[index].time[key].isSelected = false;
+        } else {
+          this.$set(this.timeData[index].time[key], "isSelected", true);
+        }
+      }
+      this.selectStart.push({
+        index: index,
+        key: key,
+      });
+    },
+    mouseover: function (index, key) {
+      // x 垂直方向  y 水平方向
+      if (this.selectFlag) {
+        if (index >= this.max.x) {
+          this.max.x = index;
+        }
+        if (key >= this.max.y) {
+          this.max.y = key;
+        }
+        var start = {
+          x: this.selectStart[0].index,
+          y: this.selectStart[0].key,
+        };
+        var end = {
+          x: index,
+          y: key,
+        };
+        for (var i = end.x; i <= this.max.x; i++) {
+          for (var j = end.y; j <= this.max.y; j++) {
+            this.$set(this.timeData[i].time[j], "isSelected", false);
+          }
+        }
+        /* 渲染选中的区域 */
+        // for (var i = start.x; i <= end.x; i++) {
+        //   for (var j = start.y; j <= end.y; j++) {
+        //     // this.$set(this.timeData[i].time[j], 'isSelected', true)
+        //     this.$set(this.timeData[i].time[j], 'show', true)
+        //   }
+        // }
+        for (var i = start.x; i <= end.x; i++) {
+          for (var j = start.y; j <= end.y; j++) {
+            this.$set(this.timeData[i].time[j], "isSelected", true);
+          }
+        }
+      }
+    },
+    mouseup: function (index, key) {
+      var start = {
+        x: this.selectStart[0].index,
+        y: this.selectStart[0].key,
+      };
+      var end = {
+        x: index,
+        y: key,
+      };
+      /* 渲染选中的区域 */
+      var data = [];
+      var arr = [];
+      //   for (let i = 0; i < this.timeData.length; i++) {
+      //     for (let j = 0; j < this.timeData[i].time.length; j++) {
+      //       this.timeData[i].time[j].show = false
+      //     }
+      //   }
+      arr = data.concat(
+        this.timeData[0].time,
+        this.timeData[1].time,
+        this.timeData[2].time,
+        this.timeData[3].time,
+        this.timeData[4].time,
+        this.timeData[5].time,
+        this.timeData[6].time
+      );
+      this.dataString = arr.map((item) => {
+        if (item.isSelected) {
+          return 1;
+        } else {
+          return 0;
+        }
+      });
+      this.$emit("update:scheduleTime", this.dataString.join(""));
+      this.selectFlag = false;
+      this.max = {
+        x: 0,
+        y: 0,
+      };
+    },
+    mouseleave: function () {
+      this.selectFlag = false;
+    },
+    setItemDate(external_binary) {
+      //初始化周数数组
+      if (external_binary) {
+        var time_week_arr = [];
+
+        var date_html = "";
+        var binary = external_binary;
+
+        for (var y = 0; y < 7; y++) {
+          //初始化小时数组
+          var time_hour_arr = [];
+
+          for (var x = 0; x < 24; x++) {
+            //获取当前点击元素的位置
+            if (y == 0) {
+              var index = x;
+            } else {
+              var index = y * 24 + x;
+            }
+            //获取td对应的二进制值
+            var Selected_val = binary.charAt(index);
+
+            if (Selected_val == 1) {
+              //组装保存进数组里
+              if (time_hour_arr == []) {
+                //表格的第一个位置的值
+                time_hour_arr = arr_hour[x];
+              } else if (
+                binary.charAt(index - 1) == 1 &&
+                binary.charAt(index - 2) == 1
+              ) {
+                //此位置(包含上一行)的前两个都为选中时
+
+                if (x == 0 && binary.charAt(index + 1) == 0) {
+                  //选中行里第一个,后一个表格没选中,加逗号
+                  time_hour_arr[time_hour_arr.length] = arr_hour[x] + ", ";
+                } else if (x == 0 && binary.charAt(index + 1) == 1) {
+                  //选中行里第一个,后一个表格已选中,不加逗号
+                  time_hour_arr[time_hour_arr.length] = arr_hour[x];
+                } else if (x == 1 && binary.charAt(index - 1) == 0) {
+                  //选中行里第二个,上一个表格没选中,加逗号
+                  time_hour_arr[time_hour_arr.length] = arr_hour[x] + ", ";
+                } else if (x == 1 && binary.charAt(index - 1) == 1) {
+                  //选中行里第二个,上一个表格已选中,前加-号,后加逗号
+                  time_hour_arr[time_hour_arr.length] =
+                    "-" + arr_hour[x] + ", ";
+                } else {
+                  //选中行里除第一、二的表格以外,前一个表格已经选中,此元素前加- 后加逗号
+                  time_hour_arr[time_hour_arr.length - 1] =
+                    "-" + arr_hour[x] + ", ";
+                }
+              } else if (binary.charAt(index - 1) == 1 && x > 0) {
+                //选中的前一个已选中,且此次选中的不是行里第一个,此次选中的元素前加-后加逗号
+                time_hour_arr[time_hour_arr.length] = "-" + arr_hour[x] + ", ";
+              } else if (binary.charAt(index + 1) != 1 || x == 47) {
+                //选中的后一个没选中,或者此次选中的是行里最后一个,此次选中的元素加逗号
+                time_hour_arr[time_hour_arr.length] = arr_hour[x] + ", ";
+              } else {
+                //选中的后一已选中,此次选中的元素不加逗号
+                time_hour_arr[time_hour_arr.length] = arr_hour[x];
+              }
+            }
+          }
+
+          time_week_arr[y] = time_hour_arr;
+        }
+        //再次组装并输出数组
+        var time_html = [];
+        for (var y = 0; y < 7; y++) {
+          for (var x = 0; x < time_week_arr[y].length; x++) {
+            if (!time_html[y]) {
+              time_html[y] = time_week_arr[y][x];
+            } else {
+              time_html[y] += time_week_arr[y][x];
+            }
+          }
+
+          if (time_html[y]) {
+            time_html[y] = time_html[y].substring(0, time_html[y].length - 1);
+
+            date_html += "星期" + num[y] + " (" + time_html[y] + ")" + ", ";
+          }
+        }
+
+        if (external_binary) {
+          return date_html;
+        }
+        // console.info(time_html);
+      } else {
+        return "不限";
+      }
+    },
+    init() {
+      var str = "";
+      if (this.scheduleTime) {
+        str = this.scheduleTime;
+      } else {
+        str =
+          "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
+      }
+      this.dataString = str.split();
+      var arr = str.split("");
+      this.timeData = [
+        {
+          date: "周一",
+          time: [],
+        },
+        {
+          date: "周二",
+          time: [],
+        },
+        {
+          date: "周三",
+          time: [],
+        },
+        {
+          date: "周四",
+          time: [],
+        },
+        {
+          date: "周五",
+          time: [],
+        },
+        {
+          date: "周六",
+          time: [],
+        },
+        {
+          date: "周日",
+          time: [],
+        },
+      ];
+      for (let i = 0; i < arr.length; i++) {
+        if (i < 24) {
+          this.timeData[0].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        } else if (i < 48 && i >= 24) {
+          this.timeData[1].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        } else if (i < 72 && i >= 48) {
+          this.timeData[2].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        } else if (i < 96 && i >= 72) {
+          this.timeData[3].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        } else if (i < 120 && i >= 96) {
+          this.timeData[4].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        } else if (i < 144 && i >= 120) {
+          this.timeData[5].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        } else {
+          this.timeData[6].time.push({
+            isSelected: arr[i] == 1 ? true : false,
+            move: false,
+            value: false,
+          });
+        }
+      }
+    },
+  },
+  watch: {
+    scheduleTime: {
+      immediate: true, // immediate选项可以开启首次赋值监听
+      handler(newVal, oldVal) {
+        this.init();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.time_table {
+  border: 1px solid #ccc;
+  border-collapse: collapse;
+}
+.time_table th,
+.time_table td {
+  border: 1px solid #ccc;
+  text-align: center;
+}
+.time_table .unselectable {
+  //   width: 30px !important;
+  height: 20px;
+}
+.active_select {
+  background: cornflowerblue;
+}
+.active_select_move {
+  background: aqua;
+}
+* {
+  -webkit-touch-callout: none !important;
+  -webkit-user-select: none !important;
+  -moz-user-select: none !important;
+  -ms-user-select: none !important;
+  user-select: none !important;
+}
+</style>

+ 8 - 1
src/main.js

@@ -18,7 +18,7 @@ import './assets/icons' // icon
 import './permission' // permission control
 import { getDicts } from "@/api/system/dict/data";
 import { getConfigKey } from "@/api/system/config";
-import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
+import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree, inputMoney, uninputMoney } from "@/utils/ruoyi";
 // 分页组件
 import Pagination from "@/components/Pagination";
 // 自定义表格工具组件
@@ -37,8 +37,14 @@ import DictTag from '@/components/DictTag'
 import VueMeta from 'vue-meta'
 // 字典数据组件
 import DictData from '@/components/DictData'
+// 投放时间段组件
+import ScheduleTime from "@/components/ScheduleTime"
+
 
 // 全局方法挂载
+Vue.prototype.inputMoney = inputMoney
+Vue.prototype.uninputMoney = uninputMoney
+
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
 Vue.prototype.parseTime = parseTime
@@ -57,6 +63,7 @@ Vue.component('Editor', Editor)
 Vue.component('FileUpload', FileUpload)
 Vue.component('ImageUpload', ImageUpload)
 Vue.component('ImagePreview', ImagePreview)
+Vue.component('ScheduleTime', ScheduleTime)
 
 Vue.use(directive)
 Vue.use(plugins)

+ 2 - 2
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.59:9003 西安
-  baseURL: 'http://ruixuan.api.tjyourong.com.cn',
+  baseURL: 'http://192.168.0.195:9003',
   // 超时
   timeout: 300000
 })
@@ -52,7 +52,7 @@ service.interceptors.request.use(config => {
       const s_url = sessionObj.url;                  // 请求地址
       const s_data = sessionObj.data;                // 请求数据
       const s_time = sessionObj.time;                // 请求时间
-      const interval = 1000;                         // 间隔时间(ms),小于此时间视为重复提交
+      const interval = 0;                         // 间隔时间(ms),小于此时间视为重复提交
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
         const message = '数据正在处理,请勿重复提交';
         console.warn(`[${s_url}]: ` + message)

+ 50 - 0
src/utils/ruoyi.js

@@ -233,4 +233,54 @@ export async function blobValidate(data) {
   } catch (error) {
     return true;
   }
+}
+
+
+// 失去焦点金额格式化
+export async function inputMoney(el) {
+  let temp = Number(el.target.value) || null;
+  return priceFormat(temp)
+}
+// 获得焦点金额去掉格式
+export async function uninputMoney(el) {
+  if (!!el.target.value) {
+    return delcommafy(el.target.value)
+  }
+}
+export async function 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;
+}
+//去除千分位中的‘,’
+export async function delcommafy(num) {
+  if (!num) return num;
+  num = num.toString();
+  num = num.replace(/,/gi, "");
+  if (num.indexOf(".00") > 0) num = parseInt(num);
+  return num;
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1207 - 0
src/views/account/customer.vue


+ 599 - 0
src/views/account/customerCreate.vue

@@ -0,0 +1,599 @@
+<template>
+  <div class="app-container">
+    <h2>新增客户</h2>
+    <el-form
+      ref="formCampaign"
+      :model="formCampaign"
+      :rules="rules"
+      label-width="150px"
+    >
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-card class="box-card">
+            <el-form-item label="客户名称" prop="customerName">
+              <el-input
+                placeholder="请输入客户名称"
+                v-model="formCampaign.customerName"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="快手小店ID" prop="ksId">
+              <el-input
+                placeholder="请输入快手小店ID"
+                v-model="formCampaign.ksId"
+                :disabled="editVisble"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="投放平台" prop="launchType">
+              <el-select
+                v-model="formCampaign.launchType"
+                placeholder="选择投放平台"
+                clearable
+                style="width: 240px"
+              >
+                <el-option
+                  v-for="(item, index) in formList.launchTypeList"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="销售" prop="saleLeaderId">
+              <el-select
+                v-model="formCampaign.saleLeaderId"
+                placeholder="请选择销售"
+                clearable
+                value-key="value"
+                style="width: 240px"
+              >
+                <el-option
+                  v-for="item in formList.saleLeaderList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="联系方式" prop="phone">
+              <el-input
+                placeholder="请输入联系方式"
+                v-model="formCampaign.phone"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="企业名称" prop="businessName">
+              <el-input
+                placeholder="请输入企业名称"
+                v-model="formCampaign.businessName"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item
+              label="营业执照编码/统一社会信用代码"
+              prop="licenseCode"
+            >
+              <el-input
+                placeholder="请输入营业执照编码/统一社会信用代码"
+                v-model="formCampaign.licenseCode"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item
+              label="以企业主体为推广主体(软著主体与企业名称是否一致)"
+              prop="asMainBody"
+            >
+              <el-radio-group v-model="formCampaign.asMainBody">
+                <el-radio-button
+                  v-for="(item, index) in formList.asMainBodyList"
+                  :key="index"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="快手小店的链接" prop="ksUrl">
+              <el-input
+                placeholder="请输入快手小店的链接"
+                v-model="formCampaign.ksUrl"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="推广内容" prop="sponsoredContent">
+              <el-input
+                placeholder="请输入推广内容"
+                v-model="formCampaign.sponsoredContent"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="注册地" prop="registration">
+              <el-input
+                placeholder="请输入注册地"
+                v-model="formCampaign.registration"
+                style="width: 450px"
+              >
+              </el-input>
+            </el-form-item>
+
+            <el-form-item label="所有资质有效期">
+              <el-form-item
+                label="营业执照有效期"
+                prop="businessLicenseValidity"
+              >
+                <el-radio-group v-model="formCampaign.businessLicenseValidity">
+                  <el-radio-button label="-">长期</el-radio-button>
+                  <el-radio-button label="f">非长期</el-radio-button>
+                </el-radio-group>
+                <el-date-picker
+                  style="position: relative; top: 4px"
+                  v-model="formCampaign.businessLicenseValidityValue"
+                  type="date"
+                  placeholder="选择日期"
+                  value-format="yyyy-MM-dd"
+                  v-if="formCampaign.businessLicenseValidity == 'f'"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item
+                label="计算机软件著作权登记证书有效期"
+                prop="copyrightValidity"
+                style="margin: 10px 0"
+              >
+                <el-radio-group v-model="formCampaign.copyrightValidity">
+                  <el-radio-button label="-">长期</el-radio-button>
+                  <el-radio-button label="f">非长期</el-radio-button>
+                </el-radio-group>
+                <el-date-picker
+                  v-model="formCampaign.copyrightValidityValue"
+                  type="date"
+                  placeholder="选择日期"
+                  value-format="yyyy-MM-dd"
+                  v-if="formCampaign.copyrightValidity == 'f'"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="承诺函有效期" prop="commitmentValidity">
+                <el-radio-group v-model="formCampaign.commitmentValidity">
+                  <el-radio-button label="-">长期</el-radio-button>
+                  <el-radio-button label="f">非长期</el-radio-button>
+                </el-radio-group>
+                <el-date-picker
+                  v-model="formCampaign.commitmentValidityValue"
+                  type="date"
+                  placeholder="选择日期"
+                  value-format="yyyy-MM-dd"
+                  v-if="formCampaign.commitmentValidity == 'f'"
+                >
+                </el-date-picker>
+              </el-form-item>
+            </el-form-item>
+            <el-form-item label="营业执照链接" prop="businessLicenseUrl">
+              <vueUpload ref="businessLicenseUrl" :multiple="false"></vueUpload>
+              <!-- //live-1301855440.cos.ap-chongqing.myqcloud.com/CaoPanShou/20220816/2-1660638104302.png -->
+            </el-form-item>
+            <el-form-item label="ICP备案证明" prop="copyrightUrl">
+              <vueUpload ref="copyrightUrl" :multiple="false"></vueUpload>
+            </el-form-item>
+            <el-form-item label="承诺函链接" prop="commitmentUrl">
+              <vueUpload ref="commitmentUrl" :multiple="false"></vueUpload>
+            </el-form-item>
+          </el-card>
+        </el-col>
+        <el-col :span="24">
+          <div class="dialog-footer" style="float: right; margin-top: 15px">
+            <el-button
+              type="primary"
+              @click="submitForm"
+              :loading="confirmLoading"
+              >确 定</el-button
+            >
+            <el-button @click="close">取 消</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { refreshCache } from "@/api/system/dict/type";
+import vueUpload from "../trader/components/vueUpload";
+import FileUpload from "../trader/components/upload";
+
+import { editLaunch, addLaunchList, getById } from "@/api/live/live";
+
+import {
+  getAccountList,
+  getQueryRolesList,
+  customerAdd,
+  customerEdit,
+  customerInfo,
+} from "@/api/trader/trader";
+
+export default {
+  name: "create-live",
+  components: {
+    vueUpload,
+    FileUpload,
+  },
+  data() {
+    var urlValid = (rule, value, callback) => {
+      value = value + "";
+      if (/(http|https):\/\/([\w.]+\/?)\S*/.test(value) && value != "") {
+        callback();
+      } else {
+        callback("链接不能为空且开头为http://或https://");
+      }
+    };
+    return {
+      userId: undefined,
+      confirmLoading: false,
+      //广告创建表单
+      formCampaign: {
+        asMainBody: 1,
+        businessLicenseValidity: "-",
+        copyrightValidity: "-",
+        commitmentValidity: "-",
+      },
+
+      //表单使用的下拉列表
+      formList: {
+        liveCreativeTypeList: [
+          { value: 1, label: "直播投流", disabled: false },
+          { value: 2, label: "视频引流", disabled: true },
+        ],
+        launchTypeList: [
+          { value: "cljn", label: "磁力金牛" },
+
+          { value: "cp", label: "操盘" },
+        ], //账户类型下拉
+        saleLeaderList: [],
+        asMainBodyList: [
+          { value: 1, label: "是" },
+          { value: 0, label: "否" },
+        ],
+      },
+      //表单验证
+      rules: {
+        customerName: [
+          {
+            required: true,
+            message: "客户名称必填",
+            trigger: "blur",
+          },
+          {
+            min: 5,
+            max: 100,
+            message: "客户名称最少输入5个字符",
+            trigger: "change",
+          },
+        ],
+        ksId: [
+          {
+            required: true,
+            message: "快手小店ID必填",
+            trigger: "blur",
+          },
+        ],
+        launchType: [
+          {
+            required: true,
+            message: "投放平台必选",
+            trigger: "change",
+          },
+        ],
+        saleLeaderId: [
+          {
+            required: true,
+            message: "销售必选",
+            trigger: "change",
+          },
+        ],
+        businessName: [
+          {
+            required: true,
+            message: "企业名称必填",
+            trigger: "blur",
+          },
+          {
+            min: 5,
+            max: 100,
+            message: "企业名称最少输入5个字符",
+            trigger: "change",
+          },
+        ],
+        licenseCode: [
+          {
+            required: true,
+            message: "营业执照编码/统一社会信用代码必填",
+            trigger: "blur",
+          },
+          {
+            min: 5,
+            max: 100,
+            message: "营业执照编码/统一社会信用代码最少输入5个字符",
+            trigger: "change",
+          },
+        ],
+        ksUrl: [
+          {
+            required: true,
+            message: "快手小店链接必填",
+            trigger: "blur",
+          },
+          {
+            validator: urlValid,
+          },
+        ],
+        sponsoredContent: [
+          {
+            required: true,
+            message: "推广内容必填",
+            trigger: "blur",
+          },
+          {
+            validator: urlValid,
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+    this.getSaleList();
+    if (this.$route && this.$route.query.id) {
+      this.editRecordId = this.$route.query.id;
+      this.editVisble = true;
+      this.getDetail(this.editRecordId);
+    }
+  },
+  filters: {},
+  methods: {
+    getDetail(item) {
+      customerInfo({ ksId: +item })
+        .then((res) => {
+          var data = res.data;
+          this.$set(this.formCampaign, "customerName", data.customerName);
+          this.$set(this.formCampaign, "ksId", data.ksId);
+          this.$set(this.formCampaign, "launchType", data.launchType);
+
+          this.$set(this.formCampaign, "saleLeaderId", {
+            value: +data.saleLeaderId,
+            label: data.saleLeader,
+          });
+          this.$set(this.formCampaign, "phone", data.phone);
+          this.$set(this.formCampaign, "businessName", data.businessName);
+          this.$set(this.formCampaign, "licenseCode", data.licenseCode);
+          this.$set(this.formCampaign, "asMainBody", data.asMainBody);
+          this.$set(this.formCampaign, "ksUrl", data.ksUrl);
+          this.$set(this.formCampaign, "registration", data.registration);
+
+          this.$set(
+            this.formCampaign,
+            "sponsoredContent",
+            data.sponsoredContent
+          );
+
+          if (data.businessLicenseValidity == "-") {
+            this.$set(
+              this.formCampaign,
+              "businessLicenseValidityValue",
+              undefined
+            );
+            this.$set(this.formCampaign, "businessLicenseValidity", "-");
+          } else {
+            this.$set(
+              this.formCampaign,
+              "businessLicenseValidityValue",
+              data.businessLicenseValidity
+            );
+            this.$set(this.formCampaign, "businessLicenseValidity", "f");
+          }
+
+          if (data.copyrightValidity == "-") {
+            this.$set(this.formCampaign, "copyrightValidityValue", undefined);
+            this.$set(this.formCampaign, "copyrightValidity", "-");
+          } else {
+            this.$set(
+              this.formCampaign,
+              "copyrightValidityValue",
+              data.copyrightValidity
+            );
+            this.$set(this.formCampaign, "copyrightValidity", "f");
+          }
+
+          if (data.commitmentValidity == "-") {
+            this.$set(this.formCampaign, "commitmentValidityValue", undefined);
+            this.$set(this.formCampaign, "commitmentValidity", "-");
+          } else {
+            this.$set(
+              this.formCampaign,
+              "commitmentValidityValue",
+              data.commitmentValidity
+            );
+            this.$set(this.formCampaign, "commitmentValidity", "f");
+          }
+          this.$nextTick(() => {
+            this.$refs.businessLicenseUrl.fileList = [
+              {
+                name: "0",
+                status: "done",
+                uid: "0",
+                url: data.businessLicenseUrl,
+              },
+            ];
+            if (!!data.copyrightUrl) {
+              this.$refs.copyrightUrl.fileList = [
+                {
+                  name: "0",
+                  status: "done",
+                  uid: "0",
+                  url: data.copyrightUrl,
+                },
+              ];
+            }
+
+            this.$refs.commitmentUrl.fileList = [
+              {
+                name: "0",
+                status: "done",
+                uid: "0",
+                url: data.commitmentUrl,
+              },
+            ];
+          });
+        })
+        .catch(() => {});
+    },
+    // 获取销售
+    getSaleList() {
+      getQueryRolesList({ type: 2 })
+        .then((res) => {
+          this.formList.saleLeaderList = res.data.map((item) => {
+            return {
+              value: item.userId,
+              label: item.nickName,
+            };
+          });
+        })
+        .catch((error) => {});
+    },
+    close() {
+      if (this.editRecordId) {
+        const obj = {
+          path: "/live/create",
+          query: { id: this.editRecordId },
+        };
+        const objOpen = { path: "/live/index" };
+        this.$tab.closeOpenPage(obj);
+        this.$tab.closePage(obj);
+        this.$router.push(objOpen.path);
+      } else {
+        const obj = { path: "/live/create" };
+        const objOpen = { path: "/live/index" };
+        this.$tab.closeOpenPage(obj);
+        this.$tab.closePage(obj);
+        this.$router.push(objOpen.path);
+      }
+    },
+    // 创建
+    submitForm() {
+      this.$refs["formCampaign"].validate((valid) => {
+        if (valid) {
+          var that = this;
+
+          var businessLicenseUrl = this.$refs.businessLicenseUrl.fileList;
+          var copyrightUrl = this.$refs.copyrightUrl.fileList;
+          var commitmentUrl = this.$refs.commitmentUrl.fileList;
+
+          if (businessLicenseUrl.length == 0 || commitmentUrl.length == 0) {
+            this.$message.error("营业执照和承诺函必须上传");
+            return;
+          }
+          var params = { ...this.formCampaign };
+          params.businessLicenseUrl = businessLicenseUrl[0].url;
+          params.copyrightUrl =
+            copyrightUrl.length > 0 ? copyrightUrl[0].url : "";
+          params.commitmentUrl = commitmentUrl[0].url;
+          if (
+            params.businessLicenseValidity == "f" &&
+            !params.businessLicenseValidityValue
+          ) {
+            this.$message.error("所有资质有效期非长期时必须填写");
+            return;
+          }
+          if (
+            params.copyrightValidity == "f" &&
+            !params.copyrightValidityValue
+          ) {
+            this.$message.error("所有资质有效期非长期时必须填写");
+            return;
+          }
+          if (
+            params.commitmentValidity == "f" &&
+            !params.commitmentValidityValue
+          ) {
+            this.$message.error("所有资质有效期非长期时必须填写");
+            return;
+          }
+
+          params.businessLicenseValidity =
+            params.businessLicenseValidity == "f"
+              ? params.businessLicenseValidityValue
+              : params.businessLicenseValidity;
+          params.copyrightValidity =
+            params.copyrightValidity == "f"
+              ? params.copyrightValidityValue
+              : params.copyrightValidity;
+          params.commitmentValidity =
+            params.commitmentValidity == "f"
+              ? params.commitmentValidityValue
+              : params.commitmentValidity;
+
+          params.saleLeader = params.saleLeaderId.label;
+          params.saleLeaderId = params.saleLeaderId.value;
+          params.createrId = this.userId;
+
+          if (this.editRecordId) {
+            params.ksId = this.editRecordId;
+            customerEdit(params)
+              .then((res) => {
+                const obj = {
+                  path: "/account/create",
+                  query: { id: this.editRecordId },
+                };
+                const objOpen = { path: "/account/customer" };
+                this.$tab.closeOpenPage(obj);
+                this.$tab.closePage(obj);
+                this.$router.push(objOpen.path);
+              })
+              .catch((err) => {});
+          } else {
+            customerAdd(params)
+              .then((res) => {
+                const obj = { path: "/account/create" };
+                const objOpen = { path: "/account/customer" };
+                this.$tab.closeOpenPage(obj);
+                this.$tab.closePage(obj);
+                this.$router.push(objOpen.path);
+              })
+              .catch((err) => {});
+          }
+        }
+      });
+    },
+  },
+};
+</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;
+// }
+::v-deep .el-tag {
+  margin-right: 15px;
+}
+::v-deep .only-the-class .el-input__inner {
+  padding: 0;
+}
+::v-deep .el-input-number__decrease {
+  display: none;
+}
+
+::v-deep .el-input-number__increase {
+  display: none;
+}
+</style>

+ 836 - 0
src/views/liveStream/create.vue

@@ -0,0 +1,836 @@
+<template>
+  <div class="app-container">
+    <h2>广告创建</h2>
+    <el-form
+      ref="formCampaign"
+      :model="formCampaign"
+      :rules="rules"
+      label-width="150px"
+    >
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>广告计划</span>
+            </div>
+
+            <el-form-item label="选择账户" prop="accountId">
+              <el-select
+                v-model="formCampaign.accountId"
+                placeholder="选择账户类型"
+                clearable
+                filterable
+                style="width: 240px"
+                :disabled="editVisble"
+              >
+                <el-option
+                  v-for="(item, index) in formList.accountList"
+                  :key="index"
+                  :label="item.label + '(' + item.value + ')'"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="推广方式" prop="promotionType">
+              <el-radio-group v-model="formCampaign.promotionType">
+                <el-radio-button
+                  v-for="(item, index) in formList.promotionTypeList"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="item.value != '2'"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="营销目标" prop="campaignType">
+              <el-radio-group v-model="formCampaign.campaignType">
+                <el-radio-button
+                  v-for="(item, index) in formList.campaignTypeList"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="item.value != '14'"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="计划预算" prop="dayBudgetType">
+              <el-radio-group v-model="formCampaign.dayBudgetType">
+                <el-radio-button
+                  v-for="(item, index) in formList.dayBudgetTypeList"
+                  :key="index"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item
+              label=" "
+              prop="dayBudget"
+              v-if="formCampaign.dayBudgetType == '2'"
+            >
+              <el-input
+                placeholder="请输入单日预算"
+                v-model.number="formCampaign.dayBudget"
+                style="width: 450px"
+              >
+                <template slot="append">元</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item
+              label=" "
+              prop="budgetSchedule"
+              v-if="formCampaign.dayBudgetType == '3'"
+            >
+              <el-row class="only-the-class">
+                <el-col
+                  :span="3"
+                  v-for="(item, index) of budgetSchedule"
+                  :key="index"
+                >
+                  <el-card shadow="never">
+                    <div slot="header" class="clearfix">
+                      {{ "周" + numberReturn(index) }}
+                    </div>
+                    <el-input-number
+                      style="width: 100%"
+                      :min="500"
+                      :max="100000000"
+                      v-model="item.one"
+                      :precision="1"
+                    />
+                  </el-card>
+                </el-col>
+              </el-row>
+            </el-form-item>
+            <el-form-item label="计划名称" prop="campaignName">
+              <el-input
+                v-model="formCampaign.campaignName"
+                style="width: 450px"
+              />
+            </el-form-item>
+          </el-card>
+        </el-col>
+
+        <el-col :span="24" style="margin-top: 15px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>广告组</span>
+            </div>
+            <el-form-item label="日预算" prop="groupDayBudget">
+              <el-radio-group
+                v-model="formCampaign.groupDayBudget"
+                @change="$set(formCampaign, 'groupDayBudgetInput', undefined)"
+              >
+                <el-radio-button
+                  v-for="(item, index) in formList.groupDayBudgetList"
+                  :key="index"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item
+              label=" "
+              prop="groupDayBudgetInput"
+              v-if="formCampaign.groupDayBudget == 1"
+            >
+              <el-input
+                placeholder="请输入单日预算"
+                v-model.number="formCampaign.groupDayBudgetInput"
+                style="width: 450px"
+              >
+                <template slot="append">元</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item label="投放方式" prop="speed">
+              <el-radio-group v-model="formCampaign.speed">
+                <el-radio-button
+                  v-for="(item, index) in formList.speedList"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="item.value != 5"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="投放时间" prop="timeType">
+              <el-radio-group
+                v-model="formCampaign.timeType"
+                @change="formCampaign.scheduleTime = undefined"
+              >
+                <el-radio-button
+                  v-for="(item, index) in formList.timeTypeList"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="item.value == 1"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item
+              label=" "
+              prop="timeStr"
+              v-if="formCampaign.timeType == 3"
+            >
+              <el-date-picker
+                v-model="formCampaign.timeStr"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="yyyy-MM-dd"
+                style="width: 450px"
+              >
+              </el-date-picker>
+            </el-form-item>
+
+            <el-form-item
+              label="投放时段"
+              prop="scheduleTime"
+              v-if="formCampaign.timeType == 2"
+            >
+              <ScheduleTime
+                v-if="formCampaign.timeType == 2"
+                style="width: 100%; margin-right: 5px"
+                :scheduleTime.sync="formCampaign.scheduleTime"
+              />
+            </el-form-item>
+
+            <el-form-item label="创意组成方式" prop="showModeTwo">
+              <el-radio-group v-model="formCampaign.showModeTwo">
+                <el-radio-button
+                  v-for="(item, index) in formList.showModeList"
+                  :key="index"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+
+            <el-form-item label="创意展示方式" prop="showMode">
+              <el-radio-group v-model="formCampaign.showMode">
+                <el-radio-button
+                  v-for="(item, index) in formList.showModeOneList"
+                  :key="index"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item
+              label="资源位置"
+              prop="sceneId"
+              :rules="{
+                required: true,
+                message: '资源位置不能为空',
+                trigger: 'change',
+              }"
+            >
+              <el-checkbox-group v-model="formCampaign.sceneId">
+                <el-checkbox-button
+                  v-for="(item, index) in formList.sceneIdList"
+                  :label="item.value"
+                  :key="item.value"
+                  :disabled="item.disabled"
+                  >{{ item.label }}</el-checkbox-button
+                >
+              </el-checkbox-group>
+            </el-form-item>
+            <el-form-item label="电商广告类型" prop="merchantItemPutType">
+              <el-radio-group v-model="formCampaign.merchantItemPutType">
+                <el-radio-button
+                  v-for="(item, index) in formList.merchantItemPutTypeList"
+                  :key="index"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="辅助类型" prop="supportType">
+              <el-radio-group v-model="formCampaign.supportType">
+                <el-radio-button
+                  v-for="(item, index) in formList.supportTypeList"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="item.disabled"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="广告组名称" prop="unitName">
+              <el-input
+                v-model="formCampaign.unitName"
+                style="width: 450px"
+                id="unitName"
+              />
+              <br />
+              <el-tag
+                @click="getChangeAll('定向包名', 'formInformation', 'unitName')"
+                >+定向包名</el-tag
+              >
+              <el-tag
+                @click="
+                  getChangeAll('人群定向名', 'formInformation', 'unitName')
+                "
+                >+人群定向名</el-tag
+              >
+              <el-tag
+                @click="
+                  getChangeAll('人群排除名', 'formInformation', 'unitName')
+                "
+                >+人群排除名</el-tag
+              >
+              <el-tag
+                @click="getChangeAll('转化目标', 'formInformation', 'unitName')"
+                >+转化目标</el-tag
+              >
+              <el-tag
+                @click="getChangeAll('出价', 'formInformation', 'unitName')"
+                >+出价</el-tag
+              >
+              <el-tag
+                @click="getChangeAll('日期', 'formInformation', 'unitName')"
+                >+日期</el-tag
+              >
+            </el-form-item>
+          </el-card>
+        </el-col>
+
+        <el-col :span="24" style="margin-top: 15px">
+          <el-card class="box-card">
+            <div slot="header" class="clearfix">
+              <span>创意设置</span>
+            </div>
+
+            <el-form-item label="作品类型" prop="liveCreativeType">
+              <el-radio-group v-model="formCampaign.liveCreativeType">
+                <el-radio-button
+                  v-for="(item, index) in formList.liveCreativeTypeList"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="item.disabled"
+                  >{{ item.label }}</el-radio-button
+                >
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="创意名称" prop="creativeName">
+              <el-input
+                v-model="formCampaign.creativeName"
+                style="width: 450px"
+              />
+            </el-form-item>
+          </el-card>
+        </el-col>
+        <el-col :span="24">
+          <div class="dialog-footer" style="float: right; margin-top: 15px">
+            <el-button
+              type="primary"
+              @click="submitForm"
+              :loading="confirmLoading"
+              >确 定</el-button
+            >
+            <el-button @click="close">取 消</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { refreshCache } from "@/api/system/dict/type";
+import vueUpload from "../trader/components/vueUpload";
+import FileUpload from "../trader/components/upload";
+
+import { editLaunch, addLaunchList, getById } from "@/api/live/live";
+
+import { getAccountList } from "@/api/trader/trader";
+export default {
+  name: "create-live",
+  components: {
+    vueUpload,
+    FileUpload,
+  },
+  data() {
+    return {
+      userId: undefined,
+      confirmLoading: false,
+      //广告创建表单
+      formCampaign: {
+        promotionType: "2",
+        campaignType: "14",
+        dayBudgetType: "1",
+        groupDayBudget: 300,
+        speed: 5,
+        timeType: 3,
+        showModeTwo: 3,
+        showMode: 1,
+        sceneId: [6],
+        merchantItemPutType: 2,
+        supportType: 0,
+        liveCreativeType: 1,
+      },
+      budgetSchedule: [
+        { one: undefined },
+        { one: undefined },
+        { one: undefined },
+        { one: undefined },
+        { one: undefined },
+        { one: undefined },
+        { one: undefined },
+      ],
+      //表单使用的下拉列表
+      formList: {
+        accountList: [
+          { value: "1", label: "极速推广" },
+          { value: "2", label: "专业推广" },
+        ],
+        promotionTypeList: [
+          { value: "1", label: "极速推广" },
+          { value: "2", label: "专业推广" },
+        ],
+        campaignTypeList: [
+          { value: "3", label: "获取电商下单" },
+          { value: "12", label: "小店商品推广" },
+          { value: "14", label: "直播推广" },
+        ],
+        dayBudgetTypeList: [
+          { value: "1", label: "不限" },
+          { value: "2", label: "单日预算" },
+          { value: "3", label: "分日预算" },
+        ],
+        groupDayBudgetList: [
+          { value: 300, label: "¥300" },
+          { value: 500, label: "¥500" },
+          { value: 1000, label: "¥1000" },
+          { value: 3000, label: "¥3000" },
+          { value: 5000, label: "¥5000" },
+          { value: 1, label: "自定义" },
+        ],
+        speedList: [
+          { value: 5, label: "最大转化" },
+          { value: 1, label: "成本保护" },
+        ],
+        timeTypeList: [
+          { value: 1, label: "固定时长" },
+          { value: 2, label: "从今天开始长期投放" },
+          { value: 3, label: "设置开始结束日期" },
+        ],
+        showModeList: [
+          { value: 1, label: "自主选择" },
+          { value: 2, label: "系统优选" },
+          { value: 3, label: "自主选择+系统优选" },
+        ],
+        showModeOneList: [
+          { value: 1, label: "轮播" },
+          { value: 2, label: "优选" },
+        ],
+        sceneIdList: [
+          { value: 6, label: "上下划大屏广告", disabled: false },
+          { value: 7, label: "优选信息流广告", disabled: false },
+          { value: 10, label: "联盟场景", disabled: true },
+          { value: 41, label: "激励广告", disabled: true },
+        ],
+        merchantItemPutTypeList: [
+          { value: 0, label: "商品" },
+          { value: 2, label: "个人主页" },
+        ],
+        supportTypeList: [
+          { value: 0, label: "小店", disabled: false },
+          { value: 3, label: "金牛", disabled: true },
+        ],
+        liveCreativeTypeList: [
+          { value: 1, label: "直播投流", disabled: false },
+          { value: 2, label: "视频引流", disabled: true },
+        ],
+      },
+      //表单验证
+      rules: {
+        accountId: [
+          {
+            required: true,
+            message: "账户必选",
+            trigger: "change",
+          },
+        ],
+        dayBudget: [
+          {
+            required: true,
+            message: "单日预算不能为空",
+            trigger: "change",
+          },
+          {
+            type: "number",
+            min: 500,
+            max: 100000000,
+            message: "预算不能少于500,不能超过100000000",
+            trigger: "change",
+          },
+        ],
+        groupDayBudgetInput: [
+          {
+            required: true,
+            message: "单日预算不能为空",
+            trigger: "change",
+          },
+          {
+            type: "number",
+            min: 300,
+            max: 2000000,
+            message: "预算不能少于300,不能超过2000000",
+            trigger: "change",
+          },
+        ],
+        campaignName: [
+          {
+            required: true,
+            message: "计划名称不能为空",
+            trigger: "blur",
+          },
+          {
+            min: 1,
+            max: 50,
+            message: "请填写广告计划名称, 最多50字",
+            trigger: "change",
+          },
+        ],
+        timeStr: [
+          {
+            required: true,
+            message: "时间段必填",
+            trigger: "change",
+          },
+        ],
+        unitName: [
+          {
+            required: true,
+            message: "广告组名称不能为空",
+            trigger: "blur",
+          },
+          {
+            min: 1,
+            max: 50,
+            message: "请填写广告组名称, 最多50字",
+            trigger: "change",
+          },
+        ],
+        creativeName: [
+          {
+            required: true,
+            message: "广告创意名称不能为空",
+            trigger: "blur",
+          },
+          {
+            min: 1,
+            max: 50,
+            message: "请填写广告创意名称, 最多50字",
+            trigger: "change",
+          },
+        ],
+        editRecordId: null,
+        editVisble: false,
+      },
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+    this.getAccountList();
+    if (this.$route && this.$route.query.id) {
+      this.editRecordId = this.$route.query.id;
+      this.editVisble = true;
+      this.getDetail(this.editRecordId);
+    }
+  },
+  filters: {},
+  methods: {
+    getDetail(item) {
+      getById({ id: item })
+        .then((res) => {
+          var data = res.data;
+          this.$set(this.formCampaign, "accountId", data.accountId);
+          this.$set(this.formCampaign, "promotionType", data.promotionType);
+          this.$set(this.formCampaign, "campaignType", data.campaignType);
+
+          if (!!data.dayBudget && data.dayBudget != -1) {
+            this.$set(this.formCampaign, "dayBudgetType", "2");
+            setTimeout(() => {
+              this.$set(this.formCampaign, "dayBudget", data.dayBudget / 1000);
+            }, 0);
+          } else if (!!data.budgetSchedule) {
+            var index = JSON.parse(data.budgetSchedule).findIndex((item) => {
+              return item != 0;
+            });
+            if (index > -1) {
+              this.$set(this.formCampaign, "dayBudgetType", "3");
+
+              this.budgetSchedule = JSON.parse(data.budgetSchedule).map(
+                (item) => {
+                  return { one: item > 0 ? item / 1000 : undefined };
+                }
+              );
+            } else {
+              this.$set(this.formCampaign, "dayBudgetType", "1");
+            }
+          }
+
+          this.$set(this.formCampaign, "campaignName", data.campaignName);
+          if (!!data.groupDayBudget) {
+            if (
+              data.groupDayBudget / 1000 == 300 ||
+              data.groupDayBudget / 1000 == 500 ||
+              data.groupDayBudget / 1000 == 1000 ||
+              data.groupDayBudget / 1000 == 3000 ||
+              data.groupDayBudget / 1000 == 5000
+            ) {
+              this.$set(
+                this.formCampaign,
+                "groupDayBudget",
+                data.groupDayBudget / 1000
+              );
+            } else {
+              this.$set(this.formCampaign, "groupDayBudget", 1);
+              this.$set(
+                this.formCampaign,
+                "groupDayBudgetInput",
+                data.groupDayBudget / 1000
+              );
+            }
+          } else {
+            this.$set(this.formCampaign, "groupDayBudget", 300);
+          }
+
+          this.$set(this.formCampaign, "speed", data.speed);
+
+          if (data.scheduleTime == "") {
+            this.$set(this.formCampaign, "timeType", 3);
+            setTimeout(() => {
+              this.$set(
+                this.formCampaign,
+                "timeStr",
+                !!data.beginTimeStr
+                  ? [data.beginTimeStr, data.endTimeStr]
+                  : undefined
+              );
+            }, 0);
+          } else {
+            this.$set(this.formCampaign, "timeType", 2);
+            this.$set(this.formCampaign, "scheduleTime", data.scheduleTime);
+          }
+          this.$set(this.formCampaign, "unitName", data.unitName);
+          this.$set(this.formCampaign, "creativeName", data.creativeName);
+
+          this.$set(this.formCampaign, "showMode", data.showMode);
+          this.$set(this.formCampaign, "sceneId", JSON.parse(data.sceneId));
+          this.$set(
+            this.formCampaign,
+            "merchantItemPutType",
+            data.merchantItemPutType
+          );
+          this.$set(this.formCampaign, "supportType", data.supportType);
+          this.$set(
+            this.formCampaign,
+            "liveCreativeType",
+            data.liveCreativeType
+          );
+        })
+        .catch(() => {});
+    },
+    getAccountList() {
+      getAccountList({
+        userId: this.userId,
+        pageNum: 1,
+        pageSize: 100000,
+      }).then((response) => {
+        this.formList.accountList = response.rows.map((item) => {
+          return {
+            value: item.accountId,
+            label: item.accountName,
+          };
+        });
+      });
+    },
+    numberReturn(num) {
+      var arr = ["一", "二", "三", "四", "五", "六", "日"];
+      return arr[num];
+    },
+    // 失去焦点金额格式化
+    nowInputMoney(el) {
+      this.inputMoney(el).then((res) => {
+        this.formCampaign.dayBudget = res;
+      });
+    },
+    // 获得焦点金额去掉格式
+    nowUninputMoney(el) {
+      if (!!el.target.value) {
+        this.uninputMoney(el).then((res) => {
+          this.formCampaign.dayBudget = res;
+        });
+      }
+    },
+    //设置通配符
+    getChangeAll(type, form, field) {
+      var node = document.getElementById(field);
+      var v = "-{{" + type + "}}-";
+      if (document.selection) {
+        //IE
+        node.focus();
+        var sel = document.selection.createRange();
+        sel.text = v;
+        sel.select();
+        this.$set(this.formCampaign, field, sel.text);
+      } else if (node.selectionStart || node.selectionStart == "0") {
+        //MOZILLA/GOOGLE
+        var startPos = node.selectionStart;
+        var endPos = node.selectionEnd;
+        var restoreTop = node.scrollTop;
+        node.value =
+          node.value.substring(0, startPos) +
+          v +
+          node.value.substring(endPos, node.value.length);
+        if (restoreTop > 0) {
+          node.scrollTop = restoreTop;
+        }
+
+        // this.formCampaign[field] = node.value;
+        this.$set(this.formCampaign, field, node.value);
+        node.focus();
+        node.selectionStart = startPos + v.length;
+        node.selectionEnd = startPos + v.length;
+        // this.campaignName = node.value
+      } else {
+        //OTHER
+        node.value += v;
+        // console.log(node.value)
+        this.$set(this.formCampaign, field, node.value);
+        node.focus();
+        // this.campaignName = node.value
+      }
+    },
+    close() {
+      if (this.editRecordId) {
+        const obj = {
+          path: "/live/create",
+          query: { id: this.editRecordId },
+        };
+        const objOpen = { path: "/live/index" };
+        this.$tab.closeOpenPage(obj);
+        this.$tab.closePage(obj);
+        this.$router.push(objOpen.path);
+      } else {
+        const obj = { path: "/live/create" };
+        const objOpen = { path: "/live/index" };
+        this.$tab.closeOpenPage(obj);
+        this.$tab.closePage(obj);
+        this.$router.push(objOpen.path);
+      }
+    },
+    // 创建
+    submitForm() {
+      this.$refs["formCampaign"].validate((valid) => {
+        if (valid) {
+          var params = { ...this.formCampaign };
+          if (params.dayBudgetType == "1") {
+            params.budgetSchedule = [0, 0, 0, 0, 0, 0, 0];
+            params.dayBudget = -1;
+          } else if (params.dayBudgetType == "2") {
+            params.dayBudget = params.dayBudget * 1000;
+            params.budgetSchedule = [];
+          } else if (params.dayBudgetType == "3") {
+            var index = this.budgetSchedule.findIndex((item) => {
+              return !item.one;
+            });
+            if (index > -1) {
+              this.$message.error("分日预算必须全部填写");
+              return;
+            } else {
+              params.budgetSchedule = this.budgetSchedule.map((item) => {
+                return !!item.one ? item.one * 1000 : 0;
+              });
+              params.dayBudget = -1;
+            }
+          }
+
+          if (params.groupDayBudget == 1) {
+            params.groupDayBudget =
+              this.formCampaign.groupDayBudgetInput * 1000;
+          } else {
+            params.groupDayBudget = params.groupDayBudget * 1000;
+          }
+
+          if (params.timeType == 3) {
+            if (!this.formCampaign.timeType) {
+            } else {
+              params.beginTimeStr = this.formCampaign.timeStr[0];
+              params.endTimeStr = this.formCampaign.timeStr[1];
+            }
+            params.scheduleTime = "";
+          } else if (params.timeType == 2) {
+            params.scheduleTime = !!params.scheduleTime
+              ? params.scheduleTime
+              : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
+            params.beginTimeStr = "";
+            params.endTimeStr = "";
+          }
+          params.createrId = this.userId;
+
+          params.showMode = this.formCampaign.showMode;
+          params.sceneId = this.formCampaign.sceneId;
+          params.merchantItemPutType = this.formCampaign.merchantItemPutType;
+          params.supportType = this.formCampaign.supportType;
+          params.liveCreativeType = this.formCampaign.liveCreativeType;
+          var that = this;
+          if (this.editRecordId) {
+            params.id = this.editRecordId;
+            editLaunch(params)
+              .then((res) => {
+                const obj = {
+                  path: "/live/create",
+                  query: { id: this.editRecordId },
+                };
+                const objOpen = { path: "/live/index" };
+                this.$tab.closeOpenPage(obj);
+                this.$tab.closePage(obj);
+                this.$router.push(objOpen.path);
+              })
+              .catch((err) => {});
+          } else {
+            addLaunchList(params)
+              .then((res) => {
+                const obj = { path: "/live/create" };
+                const objOpen = { path: "/live/index" };
+                this.$tab.closeOpenPage(obj);
+                this.$tab.closePage(obj);
+                this.$router.push(objOpen.path);
+              })
+              .catch((err) => {});
+          }
+        }
+      });
+    },
+  },
+};
+</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;
+}
+::v-deep .el-tag {
+  margin-right: 15px;
+}
+::v-deep .only-the-class .el-input__inner {
+  padding: 0;
+}
+::v-deep .el-input-number__decrease {
+  display: none;
+}
+
+::v-deep .el-input-number__increase {
+  display: none;
+}
+</style>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2017 - 0
src/views/liveStream/index.vue


+ 169 - 21
src/views/sales/index.vue

@@ -125,17 +125,28 @@
           >分配人员</el-button
         >
       </el-col>
-      <!-- <el-col :span="1.5">
+      <el-col :span="1.5">
         <el-button
           type="primary"
           plain
           icon="el-icon-printer"
           size="mini"
-          @click="handleAdd"
-          v-hasPermi="['system:dict:add']"
-          >报表导出</el-button
+          @click="handleAllRobotTelephone"
+          :disabled="ids.length == 0"
+          >批量导入外呼</el-button
         >
-      </el-col> -->
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-printer"
+          size="mini"
+          @click="handleLog"
+          >导入外呼记录</el-button
+        >
+      </el-col>
+
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -151,6 +162,55 @@
         @queryTable="getList"
       ></right-toolbar> -->
     </el-row>
+    <el-dialog title="查看外呼导入记录" :visible.sync="dialogTableVisible">
+      <el-table :data="logData" :loading="logLoading">
+        <el-table-column
+          property="createTime"
+          label="日期"
+          width="150"
+          align="center"
+        ></el-table-column>
+        <el-table-column
+          property="name"
+          label="导入线索数量"
+          width="200"
+          align="center"
+        >
+          <template slot-scope="scope">
+            {{ scope.row.successList.length + scope.row.errorList.length }}条
+          </template>
+        </el-table-column>
+        <el-table-column property="success" label="导入成功" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.successList.length }}条
+          </template>
+        </el-table-column>
+        <el-table-column property="error" label="导入失败" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.errorList.length }}条(<el-button
+              size="mini"
+              type="text"
+              :disabled="scope.row.errorList.length == 0"
+              @click="handleUploadAll(scope.row)"
+              >重新导入</el-button
+            >)
+          </template>
+        </el-table-column>
+        <el-table-column
+          property="createUserName"
+          label="操作人"
+          align="center"
+        ></el-table-column>
+      </el-table>
+      <pagination
+        v-show="logTotal > 0"
+        :total="logTotal"
+        :page.sync="logPage.pageNum"
+        :limit.sync="logPage.pageSize"
+        @pagination="getLogList"
+      />
+    </el-dialog>
+
     <el-table
       v-loading="loading"
       :data="typeList"
@@ -182,6 +242,16 @@
         </template>
       </el-table-column>
       <el-table-column
+        label="是否导入外呼"
+        align="center"
+        prop="importPhoneFlag"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.importPhoneFlag == 0 ? "否" : "是" }}
+        </template>
+      </el-table-column>
+
+      <el-table-column
         label="联系方式"
         align="center"
         prop="telephone"
@@ -216,7 +286,9 @@
       </el-table-column>
       <el-table-column label="近30天" align="center" prop="nearlyThirtyDays">
         <template slot-scope="scope">
-          <span v-if="scope.row.nearlyThirtyDays">{{ scope.row.nearlyThirtyDays }}</span>
+          <span v-if="scope.row.nearlyThirtyDays">{{
+            scope.row.nearlyThirtyDays
+          }}</span>
           <span v-else>-</span>
         </template>
       </el-table-column>
@@ -234,14 +306,9 @@
             :disabled="!!scope.row.saleName"
             >分配</el-button
           >
-          <!-- <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:dict:remove']"
-            >删除</el-button
-          > -->
+          <el-button size="mini" type="text" @click="handleUpload(scope.row)"
+            >导入外呼</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
@@ -397,12 +464,22 @@ import {
   getIndustryInfoList,
   getUserByRoleName,
   getUserRoleByUserId,
+  importRobotTelephone,
+  getRobotTelephoneRecordList,
 } from "@/api/sales/sale";
 export default {
   name: "sale",
   dicts: ["sys_normal_disable"],
   data() {
     return {
+      dialogTableVisible: false,
+      logPage: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      logData: [],
+      logTotal: 0,
+      logLoading: false,
       // 遮罩层
       loading: true,
       // 选中数组
@@ -529,11 +606,12 @@ export default {
     },
     /** 复选框禁用 */
     selectable(row, index) {
-      if (!!row.saleName) {
-        return false;
-      } else {
-        return true;
-      }
+      return true;
+      // if (!!row.saleName) {
+      //   return false;
+      // } else {
+      //   return true;
+      // }
     },
     /** 获取行业列表 */
     getIndustryInfoList() {
@@ -633,12 +711,82 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map((item) => item.sellerId);
+      this.ids = selection.map((item) => item.id);
+    },
+    /** 导入外呼 */
+    handleUpload(item) {
+      this.$confirm("是否确认导入?")
+        .then((_) => {
+          var params = {};
+          params.ids = item.id;
+          params.userId = this.userId;
+          importRobotTelephone(params)
+            .then((res) => {
+              this.$message.success(res.msg);
+            })
+            .catch(() => {});
+        })
+        .catch((_) => {});
+    },
+    handleUploadAll(item) {
+      if (item.errorList.length > 0) {
+        var params = {};
+        params.ids = item.errorList
+          .map((c) => {
+            return c.id;
+          })
+          .join();
+        params.userId = this.userId;
+        importRobotTelephone(params)
+          .then((res) => {
+            this.$message.success(res.msg);
+            this.getLogList()
+          })
+          .catch(() => {});
+      }
+    },
+    getLogList() {
+      var params = {};
+      params.pageNum = this.logPage.pageNum;
+      params.pageSize = this.logPage.pageSize;
+      this.logLoading = true;
+      getRobotTelephoneRecordList(params)
+        .then((res) => {
+          this.logData = res.data.rows;
+          this.logTotal = res.data.total;
+          this.logLoading = false;
+        })
+        .catch(() => {
+          this.logLoading = false;
+        });
+    },
+    /** 外呼导入记录 */
+    handleLog() {
+      this.dialogTableVisible = true;
+      this.getLogList();
+    },
+    /** 批量导入外呼 */
+    handleAllRobotTelephone() {
+      this.$confirm(`本次导入${this.ids.length}条,是否确认导入?`)
+        .then((_) => {
+          var params = {};
+          params.ids = this.ids.join();
+          params.userId = this.userId;
+          importRobotTelephone(params)
+            .then((res) => {
+              this.$message.success(res.msg);
+            })
+            .catch(() => {});
+        })
+        .catch((_) => {
+          this.ids = [];
+          this.handleQuery();
+        });
     },
     /** 单条销售线索分配列表 */
     handleAllocationOne(item) {
       console.log(item);
-      this.getAllocationList(item.sellerId);
+      this.getAllocationList(item.id);
     },
     /** 多销售线索分配列表 */
     handleAllocation() {

+ 581 - 0
src/views/sales/robotTelephone.vue

@@ -0,0 +1,581 @@
+<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="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          type="date"
+          placeholder="选择日期"
+          value-format="yyyy-MM-dd"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="跟进状态" prop="state">
+        <el-select
+          filterable
+          v-model="queryParams.state"
+          placeholder="选择跟进状态"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in queryParamsList.industryList"
+            :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="seller_id" />
+      <el-table-column label="卖家昵称" align="center" prop="seller_name" />
+      <el-table-column label="行业" align="center" prop="industryName">
+        <template slot-scope="scope">
+          {{ scope.row.industryName ? scope.row.industryName : "-" }}
+        </template>
+      </el-table-column>
+      <el-table-column label="联系方式" align="center" prop="customerPhone" />
+      
+      <el-table-column label="跟进状态" align="center" prop="state">
+        <template slot-scope="scope">
+          {{ scope.row.state | stateName }}
+        </template>
+      </el-table-column>
+      <el-table-column label="开始拨打时间" align="center" prop="startedAt">
+      </el-table-column>
+      <el-table-column label="通话时长" align="center" prop="duration">
+      </el-table-column>
+      <el-table-column
+        label="话术名称"
+        align="center"
+        prop="surveyName"
+        :show-overflow-tooltip="true"
+      />
+      <el-table-column
+        label="客户关注点"
+        align="center"
+        :show-overflow-tooltip="true"
+        prop="focus"
+      >
+        <template slot-scope="scope">
+          <div v-if="JSON.parse(scope.row.focus).length == 0">-</div>
+          <div v-else>
+            <span v-for="(item, index) in JSON.parse(scope.row.focus)">
+              {{ item
+              }}{{ index == JSON.parse(scope.row.focus).length - 1 ? "" : "," }}
+            </span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="销售" align="center" prop="saleName">
+        <template slot-scope="scope">
+          {{ scope.row.saleName ? scope.row.saleName : "-" }}
+        </template>
+      </el-table-column>
+
+      <el-table-column label="录音地址" align="center" prop="recordUrl">
+      </el-table-column>
+      <el-table-column label="对话内容" align="center" prop="content">
+        <template slot-scope="scope">
+          <span v-for="(item, index) in scope.row.speakerContent">
+            {{ item.script == "" ? "暂无对话" : item.script
+            }}{{ index == scope.row.speakerContent.length - 1 ? "" : "," }}
+          </span>
+        </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 {
+  listType,
+  getType,
+  delType,
+  addType,
+  updateType,
+  refreshCache,
+} from "@/api/system/dict/type";
+import {
+  getSaleList,
+  importSaleExcelOrCsv,
+  getSaleAllocationList,
+  saleClueDistribution,
+  getUserByRoleName,
+  importRobotTelephone,
+  getRobotTelephoneRecordList,
+  getRobotTelephoneResultList,
+} from "@/api/sales/sale";
+export default {
+  name: "sale",
+  dicts: ["sys_normal_disable"],
+  data() {
+    return {
+      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,
+        createTime: undefined,
+        state: undefined,
+      },
+      //查询参数所用下拉数据
+      queryParamsList: {
+        industryList: [
+          { value: 1, label: "未开始" },
+          { value: 2, label: "进行中" },
+          { value: 3, label: "已结束" },
+        ], //行业下拉
+        fansList: [
+          { value: 1, label: "0~50W" },
+          { value: 2, label: "50W~200W" },
+          { value: 3, label: "200W~500W" },
+          { value: 4, label: "500W以上" },
+        ], //粉丝量级
+        distributionSaleFlagList: [
+          { value: 0, label: "否" },
+          { value: 1, label: "是" },
+        ], //是否分配销售
+        salesLeadsTypeList: [
+          { value: 1, label: "50W低潜" },
+          { value: 2, label: "50W中高潜" },
+          { value: 3, label: "200W高潜" },
+          { value: 4, label: "200W~500W" },
+          { value: 5, label: "500W以上" },
+        ], //销售线索类型
+      },
+      // 表单参数
+      form: {},
+      //上传报表下拉数据
+      formList: {
+        salesLeadsTypeList: [
+          { value: 1, label: "50W低潜" },
+          { value: 2, label: "50W中高潜" },
+          { value: 3, label: "200W高潜" },
+          { value: 4, label: "200W~500W" },
+          { value: 5, label: "500W以上" },
+        ], //销售线索类型
+      },
+      fileList: [],
+      //获取销售线索文件流
+      dateFile: null,
+      //销售线索上传loading
+      confirmLoading: false,
+      // 表单校验
+      rules: {
+        salesLeadsType: [
+          { required: true, message: "选择类别不能为空", trigger: "blur" },
+        ],
+        uploadDate: [
+          { required: true, message: "月份不能为空", trigger: "blur" },
+        ],
+      },
+      // 分配销售展示列表
+      saleAllocationList: [],
+    };
+  },
+  created() {
+    this.userId = this.$store.getters.userId;
+
+    this.getList();
+  },
+  mounted() {},
+  filters: {
+    stateName(status) {
+      const statusMap = {
+        1: "未开始",
+        2: "进行中",
+        3: "已结束",
+        null: "-",
+      };
+      return statusMap[status];
+    },
+  },
+  methods: {
+    /** 复选框禁用 */
+    selectable(row, index) {
+      return true;
+      // if (!!row.saleName) {
+      //   return false;
+      // } else {
+      //   return true;
+      // }
+    },
+    handleExceed(files, fileList) {
+      this.$message.warning(
+        `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
+          files.length + fileList.length
+        } 个文件`
+      );
+    },
+    beforeRemove(file, fileList) {
+      return false;
+    },
+    /** 删除文件 */
+    handleRemove(file, fileList) {
+      console.log(file, fileList);
+    },
+    /** 上传文件 */
+    handlePreview(file) {
+      console.log(file);
+    },
+    /** 上传文件前验证 */
+    handleBeforeUpload(file) {
+      console.log(file);
+      const fileSuffix = ["xlsx", "xls", "csv"];
+      const fileName = file.name;
+      const fileStrArr = fileName.split(".");
+      const suffix = fileStrArr[fileStrArr.length - 1];
+
+      let result = fileSuffix.some((item) => {
+        return item === suffix;
+      });
+
+      if (!result) {
+        this.$message.error("不支持该文件类型");
+        this.loadDisabled = false;
+        return false;
+      }
+      this.dateFile = file;
+      return false;
+    },
+    /** 查询字典类型列表 */
+    getList() {
+      this.loading = true;
+      getRobotTelephoneResultList(this.queryParams).then((response) => {
+        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.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.sellerId);
+    },
+    /** 导入外呼 */
+    handleUpload(item) {
+      this.$confirm("本次导入数据100条,是否确认导入!")
+        .then((_) => {
+          var params = {};
+          params.ids = item.id;
+          params.userId = this.userId;
+          importRobotTelephone(params)
+            .then((res) => {
+              this.$message.success("导入成功");
+            })
+            .catch(() => {});
+        })
+        .catch((_) => {});
+    },
+    handleUploadAll(item) {
+      if (item.errorList.length > 0) {
+        var params = {};
+        params.ids = item.errorList
+          .map((c) => {
+            return c.id;
+          })
+          .join();
+        params.userId = this.userId;
+        importRobotTelephone(params)
+          .then((res) => {
+            this.$message.success("导入成功");
+          })
+          .catch(() => {});
+      }
+    },
+    getLogList() {
+      var params = {};
+      params.pageNum = this.logPage.pageNum;
+      params.pageSize = this.logPage.pageSize;
+      this.logLoading = true;
+      getRobotTelephoneRecordList(params)
+        .then((res) => {
+          this.logData = res.data.rows;
+          this.logTotal = res.data.total;
+          this.logLoading = false;
+        })
+        .catch(() => {
+          this.logLoading = false;
+        });
+    },
+    /** 外呼导入记录 */
+    handleLog() {
+      this.dialogTableVisible = true;
+      this.getLogList();
+    },
+    /** 批量导入外呼 */
+    handleAllRobotTelephone() {
+      this.$confirm("是否确认导入!")
+        .then((_) => {
+          var params = {};
+          params.ids = this.ids.join();
+          params.userId = this.userId;
+          importRobotTelephone(params)
+            .then((res) => {
+              this.$message.success("导入成功");
+            })
+            .catch(() => {});
+        })
+        .catch((_) => {
+          this.ids = [];
+          this.handleQuery();
+        });
+    },
+    /** 单条销售线索分配列表 */
+    handleAllocationOne(item) {
+      console.log(item);
+      this.getAllocationList(item.sellerId);
+    },
+    /** 多销售线索分配列表 */
+    handleAllocation() {
+      this.getAllocationList(null);
+    },
+    /** 获取分配销售列表 */
+    getAllocationList(sellerIds) {
+      var params = {};
+      if (sellerIds) {
+        params.sellerIds = sellerIds;
+        this.ids = [sellerIds];
+      } else {
+        params.sellerIds = this.ids.join();
+      }
+      getSaleAllocationList(params)
+        .then((res) => {
+          if (res.code === 200) {
+            this.openAllocation = true;
+            this.title = "分配销售";
+            this.saleAllocationList = res.data;
+            getUserByRoleName({ roleName: "electricPin,facePin" })
+              .then((res) => {
+                this.saleList = res.data.map((item) => {
+                  return {
+                    value: item.user_id,
+                    label: item.nick_name,
+                  };
+                });
+              })
+              .catch((error) => {});
+          }
+        })
+        .catch((err) => {
+          this.$message.error("分配销售列表数据请求出错");
+        });
+    },
+    // 销售列表删除
+    removeListOne(index) {
+      this.saleAllocationList.splice(index, 1);
+    },
+    // 分配销售确定
+    submitSale() {
+      if (!this.saleId) {
+        this.$message.error("请选择销售");
+      } else {
+        this.confirmLoadingSale = true;
+        saleClueDistribution({
+          sellerIds: this.saleAllocationList
+            .map((item) => {
+              return item.sellerId;
+            })
+            .join(),
+          saleId: this.saleId,
+          createUserId: this.userId,
+        })
+          .then((res) => {
+            this.openAllocation = false;
+            this.confirmLoadingSale = false;
+            this.saleId = undefined;
+            this.$refs.multipleTable.clearSelection();
+            this.handleQuery();
+          })
+          .catch((err) => {
+            this.confirmLoadingSale = false;
+          });
+      }
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const dictId = row.dictId || this.ids;
+      getType(dictId).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改字典类型";
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.dateFile) {
+            this.confirmLoading = true;
+            let formData = new FormData();
+            formData.append("file", this.dateFile);
+            formData.append("salesLeadsType", this.form.salesLeadsType);
+            formData.append("uploadDate", this.form.uploadDate);
+            formData.append("createUserId", this.userId);
+            importSaleExcelOrCsv(formData)
+              .then((res) => {
+                this.confirmLoading = false;
+                this.$message.success("上传成功");
+                this.cancel();
+                this.handleQuery();
+              })
+              .catch((err) => {
+                this.confirmLoading = false;
+              });
+          } else {
+            this.$message.error("请上传文件");
+          }
+
+          // if (this.form.dictId != undefined) {
+          //   updateType(this.form).then((response) => {
+          //     this.$modal.msgSuccess("修改成功");
+          //     this.open = false;
+          //     this.getList();
+          //   });
+          // } else {
+          //   addType(this.form).then((response) => {
+          //     this.$modal.msgSuccess("新增成功");
+          //     this.open = false;
+          //     this.getList();
+          //   });
+          // }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const dictIds = row.dictId || this.ids;
+      this.$modal
+        .confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?')
+        .then(function () {
+          return delType(dictIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/dict/type/export",
+        {
+          ...this.queryParams,
+        },
+        `type_${new Date().getTime()}.xlsx`
+      );
+    },
+    /** 刷新缓存按钮操作 */
+    handleRefreshCache() {
+      refreshCache().then(() => {
+        this.$modal.msgSuccess("刷新成功");
+      });
+    },
+  },
+};
+</script>